@@ -53,6 +53,11 @@
struct DecodeContext {
/* to prevent infinite loop on errors when draining */
int nb_draining_errors;
+
+ /**
+ * The caller has submitted a NULL packet on input.
+ */
+ int draining_started;
};
static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt)
@@ -624,7 +629,7 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke
if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
return AVERROR(EINVAL);
- if (avctx->internal->draining)
+ if (avci->d->draining_started)
return AVERROR_EOF;
if (avpkt && !avpkt->size && avpkt->data)
@@ -635,7 +640,8 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke
ret = av_packet_ref(avci->buffer_pkt, avpkt);
if (ret < 0)
return ret;
- }
+ } else
+ avci->d->draining_started = 1;
ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt);
if (ret < 0) {
@@ -1758,6 +1764,7 @@ void ff_decode_flush_buffers(AVCodecContext *avctx)
av_bsf_flush(avci->bsf);
avci->d->nb_draining_errors = 0;
+ avci->d->draining_started = 0;
}
AVCodecInternal *ff_decode_internal_alloc(void)