ffmpeg: return B_LAST_BUFFER_ERROR when decoding completes.

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 <[email protected]>
This commit is contained in:
Adrien Destugues
2020-05-02 18:47:41 +00:00
committed by waddlesplash
parent 12bd6e12a2
commit 92290d9bc3
2 changed files with 9 additions and 5 deletions
@@ -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
@@ -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;
}