From 92290d9bc3c964fb4f0a1788bbad17b684e2eef5 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sat, 2 May 2020 14:38:30 +0200 Subject: [PATCH] ffmpeg: return B_LAST_BUFFER_ERROR when decoding completes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #13622. Fixes #14773. Fixes #15220. Change-Id: I2c20b421d25b450714209f4f4f4205d61145e615 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2551 Reviewed-by: Jérôme Duval --- src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp | 3 +++ src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp | 11 ++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp index f5641fa7b6..cb63387a5c 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp +++ b/src/add-ons/media/plugins/ffmpeg/AVCodecDecoder.cpp @@ -1248,6 +1248,9 @@ AVCodecDecoder::_DecodeNextVideoFrame() error = avcodec_receive_frame(fCodecContext, fRawDecodedPicture); + if (error == AVERROR_EOF) + return B_LAST_BUFFER_ERROR; + if (error == AVERROR(EAGAIN)) { do { status_t loadingChunkStatus diff --git a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp index 2d53197a08..23fd7ff55c 100644 --- a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp +++ b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp @@ -395,17 +395,18 @@ StreamBase::FrameRate() const frameRate = (double)fStream->codecpar->sample_rate; break; case AVMEDIA_TYPE_VIDEO: - if (fStream->avg_frame_rate.den && fStream->avg_frame_rate.num) - frameRate = av_q2d(fStream->avg_frame_rate); - else if (fStream->r_frame_rate.den && fStream->r_frame_rate.num) - frameRate = av_q2d(fStream->r_frame_rate); - else if (fStream->time_base.den && fStream->time_base.num) + { + AVRational frame_rate = av_guess_frame_rate(NULL, fStream, NULL); + if (frame_rate.den != 0 && frame_rate.num != 0) + frameRate = av_q2d(frame_rate); + else if (fStream->time_base.den != 0 && fStream->time_base.num != 0) frameRate = 1 / av_q2d(fStream->time_base); // TODO: Fix up interlaced video for real if (frameRate == 50.0f) frameRate = 25.0f; break; + } default: break; }