提交 4aea3ce7 编写于 作者: J jp9000

deps/media-playback: Always check for new frame first

Fixes potential decoding errors with FFmpeg's new decode API.  Because
avcodec_send_packet may process multiple packets, you must call
avcodec_receive_frame continually until no more frames are left.
上级 d54b51ed
...@@ -210,22 +210,35 @@ static int decode_packet(struct mp_decode *d, int *got_frame) ...@@ -210,22 +210,35 @@ static int decode_packet(struct mp_decode *d, int *got_frame)
*got_frame = 0; *got_frame = 0;
#ifdef USE_NEW_FFMPEG_DECODE_API #ifdef USE_NEW_FFMPEG_DECODE_API
ret = avcodec_send_packet(d->decoder, &d->pkt); ret = avcodec_receive_frame(d->decoder, d->frame);
if (ret != 0 && ret != AVERROR(EAGAIN)) { if (ret != 0 && ret != AVERROR(EAGAIN)) {
if (ret == AVERROR_EOF) if (ret == AVERROR_EOF)
ret = 0; ret = 0;
return ret; return ret;
} }
ret = avcodec_receive_frame(d->decoder, d->frame); if (ret != 0) {
if (ret != 0 && ret != AVERROR(EAGAIN)) { ret = avcodec_send_packet(d->decoder, &d->pkt);
if (ret == AVERROR_EOF) if (ret != 0 && ret != AVERROR(EAGAIN)) {
ret = 0; if (ret == AVERROR_EOF)
return ret; ret = 0;
return ret;
}
ret = avcodec_receive_frame(d->decoder, d->frame);
if (ret != 0 && ret != AVERROR(EAGAIN)) {
if (ret == AVERROR_EOF)
ret = 0;
return ret;
}
*got_frame = (ret == 0);
ret = d->pkt.size;
} else {
ret = 0;
*got_frame = 1;
} }
*got_frame = (ret == 0);
ret = d->pkt.size;
#else #else
if (d->audio) { if (d->audio) {
ret = avcodec_decode_audio4(d->decoder, ret = avcodec_decode_audio4(d->decoder,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册