コード例 #1
0
ファイル: EffectVideo.cs プロジェクト: ratsil/bethe.btl
        new internal void LoadXML(XmlNode cXmlNode)
        {
            base.LoadXML(cXmlNode);

            if (null != cXmlNode.AttributeValueGet("cuda", false) || null != cXmlNode.AttributeValueGet("merging", false))
            {
                stMergingMethod = new MergingMethod(cXmlNode);
            }
            else
            {
                stMergingMethod = iContainer == null || iContainer.stMergingMethod == null ? Preferences.stMerging : iContainer.stMergingMethod.Value;
            }

            nInDissolve  = cXmlNode.AttributeOrDefaultGet <byte>("in_dissolve", 0);
            nOutDissolve = cXmlNode.AttributeOrDefaultGet <byte>("out_dissolve", 0);
            nMaxOpacity  = cXmlNode.AttributeOrDefaultGet <byte>("max_opacity", 255);

            bOpacity = cXmlNode.AttributeOrDefaultGet <bool>("opacity", false);
            cMask    = Play.Mask.MaskLoad(cXmlNode);

            XmlNode cNodeChild;

            if (null == cMask && null != (cNodeChild = cXmlNode.NodeGet("mask", false)))
            {
                this.iMask = (IVideo)EffectGet(cNodeChild.ChildNodes[0]);
            }

            stArea = stArea.LoadXML(cXmlNode);
            Dock cDockTMP = new Dock();

            cDockTMP.LoadXML(cXmlNode);
            cDock = cDockTMP;
        }
コード例 #2
0
ファイル: Preferences.cs プロジェクト: ratsil/bethe.btl
        override protected void LoadXML(XmlNode cXmlNode)
        {
            if (null == cXmlNode)              // || _bInitialized
            {
                return;
            }

            _stMerging           = new MergingMethod(cXmlNode);
            _bClearScreenOnEmpty = cXmlNode.AttributeOrDefaultGet <bool>("cls", false);
            _sDebugFolder        = cXmlNode.AttributeOrDefaultGet <string>("debug_folder", "");
            XmlNode cNodeChild;
            XmlNode cNodeDevice = cXmlNode.NodeGet("device");

            _nDeviceTarget = cNodeDevice.AttributeGet <byte>("target");
            _sDeviceMake   = cNodeDevice.AttributeValueGet("make");
            if (_sDeviceMake == "aja")
            {
                _nTargetChannel = cNodeDevice.AttributeGet <byte>("target_channel");
            }

            if (_bAudio = (null != (cNodeChild = cNodeDevice.NodeGet("audio", false))))
            {
                _nAudioSamplesRate       = cNodeChild.AttributeGet <uint>("rate");
                _nAudioChannelsQty       = cNodeChild.AttributeGet <byte>("channels");
                _nAudioChannelsQtyFfmpeg = cNodeChild.AttributeGet <byte>("channels_ffmpeg");
                _nAudioBitDepth          = cNodeChild.AttributeGet <byte>("bits");
                _nAudioByteDepth         = (byte)(_nAudioBitDepth / 8);
                _nAudioBytesPerSample    = (byte)(_nAudioByteDepth * _nAudioChannelsQty);
                _nAudioBitDepthToSend    = cNodeChild.AttributeOrDefaultGet <byte>("bits_send", _nAudioByteDepth);
                _nAudioByteDepthToSend   = (byte)(_nAudioBitDepthToSend / 8);
            }
            if (_bVideo = (null != (cNodeChild = cNodeDevice.NodeGet("video", false))))
            {
                _bAnamorph        = cNodeChild.AttributeOrDefaultGet <bool>("anamorph", false);
                _bBackgroundAlpha = cNodeChild.AttributeOrDefaultGet <bool>("alpha", false);
            }

            cNodeChild             = cNodeDevice.NodeGet("queue");
            _nClockBiasInFrames    = cNodeChild.AttributeGet <byte>("clock_bias"); // time lag for clock effect in frames
            _nQueueFfmpegLength    = cNodeChild.AttributeGet <ushort>("ffmpeg");   // frames
            _nQueueAnimationLength = cNodeChild.AttributeGet <byte>("animation");  // frames
            _nQueuePacketsLength   = cNodeChild.AttributeGet <long>("packets");    // bytes qty  200 000 000
            _nDecodingThreads      = cNodeChild.AttributeGet <byte>("threads");    // 4 by default. No need greater.
            if (_nDecodingThreads < 4)
            {
                throw new Exception("'threads' attribute must be >=4");
            }
            //_tsNextFrameTimeout = cNodeChild.AttributeGet<TimeSpan>("frame_timeout");
            _tsPacketsBlockGettingTimeout = cNodeChild.AttributeGet <TimeSpan>("get_block_timeout");   // packets block getting timeout. (20 sec for HD.mxf is ok if 'ffmpeg' >= 400fr and 'packets' = 200MB) (200MB=12sec; 400fr=16sec; 12/2+16=22 > 20)
                                                                                                       // new block is started getting when 1/2 of previous block was run out.
            if (_tsPacketsBlockGettingTimeout.TotalSeconds < 5)
            {
                throw new Exception("btl.pref: [get_block_timeout < 5 " + _tsPacketsBlockGettingTimeout.TotalSeconds + " s]");
            }
            _nGCFramesInterval = cNodeChild.AttributeGet <int>("gc_interval");
        }
