From 202342e24fe4a0a71d43f0fb908f4f03d98aae5b Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 11 Oct 2022 00:25:56 -0700 Subject: [PATCH] ffmpegdecoder: factor in AVFormatContext::start_time --- app/codec/ffmpeg/ffmpegdecoder.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index 65520d34f..d398108a2 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -312,9 +312,11 @@ void FFmpegDecoder::CloseInternal() rational FFmpegDecoder::GetAudioStartOffset() const { - AVStream *s = this->instance_.avstream(); - if (s) { - return rational(s->start_time * s->time_base.num, s->time_base.den); + auto f = instance_.fmt_ctx(); + if (f) { + rational fmt_start = rational(instance_.fmt_ctx()->start_time, AV_TIME_BASE); + rational str_start = rational(instance_.avstream()->time_base) * instance_.avstream()->start_time; + return str_start - fmt_start; } else { return 0; } @@ -804,7 +806,9 @@ AVFramePtr FFmpegDecoder::RetrieveFrame(const rational& time, VideoParams::Inter target_ts *= 2; } - target_ts += instance_.avstream()->start_time; + if (instance_.fmt_ctx()->start_time != AV_NOPTS_VALUE) { + target_ts += av_rescale_q(instance_.fmt_ctx()->start_time, AV_TIME_BASE_Q, instance_.avstream()->time_base); + } const int64_t min_seek = 0; int64_t seek_ts = std::max(min_seek, target_ts - MaximumQueueSize());