aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.dev>2024-06-14 20:32:58 +0200
committerNiklas Haas <git@haasn.dev>2024-08-16 11:48:02 +0200
commit765f29c61efcce598dcd1ddd9f29f19c5902d651 (patch)
treeeafdb3815cb7d2531f712d72c50f8466b5b88ea9 /libavcodec
parentae3a78593df2b41f4163496f0bdf73c01d73c9a6 (diff)
downloadffmpeg-765f29c61efcce598dcd1ddd9f29f19c5902d651.tar.gz
avcodec/dovi_rpu: add ff_dovi_get_metadata()
Provides direct access to the AVDOVIMetadata without having to attach it to a frame.
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/dovi_rpu.h9
-rw-r--r--libavcodec/dovi_rpudec.c40
2 files changed, 36 insertions, 13 deletions
diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h
index e2e7635cfb..4eb4bc0873 100644
--- a/libavcodec/dovi_rpu.h
+++ b/libavcodec/dovi_rpu.h
@@ -109,7 +109,16 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size,
int err_recognition);
/**
+ * Get the decoded AVDOVIMetadata. Ownership passes to the caller.
+ *
+ * Returns the size of *out_metadata, a negative error code, or 0 if no
+ * metadata is available to return.
+ */
+int ff_dovi_get_metadata(DOVIContext *s, AVDOVIMetadata **out_metadata);
+
+/**
* Attach the decoded AVDOVIMetadata as side data to an AVFrame.
+ * Returns 0 or a negative error code.
*/
int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame);
diff --git a/libavcodec/dovi_rpudec.c b/libavcodec/dovi_rpudec.c
index bf6e5075d1..0ddc923539 100644
--- a/libavcodec/dovi_rpudec.c
+++ b/libavcodec/dovi_rpudec.c
@@ -30,10 +30,8 @@
#include "get_bits.h"
#include "refstruct.h"
-int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame)
+int ff_dovi_get_metadata(DOVIContext *s, AVDOVIMetadata **out_metadata)
{
- AVFrameSideData *sd;
- AVBufferRef *buf;
AVDOVIMetadata *dovi;
size_t dovi_size, ext_sz;
@@ -44,7 +42,32 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame)
if (!dovi)
return AVERROR(ENOMEM);
- buf = av_buffer_create((uint8_t *) dovi, dovi_size, NULL, NULL, 0);
+ /* Copy only the parts of these structs known to us at compiler-time. */
+#define COPY(t, a, b, last) memcpy(a, b, offsetof(t, last) + sizeof((b)->last))
+ COPY(AVDOVIRpuDataHeader, av_dovi_get_header(dovi), &s->header, ext_mapping_idc_5_7);
+ COPY(AVDOVIDataMapping, av_dovi_get_mapping(dovi), s->mapping, nlq_pivots);
+ COPY(AVDOVIColorMetadata, av_dovi_get_color(dovi), s->color, source_diagonal);
+ ext_sz = FFMIN(sizeof(AVDOVIDmData), dovi->ext_block_size);
+ for (int i = 0; i < s->num_ext_blocks; i++)
+ memcpy(av_dovi_get_ext(dovi, i), &s->ext_blocks[i], ext_sz);
+ dovi->num_ext_blocks = s->num_ext_blocks;
+
+ *out_metadata = dovi;
+ return dovi_size;
+}
+
+int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame)
+{
+ AVFrameSideData *sd;
+ AVDOVIMetadata *dovi;
+ AVBufferRef *buf;
+ int size;
+
+ size = ff_dovi_get_metadata(s, &dovi);
+ if (size <= 0)
+ return size;
+
+ buf = av_buffer_create((uint8_t *) dovi, size, NULL, NULL, 0);
if (!buf) {
av_free(dovi);
return AVERROR(ENOMEM);
@@ -56,15 +79,6 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame)
return AVERROR(ENOMEM);
}
- /* Copy only the parts of these structs known to us at compiler-time. */
-#define COPY(t, a, b, last) memcpy(a, b, offsetof(t, last) + sizeof((b)->last))
- COPY(AVDOVIRpuDataHeader, av_dovi_get_header(dovi), &s->header, ext_mapping_idc_5_7);
- COPY(AVDOVIDataMapping, av_dovi_get_mapping(dovi), s->mapping, nlq_pivots);
- COPY(AVDOVIColorMetadata, av_dovi_get_color(dovi), s->color, source_diagonal);
- ext_sz = FFMIN(sizeof(AVDOVIDmData), dovi->ext_block_size);
- for (int i = 0; i < s->num_ext_blocks; i++)
- memcpy(av_dovi_get_ext(dovi, i), &s->ext_blocks[i], ext_sz);
- dovi->num_ext_blocks = s->num_ext_blocks;
return 0;
}