override public PixelsMap FrameNext() { base.FrameNext(); base.Action(); try { _cPixelsMap = _cPMDuo.Switch(nPixelsMapSyncIndex); _cTimings.TotalRenew(); if (null == _cPixelsMap) { _cPixelsMap = new PixelsMap(stMergingMethod, new Area(0, 0, stArea.nWidth, stArea.nHeight), PixelsMap.Format.ARGB32); _cPixelsMap.bKeepAlive = false; // на одни раз _cPixelsMap.nIndexTriple = nPixelsMapSyncIndex; _cPixelsMap.Allocate(); _cTimings.Restart("newpm"); } _cPixelsMap.Move(0, 0); _cTimings.Restart("move1"); _cFile.VideoFrameNext(_cPixelsMap); _cTimings.Restart("frnext"); if (_cFile.bEOF) { base.Stop(); return(null); } _cPixelsMap.Move(stArea.nLeft, stArea.nTop); _cTimings.Restart("move2"); Advance(); _cTimings.Stop("frnext", "advance", 30); } catch (Exception ex) { (new Logger()).WriteError(ex); } if (nFrameCurrent >= nDuration) { base.Stop(); } if (null != _cPixelsMap) { _cPixelsMap.nAlphaConstant = nCurrentOpacity; if (null != cMask) { _cPixelsMap.eAlpha = cMask.eMaskType; } } return(_cPixelsMap); }
override public PixelsMap FrameNext() // если население композита тексты и они не менялись, то можно ничего не менять вообще! (оптимизация чата и подобных) // сделал { _cPixelsMap = _cPMDuo.Switch(nPixelsMapSyncIndex); if (null == _cPixelsMap) { return(null); } _bChanged = false; base.FrameNext(); PixelsMap cPM = null; List <PixelsMap> aPMs = new List <PixelsMap>(); Dictionary <Effect, PixelsMap> ahEffects_PMs = new Dictionary <Effect, PixelsMap>(); IVideo iVideo = null; foreach (Effect cEffect in _aEffects) { if (null == cEffect || !(cEffect is IVideo) || (EffectStatus.Running != cEffect.eStatus)) { continue; } iVideo = (IVideo)cEffect; iVideo.nPixelsMapSyncIndex = nPixelsMapSyncIndex; cPM = iVideo.FrameNext(); if (null == cPM) { continue; } aPMs.Add(cPM); if (!_bChanged && (!(iVideo is Text) || ((Text)iVideo).dtChanged > _dtLastChange)) { _bChanged = true; } } if (_bChanged && 0 < aPMs.Count) // когда == 0 - это пустышка и не надо для нее делать pixelsmap // || _bMergedChanges { //_bMergedChanges = _bChanged; _dtLastChange = DateTime.Now; _cPixelsMap.Merge(aPMs); Baetylus.PixelsMapDispose(aPMs.ToArray()); } _cPixelsMap.nAlphaConstant = nCurrentOpacity; if (null != cMask) { _cPixelsMap.eAlpha = cMask.eMaskType; } _cPixelsMap.Move(stArea.nLeft, stArea.nTop); if (nFrameCurrent >= nDuration) { base.Stop(); } return(_cPixelsMap); }
public PixelsMap FrameNextVideo() { cTimings.TotalRenew(); try { _cPixelsMap = _cPMDuo.cCurrent; _cPixelsMap.Move(stPixelArea.nLeft, stPixelArea.nTop); // были проблемы в транзишене. т.к. PM многоразовый, то кто-то его мог мувнуть (плейлист) и на место не класть. ffmpeg.net.Frame cFrame = _cFile.FrameNextVideoGet(); //_cFormatVideo, cTimings.Restart("ffmpeg_framenext"); if (null != cFrame) { int nOffset = 0; int nOffsetBot = 0; int nLine = _cFormatVideo.nWidth * _cFormatVideo.nBitsPerPixel / 8; int nBotDiff = _cFormatVideo.nHeight - (stContainerArea.nHeight - stArea.nTop); if (720 == _cFormatVideo.nWidth && 576 == _cFormatVideo.nHeight) // инверсия полей нужна только на sd { nOffset = nLine; } if (stArea.nTop < 0) { nOffset += (-stArea.nTop) * nLine; } if (nBotDiff > 0) { nOffsetBot = nBotDiff * nLine; } _cPixelsMap.CopyIn(cFrame.pBytes + nOffset, cFrame.nLength - nOffset - nOffsetBot); // сдвигаем фрейм на строчку вверх (это если не HD, а PAL) cTimings.Restart("copy_in"); cFrame.Dispose(); cTimings.Restart("dispose"); //GC.Collect(1, GCCollectionMode.Force_d); // худший вариант был //GC.Collect(GC.MaxGeneration, GCCollectionMode.Optimized); // этот лучший был ------- уехало в байтилус ------- //GC.Collect(GC.MaxGeneration, GCCollectionMode.Force_d); // гипотеза (ТАК и оказалось!!!!) - т.к. сборка спонтанная высвобождает сразу много мусора и и лочит этим copyin и вышибает пробки у БлэкМэджика //cTimings.Restart("GCcollect. " + System.Runtime.GCSettings.LatencyMode + "."); nFrameCurrentVideo++; } else if (bEOF) { return(null); } cTimings.Stop("framenext", "eof_getting", 20); ffmpeg.net.File.Input.nBTLCurrentBuffer = Baetylus.nCurrentDeviceBufferCount; return(_cPixelsMap); } catch (Exception ex) { (new Logger()).WriteError(ex); _cFile.Close(); } return(null); }
override public PixelsMap FrameNext() { lock (_cSyncRoot) { base.FrameNext(); if (nFrameCurrent >= nDuration) { base.Stop(); } _cPixelsMap = _cPMDuo.Switch(nPixelsMapSyncIndex); if (null == _cPixelsMap) { _cPixelsMap = new PixelsMap(stMergingMethod, stArea, PixelsMap.Format.ARGB32); _cPixelsMap.bKeepAlive = false; // на одни раз _cPixelsMap.nIndexTriple = nPixelsMapSyncIndex; _cPixelsMap.Allocate(); } if (null != _cPixelsMap) { if (!_aPMGotDrawCurrent.Contains(_cPixelsMap.nID)) { _dtChanged = DateTime.Now; _aPMGotDrawCurrent.Add(_cPixelsMap.nID); _cPixelsMap.CopyIn(_aDrawCurrent.aBytes); } if (_cPixelsMap.nAlphaConstant != nCurrentOpacity) { _dtChanged = DateTime.Now; _cPixelsMap.nAlphaConstant = nCurrentOpacity; } if (null != cMask && _cPixelsMap.eAlpha != cMask.eMaskType) { _dtChanged = DateTime.Now; _cPixelsMap.eAlpha = cMask.eMaskType; } if (_cPixelsMap.stArea.nLeft != stArea.nLeft || _cPixelsMap.stArea.nTop != stArea.nTop) { _dtChanged = DateTime.Now; _cPixelsMap.Move(stArea.nLeft, stArea.nTop); } } return(_cPixelsMap); } }