diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-06-20 13:02:59 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2023-07-07 12:07:23 +0200 |
commit | f2fb882b3f0046493e40306724a6d855b12e2121 (patch) | |
tree | 34164243afceeeccb04aec3df950cb975a979322 /libavcodec | |
parent | 21de4db402cc40734b30685f9435538e7d35ef9a (diff) | |
download | ffmpeg-f2fb882b3f0046493e40306724a6d855b12e2121.tar.gz |
lavc: add generic-decode-layer private data
Move AVCodecInternal.nb_draining_errors to it, should should not be
visible outside of decode.c.
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/avcodec.c | 4 | ||||
-rw-r--r-- | libavcodec/avcodec_internal.h | 2 | ||||
-rw-r--r-- | libavcodec/decode.c | 21 | ||||
-rw-r--r-- | libavcodec/internal.h | 3 | ||||
-rw-r--r-- | libavcodec/pthread_frame.c | 3 |
5 files changed, 26 insertions, 7 deletions
diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c index c01dac2049..aef2edce32 100644 --- a/libavcodec/avcodec.c +++ b/libavcodec/avcodec.c @@ -150,7 +150,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE) return AVERROR(EINVAL); - avci = av_mallocz(sizeof(*avci)); + avci = av_codec_is_decoder(codec) ? + ff_decode_internal_alloc() : + av_mallocz(sizeof(AVCodecInternal)); if (!avci) { ret = AVERROR(ENOMEM); goto end; diff --git a/libavcodec/avcodec_internal.h b/libavcodec/avcodec_internal.h index 6ffe575c3e..f52f91e07c 100644 --- a/libavcodec/avcodec_internal.h +++ b/libavcodec/avcodec_internal.h @@ -53,4 +53,6 @@ int ff_decode_preinit(struct AVCodecContext *avctx); void ff_decode_flush_buffers(struct AVCodecContext *avctx); void ff_encode_flush_buffers(struct AVCodecContext *avctx); +struct AVCodecInternal *ff_decode_internal_alloc(void); + #endif // AVCODEC_AVCODEC_INTERNAL_H diff --git a/libavcodec/decode.c b/libavcodec/decode.c index 3115282923..acec9860a5 100644 --- a/libavcodec/decode.c +++ b/libavcodec/decode.c @@ -50,6 +50,18 @@ #include "internal.h" #include "thread.h" +typedef struct DecodeContext { + AVCodecInternal avci; + + /* to prevent infinite loop on errors when draining */ + int nb_draining_errors; +} DecodeContext; + +static DecodeContext *decode_ctx(AVCodecInternal *avci) +{ + return (DecodeContext *)avci; +} + static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt) { int ret; @@ -439,7 +451,7 @@ FF_ENABLE_DEPRECATION_WARNINGS 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) { + if (decode_ctx(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; @@ -1753,5 +1765,10 @@ void ff_decode_flush_buffers(AVCodecContext *avctx) av_bsf_flush(avci->bsf); - avci->nb_draining_errors = 0; + decode_ctx(avci)->nb_draining_errors = 0; +} + +AVCodecInternal *ff_decode_internal_alloc(void) +{ + return av_mallocz(sizeof(DecodeContext)); } diff --git a/libavcodec/internal.h b/libavcodec/internal.h index dceae182c0..0c1f0b82ea 100644 --- a/libavcodec/internal.h +++ b/libavcodec/internal.h @@ -148,9 +148,6 @@ typedef struct AVCodecInternal { AVFrame *buffer_frame; int draining_done; - /* to prevent infinite loop on errors when draining */ - int nb_draining_errors; - /* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */ int changed_frames_dropped; int initial_format; diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 008f3da43b..bc305f561f 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -28,6 +28,7 @@ #include <stdint.h> #include "avcodec.h" +#include "avcodec_internal.h" #include "codec_internal.h" #include "decode.h" #include "hwconfig.h" @@ -815,7 +816,7 @@ static av_cold int init_thread(PerThreadContext *p, int *threads_to_free, p->parent = fctx; p->avctx = copy; - copy->internal = av_mallocz(sizeof(*copy->internal)); + copy->internal = ff_decode_internal_alloc(); if (!copy->internal) return AVERROR(ENOMEM); copy->internal->thread_ctx = p; |