diff options
author | Anton Khirnov <anton@khirnov.net> | 2024-04-03 12:32:51 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2024-08-12 14:42:20 +0200 |
commit | 64743b45b5741969074213004ca2f44a89f1ffb3 (patch) | |
tree | eb45a00074f77fcb675059a4ff9a7275df17b187 | |
parent | d94cfd49009cf27a4c72c8bf254de6cff8f1d1f4 (diff) | |
download | ffmpeg-64743b45b5741969074213004ca2f44a89f1ffb3.tar.gz |
lavc/internal: document the precise meaning of AVCodecInternal.draining
Also, set draining=1 in case a bitstream filter returns an
internally-triggered EOF. While no bitstream filters currently inserted
by decoders will do that, that may change in the future and it is better
to cover this case.
-rw-r--r-- | libavcodec/decode.c | 12 | ||||
-rw-r--r-- | libavcodec/internal.h | 6 |
2 files changed, 10 insertions, 8 deletions
diff --git a/libavcodec/decode.c b/libavcodec/decode.c index c5873391d0..d8e60567bd 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -213,8 +213,6 @@ static int decode_get_packet(AVCodecContext *avctx, AVPacket *pkt) int ret; ret = av_bsf_receive_packet(avci->bsf, pkt); - if (ret == AVERROR_EOF) - avci->draining = 1; if (ret < 0) return ret; @@ -247,14 +245,14 @@ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt) if (ret == AVERROR(EAGAIN) && (!AVPACKET_IS_EMPTY(avci->buffer_pkt) || dc->draining_started)) { ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt); - if (ret < 0) { - av_packet_unref(avci->buffer_pkt); - return ret; - } + if (ret >= 0) + continue; - continue; + av_packet_unref(avci->buffer_pkt); } + if (ret == AVERROR_EOF) + avci->draining = 1; return ret; } } diff --git a/libavcodec/internal.h b/libavcodec/internal.h index bc20a797ae..d7b0b9f880 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -123,7 +123,11 @@ typedef struct AVCodecInternal { void *hwaccel_priv_data; /** - * checks API usage: after codec draining, flush is required to resume operation + * decoding: AVERROR_EOF has been returned from ff_decode_get_packet(); must + * not be used by decoders that use the decode() callback, as they + * do not call ff_decode_get_packet() directly. + * + * encoding: a flush frame has been submitted to avcodec_send_frame(). */ int draining; |