From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH 1/2] avcodec/decode: make ff_frame_new_side_data_from_buf behave like the function it's a wrapper for Date: Fri, 7 Feb 2025 13:17:49 +0100 Message-ID: <AS8P250MB0744F0C8B1B461D68A8A1FA78FF12@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM> (raw) In-Reply-To: <20250204211256.10228-1-jamrial@gmail.com> James Almer: > It's less confusing to have ff_frame_new_side_data_from_buf() be a drop in > replacement for av_frame_side_data_add(), and the addition of the missing flags > field will make it more versatile, as will be seen in the following commit. > > Signed-off-by: James Almer <jamrial@gmail.com> > --- > libavcodec/av1dec.c | 6 ++++-- > libavcodec/decode.c | 13 +++++-------- > libavcodec/decode.h | 11 +++++++---- > libavcodec/h2645_sei.c | 12 ++++++++---- > libavcodec/hevc/hevcdec.c | 7 +++++-- > libavcodec/hevc/refs.c | 6 ++++-- > libavcodec/libdav1d.c | 6 ++++-- > libavcodec/libjxldec.c | 6 ++++-- > libavcodec/mpeg12dec.c | 6 ++++-- > 9 files changed, 45 insertions(+), 28 deletions(-) > > diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c > index 7c54e36220..11b6100f9f 100644 > --- a/libavcodec/av1dec.c > +++ b/libavcodec/av1dec.c > @@ -983,9 +983,11 @@ static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame, > if (!ret) > break; > > - ret = ff_frame_new_side_data_from_buf(avctx, frame, AV_FRAME_DATA_A53_CC, &buf); > - if (ret < 0) > + ret = ff_frame_new_side_data_from_buf(avctx, frame, AV_FRAME_DATA_A53_CC, &buf, 0); > + if (ret < 0) { > + av_buffer_unref(&buf); > return ret; > + } > > #if FF_API_CODEC_PROPS > FF_DISABLE_DEPRECATION_WARNINGS > diff --git a/libavcodec/decode.c b/libavcodec/decode.c > index cac7e620d2..794e84c1a2 100644 > --- a/libavcodec/decode.c > +++ b/libavcodec/decode.c > @@ -2118,29 +2118,26 @@ int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, > int ff_frame_new_side_data_from_buf_ext(const AVCodecContext *avctx, > AVFrameSideData ***sd, int *nb_sd, > enum AVFrameSideDataType type, > - AVBufferRef **buf) > + AVBufferRef **buf, int flags) > { > int ret = 0; > > if (side_data_pref(avctx, sd, nb_sd, type)) > - goto finish; > + return 0; > > - if (!av_frame_side_data_add(sd, nb_sd, type, buf, 0)) > + if (!av_frame_side_data_add(sd, nb_sd, type, buf, flags)) > ret = AVERROR(ENOMEM); > > -finish: > - av_buffer_unref(buf); > - > return ret; > } > > int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, > AVFrame *frame, enum AVFrameSideDataType type, > - AVBufferRef **buf) > + AVBufferRef **buf, int flags) > { > return ff_frame_new_side_data_from_buf_ext(avctx, > &frame->side_data, &frame->nb_side_data, > - type, buf); > + type, buf, flags); > } > > int ff_decode_mastering_display_new_ext(const AVCodecContext *avctx, > diff --git a/libavcodec/decode.h b/libavcodec/decode.h > index 2c3719a8d0..dc2802d782 100644 > --- a/libavcodec/decode.h > +++ b/libavcodec/decode.h > @@ -168,12 +168,15 @@ int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, > /** > * Similar to `ff_frame_new_side_data`, but using an existing buffer ref. > * > - * *buf is ALWAYS consumed by this function and NULL written in its place, even > - * on failure. > + * @param buf Pointer to AVBufferRef to add to the array. On success, > + * the function takes ownership of the AVBufferRef and *buf is > + * set to NULL, unless AV_FRAME_SIDE_DATA_FLAG_NEW_REF is set > + * in which case the ownership will remain with the caller. > + * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0. > */ > int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, > AVFrame *frame, enum AVFrameSideDataType type, > - AVBufferRef **buf); > + AVBufferRef **buf, int flags); > > /** > * Same as `ff_frame_new_side_data_from_buf`, but taking a AVFrameSideData > @@ -182,7 +185,7 @@ int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, > int ff_frame_new_side_data_from_buf_ext(const AVCodecContext *avctx, > AVFrameSideData ***sd, int *nb_sd, > enum AVFrameSideDataType type, > - AVBufferRef **buf); > + AVBufferRef **buf, int flags); > > struct AVMasteringDisplayMetadata; > struct AVContentLightMetadata; > diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c > index 2494daaf3c..d48a9b5f2c 100644 > --- a/libavcodec/h2645_sei.c > +++ b/libavcodec/h2645_sei.c > @@ -610,10 +610,12 @@ static int h2645_sei_to_side_data(AVCodecContext *avctx, H2645SEI *sei, > } > > ret = ff_frame_new_side_data_from_buf_ext(avctx, sd, nb_sd, > - AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, &buf); > + AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, &buf, 0); > > - if (ret < 0) > + if (ret < 0) { > + av_buffer_unref(&buf); > return ret; > + } > > dst_env->ambient_illuminance = av_make_q(env->ambient_illuminance, 10000); > dst_env->ambient_light_x = av_make_q(env->ambient_light_x, 50000); > @@ -830,9 +832,11 @@ FF_ENABLE_DEPRECATION_WARNINGS > > if (sei->lcevc.info) { > HEVCSEILCEVC *lcevc = &sei->lcevc; > - ret = ff_frame_new_side_data_from_buf(avctx, frame, AV_FRAME_DATA_LCEVC, &lcevc->info); > - if (ret < 0) > + ret = ff_frame_new_side_data_from_buf(avctx, frame, AV_FRAME_DATA_LCEVC, &lcevc->info, 0); > + if (ret < 0) { > + av_buffer_unref(&lcevc->info); > return ret; > + } > } > > if (sei->film_grain_characteristics && sei->film_grain_characteristics->present) { > diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c > index e9c045f7a1..cf4062c75c 100644 > --- a/libavcodec/hevc/hevcdec.c > +++ b/libavcodec/hevc/hevcdec.c > @@ -3085,9 +3085,12 @@ static int set_side_data(HEVCContext *s) > if (!info_ref) > return AVERROR(ENOMEM); > > - ret = ff_frame_new_side_data_from_buf(s->avctx, out, AV_FRAME_DATA_DYNAMIC_HDR_PLUS, &info_ref); > - if (ret < 0) > + ret = ff_frame_new_side_data_from_buf(s->avctx, out, AV_FRAME_DATA_DYNAMIC_HDR_PLUS, > + &info_ref, 0); > + if (ret < 0) { > + av_buffer_unref(&info_ref); > return ret; > + } > } > > if (s->rpu_buf) { > diff --git a/libavcodec/hevc/refs.c b/libavcodec/hevc/refs.c > index dd7f7f95a8..04cecd9770 100644 > --- a/libavcodec/hevc/refs.c > +++ b/libavcodec/hevc/refs.c > @@ -97,9 +97,11 @@ static HEVCFrame *alloc_frame(HEVCContext *s, HEVCLayerContext *l) > if (s->sei.common.lcevc.info) { > HEVCSEILCEVC *lcevc = &s->sei.common.lcevc; > ret = ff_frame_new_side_data_from_buf(s->avctx, frame->tf.f, > - AV_FRAME_DATA_LCEVC, &lcevc->info); > - if (ret < 0) > + AV_FRAME_DATA_LCEVC, &lcevc->info, 0); > + if (ret < 0) { > + av_buffer_unref(&lcevc->info); > goto fail; > + } > } > > // add view ID side data if it's nontrivial > diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c > index f4cbc927b5..d2c7342e55 100644 > --- a/libavcodec/libdav1d.c > +++ b/libavcodec/libdav1d.c > @@ -533,9 +533,11 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) > if (!res) > break; > > - res = ff_frame_new_side_data_from_buf(c, frame, AV_FRAME_DATA_A53_CC, &buf); > - if (res < 0) > + res = ff_frame_new_side_data_from_buf(c, frame, AV_FRAME_DATA_A53_CC, &buf, 0); > + if (res < 0) { > + av_buffer_unref(&buf); > goto fail; > + } > > #if FF_API_CODEC_PROPS > FF_DISABLE_DEPRECATION_WARNINGS > diff --git a/libavcodec/libjxldec.c b/libavcodec/libjxldec.c > index 96c338d1b4..a9261f5016 100644 > --- a/libavcodec/libjxldec.c > +++ b/libavcodec/libjxldec.c > @@ -483,9 +483,11 @@ static int libjxl_receive_frame(AVCodecContext *avctx, AVFrame *frame) > /* full image is one frame, even if animated */ > av_log(avctx, AV_LOG_DEBUG, "FULL_IMAGE event emitted\n"); > if (ctx->iccp) { > - ret = ff_frame_new_side_data_from_buf(avctx, ctx->frame, AV_FRAME_DATA_ICC_PROFILE, &ctx->iccp); > - if (ret < 0) > + ret = ff_frame_new_side_data_from_buf(avctx, ctx->frame, AV_FRAME_DATA_ICC_PROFILE, &ctx->iccp, 0); > + if (ret < 0) { > + av_buffer_unref(&ctx->iccp); > return ret; > + } > } > if (ctx->basic_info.have_animation) { > ctx->frame->pts = av_rescale_q(ctx->accumulated_pts, ctx->anim_timebase, avctx->pkt_timebase); > diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c > index 0002f016e9..b181852b6e 100644 > --- a/libavcodec/mpeg12dec.c > +++ b/libavcodec/mpeg12dec.c > @@ -1308,9 +1308,11 @@ static int mpeg_field_start(Mpeg1Context *s1, const uint8_t *buf, int buf_size) > if (s1->a53_buf_ref) { > ret = ff_frame_new_side_data_from_buf( > s->avctx, s->cur_pic.ptr->f, AV_FRAME_DATA_A53_CC, > - &s1->a53_buf_ref); > - if (ret < 0) > + &s1->a53_buf_ref, 0); > + if (ret < 0) { > + av_buffer_unref(&s1->a53_buf_ref); This adds these cleanup av_buffer_unref() everywhere. That is not an improvement. > return ret; > + } > } > > if (s1->has_stereo3d) { _______________________________________________ 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:[~2025-02-07 12:18 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2025-02-04 21:12 James Almer 2025-02-04 21:12 ` [FFmpeg-devel] [PATCH 2/2] avcodec/hevc/hevcdec: simplify creating a new reference to HDR10 side data James Almer 2025-02-07 12:17 ` Andreas Rheinhardt [this message] 2025-02-07 16:22 ` [FFmpeg-devel] [PATCH 1/2] avcodec/decode: make ff_frame_new_side_data_from_buf behave like the function it's a wrapper for James Almer
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=AS8P250MB0744F0C8B1B461D68A8A1FA78FF12@AS8P250MB0744.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