PR #23080 opened by vigneshvg URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23080 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23080.patch
Handle SMPTE-2094-50 metadata that appears as a SEI message. Signed-off-by: Vignesh Venkat <[email protected]> >From 3a05cd4bfcd75413fd4a4d80d4f71f65b80b0787 Mon Sep 17 00:00:00 2001 From: Vignesh Venkat <[email protected]> Date: Mon, 11 May 2026 14:02:36 -0700 Subject: [PATCH] avcodec/hevcdec: Support SMPTE-2094-50 metadata Handle SMPTE-2094-50 metadata that appears as a SEI message. Signed-off-by: Vignesh Venkat <[email protected]> --- libavcodec/h2645_sei.c | 43 +++++++++++++++++++++++++++++++++++++++ libavcodec/h2645_sei.h | 5 +++++ libavcodec/hevc/hevcdec.c | 10 +++++++++ 3 files changed, 58 insertions(+) diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c index 638362fbf6..0f4f86d778 100644 --- a/libavcodec/h2645_sei.c +++ b/libavcodec/h2645_sei.c @@ -75,6 +75,32 @@ static int decode_registered_user_data_dynamic_hdr_plus(HEVCSEIDynamicHDRPlus *s return 0; } +static int decode_registered_user_data_dynamic_hdr_smpte2094_app5(HEVCSEIDynamicHDRSmpte2094App5 *s, + GetByteContext *gb) +{ + size_t meta_size; + int err; + AVDynamicHDRSmpte2094App5 *metadata = av_dynamic_hdr_smpte2094_app5_alloc(&meta_size); + if (!metadata) + return AVERROR(ENOMEM); + + err = av_dynamic_hdr_smpte2094_app5_from_t35(metadata, gb->buffer, + bytestream2_get_bytes_left(gb)); + if (err < 0) { + av_free(metadata); + return err; + } + + av_buffer_unref(&s->info); + s->info = av_buffer_create((uint8_t *)metadata, meta_size, NULL, NULL, 0); + if (!s->info) { + av_free(metadata); + return AVERROR(ENOMEM); + } + + return 0; +} + static int decode_registered_user_data_dynamic_hdr_vivid(HEVCSEIDynamicHDRVivid *s, GetByteContext *gb) { @@ -225,6 +251,23 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb, } break; } + case ITU_T_T35_PROVIDER_CODE_SMPTE: { + const uint16_t smpte2094_app5_provider_oriented_code = 0x0001; + uint16_t provider_oriented_code; + + if (!IS_HEVC(codec_id)) + break; + + if (bytestream2_get_bytes_left(gb) < 2) + return AVERROR_INVALIDDATA; + + provider_oriented_code = bytestream2_get_be16u(gb); + if (provider_oriented_code == smpte2094_app5_provider_oriented_code) { + return decode_registered_user_data_dynamic_hdr_smpte2094_app5(&h->dynamic_hdr_smpte2094_app5, + gb); + } + break; + } #endif default: break; diff --git a/libavcodec/h2645_sei.h b/libavcodec/h2645_sei.h index f2ad7147c6..48138c1fc1 100644 --- a/libavcodec/h2645_sei.h +++ b/libavcodec/h2645_sei.h @@ -46,6 +46,10 @@ typedef struct HEVCSEIDynamicHDRPlus { AVBufferRef *info; } HEVCSEIDynamicHDRPlus; +typedef struct HEVCSEIDynamicHDRSmpte2094App5 { + AVBufferRef *info; +} HEVCSEIDynamicHDRSmpte2094App5; + typedef struct HEVCSEIDynamicHDRVivid { AVBufferRef *info; } HEVCSEIDynamicHDRVivid; @@ -129,6 +133,7 @@ typedef struct H2645SEI { H2645SEIA53Caption a53_caption; H2645SEIAFD afd; HEVCSEIDynamicHDRPlus dynamic_hdr_plus; //< HEVC only + HEVCSEIDynamicHDRSmpte2094App5 dynamic_hdr_smpte2094_app5; HEVCSEIDynamicHDRVivid dynamic_hdr_vivid; //< HEVC only HEVCSEILCEVC lcevc; H2645SEIUnregistered unregistered; diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c index b576b09b42..3d156476a6 100644 --- a/libavcodec/hevc/hevcdec.c +++ b/libavcodec/hevc/hevcdec.c @@ -3142,6 +3142,16 @@ static int set_side_data(HEVCContext *s) return ret; } + if (s->sei.common.dynamic_hdr_smpte2094_app5.info) { + AVBufferRef *info_ref = av_buffer_ref(s->sei.common.dynamic_hdr_smpte2094_app5.info); + if (!info_ref) + return AVERROR(ENOMEM); + + ret = ff_frame_new_side_data_from_buf(s->avctx, out, AV_FRAME_DATA_DYNAMIC_HDR_SMPTE_2094_APP5, &info_ref); + if (ret < 0) + return ret; + } + if (s->rpu_buf) { AVFrameSideData *rpu = av_frame_new_side_data_from_buf(out, AV_FRAME_DATA_DOVI_RPU_BUFFER, s->rpu_buf); if (!rpu) -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