コード例 #3
0
ファイル: Preferences.cs プロジェクト: ratsil/bethe.helpers
        override protected void LoadXML(XmlNode cXmlNode)
        {
            if (null == cXmlNode)  // || _bInitialized
            {
                return;
            }

            int nMergingId = cXmlNode.AttributeOrDefaultGet <int>("merging_id", 0);

            _stMergingMethod = new MergingMethod(MergingDevice.DisComExternal, nMergingId);
        }
コード例 #4
0
ファイル: Video.cs プロジェクト: ratsil/bethe.btl
            public void Open(MergingMethod stMergingMethod, ffmpeg.net.File.Input.PlaybackMode ePlaybackMode)
            {
                // TODO  нужно выцеплять размеры кадра из видео.
                _bClosed = false;
                if (null == _cFile)
                {
                    _cFile = new ffmpeg.net.File.Input(_sFile, nFrameStart);
                }
                (new Logger()).WriteDebug("[video_file open " + GetHashCode() + "][ffmpeg_file " + _cFile.GetHashCode() + "]");
                //Area stDeviceArea = Baetylus.Helper.stCurrentBTLArea;
                _cFormatVideo = new ffmpeg.net.Format.Video(stArea.nWidth, stArea.nHeight, ffmpeg.net.PixelFormat.AV_PIX_FMT_BGRA, ffmpeg.net.AVFieldOrder.AV_FIELD_TT);

                short  nTop = stArea.nTop;
                ushort nHei = stArea.nHeight;

                if (stArea.nTop < 0)                 // если верх выше границы, то не будем копировать лишние строки в пиксельсмэп
                {
                    nTop = 0;
                }
                if (nTop < stContainerArea.nHeight && stArea.nHeight + stArea.nTop > stContainerArea.nHeight)                 // если низ ниже, то не будем копировать лишние строки в пиксельсмэп
                {
                    nHei = (ushort)(stContainerArea.nHeight - (ushort)nTop);
                }

                stPixelArea = new Area(stArea.nLeft, nTop, stArea.nWidth, nHei);

                _cPMDuo = new PixelsMap.Triple(stMergingMethod, stPixelArea, PixelsMap.Format.BGRA32, true, Baetylus.PixelsMapDispose);
                ffmpeg.net.AVSampleFormat eAVSampleFormat;
                switch (Preferences.nAudioBitDepth)
                {
                case 32:
                    eAVSampleFormat = ffmpeg.net.AVSampleFormat.AV_SAMPLE_FMT_S32;
                    break;

                case 16:
                default:
                    eAVSampleFormat = ffmpeg.net.AVSampleFormat.AV_SAMPLE_FMT_S16;
                    break;
                }
                int nAudioChannelsQty = Preferences.nAudioChannelsQtyFfmpeg;

                _cFormatAudio = new ffmpeg.net.Format.Audio((int)Preferences.nAudioSamplesRate, nAudioChannelsQty, eAVSampleFormat);
                nFramesTotal  = _cFile.nFramesQty;
                //_cFile.Prepare(nDuration);
                _cFile.Prepare(_cFormatVideo, _cFormatAudio, ePlaybackMode);
            }
