From 5a86c1b47f940c8f668250bead36c861147c3972 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Thu, 19 May 2022 14:00:56 -0700 Subject: [PATCH] ffmpegdecoder: improve scaler refresh --- app/codec/ffmpeg/ffmpegdecoder.cpp | 15 +++++++++++---- app/codec/ffmpeg/ffmpegdecoder.h | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) 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);