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; }