diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index 3abb9a86a..a27e709c9 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -173,6 +173,7 @@ void FFmpegDecoder::CloseInternal() } ClearFrameCache(); + FreeScaler(); instance_.Close(); } @@ -677,13 +678,15 @@ void FFmpegDecoder::ClearFrameCache() cached_frames_.clear(); cache_at_eof_ = false; cache_at_zero_ = false; - - // Filter graph may rely on "continuous" video frames, so we free the scaler here - FreeScaler(); - InitScaler(filter_params_); } } +void FFmpegDecoder::ResetScaler() +{ + FreeScaler(); + InitScaler(filter_params_); +} + FramePtr FFmpegDecoder::RetrieveFrame(const rational& time, const QAtomicInt *cancelled) { int64_t target_ts = GetTimeInTimebaseUnits(time, instance_.avstream()->time_base, instance_.avstream()->start_time, filter_params_.src_interlacing); @@ -698,6 +701,9 @@ FramePtr FFmpegDecoder::RetrieveFrame(const rational& time, const QAtomicInt *ca || (time < cached_frames_.front()->timestamp() || time > cached_frames_.back()->timestamp() + 2)) { ClearFrameCache(); + // Filter graph may rely on "continuous" video frames, so we free the scaler here + ResetScaler(); + instance_.Seek(seek_ts); if (seek_ts == min_seek) { cache_at_zero_ = true; @@ -827,6 +833,7 @@ bool FFmpegDecoder::InitScaler(const RetrieveVideoParams& params) // We need to (re)create the filter, delete current if necessary ClearFrameCache(); + FreeScaler(); // Set our params to this filter_params_ = params; diff --git a/app/codec/ffmpeg/ffmpegdecoder.h b/app/codec/ffmpeg/ffmpegdecoder.h index 2f377af5d..48e6cc3a3 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.h +++ b/app/codec/ffmpeg/ffmpegdecoder.h @@ -141,6 +141,7 @@ private: FramePtr GetFrameFromCache(const rational &t) const; void ClearFrameCache(); + void ResetScaler(); FramePtr RetrieveFrame(const rational &time, const QAtomicInt *cancelled);