mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-15 19:40:07 +01:00
avcodec/pthread_frame, decode: allow errors to happen on draining
So, all frames and errors are correctly reported in order.
Also limit the numbers of error during draining to prevent infinite loop.
This fix fate failure with THREADS>=4:
make fate-h264-attachment-631 THREADS=4
This also reverts a755b725ec.
Suggested-by: wm4, Ronald S. Bultje, Marton Balint
Reviewed-by: w4 <nfxjfg@googlemail.com>
Reviewed-by: Ronald S. Bultje <rsbultje@gmail.com>
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Muhammad Faiz <mfcc64@gmail.com>
This commit is contained in:
@@ -568,8 +568,24 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
avctx->time_base = av_inv_q(av_mul_q(avctx->framerate, (AVRational){avctx->ticks_per_frame, 1}));
|
||||
#endif
|
||||
|
||||
if (avctx->internal->draining && !got_frame)
|
||||
avci->draining_done = 1;
|
||||
/* do not stop draining when got_frame != 0 or ret < 0 */
|
||||
if (avctx->internal->draining && !got_frame) {
|
||||
if (ret < 0) {
|
||||
/* prevent infinite loop if a decoder wrongly always return error on draining */
|
||||
/* reasonable nb_errors_max = maximum b frames + thread count */
|
||||
int nb_errors_max = 20 + (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME ?
|
||||
avctx->thread_count : 1);
|
||||
|
||||
if (avci->nb_draining_errors++ >= nb_errors_max) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Too many errors when draining, this is a bug. "
|
||||
"Stop draining and force EOF.\n");
|
||||
avci->draining_done = 1;
|
||||
ret = AVERROR_BUG;
|
||||
}
|
||||
} else {
|
||||
avci->draining_done = 1;
|
||||
}
|
||||
}
|
||||
|
||||
avci->compat_decode_consumed += ret;
|
||||
|
||||
@@ -1659,6 +1675,7 @@ void avcodec_flush_buffers(AVCodecContext *avctx)
|
||||
{
|
||||
avctx->internal->draining = 0;
|
||||
avctx->internal->draining_done = 0;
|
||||
avctx->internal->nb_draining_errors = 0;
|
||||
av_frame_unref(avctx->internal->buffer_frame);
|
||||
av_frame_unref(avctx->internal->compat_decode_frame);
|
||||
av_packet_unref(avctx->internal->buffer_pkt);
|
||||
|
||||
Reference in New Issue
Block a user