コード例 #5
0
ファイル: Preferences.cs プロジェクト: ratsil/bethe.ingenie
        public Preferences(string sData)
        {
            XmlDocument cXmlDocument = new XmlDocument();

            cXmlDocument.LoadXml(sData);
            XmlNode cXmlNode = cXmlDocument.NodeGet("data");

            XmlNode cNodeChild = cXmlNode.NodeGet("playlist");

            _stMerging   = new MergingMethod(cNodeChild);
            _nLayer      = cNodeChild.AttributeGet <ushort>("layer");
            _nPlaylistID = cNodeChild.AttributeGet <long>("id");
            cNodeChild   = cNodeChild.NodeGet("area");
            _stArea      = new Area(
                cNodeChild.AttributeGet <short>("left"),
                cNodeChild.AttributeGet <short>("top"),
                cNodeChild.AttributeGet <ushort>("width"),
                cNodeChild.AttributeGet <ushort>("height")
                );
            _cDBCredentials = new DB.Credentials(cXmlNode.NodeGet("database"));
        }
コード例 #6
0
        public Preferences(string sData)
        {
            XmlDocument cXmlDocument = new XmlDocument();

            cXmlDocument.LoadXml(sData);
            XmlNode cXmlNode = cXmlDocument.NodeGet("data");

            sRequest        = cXmlNode.AttributeValueGet("request");
            nTemplate       = cXmlNode.AttributeGet <byte>("template");
            sValue          = cXmlNode.AttributeValueGet("value", false);
            _nCheckInterval = cXmlNode.AttributeGet <int>("interval");
            _nLoops         = null == cXmlNode.AttributeValueGet("loop", false) ? (ushort)0 : cXmlNode.AttributeGet <ushort>("loop");

            XmlNode cNodeChild = cXmlNode.NodeGet("roll");

            _eDirection    = cNodeChild.AttributeGet <btl.Roll.Direction>("direction");
            _nSpeed        = cNodeChild.AttributeGet <float>("speed");
            _stRollMerging = new MergingMethod(cNodeChild);
            _nLayer        = cNodeChild.AttributeGet <ushort>("layer");
            _nQueueLength  = cNodeChild.AttributeGet <byte>("queue");
            _nPause        = cNodeChild.AttributeOrDefaultGet <int>("pause", 0);
            _nDelay        = cNodeChild.AttributeOrDefaultGet <int>("delay", 0);
            cNodeChild     = cNodeChild.NodeGet("area");
            _stArea        = new Area(
                cNodeChild.AttributeGet <short>("left"),
                cNodeChild.AttributeGet <short>("top"),
                cNodeChild.AttributeGet <ushort>("width"),
                cNodeChild.AttributeGet <ushort>("height")
                );
            _aItems = cXmlNode.NodesGet("item").Select(o => Item.Parse(o)).ToList();

            if (null != (cNodeChild = cXmlNode.NodeGet("background", false)))
            {
                _cBackground = new Background(cNodeChild);
            }
        }
