* [FFmpeg-devel] [PATCH 1/5] avutil/frame: add helper for adding side data w/ AVBufferRef to array
@ 2024-03-22 23:31 James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 2/5] avutil/frame: add helper to remove side data of a given type from an array James Almer
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: James Almer @ 2024-03-22 23:31 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
Now taking ownership of the passed in buffer, as Anton suggested.
libavutil/frame.c | 22 ++++++++++++++++++++++
libavutil/frame.h | 23 +++++++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index d7a32cdc92..0717d89711 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -782,6 +782,28 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
return ret;
}
+AVFrameSideData *av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd,
+ enum AVFrameSideDataType type,
+ AVBufferRef **buf,
+ unsigned int flags)
+{
+ AVFrameSideData *sd_dst = NULL;
+
+ if (!sd || !buf || !nb_sd || (*nb_sd && !*sd))
+ return NULL;
+
+ if (flags & AV_FRAME_SIDE_DATA_FLAG_UNIQUE)
+ remove_side_data(sd, nb_sd, type);
+
+ sd_dst = add_side_data_from_buf(sd, nb_sd, type, *buf);
+ if (!sd_dst)
+ return NULL;
+
+ *buf = NULL;
+
+ return sd_dst;
+}
+
int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd,
const AVFrameSideData *src, unsigned int flags)
{
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 373866c600..e3733ce928 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -1021,6 +1021,29 @@ AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
enum AVFrameSideDataType type,
size_t size, unsigned int flags);
+/**
+ * Add a new side data entry to an array from an existing AVBufferRef.
+ *
+ * @param sd pointer to array of side data to which to add another entry,
+ * or to NULL in order to start a new array.
+ * @param nb_sd pointer to an integer containing the number of entries in
+ * the array.
+ * @param type type of the added side data
+ * @param buf Pointer to AVBufferRef to add to the array. On success,
+ * the ownership of the AVBufferRef is transferred to the frame
+ * and *buf is set to NULL.
+ * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.
+ *
+ * @return newly added side data on success, NULL on error. In case of
+ * AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of matching
+ * AVFrameSideDataType will be removed before the addition is
+ * attempted.
+ */
+AVFrameSideData *av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd,
+ enum AVFrameSideDataType type,
+ AVBufferRef **buf,
+ unsigned int flags);
+
/**
* Add a new side data entry to an array based on existing side data, taking
* a reference towards the contained AVBufferRef.
--
2.44.0
_______________________________________________
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] 5+ messages in thread
* [FFmpeg-devel] [PATCH 2/5] avutil/frame: add helper to remove side data of a given type from an array
2024-03-22 23:31 [FFmpeg-devel] [PATCH 1/5] avutil/frame: add helper for adding side data w/ AVBufferRef to array James Almer
@ 2024-03-22 23:31 ` James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 3/5] avutil/mastering_display_metadata: add a new allocator function that returns a size James Almer
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: James Almer @ 2024-03-22 23:31 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavutil/frame.c | 6 ++++++
libavutil/frame.h | 5 +++++
2 files changed, 11 insertions(+)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index 0717d89711..3e225ce5a4 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -847,6 +847,12 @@ const AVFrameSideData *av_frame_side_data_get_c(const AVFrameSideData * const *s
return NULL;
}
+void av_frame_side_data_remove(AVFrameSideData ***sd, int *nb_sd,
+ enum AVFrameSideDataType type)
+{
+ remove_side_data(sd, nb_sd, type);
+}
+
AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
enum AVFrameSideDataType type)
{
diff --git a/libavutil/frame.h b/libavutil/frame.h
index e3733ce928..671f75698c 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -1093,6 +1093,11 @@ const AVFrameSideData *av_frame_side_data_get(AVFrameSideData * const *sd,
nb_sd, type);
}
+/**
+ * Remove and free all side data instances of the given type from an array.
+ */
+void av_frame_side_data_remove(AVFrameSideData ***sd, int *nb_sd,
+ enum AVFrameSideDataType type);
/**
* @}
*/
--
2.44.0
_______________________________________________
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] 5+ messages in thread
* [FFmpeg-devel] [PATCH 3/5] avutil/mastering_display_metadata: add a new allocator function that returns a size
2024-03-22 23:31 [FFmpeg-devel] [PATCH 1/5] avutil/frame: add helper for adding side data w/ AVBufferRef to array James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 2/5] avutil/frame: add helper to remove side data of a given type from an array James Almer
@ 2024-03-22 23:31 ` James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 4/5] avcodec/decode: make the AVFrameSideData helper wrappers not depend on frames James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 5/5] avcodec/hevcdec: export global side data in AVCodecContext James Almer
3 siblings, 0 replies; 5+ messages in thread
From: James Almer @ 2024-03-22 23:31 UTC (permalink / raw)
To: ffmpeg-devel
av_mastering_display_metadata_alloc() is not useful in scenarios where you need to
know the runtime size of AVMasteringDisplayMetadata.
Signed-off-by: James Almer <jamrial@gmail.com>
---
Could also name it av_mastering_display_metadata_alloc2()
libavutil/mastering_display_metadata.c | 13 +++++++++++++
libavutil/mastering_display_metadata.h | 9 +++++++++
2 files changed, 22 insertions(+)
diff --git a/libavutil/mastering_display_metadata.c b/libavutil/mastering_display_metadata.c
index 6069347617..ea41f13f9d 100644
--- a/libavutil/mastering_display_metadata.c
+++ b/libavutil/mastering_display_metadata.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <stddef.h>
#include <stdint.h>
#include <string.h>
@@ -29,6 +30,18 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void)
return av_mallocz(sizeof(AVMasteringDisplayMetadata));
}
+AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc_size(size_t *size)
+{
+ AVMasteringDisplayMetadata *mastering = av_mallocz(sizeof(AVMasteringDisplayMetadata));
+ if (!mastering)
+ return NULL;
+
+ if (size)
+ *size = sizeof(*mastering);
+
+ return mastering;
+}
+
AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame)
{
AVFrameSideData *side_data = av_frame_new_side_data(frame,
diff --git a/libavutil/mastering_display_metadata.h b/libavutil/mastering_display_metadata.h
index c23b07c3cd..52fcef9e37 100644
--- a/libavutil/mastering_display_metadata.h
+++ b/libavutil/mastering_display_metadata.h
@@ -77,6 +77,15 @@ typedef struct AVMasteringDisplayMetadata {
*/
AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void);
+/**
+ * Allocate an AVMasteringDisplayMetadata structure and set its fields to
+ * default values. The resulting struct can be freed using av_freep().
+ *
+ * @return An AVMasteringDisplayMetadata filled with default values or NULL
+ * on failure.
+ */
+AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc_size(size_t *size);
+
/**
* Allocate a complete AVMasteringDisplayMetadata and add it to the frame.
*
--
2.44.0
_______________________________________________
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] 5+ messages in thread
* [FFmpeg-devel] [PATCH 4/5] avcodec/decode: make the AVFrameSideData helper wrappers not depend on frames
2024-03-22 23:31 [FFmpeg-devel] [PATCH 1/5] avutil/frame: add helper for adding side data w/ AVBufferRef to array James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 2/5] avutil/frame: add helper to remove side data of a given type from an array James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 3/5] avutil/mastering_display_metadata: add a new allocator function that returns a size James Almer
@ 2024-03-22 23:31 ` James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 5/5] avcodec/hevcdec: export global side data in AVCodecContext James Almer
3 siblings, 0 replies; 5+ messages in thread
From: James Almer @ 2024-03-22 23:31 UTC (permalink / raw)
To: ffmpeg-devel
They can be useful to fill arrays stored in other structs.
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/av1dec.c | 7 +--
libavcodec/cri.c | 3 +-
libavcodec/decode.c | 98 ++++++++++++++++++++++++++---------------
libavcodec/decode.h | 28 ++++++------
libavcodec/dpx.c | 3 +-
libavcodec/h2645_sei.c | 4 +-
libavcodec/h264_slice.c | 3 +-
libavcodec/hevcdec.c | 6 ++-
libavcodec/libdav1d.c | 7 +--
libavcodec/libjxldec.c | 3 +-
libavcodec/mjpegdec.c | 3 +-
libavcodec/mpeg12dec.c | 11 +++--
libavcodec/pngdec.c | 8 ++--
libavcodec/qsvdec.c | 4 +-
libavcodec/tiff.c | 3 +-
libavcodec/webp.c | 3 +-
16 files changed, 118 insertions(+), 76 deletions(-)
diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c
index 4d074c3908..d130244f13 100644
--- a/libavcodec/av1dec.c
+++ b/libavcodec/av1dec.c
@@ -964,7 +964,8 @@ 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, NULL);
+ ret = ff_frame_new_side_data_from_buf(avctx, &frame->side_data, &frame->nb_side_data,
+ AV_FRAME_DATA_A53_CC, &buf);
if (ret < 0)
return ret;
@@ -1028,7 +1029,7 @@ static int export_metadata(AVCodecContext *avctx, AVFrame *frame)
if (s->mdcv) {
AVMasteringDisplayMetadata *mastering;
- ret = ff_decode_mastering_display_new(avctx, frame, &mastering);
+ ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &mastering);
if (ret < 0)
return ret;
@@ -1051,7 +1052,7 @@ static int export_metadata(AVCodecContext *avctx, AVFrame *frame)
if (s->cll) {
AVContentLightMetadata *light;
- ret = ff_decode_content_light_new(avctx, frame, &light);
+ ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &light);
if (ret < 0)
return ret;
diff --git a/libavcodec/cri.c b/libavcodec/cri.c
index 990e52ac99..94468e7515 100644
--- a/libavcodec/cri.c
+++ b/libavcodec/cri.c
@@ -398,7 +398,8 @@ skip:
}
if (hflip || vflip) {
- ff_frame_new_side_data(avctx, p, AV_FRAME_DATA_DISPLAYMATRIX,
+ ff_frame_new_side_data(avctx, &p->side_data, &p->nb_side_data,
+ AV_FRAME_DATA_DISPLAYMATRIX,
sizeof(int32_t) * 9, &rotation);
if (rotation) {
av_display_rotation_set((int32_t *)rotation->data, 0.f);
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 34bcb7cc64..e6b32fcb26 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1799,87 +1799,115 @@ int ff_decode_preinit(AVCodecContext *avctx)
* @retval 0 side data of this type can be added to frame
* @retval 1 side data of this type should not be added to frame
*/
-static int side_data_pref(const AVCodecContext *avctx, AVFrame *frame,
- enum AVFrameSideDataType type)
+static int side_data_pref(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, enum AVFrameSideDataType type)
{
DecodeContext *dc = decode_ctx(avctx->internal);
// Note: could be skipped for `type` without corresponding packet sd
- if (av_frame_get_side_data(frame, type)) {
+ if (av_frame_side_data_get(*sd, *nb_sd, type)) {
if (dc->side_data_pref_mask & (1ULL << type))
return 1;
- av_frame_remove_side_data(frame, type);
+ av_frame_side_data_remove(sd, nb_sd, type);
}
return 0;
}
-
-int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame,
- enum AVFrameSideDataType type, size_t size,
+int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, enum AVFrameSideDataType type, size_t size,
AVFrameSideData **psd)
{
- AVFrameSideData *sd;
-
- if (side_data_pref(avctx, frame, type)) {
+ if (side_data_pref(avctx, sd, nb_sd, type)) {
if (psd)
*psd = NULL;
return 0;
}
- sd = av_frame_new_side_data(frame, type, size);
- if (psd)
- *psd = sd;
+ *psd = av_frame_side_data_new(sd, nb_sd, type, size, AV_FRAME_SIDE_DATA_FLAG_UNIQUE);
- return sd ? 0 : AVERROR(ENOMEM);
+ return *psd ? 0 : AVERROR(ENOMEM);
}
-int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx,
- AVFrame *frame, enum AVFrameSideDataType type,
- AVBufferRef **buf, AVFrameSideData **psd)
+int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, enum AVFrameSideDataType type,
+ AVBufferRef **buf)
{
- AVFrameSideData *sd = NULL;
int ret = 0;
- if (side_data_pref(avctx, frame, type))
+ if (side_data_pref(avctx, sd, nb_sd, type))
goto finish;
- sd = av_frame_new_side_data_from_buf(frame, type, *buf);
- if (sd)
- *buf = NULL;
- else
+ if (!av_frame_side_data_add(sd, nb_sd, type, buf,
+ AV_FRAME_SIDE_DATA_FLAG_UNIQUE))
ret = AVERROR(ENOMEM);
finish:
av_buffer_unref(buf);
- if (psd)
- *psd = sd;
return ret;
}
-int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame,
- AVMasteringDisplayMetadata **mdm)
+int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, AVMasteringDisplayMetadata **mdm)
{
- if (side_data_pref(avctx, frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA)) {
+ AVBufferRef *buf;
+ size_t size;
+
+ if (side_data_pref(avctx, sd, nb_sd, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA)) {
*mdm = NULL;
return 0;
}
- *mdm = av_mastering_display_metadata_create_side_data(frame);
- return *mdm ? 0 : AVERROR(ENOMEM);
+ *mdm = av_mastering_display_metadata_alloc_size(&size);
+ if (!*mdm)
+ return AVERROR(ENOMEM);
+
+ buf = av_buffer_create((uint8_t *)*mdm, size, NULL, NULL, 0);
+ if (!buf) {
+ av_freep(mdm);
+ return AVERROR(ENOMEM);
+ }
+
+ if (!av_frame_side_data_add(sd, nb_sd, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA,
+ &buf, AV_FRAME_SIDE_DATA_FLAG_UNIQUE)) {
+ *mdm = NULL;
+ av_buffer_unref(&buf);
+ return AVERROR(ENOMEM);
+ }
+
+ return 0;
}
-int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame,
- AVContentLightMetadata **clm)
+int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, AVContentLightMetadata **clm)
{
- if (side_data_pref(avctx, frame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) {
+ AVBufferRef *buf;
+ size_t size;
+
+ if (side_data_pref(avctx, sd, nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) {
*clm = NULL;
return 0;
}
- *clm = av_content_light_metadata_create_side_data(frame);
- return *clm ? 0 : AVERROR(ENOMEM);
+ *clm = av_content_light_metadata_alloc(&size);
+ if (!*clm)
+ return AVERROR(ENOMEM);
+
+ buf = av_buffer_create((uint8_t *)*clm, size, NULL, NULL, 0);
+ if (!buf) {
+ av_freep(clm);
+ return AVERROR(ENOMEM);
+ }
+
+ if (!av_frame_side_data_add(sd, nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+ &buf, AV_FRAME_SIDE_DATA_FLAG_UNIQUE)) {
+ *clm = NULL;
+ av_buffer_unref(&buf);
+ return AVERROR(ENOMEM);
+ }
+
+ return 0;
}
int ff_copy_palette(void *dst, const AVPacket *src, void *logctx)
diff --git a/libavcodec/decode.h b/libavcodec/decode.h
index 4ffbd9db8e..1026c9dae9 100644
--- a/libavcodec/decode.h
+++ b/libavcodec/decode.h
@@ -156,14 +156,14 @@ const AVPacketSideData *ff_get_coded_side_data(const AVCodecContext *avctx,
enum AVPacketSideDataType type);
/**
- * Wrapper around av_frame_new_side_data, which rejects side data overridden by
+ * Wrapper around av_frame_side_data_new, which rejects side data overridden by
* the demuxer. Returns 0 on success, and a negative error code otherwise.
- * If successful and sd is not NULL, *sd may either contain a pointer to the new
+ * If successful and psd is not NULL, *psd may either contain a pointer to the new
* side data, or NULL in case the side data was already present.
*/
-int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame,
- enum AVFrameSideDataType type, size_t size,
- AVFrameSideData **sd);
+int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, enum AVFrameSideDataType type, size_t size,
+ AVFrameSideData **psd);
/**
* Similar to `ff_frame_new_side_data`, but using an existing buffer ref.
@@ -171,29 +171,29 @@ int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame,
* *buf is ALWAYS consumed by this function and NULL written in its place, even
* on failure.
*/
-int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx,
- AVFrame *frame, enum AVFrameSideDataType type,
- AVBufferRef **buf, AVFrameSideData **sd);
+int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, enum AVFrameSideDataType type,
+ AVBufferRef **buf);
struct AVMasteringDisplayMetadata;
struct AVContentLightMetadata;
/**
- * Wrapper around av_mastering_display_metadata_create_side_data(), which
+ * Similar to av_mastering_display_metadata_create_side_data(), but
* rejects side data overridden by the demuxer. Returns 0 on success, and a
* negative error code otherwise. If successful, *mdm may either be a pointer to
* the new side data, or NULL in case the side data was already present.
*/
-int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame,
- struct AVMasteringDisplayMetadata **mdm);
+int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, struct AVMasteringDisplayMetadata **mdm);
/**
- * Wrapper around av_content_light_metadata_create_side_data(), which
+ * Similar to av_content_light_metadata_create_side_data(), but
* rejects side data overridden by the demuxer. Returns 0 on success, and a
* negative error code otherwise. If successful, *clm may either be a pointer to
* the new side data, or NULL in case the side data was already present.
*/
-int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame,
- struct AVContentLightMetadata **clm);
+int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrameSideData ***sd,
+ int *nb_sd, struct AVContentLightMetadata **clm);
#endif /* AVCODEC_DECODE_H */
diff --git a/libavcodec/dpx.c b/libavcodec/dpx.c
index 80616d98a2..ff9115bf86 100644
--- a/libavcodec/dpx.c
+++ b/libavcodec/dpx.c
@@ -288,7 +288,8 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *p,
if (i != 0xFFFFFFFF) {
AVFrameSideData *tcside;
- ret = ff_frame_new_side_data(avctx, p, AV_FRAME_DATA_S12M_TIMECODE,
+ ret = ff_frame_new_side_data(avctx, &p->side_data, &p->nb_side_data,
+ AV_FRAME_DATA_S12M_TIMECODE,
sizeof(uint32_t) * 4, &tcside);
if (ret < 0)
return ret;
diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
index e8eb15524f..2e098d1069 100644
--- a/libavcodec/h2645_sei.c
+++ b/libavcodec/h2645_sei.c
@@ -716,7 +716,7 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
int i;
AVMasteringDisplayMetadata *metadata;
- ret = ff_decode_mastering_display_new(avctx, frame, &metadata);
+ ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &metadata);
if (ret < 0)
return ret;
@@ -759,7 +759,7 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
if (sei->content_light.present) {
AVContentLightMetadata *metadata;
- ret = ff_decode_content_light_new(avctx, frame, &metadata);
+ ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &metadata);
if (ret < 0)
return ret;
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index e9a404e41b..6d9d2ddc14 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1253,7 +1253,8 @@ static int h264_export_frame_props(H264Context *h)
uint32_t *tc_sd;
char tcbuf[AV_TIMECODE_STR_SIZE];
AVFrameSideData *tcside;
- ret = ff_frame_new_side_data(h->avctx, out, AV_FRAME_DATA_S12M_TIMECODE,
+ ret = ff_frame_new_side_data(h->avctx, &out->side_data, &out->nb_side_data,
+ AV_FRAME_DATA_S12M_TIMECODE,
sizeof(uint32_t)*4, &tcside);
if (ret < 0)
return ret;
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 76aa6b4588..565c94cf95 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -2789,7 +2789,8 @@ static int set_side_data(HEVCContext *s)
uint32_t *tc_sd;
char tcbuf[AV_TIMECODE_STR_SIZE];
AVFrameSideData *tcside;
- ret = ff_frame_new_side_data(s->avctx, out, AV_FRAME_DATA_S12M_TIMECODE,
+ ret = ff_frame_new_side_data(s->avctx, &out->side_data, &out->nb_side_data,
+ AV_FRAME_DATA_S12M_TIMECODE,
sizeof(uint32_t) * 4, &tcside);
if (ret < 0)
return ret;
@@ -2819,7 +2820,8 @@ 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, NULL);
+ ret = ff_frame_new_side_data_from_buf(s->avctx, &out->side_data, &out->nb_side_data,
+ AV_FRAME_DATA_DYNAMIC_HDR_PLUS, &info_ref);
if (ret < 0)
return ret;
}
diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c
index 17b0743cf0..4c65bfc18b 100644
--- a/libavcodec/libdav1d.c
+++ b/libavcodec/libdav1d.c
@@ -471,7 +471,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
if (p->mastering_display) {
AVMasteringDisplayMetadata *mastering;
- res = ff_decode_mastering_display_new(c, frame, &mastering);
+ res = ff_decode_mastering_display_new(c, &frame->side_data, &frame->nb_side_data, &mastering);
if (res < 0)
goto fail;
@@ -493,7 +493,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
if (p->content_light) {
AVContentLightMetadata *light;
- res = ff_decode_content_light_new(c, frame, &light);
+ res = ff_decode_content_light_new(c, &frame->side_data, &frame->nb_side_data, &light);
if (res < 0)
goto fail;
@@ -528,7 +528,8 @@ 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, NULL);
+ res = ff_frame_new_side_data_from_buf(c, &frame->side_data, &frame->nb_side_data,
+ AV_FRAME_DATA_A53_CC, &buf);
if (res < 0)
goto fail;
diff --git a/libavcodec/libjxldec.c b/libavcodec/libjxldec.c
index d57a27418f..6e95c79177 100644
--- a/libavcodec/libjxldec.c
+++ b/libavcodec/libjxldec.c
@@ -483,7 +483,8 @@ 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, NULL);
+ ret = ff_frame_new_side_data_from_buf(avctx, &ctx->frame->side_data, &ctx->frame->nb_side_data,
+ AV_FRAME_DATA_ICC_PROFILE, &ctx->iccp);
if (ret < 0)
return ret;
}
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index c9409eac6c..89443dc4cd 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -2839,7 +2839,8 @@ the_end:
for (i = 0; i < s->iccnum; i++)
total_size += s->iccentries[i].length;
- ret = ff_frame_new_side_data(avctx, frame, AV_FRAME_DATA_ICC_PROFILE, total_size, &sd);
+ ret = ff_frame_new_side_data(avctx, &frame->side_data, &frame->nb_side_data,
+ AV_FRAME_DATA_ICC_PROFILE, total_size, &sd);
if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
return ret;
diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
index 4ad1eb6572..2665ee2f95 100644
--- a/libavcodec/mpeg12dec.c
+++ b/libavcodec/mpeg12dec.c
@@ -1314,7 +1314,8 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
}
}
- ret = ff_frame_new_side_data(s->avctx, s->current_picture_ptr->f,
+ ret = ff_frame_new_side_data(s->avctx, &s->current_picture_ptr->f->side_data,
+ &s->current_picture_ptr->f->nb_side_data,
AV_FRAME_DATA_PANSCAN, sizeof(s1->pan_scan),
&pan_scan);
if (ret < 0)
@@ -1324,8 +1325,9 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
if (s1->a53_buf_ref) {
ret = ff_frame_new_side_data_from_buf(
- s->avctx, s->current_picture_ptr->f, AV_FRAME_DATA_A53_CC,
- &s1->a53_buf_ref, NULL);
+ s->avctx, &s->current_picture_ptr->f->side_data,
+ &s->current_picture_ptr->f->nb_side_data,
+ AV_FRAME_DATA_A53_CC, &s1->a53_buf_ref);
if (ret < 0)
return ret;
}
@@ -1341,7 +1343,8 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
if (s1->has_afd) {
AVFrameSideData *sd;
- ret = ff_frame_new_side_data(s->avctx, s->current_picture_ptr->f,
+ ret = ff_frame_new_side_data(s->avctx, &s->current_picture_ptr->f->side_data,
+ &s->current_picture_ptr->f->nb_side_data,
AV_FRAME_DATA_AFD, 1, &sd);
if (ret < 0)
return ret;
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index de50e6a5b6..68c25cb5bd 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -680,8 +680,8 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame)
}
} else if (s->iccp_data) {
AVFrameSideData *sd;
- ret = ff_frame_new_side_data(avctx, frame, AV_FRAME_DATA_ICC_PROFILE,
- s->iccp_data_len, &sd);
+ ret = ff_frame_new_side_data(avctx, &frame->side_data, &frame->nb_side_data,
+ AV_FRAME_DATA_ICC_PROFILE, s->iccp_data_len, &sd);
if (ret < 0)
return ret;
if (sd) {
@@ -748,7 +748,7 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame)
if (s->have_clli) {
AVContentLightMetadata *clli;
- ret = ff_decode_content_light_new(avctx, frame, &clli);
+ ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &clli);
if (ret < 0)
return ret;
@@ -765,7 +765,7 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame)
if (s->have_mdvc) {
AVMasteringDisplayMetadata *mdvc;
- ret = ff_decode_mastering_display_new(avctx, frame, &mdvc);
+ ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &mdvc);
if (ret < 0)
return ret;
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index fd9267c6f4..de3ed3c357 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -661,7 +661,7 @@ static int qsv_export_hdr_side_data(AVCodecContext *avctx, mfxExtMasteringDispla
const int luma_den = 10000;
int i;
- ret = ff_decode_mastering_display_new(avctx, frame, &mastering);
+ ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &mastering);
if (ret < 0)
return ret;
@@ -687,7 +687,7 @@ static int qsv_export_hdr_side_data(AVCodecContext *avctx, mfxExtMasteringDispla
if (clli->InsertPayloadToggle) {
AVContentLightMetadata *light;
- ret = ff_decode_content_light_new(avctx, frame, &light);
+ ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &light);
if (ret < 0)
return ret;
diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index 7ce1ab32f6..9cde2e60e1 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -1706,7 +1706,8 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
if (bytestream2_get_bytes_left(&gb_temp) < count)
return AVERROR_INVALIDDATA;
- ret = ff_frame_new_side_data(s->avctx, frame, AV_FRAME_DATA_ICC_PROFILE, count, &sd);
+ ret = ff_frame_new_side_data(s->avctx, &frame->side_data, &frame->nb_side_data,
+ AV_FRAME_DATA_ICC_PROFILE, count, &sd);
if (ret < 0)
return ret;
if (sd)
diff --git a/libavcodec/webp.c b/libavcodec/webp.c
index 9308ea2b69..ec23533ef2 100644
--- a/libavcodec/webp.c
+++ b/libavcodec/webp.c
@@ -1501,7 +1501,8 @@ exif_end:
s->has_iccp = 1;
- ret = ff_frame_new_side_data(avctx, p, AV_FRAME_DATA_ICC_PROFILE, chunk_size, &sd);
+ ret = ff_frame_new_side_data(avctx, &p->side_data, &p->nb_side_data,
+ AV_FRAME_DATA_ICC_PROFILE, chunk_size, &sd);
if (ret < 0)
return ret;
--
2.44.0
_______________________________________________
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] 5+ messages in thread
* [FFmpeg-devel] [PATCH 5/5] avcodec/hevcdec: export global side data in AVCodecContext
2024-03-22 23:31 [FFmpeg-devel] [PATCH 1/5] avutil/frame: add helper for adding side data w/ AVBufferRef to array James Almer
` (2 preceding siblings ...)
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 4/5] avcodec/decode: make the AVFrameSideData helper wrappers not depend on frames James Almer
@ 2024-03-22 23:31 ` James Almer
3 siblings, 0 replies; 5+ messages in thread
From: James Almer @ 2024-03-22 23:31 UTC (permalink / raw)
To: ffmpeg-devel
Signed-off-by: James Almer <jamrial@gmail.com>
---
libavcodec/avcodec.h | 2 +-
libavcodec/h2645_sei.c | 217 ++++++++++++++++++++++++-----------------
libavcodec/h2645_sei.h | 2 +
libavcodec/hevcdec.c | 4 +
4 files changed, 136 insertions(+), 89 deletions(-)
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 83dc487251..968009a192 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2071,7 +2071,7 @@ typedef struct AVCodecContext {
* - encoding: may be set by user before calling avcodec_open2() for
* encoder configuration. Afterwards owned and freed by the
* encoder.
- * - decoding: unused
+ * - decoding: may be set by libavcodec in avcodec_open2().
*/
AVFrameSideData **decoded_side_data;
int nb_decoded_side_data;
diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
index 2e098d1069..32bb4f841d 100644
--- a/libavcodec/h2645_sei.c
+++ b/libavcodec/h2645_sei.c
@@ -511,6 +511,124 @@ static int is_frame_packing_type_valid(SEIFpaType type, enum AVCodecID codec_id)
type >= SEI_FPA_TYPE_SIDE_BY_SIDE;
}
+static int h2645_sei_to_side_data(AVCodecContext *avctx, H2645SEI *sei,
+ AVFrameSideData ***sd, int *nb_sd)
+{
+ int ret;
+
+ for (unsigned i = 0; i < sei->unregistered.nb_buf_ref; i++) {
+ H2645SEIUnregistered *unreg = &sei->unregistered;
+ AVBufferRef *buf;
+
+ if (!unreg->buf_ref[i])
+ continue;
+
+ buf = av_buffer_ref(unreg->buf_ref[i]);
+ if (!buf)
+ return AVERROR(ENOMEM);
+
+ if (!av_frame_side_data_add(sd, nb_sd, AV_FRAME_DATA_SEI_UNREGISTERED, &buf, 0)) {
+ av_buffer_unref(&buf);
+ return AVERROR(ENOMEM);
+ }
+ }
+
+ if (sei->ambient_viewing_environment.present) {
+ H2645SEIAmbientViewingEnvironment *env =
+ &sei->ambient_viewing_environment;
+ AVBufferRef *buf;
+ size_t size;
+
+ AVAmbientViewingEnvironment *dst_env =
+ av_ambient_viewing_environment_alloc(&size);
+ if (!dst_env)
+ return AVERROR(ENOMEM);
+
+ buf = av_buffer_create((uint8_t *)dst_env, size, NULL, NULL, 0);
+ if (!buf) {
+ av_free(dst_env);
+ return AVERROR(ENOMEM);
+ }
+
+ ret = ff_frame_new_side_data_from_buf(avctx, sd, nb_sd,
+ AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, &buf);
+
+ if (ret < 0)
+ 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);
+ dst_env->ambient_light_y = av_make_q(env->ambient_light_y, 50000);
+ }
+
+ if (sei->mastering_display.present) {
+ // HEVC uses a g,b,r ordering, which we convert to a more natural r,g,b
+ const int mapping[3] = {2, 0, 1};
+ const int chroma_den = 50000;
+ const int luma_den = 10000;
+ int i;
+ AVMasteringDisplayMetadata *metadata;
+
+ ret = ff_decode_mastering_display_new(avctx, sd, nb_sd, &metadata);
+ if (ret < 0)
+ return ret;
+
+ if (metadata) {
+ for (i = 0; i < 3; i++) {
+ const int j = mapping[i];
+ metadata->display_primaries[i][0].num = sei->mastering_display.display_primaries[j][0];
+ metadata->display_primaries[i][0].den = chroma_den;
+ metadata->display_primaries[i][1].num = sei->mastering_display.display_primaries[j][1];
+ metadata->display_primaries[i][1].den = chroma_den;
+ }
+ metadata->white_point[0].num = sei->mastering_display.white_point[0];
+ metadata->white_point[0].den = chroma_den;
+ metadata->white_point[1].num = sei->mastering_display.white_point[1];
+ metadata->white_point[1].den = chroma_den;
+
+ metadata->max_luminance.num = sei->mastering_display.max_luminance;
+ metadata->max_luminance.den = luma_den;
+ metadata->min_luminance.num = sei->mastering_display.min_luminance;
+ metadata->min_luminance.den = luma_den;
+ metadata->has_luminance = 1;
+ metadata->has_primaries = 1;
+
+ av_log(avctx, AV_LOG_DEBUG, "Mastering Display Metadata:\n");
+ av_log(avctx, AV_LOG_DEBUG,
+ "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)\n",
+ av_q2d(metadata->display_primaries[0][0]),
+ av_q2d(metadata->display_primaries[0][1]),
+ av_q2d(metadata->display_primaries[1][0]),
+ av_q2d(metadata->display_primaries[1][1]),
+ av_q2d(metadata->display_primaries[2][0]),
+ av_q2d(metadata->display_primaries[2][1]),
+ av_q2d(metadata->white_point[0]), av_q2d(metadata->white_point[1]));
+ av_log(avctx, AV_LOG_DEBUG,
+ "min_luminance=%f, max_luminance=%f\n",
+ av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance));
+ }
+ }
+
+ if (sei->content_light.present) {
+ AVContentLightMetadata *metadata;
+
+ ret = ff_decode_content_light_new(avctx, sd, nb_sd, &metadata);
+ if (ret < 0)
+ return ret;
+
+ if (metadata) {
+ metadata->MaxCLL = sei->content_light.max_content_light_level;
+ metadata->MaxFALL = sei->content_light.max_pic_average_light_level;
+
+ av_log(avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n");
+ av_log(avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n",
+ metadata->MaxCLL, metadata->MaxFALL);
+ }
+ }
+
+ return 0;
+}
+
int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
enum AVCodecID codec_id,
AVCodecContext *avctx, const H2645VUI *vui,
@@ -607,17 +725,13 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
}
+ ret = h2645_sei_to_side_data(avctx, sei, &frame->side_data, &frame->nb_side_data);
+ if (ret < 0)
+ return ret;
+
for (unsigned i = 0; i < sei->unregistered.nb_buf_ref; i++) {
H2645SEIUnregistered *unreg = &sei->unregistered;
-
- if (unreg->buf_ref[i]) {
- AVFrameSideData *sd = av_frame_new_side_data_from_buf(frame,
- AV_FRAME_DATA_SEI_UNREGISTERED,
- unreg->buf_ref[i]);
- if (!sd)
- av_buffer_unref(&unreg->buf_ref[i]);
- unreg->buf_ref[i] = NULL;
- }
+ av_buffer_unref(&unreg->buf_ref[i]);
}
sei->unregistered.nb_buf_ref = 0;
@@ -694,88 +808,15 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
avctx->properties |= FF_CODEC_PROPERTY_FILM_GRAIN;
}
- if (sei->ambient_viewing_environment.present) {
- H2645SEIAmbientViewingEnvironment *env =
- &sei->ambient_viewing_environment;
-
- AVAmbientViewingEnvironment *dst_env =
- av_ambient_viewing_environment_create_side_data(frame);
- if (!dst_env)
- return AVERROR(ENOMEM);
-
- dst_env->ambient_illuminance = av_make_q(env->ambient_illuminance, 10000);
- dst_env->ambient_light_x = av_make_q(env->ambient_light_x, 50000);
- dst_env->ambient_light_y = av_make_q(env->ambient_light_y, 50000);
- }
-
- if (sei->mastering_display.present) {
- // HEVC uses a g,b,r ordering, which we convert to a more natural r,g,b
- const int mapping[3] = {2, 0, 1};
- const int chroma_den = 50000;
- const int luma_den = 10000;
- int i;
- AVMasteringDisplayMetadata *metadata;
-
- ret = ff_decode_mastering_display_new(avctx, &frame->side_data, &frame->nb_side_data, &metadata);
- if (ret < 0)
- return ret;
-
- if (metadata) {
- for (i = 0; i < 3; i++) {
- const int j = mapping[i];
- metadata->display_primaries[i][0].num = sei->mastering_display.display_primaries[j][0];
- metadata->display_primaries[i][0].den = chroma_den;
- metadata->display_primaries[i][1].num = sei->mastering_display.display_primaries[j][1];
- metadata->display_primaries[i][1].den = chroma_den;
- }
- metadata->white_point[0].num = sei->mastering_display.white_point[0];
- metadata->white_point[0].den = chroma_den;
- metadata->white_point[1].num = sei->mastering_display.white_point[1];
- metadata->white_point[1].den = chroma_den;
-
- metadata->max_luminance.num = sei->mastering_display.max_luminance;
- metadata->max_luminance.den = luma_den;
- metadata->min_luminance.num = sei->mastering_display.min_luminance;
- metadata->min_luminance.den = luma_den;
- metadata->has_luminance = 1;
- metadata->has_primaries = 1;
-
- av_log(avctx, AV_LOG_DEBUG, "Mastering Display Metadata:\n");
- av_log(avctx, AV_LOG_DEBUG,
- "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)\n",
- av_q2d(metadata->display_primaries[0][0]),
- av_q2d(metadata->display_primaries[0][1]),
- av_q2d(metadata->display_primaries[1][0]),
- av_q2d(metadata->display_primaries[1][1]),
- av_q2d(metadata->display_primaries[2][0]),
- av_q2d(metadata->display_primaries[2][1]),
- av_q2d(metadata->white_point[0]), av_q2d(metadata->white_point[1]));
- av_log(avctx, AV_LOG_DEBUG,
- "min_luminance=%f, max_luminance=%f\n",
- av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance));
- }
- }
-
- if (sei->content_light.present) {
- AVContentLightMetadata *metadata;
-
- ret = ff_decode_content_light_new(avctx, &frame->side_data, &frame->nb_side_data, &metadata);
- if (ret < 0)
- return ret;
-
- if (metadata) {
- metadata->MaxCLL = sei->content_light.max_content_light_level;
- metadata->MaxFALL = sei->content_light.max_pic_average_light_level;
-
- av_log(avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n");
- av_log(avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n",
- metadata->MaxCLL, metadata->MaxFALL);
- }
- }
-
return 0;
}
+int ff_h2645_sei_to_context(AVCodecContext *avctx, H2645SEI *sei)
+{
+ return h2645_sei_to_side_data(avctx, sei, &avctx->decoded_side_data,
+ &avctx->nb_decoded_side_data);
+}
+
void ff_h2645_sei_reset(H2645SEI *s)
{
av_buffer_unref(&s->a53_caption.buf_ref);
diff --git a/libavcodec/h2645_sei.h b/libavcodec/h2645_sei.h
index 0ebf48011a..1b55280c05 100644
--- a/libavcodec/h2645_sei.h
+++ b/libavcodec/h2645_sei.h
@@ -165,4 +165,6 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
unsigned bit_depth_luma, unsigned bit_depth_chroma,
int seed);
+int ff_h2645_sei_to_context(AVCodecContext *avctx, H2645SEI *sei);
+
#endif /* AVCODEC_H2645_SEI_H */
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 565c94cf95..17c77f0919 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -3643,6 +3643,10 @@ static av_cold int hevc_decode_init(AVCodecContext *avctx)
if (ret < 0) {
return ret;
}
+
+ ret = ff_h2645_sei_to_context(s->avctx, &s->sei.common);
+ if (ret < 0)
+ return ret;
}
sd = ff_get_coded_side_data(avctx, AV_PKT_DATA_DOVI_CONF);
--
2.44.0
_______________________________________________
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] 5+ messages in thread
end of thread, other threads:[~2024-03-22 23:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-22 23:31 [FFmpeg-devel] [PATCH 1/5] avutil/frame: add helper for adding side data w/ AVBufferRef to array James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 2/5] avutil/frame: add helper to remove side data of a given type from an array James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 3/5] avutil/mastering_display_metadata: add a new allocator function that returns a size James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 4/5] avcodec/decode: make the AVFrameSideData helper wrappers not depend on frames James Almer
2024-03-22 23:31 ` [FFmpeg-devel] [PATCH 5/5] avcodec/hevcdec: export global side data in AVCodecContext 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