From c451fe3fe1656d7343413210d56306279486f85f Mon Sep 17 00:00:00 2001 From: Crend King <975235+CrendKing@users.noreply.github.com> Date: Mon, 21 Dec 2020 23:49:38 -0800 Subject: [PATCH] Fix bug that skips the first source frame when creating output frames --- avisynth_filter/src/frame_handler.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/avisynth_filter/src/frame_handler.cpp b/avisynth_filter/src/frame_handler.cpp index c8abba6..e9f5016 100644 --- a/avisynth_filter/src/frame_handler.cpp +++ b/avisynth_filter/src/frame_handler.cpp @@ -58,9 +58,15 @@ auto FrameHandler::AddInputSample(IMediaSample *inSample) -> HRESULT { return VFW_E_SAMPLE_REJECTED; } - if (_nextOutputFrameStartTime == 0) { + if (_nextOutputFrameStartTime == -1) { _nextOutputFrameStartTime = srcFrameInfo.startTime; } + if (_frameRateCheckpointInputSampleStartTime == -1) { + _frameRateCheckpointInputSampleStartTime = srcFrameInfo.startTime; + } + if (_frameRateCheckpointOutputFrameStartTime == -1) { + _frameRateCheckpointOutputFrameStartTime = srcFrameInfo.startTime; + } RefreshInputFrameRates(srcFrameInfo); @@ -294,12 +300,12 @@ auto FrameHandler::Reset() -> void { _nextSourceFrameNb = 0; _nextOutputFrameNb = 0; _nextDeliverFrameNb = 0; - _nextOutputFrameStartTime = 0; + _nextOutputFrameStartTime = -1; _frameRateCheckpointInputSampleNb = 0; - _frameRateCheckpointInputSampleStartTime = 0; + _frameRateCheckpointInputSampleStartTime = -1; _frameRateCheckpointOutputFrameNb = 0; - _frameRateCheckpointOutputFrameStartTime = 0; + _frameRateCheckpointOutputFrameStartTime = -1; _currentInputFrameRate = 0; _currentOutputFrameRate = 0; } @@ -414,6 +420,8 @@ auto FrameHandler::GarbageCollect(int srcFrameNb) -> void { const size_t dbgPreSize = _sourceFrames.size(); + // search for all previous zero-ref frames in case of some source frames are never used + // this could happen by plugins that decrease frame rate auto iter = _sourceFrames.begin(); do { if (iter->first == srcFrameNb) {