mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-21 14:26:59 +00:00
lavc/decode: track whether the caller started draining with a separate flag
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.
This commit is contained in:
parent
fd915dc1da
commit
c4332dfda9
@ -55,6 +55,11 @@ typedef 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;
|
||||
} DecodeContext;
|
||||
|
||||
static DecodeContext *decode_ctx(AVCodecInternal *avci)
|
||||
@ -626,12 +631,13 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
|
||||
{
|
||||
AVCodecInternal *avci = avctx->internal;
|
||||
DecodeContext *dc = decode_ctx(avci);
|
||||
int ret;
|
||||
|
||||
if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
if (avctx->internal->draining)
|
||||
if (dc->draining_started)
|
||||
return AVERROR_EOF;
|
||||
|
||||
if (avpkt && !avpkt->size && avpkt->data)
|
||||
@ -642,7 +648,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
|
||||
dc->draining_started = 1;
|
||||
|
||||
ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt);
|
||||
if (ret < 0) {
|
||||
@ -1756,6 +1763,7 @@ AVBufferRef *ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx,
|
||||
void ff_decode_flush_buffers(AVCodecContext *avctx)
|
||||
{
|
||||
AVCodecInternal *avci = avctx->internal;
|
||||
DecodeContext *dc = decode_ctx(avci);
|
||||
|
||||
av_packet_unref(avci->last_pkt_props);
|
||||
av_packet_unref(avci->in_pkt);
|
||||
@ -1765,7 +1773,8 @@ void ff_decode_flush_buffers(AVCodecContext *avctx)
|
||||
|
||||
av_bsf_flush(avci->bsf);
|
||||
|
||||
decode_ctx(avci)->nb_draining_errors = 0;
|
||||
dc->nb_draining_errors = 0;
|
||||
dc->draining_started = 0;
|
||||
}
|
||||
|
||||
AVCodecInternal *ff_decode_internal_alloc(void)
|
||||
|
Loading…
Reference in New Issue
Block a user