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:
committed by
waddlesplash
parent
12bd6e12a2
commit
92290d9bc3
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user