From 4f6dd6aeb156bd76aa5752bc8d23fe0105a17462 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:54:36 -0700 Subject: [PATCH] ffmpegdecoder: offset target timestamp by start timestamp Fixes #2054 --- app/codec/decoder.h | 3 --- app/codec/ffmpeg/ffmpegdecoder.cpp | 6 ++++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/codec/decoder.h b/app/codec/decoder.h index 757b48080..d0c974846 100644 --- a/app/codec/decoder.h +++ b/app/codec/decoder.h @@ -294,9 +294,6 @@ protected: return stream_; } - static int64_t GetTimeInTimebaseUnits(const rational& time, const rational& timebase, int64_t start_time); - static rational GetTimestampInTimeUnits(int64_t time, const rational& timebase, int64_t start_time); - virtual rational GetAudioStartOffset() const { return 0; } signals: diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index 76b25da8e..65520d34f 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -798,13 +798,15 @@ void FFmpegDecoder::ClearFrameCache() AVFramePtr FFmpegDecoder::RetrieveFrame(const rational& time, VideoParams::Interlacing interlacing, CancelAtom *cancelled) { - int64_t target_ts = GetTimeInTimebaseUnits(time, instance_.avstream()->time_base, instance_.avstream()->start_time); + int64_t target_ts = Timecode::time_to_timestamp(time, instance_.avstream()->time_base); if (interlacing != VideoParams::kInterlaceNone && !IsPixelFormatGLSLCompatible(static_cast(instance_.avstream()->codecpar->format))) { target_ts *= 2; } - const int64_t min_seek = -instance_.avstream()->start_time; + target_ts += instance_.avstream()->start_time; + + const int64_t min_seek = 0; int64_t seek_ts = std::max(min_seek, target_ts - MaximumQueueSize()); bool still_seeking = false;