コード例 #7
0
ファイル: Preferences.cs プロジェクト: ratsil/bethe.ingenie
        public Preferences(string sWorkFolder, string sData)
        {
            nTop = nLeft = 0;
            if (!Directory.Exists(_sFolderFootages = Path.Combine(_sWorkFolder = sWorkFolder, "footages")))
            {
                Directory.CreateDirectory(_sFolderFootages);
            }
            if (!Directory.Exists(_sFolderPoll = Path.Combine(_sFolderFootages, "polls")))
            {
                Directory.CreateDirectory(_sFolderPoll);
            }

            XmlDocument cXmlDocument = new XmlDocument();

            cXmlDocument.Load(Path.Combine(sWorkFolder, "preferences.xml"));

            if (null == (
                    //берем самое старое голосование
                    _cPoll = cXmlDocument.NodesGet("preferences/polls/poll").Select(o => new Poll()
            {
                sName = o.AttributeValueGet("name", false),
                dtLast = o.AttributeOrDefaultGet <DateTime>("dt", DateTime.MinValue),
                sDescription = o.NodeGet("description").InnerText,
                aCandidates = o.NodesGet("candidate").Select(o1 => new Poll.Candidate()
                {
                    sName = o1.AttributeValueGet("name").ToLower(),
                    sImage = o1.AttributeValueGet("image"),
                    sDescription = o1.AttributeValueGet("description"),
                    nVotesQty = 0
                }).ToArray()
            }).Where(o => 1 > _aPollsPreparing.Count(o1 => o1.nID == o.nID)).OrderBy(o => (x.ToDT(null) > o.dtLast ? o.dtLast.Ticks : 0)).FirstOrDefault()
                             ?? _aPollsPreparing.OrderBy(o => (x.ToDT(null) > o.dtLast ? o.dtLast.Ticks : 0)).FirstOrDefault()
                    ))
            {
                throw new Exception("no poll specified");
            }
            XmlNode cXmlNode = cXmlDocument.NodeGet("preferences/blender");

            sFolderBlender = cXmlNode.AttributeValueGet("folder");

            XmlDocument  cXD = new XmlDocument();
            XmlAttribute cXA;


            XmlNode cXNBlend = cXmlNode.NodeGet("mat");

            cMat      = cXD.CreateElement("data");
            cXA       = cXD.CreateAttribute("effect");
            cXA.Value = "render";
            cMat.Attributes.Append(cXA);
            cXA       = cXD.CreateAttribute("blend");
            cXA.Value = Path.Combine(sWorkFolder, "blender", cXNBlend.AttributeValueGet("blend"));
            cMat.Attributes.Append(cXA);
            cXA       = cXD.CreateAttribute("threads");
            cXA.Value = cXNBlend.AttributeValueGet("threads");
            cMat.Attributes.Append(cXA);

            XmlNode cPython = cXD.CreateElement("python");

            cPython.InnerText = cXNBlend.InnerText.
                                Replace("{%_IMAGE_LEFT_%}", _cPoll.aCandidates[0].sImage).
                                Replace("{%_IMAGE_RIGHT_%}", _cPoll.aCandidates[1].sImage).
                                Replace("{%_TEXT_TOP_ARRAY_%}", "\"" + _cPoll.sDescription.Remove("\r").Split('\n').Select(o => o.Trim().Replace("\"", "\\\"")).Where(o => !o.IsNullOrEmpty()).Aggregate((r, o) => r += "\",\"" + o) + "\"").
                                Replace("{%_TEXT_LEFT_%}", _cPoll.aCandidates[0].sDescription).
                                Replace("{%_TEXT_RIGHT_%}", _cPoll.aCandidates[1].sDescription);
            cMat.AppendChild(cPython);

            cXNBlend  = cXmlNode.NodeGet("votes");
            cVotes    = cXD.CreateElement("data");
            cXA       = cXD.CreateAttribute("effect");
            cXA.Value = "render";
            cVotes.Attributes.Append(cXA);
            cXA       = cXD.CreateAttribute("blend");
            cXA.Value = Path.Combine(sWorkFolder, "blender", cXNBlend.AttributeValueGet("blend"));
            cVotes.Attributes.Append(cXA);
            cXA       = cXD.CreateAttribute("threads");
            cXA.Value = cXNBlend.AttributeValueGet("threads");
            cVotes.Attributes.Append(cXA);
            cPython           = cXD.CreateElement("python");
            cPython.InnerText = cXNBlend.InnerText;
            cVotes.AppendChild(cPython);

            if (!Directory.Exists(_sFolderPoll = Path.Combine(_sFolderPoll, (cMat.InnerText + cVotes.InnerText).GetHashCode().ToStr())))
            {
                Directory.CreateDirectory(_sFolderPoll);
            }

            cXA       = cXD.CreateAttribute("output");
            cXA.Value = "*" + (sFolderMat = Path.Combine(_sFolderPoll, "mat"));
            cMat.Attributes.Append(cXA);
            cMat.InnerXml = cMat.InnerXml.Replace("{%_PATH_%}", sFolderMat.Replace("\\", "/"));
            if (!Directory.Exists(sFolderMat))
            {
                Directory.CreateDirectory(sFolderMat);
            }

            cXA = cXD.CreateAttribute("output");

            cXA.Value = "*" + (sFolderVotes = Path.Combine(_sFolderPoll, "votes"));
            cVotes.Attributes.Append(cXA);
            cVotes.InnerXml = cVotes.InnerXml.Replace("{%_PATH_%}", sFolderVotes.Replace("\\", "/"));
            if (!Directory.Exists(sFolderVotes))
            {
                Directory.CreateDirectory(sFolderVotes);
            }

            cXmlDocument.LoadXml(sData);
            cXmlNode  = cXmlDocument.NodeGet("data");
            nLeft     = cXmlNode.AttributeGet <short>("left");
            nTop      = cXmlNode.AttributeGet <short>("top");
            stMerging = new MergingMethod(cXmlNode);
            nLayer    = cXmlNode.AttributeGet <ushort>("layer");
        }