diff mbox series

[FFmpeg-devel,7/9] lavc/decode: track whether the caller started draining with a separate flag

Message ID 20230620141608.31759-7-anton@khirnov.net
State New
Headers show
Series [FFmpeg-devel,1/9] lavc: add a header for internal generic-layer APIs | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 fail Make fate failed
andriy/make_x86 success Make finished
andriy/make_fate_x86 fail Make fate failed

Commit Message

Anton Khirnov June 20, 2023, 2:16 p.m. UTC
Decoding pipeline has multiple stages, some of which may have their own
delay (e.g. bitstream filters). The code currently uses
AVCodecInternal.draining to track all of them, but they do not have to
all be in sync.
---
 libavcodec/decode.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index c070148b58..c61ce74fb8 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -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)