aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2024-03-11 13:35:22 -0300
committerJames Almer <jamrial@gmail.com>2024-09-19 10:01:00 -0300
commit9cea2410a14a7e5307902545df5f9a75f2d55763 (patch)
tree6d6d9b16f9c7f1b0982c916e97119d58d02c0f4e
parent90d12c24c514ee89c9035c42c5a5d2fe54e92fe4 (diff)
downloadffmpeg-9cea2410a14a7e5307902545df5f9a75f2d55763.tar.gz
avcodec/h2645_sei: export raw LCEVC metadata
Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r--Changelog1
-rw-r--r--libavcodec/h2645_sei.c34
-rw-r--r--libavcodec/h2645_sei.h5
-rw-r--r--libavcodec/itut35.h2
4 files changed, 42 insertions, 0 deletions
diff --git a/Changelog b/Changelog
index fbc76db862..256dab9820 100644
--- a/Changelog
+++ b/Changelog
@@ -24,6 +24,7 @@ version <next>:
- Vulkan H.264 encoder
- Vulkan H.265 encoder
- stream specifiers in fftools can now match by stream disposition
+- LCEVC enhancement data exporting in H.26x
version 7.0:
diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
index 7c83747cd0..c46a563308 100644
--- a/libavcodec/h2645_sei.c
+++ b/libavcodec/h2645_sei.c
@@ -99,6 +99,20 @@ static int decode_registered_user_data_dynamic_hdr_vivid(HEVCSEIDynamicHDRVivid
}
#endif
+static int decode_registered_user_data_lcevc(HEVCSEILCEVC *s,
+ GetByteContext *gb)
+{
+ int size = bytestream2_get_bytes_left(gb);
+
+ av_buffer_unref(&s->info);
+ s->info = av_buffer_alloc(size);
+ if (!s->info)
+ return AVERROR(ENOMEM);
+
+ bytestream2_get_bufferu(gb, s->info->data, size);
+ return 0;
+}
+
static int decode_registered_user_data_afd(H2645SEIAFD *h, GetByteContext *gb)
{
int flag;
@@ -142,6 +156,7 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb,
}
if (country_code != ITU_T_T35_COUNTRY_CODE_US &&
+ country_code != ITU_T_T35_COUNTRY_CODE_UK &&
country_code != ITU_T_T35_COUNTRY_CODE_CN) {
av_log(logctx, AV_LOG_VERBOSE,
"Unsupported User Data Registered ITU-T T35 SEI message (country_code = %d)\n",
@@ -173,6 +188,13 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb,
}
break;
}
+ case ITU_T_T35_PROVIDER_CODE_LCEVC: {
+ if (bytestream2_get_bytes_left(gb) < 2)
+ return AVERROR_INVALIDDATA;
+
+ bytestream2_skipu(gb, 1); // user_data_type_code
+ return decode_registered_user_data_lcevc(&h->lcevc, gb);
+ }
#if CONFIG_HEVC_SEI
case ITU_T_T35_PROVIDER_CODE_CUVA: {
const uint16_t cuva_provider_oriented_code = 0x0005;
@@ -501,6 +523,10 @@ int ff_h2645_sei_ctx_replace(H2645SEI *dst, const H2645SEI *src)
av_buffer_unref(&dst->unregistered.buf_ref[i]);
dst->unregistered.nb_buf_ref = 0;
+ ret = av_buffer_replace(&dst->lcevc.info, src->lcevc.info);
+ if (ret < 0)
+ return ret;
+
if (src->unregistered.nb_buf_ref) {
ret = av_reallocp_array(&dst->unregistered.buf_ref,
src->unregistered.nb_buf_ref,
@@ -778,6 +804,13 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
}
}
+ 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)
+ return ret;
+ }
+
if (sei->film_grain_characteristics.present) {
H2645SEIFilmGrainCharacteristics *fgc = &sei->film_grain_characteristics;
AVFilmGrainParams *fgp = av_film_grain_params_create_side_data(frame);
@@ -875,6 +908,7 @@ void ff_h2645_sei_reset(H2645SEI *s)
av_freep(&s->unregistered.buf_ref);
av_buffer_unref(&s->dynamic_hdr_plus.info);
av_buffer_unref(&s->dynamic_hdr_vivid.info);
+ av_buffer_unref(&s->lcevc.info);
s->ambient_viewing_environment.present = 0;
s->mastering_display.present = 0;
diff --git a/libavcodec/h2645_sei.h b/libavcodec/h2645_sei.h
index 488dbcad7e..598f78b585 100644
--- a/libavcodec/h2645_sei.h
+++ b/libavcodec/h2645_sei.h
@@ -50,6 +50,10 @@ typedef struct HEVCSEIDynamicHDRVivid {
AVBufferRef *info;
} HEVCSEIDynamicHDRVivid;
+typedef struct HEVCSEILCEVC {
+ AVBufferRef *info;
+} HEVCSEILCEVC;
+
typedef struct H2645SEIUnregistered {
AVBufferRef **buf_ref;
unsigned nb_buf_ref;
@@ -126,6 +130,7 @@ typedef struct H2645SEI {
H2645SEIAFD afd;
HEVCSEIDynamicHDRPlus dynamic_hdr_plus; //< HEVC only
HEVCSEIDynamicHDRVivid dynamic_hdr_vivid; //< HEVC only
+ HEVCSEILCEVC lcevc;
H2645SEIUnregistered unregistered;
H2645SEIFramePacking frame_packing;
H2645SEIDisplayOrientation display_orientation;
diff --git a/libavcodec/itut35.h b/libavcodec/itut35.h
index ffa7024981..a75ef37929 100644
--- a/libavcodec/itut35.h
+++ b/libavcodec/itut35.h
@@ -20,11 +20,13 @@
#define AVCODEC_ITUT35_H
#define ITU_T_T35_COUNTRY_CODE_CN 0x26
+#define ITU_T_T35_COUNTRY_CODE_UK 0xB4
#define ITU_T_T35_COUNTRY_CODE_US 0xB5
#define ITU_T_T35_PROVIDER_CODE_ATSC 0x31
#define ITU_T_T35_PROVIDER_CODE_CUVA 0x04
#define ITU_T_T35_PROVIDER_CODE_DOLBY 0x3B
+#define ITU_T_T35_PROVIDER_CODE_LCEVC 0x50
#define ITU_T_T35_PROVIDER_CODE_SMTPE 0x3C
#endif /* AVCODEC_ITUT35_H */