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; }
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"); }
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); }
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); }
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")); }
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); } }
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"); }