diff mbox series

[FFmpeg-devel,2/4,v2] libavcodec/h2645_sei: export raw LCEVC metadata

Message ID 20240721225350.298-2-jamrial@gmail.com
State New
Headers show
Series [FFmpeg-devel,1/4,v2] avutil/frame: add an LCEVC enhancement data payload side data type | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

James Almer July 21, 2024, 10:53 p.m. UTC
Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/h2645_sei.c | 37 +++++++++++++++++++++++++++++++++++++
 libavcodec/h2645_sei.h |  5 +++++
 libavcodec/itut35.h    |  2 ++
 3 files changed, 44 insertions(+)

Comments

Lynne July 22, 2024, 12:02 a.m. UTC | #1
On 22/07/2024 00:53, James Almer wrote:
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>   libavcodec/h2645_sei.c | 37 +++++++++++++++++++++++++++++++++++++
>   libavcodec/h2645_sei.h |  5 +++++
>   libavcodec/itut35.h    |  2 ++
>   3 files changed, 44 insertions(+)
> 
> diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
> index 7c83747cd0..61d18e14b3 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) {

Unrelated change?

>           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,11 @@ 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,
> @@ -666,6 +693,15 @@ static int h2645_sei_to_side_data(AVCodecContext *avctx, H2645SEI *sei,
>           }
>       }
>   
> +    if (sei->lcevc.info) {
> +        HEVCSEILCEVC *lcevc = &sei->lcevc;
> +        AVFrameSideData *entry = av_frame_side_data_add(sd, nb_sd, AV_FRAME_DATA_LCEVC,
> +                                                        &lcevc->info, 0);
> +        if (!entry)
> +            av_buffer_unref(&lcevc->info);
> +        lcevc->info = NULL;
> +    }
> +
>       return 0;
>   }
>   
> @@ -875,6 +911,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 */
James Almer July 22, 2024, 12:14 a.m. UTC | #2
On 7/21/2024 9:02 PM, Lynne via ffmpeg-devel wrote:
> On 22/07/2024 00:53, James Almer wrote:
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>>   libavcodec/h2645_sei.c | 37 +++++++++++++++++++++++++++++++++++++
>>   libavcodec/h2645_sei.h |  5 +++++
>>   libavcodec/itut35.h    |  2 ++
>>   3 files changed, 44 insertions(+)
>>
>> diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
>> index 7c83747cd0..61d18e14b3 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) {
> 
> Unrelated change?

The samples i have use this code.

> 
>>           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,11 @@ 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,
>> @@ -666,6 +693,15 @@ static int h2645_sei_to_side_data(AVCodecContext 
>> *avctx, H2645SEI *sei,
>>           }
>>       }
>> +    if (sei->lcevc.info) {
>> +        HEVCSEILCEVC *lcevc = &sei->lcevc;
>> +        AVFrameSideData *entry = av_frame_side_data_add(sd, nb_sd, 
>> AV_FRAME_DATA_LCEVC,
>> +                                                        &lcevc->info, 
>> 0);
>> +        if (!entry)
>> +            av_buffer_unref(&lcevc->info);
>> +        lcevc->info = NULL;
>> +    }
>> +
>>       return 0;
>>   }
>> @@ -875,6 +911,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 */
> 
> _______________________________________________
> 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".
diff mbox series

Patch

diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
index 7c83747cd0..61d18e14b3 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,11 @@  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,
@@ -666,6 +693,15 @@  static int h2645_sei_to_side_data(AVCodecContext *avctx, H2645SEI *sei,
         }
     }
 
+    if (sei->lcevc.info) {
+        HEVCSEILCEVC *lcevc = &sei->lcevc;
+        AVFrameSideData *entry = av_frame_side_data_add(sd, nb_sd, AV_FRAME_DATA_LCEVC,
+                                                        &lcevc->info, 0);
+        if (!entry)
+            av_buffer_unref(&lcevc->info);
+        lcevc->info = NULL;
+    }
+
     return 0;
 }
 
@@ -875,6 +911,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 */