* [FFmpeg-devel] [PATCH 1/2] avcodec/decode: make ff_frame_new_side_data_from_buf behave like the function it's a wrapper for
@ 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
0 siblings, 1 reply; 2+ messages in thread
From: James Almer @ 2025-02-04 21:12 UTC (permalink / raw)
To: ffmpeg-devel
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);
return ret;
+ }
}
if (s1->has_stereo3d) {
--
2.48.1
_______________________________________________
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".
^ permalink raw reply [flat|nested] 2+ messages in thread
* [FFmpeg-devel] [PATCH 2/2] avcodec/hevc/hevcdec: simplify creating a new reference to HDR10 side data
2025-02-04 21:12 [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
@ 2025-02-04 21:12 ` James Almer
0 siblings, 0 replies; 2+ messages in thread
From: James Almer @ 2025-02-04 21:12 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/hevc/hevcdec.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index cf4062c75c..24d801c39f 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -3081,16 +3081,11 @@ static int set_side_data(HEVCContext *s)
}
if (s->sei.common.dynamic_hdr_plus.info) {
- AVBufferRef *info_ref = av_buffer_ref(s->sei.common.dynamic_hdr_plus.info);
- 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, 0);
- if (ret < 0) {
- av_buffer_unref(&info_ref);
+ &s->sei.common.dynamic_hdr_plus.info,
+ AV_FRAME_SIDE_DATA_FLAG_NEW_REF);
+ if (ret < 0)
return ret;
- }
}
if (s->rpu_buf) {
--
2.48.1
_______________________________________________
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".
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-02-04 21:13 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-02-04 21:12 [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
2025-02-04 21:12 ` [FFmpeg-devel] [PATCH 2/2] avcodec/hevc/hevcdec: simplify creating a new reference to HDR10 side data James Almer
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