From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH 4/9] lavc: add generic-decode-layer private data Date: Sat, 24 Jun 2023 21:34:58 +0200 Message-ID: <GV1P250MB0737A11936371A3FDCA7CE6E8F20A@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM> (raw) In-Reply-To: <20230620141608.31759-4-anton@khirnov.net> Anton Khirnov: > Move AVCodecInternal.nb_draining_errors to it, should should not be > visible outside of decode.c. > --- > libavcodec/avcodec.c | 4 +++- > libavcodec/avcodec_internal.h | 2 ++ > libavcodec/decode.c | 22 ++++++++++++++++++++-- > libavcodec/internal.h | 10 +++++++--- > libavcodec/pthread_frame.c | 3 ++- > 5 files changed, 34 insertions(+), 7 deletions(-) > > diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c > index a5cb6035b6..ff251d2dae 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 b5e5b4a2db..c070148b58 100644 > --- a/libavcodec/decode.c > +++ b/libavcodec/decode.c > @@ -50,6 +50,11 @@ > #include "internal.h" > #include "thread.h" > > +struct DecodeContext { > + /* to prevent infinite loop on errors when draining */ > + int nb_draining_errors; > +}; > + > static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt) > { > int ret; > @@ -439,7 +444,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 (avci->d->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; > @@ -1752,5 +1757,18 @@ void ff_decode_flush_buffers(AVCodecContext *avctx) > > av_bsf_flush(avci->bsf); > > - avci->nb_draining_errors = 0; > + avci->d->nb_draining_errors = 0; > +} > + > +AVCodecInternal *ff_decode_internal_alloc(void) > +{ > + struct Dummy { > + AVCodecInternal i; > + DecodeContext d; > + } *dummy = av_mallocz(sizeof(*dummy)); > + if (!dummy) > + return NULL; > + dummy->i.d = &dummy->d; > + > + return &dummy->i; > } > diff --git a/libavcodec/internal.h b/libavcodec/internal.h > index dceae182c0..b672092ac4 100644 > --- a/libavcodec/internal.h > +++ b/libavcodec/internal.h > @@ -49,7 +49,14 @@ > # define STRIDE_ALIGN 8 > #endif > > +typedef struct DecodeContext DecodeContext; > + > typedef struct AVCodecInternal { > + /** > + * Generic decoding private data. > + */ > + DecodeContext *d; This approach has the downside of adding unnecessary indirecations; it furthermore adds pointers to DecodeContext and EncodeContext to AVCodecInternal, as if both could be valid at the same time. The above could be overcome by using the typical approach to access these extra fields, as is used for FFStream etc. Furthermore, I do not really think that is worth it: The number of fields affected by it are just so small. Has encoder code ever tried to set nb_draining_errors? > + > /** > * When using frame-threaded decoding, this field is set for the first > * worker thread (e.g. to decode extradata just once). > @@ -148,9 +155,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; _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2023-06-24 19:49 UTC|newest] Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-06-20 14:16 [FFmpeg-devel] [PATCH 1/9] lavc: add a header for internal generic-layer APIs Anton Khirnov 2023-06-20 14:16 ` [FFmpeg-devel] [PATCH 2/9] lavc/avcodec: split flushing into decode- and encode-specific functions Anton Khirnov 2023-06-24 18:53 ` Andreas Rheinhardt 2023-06-20 14:16 ` [FFmpeg-devel] [PATCH 3/9] lavc: reindent after previous commit Anton Khirnov 2023-06-20 14:16 ` [FFmpeg-devel] [PATCH 4/9] lavc: add generic-decode-layer private data Anton Khirnov 2023-06-24 19:34 ` Andreas Rheinhardt [this message] 2023-07-03 19:24 ` Anton Khirnov 2023-06-20 14:16 ` [FFmpeg-devel] [PATCH 5/9] lavc: add generic-encode-layer " Anton Khirnov 2023-06-20 14:16 ` [FFmpeg-devel] [PATCH 6/9] lavc: move AVCodecInternal.last_audio_frame to EncodeContext Anton Khirnov 2023-06-20 14:16 ` [FFmpeg-devel] [PATCH 7/9] lavc/decode: track whether the caller started draining with a separate flag Anton Khirnov 2023-06-20 14:16 ` [FFmpeg-devel] [PATCH 8/9] lavc/decode: move submitting input packets to bitstream filters Anton Khirnov 2023-06-20 17:48 ` James Almer 2023-06-20 14:16 ` [FFmpeg-devel] [PATCH 9/9] lavc/decode: do not perform decoding when sending draining packets Anton Khirnov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=GV1P250MB0737A11936371A3FDCA7CE6E8F20A@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM \ --to=andreas.rheinhardt@outlook.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git