diff options
author | Niklas Haas <git@haasn.dev> | 2024-06-14 20:32:58 +0200 |
---|---|---|
committer | Niklas Haas <git@haasn.dev> | 2024-08-16 11:48:02 +0200 |
commit | 765f29c61efcce598dcd1ddd9f29f19c5902d651 (patch) | |
tree | eafdb3815cb7d2531f712d72c50f8466b5b88ea9 /libavcodec | |
parent | ae3a78593df2b41f4163496f0bdf73c01d73c9a6 (diff) | |
download | ffmpeg-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.h | 9 | ||||
-rw-r--r-- | libavcodec/dovi_rpudec.c | 40 |
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; } |