diff mbox

[FFmpeg-devel,1/3] lavu: add support for Content Light Level side metadata

Message ID 20170330143149.3792-1-robux4@gmail.com
State Superseded
Headers show

Commit Message

Steve Lhomme March 30, 2017, 2:31 p.m. UTC
As found in HEVC.

I put the code in mastering_display_metadata as they usually go together in
Blu-Ray UHD sources.
---
 libavutil/frame.c                      |  1 +
 libavutil/frame.h                      |  6 ++++++
 libavutil/mastering_display_metadata.c | 18 ++++++++++++++++
 libavutil/mastering_display_metadata.h | 39 ++++++++++++++++++++++++++++++++++
 libavutil/version.h                    |  2 +-
 5 files changed, 65 insertions(+), 1 deletion(-)

Comments

Hendrik Leppkes March 30, 2017, 2:46 p.m. UTC | #1
On Thu, Mar 30, 2017 at 4:31 PM, Steve Lhomme <robux4@gmail.com> wrote:
> As found in HEVC.
>
> I put the code in mastering_display_metadata as they usually go together in
> Blu-Ray UHD sources.
> ---
>  libavutil/frame.c                      |  1 +
>  libavutil/frame.h                      |  6 ++++++
>  libavutil/mastering_display_metadata.c | 18 ++++++++++++++++
>  libavutil/mastering_display_metadata.h | 39 ++++++++++++++++++++++++++++++++++
>  libavutil/version.h                    |  2 +-
>  5 files changed, 65 insertions(+), 1 deletion(-)
>
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 8811dcdcfe..dd12c5549c 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type)
>      case AV_FRAME_DATA_SKIP_SAMPLES:    return "Skip samples";
>      case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:          return "Audio service type";
>      case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display metadata";
> +    case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL:         return "Content light level metadata";
>      case AV_FRAME_DATA_GOP_TIMECODE:                return "GOP timecode";
>      }
>      return NULL;
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 7cb78a1a44..45e21a11d4 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -127,6 +127,12 @@ enum AVFrameSideDataType {
>       * libavutil/spherical.h.
>       */
>      AV_FRAME_DATA_SPHERICAL,
> +
> +    /**
> +     * Content light level (based on CEA 861.3). This payload containts data in
> +     * the form of the AVContentLightMetadata struct.
> +     */
> +    AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>  };
>
>  enum AVActiveFormatDescription {
> diff --git a/libavutil/mastering_display_metadata.c b/libavutil/mastering_display_metadata.c
> index e1683e55c7..c41c90db12 100644
> --- a/libavutil/mastering_display_metadata.c
> +++ b/libavutil/mastering_display_metadata.c
> @@ -41,3 +41,21 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFra
>
>      return (AVMasteringDisplayMetadata *)side_data->data;
>  }
> +
> +AVContentLightMetadata *av_content_light_metadata_alloc(void)
> +{
> +    return av_mallocz(sizeof(AVContentLightMetadata));
> +}
> +
> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame)
> +{
> +    AVFrameSideData *side_data = av_frame_new_side_data(frame,
> +                                                        AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
> +                                                        sizeof(AVContentLightMetadata));
> +    if (!side_data)
> +        return NULL;
> +
> +    memset(side_data->data, 0, sizeof(AVContentLightMetadata));
> +
> +    return (AVContentLightMetadata *)side_data->data;
> +}
> diff --git a/libavutil/mastering_display_metadata.h b/libavutil/mastering_display_metadata.h
> index 936533fec4..5ad7f5bd42 100644
> --- a/libavutil/mastering_display_metadata.h
> +++ b/libavutil/mastering_display_metadata.h
> @@ -86,4 +86,43 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void);
>   */
>  AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame);
>
> +/**
> + * Content light level needed by to transmit HDR over HDMI (CEA 861.3).
> + *
> + * To be used as payload of a AVFrameSideData or AVPacketSideData with the
> + * appropriate type.
> + *
> + * @note The struct should be allocated with av_content_light_metadata_alloc()
> + *       and its size is not a part of the public ABI.
> + */
> +typedef struct AVContentLightMetadata {
> +    /**
> +     * Max content light level (cd/m^2).
> +     */
> +    AVRational max_content_light_level;
> +
> +    /**
> +     * Max avereage light level per picture (cd/m^2).

It might be better to call this how the spec calls it: Maximum
frame-average light level (MaxFALL), instead of coming up with a
slight rewording, that could just cause confusion.
Maybe including the common acronyms MaxCLL and MaxFALL for both
elements might be sensible too.

> +     */
> +    AVRational max_pic_avg_light_level;
> +} AVContentLightMetadata;
> +
> +/**
> + * Allocate an AVContentLightMetadata structure and set its fields to
> + * default values. The resulting struct can be freed using av_freep().
> + *
> + * @return An AVContentLightMetadata filled with default values or NULL
> + *         on failure.
> + */
> +AVContentLightMetadata *av_content_light_metadata_alloc(void);
> +
> +/**
> + * Allocate a complete AVContentLightMetadata and add it to the frame.
> + *
> + * @param frame The frame which side data is added to.
> + *
> + * @return The AVContentLightMetadata structure to be filled by caller.
> + */
> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame);
> +
>  #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
> diff --git a/libavutil/version.h b/libavutil/version.h
> index a14c0e7eb2..fedc6fa177 100644
> --- a/libavutil/version.h
> +++ b/libavutil/version.h
> @@ -79,7 +79,7 @@
>   */
>
>  #define LIBAVUTIL_VERSION_MAJOR  55
> -#define LIBAVUTIL_VERSION_MINOR  53
> +#define LIBAVUTIL_VERSION_MINOR  54
>  #define LIBAVUTIL_VERSION_MICRO 100
>
>  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
> --
> 2.11.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
James Almer March 30, 2017, 3:50 p.m. UTC | #2
On 3/30/2017 11:31 AM, Steve Lhomme wrote:
> As found in HEVC.
> 
> I put the code in mastering_display_metadata as they usually go together in
> Blu-Ray UHD sources.
> ---
>  libavutil/frame.c                      |  1 +
>  libavutil/frame.h                      |  6 ++++++
>  libavutil/mastering_display_metadata.c | 18 ++++++++++++++++
>  libavutil/mastering_display_metadata.h | 39 ++++++++++++++++++++++++++++++++++
>  libavutil/version.h                    |  2 +-
>  5 files changed, 65 insertions(+), 1 deletion(-)
> 
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 8811dcdcfe..dd12c5549c 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type)
>      case AV_FRAME_DATA_SKIP_SAMPLES:    return "Skip samples";
>      case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:          return "Audio service type";
>      case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display metadata";
> +    case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL:         return "Content light level metadata";
>      case AV_FRAME_DATA_GOP_TIMECODE:                return "GOP timecode";
>      }
>      return NULL;
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 7cb78a1a44..45e21a11d4 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -127,6 +127,12 @@ enum AVFrameSideDataType {
>       * libavutil/spherical.h.
>       */
>      AV_FRAME_DATA_SPHERICAL,
> +
> +    /**
> +     * Content light level (based on CEA 861.3). This payload containts data in
> +     * the form of the AVContentLightMetadata struct.
> +     */
> +    AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>  };
>  
>  enum AVActiveFormatDescription {
> diff --git a/libavutil/mastering_display_metadata.c b/libavutil/mastering_display_metadata.c
> index e1683e55c7..c41c90db12 100644
> --- a/libavutil/mastering_display_metadata.c
> +++ b/libavutil/mastering_display_metadata.c
> @@ -41,3 +41,21 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFra
>  
>      return (AVMasteringDisplayMetadata *)side_data->data;
>  }
> +
> +AVContentLightMetadata *av_content_light_metadata_alloc(void)
> +{
> +    return av_mallocz(sizeof(AVContentLightMetadata));
> +}

Could you add a size_t *size parameter that returns sizeof(AVContentLightMetadata)?
For the sake of being able to use av_stream_new_side_data() and
av_stream_add_side_data() once and if required by containers without having to
use sizeof(AVContentLightMetadata) from libavformat, like it currently happens with
mastering_display_metadata and stereo3d.

See av_spherical_alloc().

> +
> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame)
> +{
> +    AVFrameSideData *side_data = av_frame_new_side_data(frame,
> +                                                        AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
> +                                                        sizeof(AVContentLightMetadata));
> +    if (!side_data)
> +        return NULL;
> +
> +    memset(side_data->data, 0, sizeof(AVContentLightMetadata));
> +
> +    return (AVContentLightMetadata *)side_data->data;
> +}
> diff --git a/libavutil/mastering_display_metadata.h b/libavutil/mastering_display_metadata.h
> index 936533fec4..5ad7f5bd42 100644
> --- a/libavutil/mastering_display_metadata.h
> +++ b/libavutil/mastering_display_metadata.h
> @@ -86,4 +86,43 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void);
>   */
>  AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame);
>  
> +/**
> + * Content light level needed by to transmit HDR over HDMI (CEA 861.3).
> + *
> + * To be used as payload of a AVFrameSideData or AVPacketSideData with the
> + * appropriate type.
> + *
> + * @note The struct should be allocated with av_content_light_metadata_alloc()
> + *       and its size is not a part of the public ABI.
> + */
> +typedef struct AVContentLightMetadata {
> +    /**
> +     * Max content light level (cd/m^2).
> +     */
> +    AVRational max_content_light_level;
> +
> +    /**
> +     * Max avereage light level per picture (cd/m^2).
> +     */
> +    AVRational max_pic_avg_light_level;
> +} AVContentLightMetadata;
> +
> +/**
> + * Allocate an AVContentLightMetadata structure and set its fields to
> + * default values. The resulting struct can be freed using av_freep().
> + *
> + * @return An AVContentLightMetadata filled with default values or NULL
> + *         on failure.
> + */
> +AVContentLightMetadata *av_content_light_metadata_alloc(void);
> +
> +/**
> + * Allocate a complete AVContentLightMetadata and add it to the frame.
> + *
> + * @param frame The frame which side data is added to.
> + *
> + * @return The AVContentLightMetadata structure to be filled by caller.
> + */
> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame);
> +
>  #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
> diff --git a/libavutil/version.h b/libavutil/version.h
> index a14c0e7eb2..fedc6fa177 100644
> --- a/libavutil/version.h
> +++ b/libavutil/version.h
> @@ -79,7 +79,7 @@
>   */
>  
>  #define LIBAVUTIL_VERSION_MAJOR  55
> -#define LIBAVUTIL_VERSION_MINOR  53
> +#define LIBAVUTIL_VERSION_MINOR  54
>  #define LIBAVUTIL_VERSION_MICRO 100
>  
>  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
>
Steve Lhomme March 31, 2017, 7:08 a.m. UTC | #3
On Thu, Mar 30, 2017 at 4:46 PM, Hendrik Leppkes <h.leppkes@gmail.com> wrote:
> On Thu, Mar 30, 2017 at 4:31 PM, Steve Lhomme <robux4@gmail.com> wrote:
>> As found in HEVC.
>>
>> I put the code in mastering_display_metadata as they usually go together in
>> Blu-Ray UHD sources.
>> ---
>>  libavutil/frame.c                      |  1 +
>>  libavutil/frame.h                      |  6 ++++++
>>  libavutil/mastering_display_metadata.c | 18 ++++++++++++++++
>>  libavutil/mastering_display_metadata.h | 39 ++++++++++++++++++++++++++++++++++
>>  libavutil/version.h                    |  2 +-
>>  5 files changed, 65 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavutil/frame.c b/libavutil/frame.c
>> index 8811dcdcfe..dd12c5549c 100644
>> --- a/libavutil/frame.c
>> +++ b/libavutil/frame.c
>> @@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type)
>>      case AV_FRAME_DATA_SKIP_SAMPLES:    return "Skip samples";
>>      case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:          return "Audio service type";
>>      case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display metadata";
>> +    case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL:         return "Content light level metadata";
>>      case AV_FRAME_DATA_GOP_TIMECODE:                return "GOP timecode";
>>      }
>>      return NULL;
>> diff --git a/libavutil/frame.h b/libavutil/frame.h
>> index 7cb78a1a44..45e21a11d4 100644
>> --- a/libavutil/frame.h
>> +++ b/libavutil/frame.h
>> @@ -127,6 +127,12 @@ enum AVFrameSideDataType {
>>       * libavutil/spherical.h.
>>       */
>>      AV_FRAME_DATA_SPHERICAL,
>> +
>> +    /**
>> +     * Content light level (based on CEA 861.3). This payload containts data in
>> +     * the form of the AVContentLightMetadata struct.
>> +     */
>> +    AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>>  };
>>
>>  enum AVActiveFormatDescription {
>> diff --git a/libavutil/mastering_display_metadata.c b/libavutil/mastering_display_metadata.c
>> index e1683e55c7..c41c90db12 100644
>> --- a/libavutil/mastering_display_metadata.c
>> +++ b/libavutil/mastering_display_metadata.c
>> @@ -41,3 +41,21 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFra
>>
>>      return (AVMasteringDisplayMetadata *)side_data->data;
>>  }
>> +
>> +AVContentLightMetadata *av_content_light_metadata_alloc(void)
>> +{
>> +    return av_mallocz(sizeof(AVContentLightMetadata));
>> +}
>> +
>> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame)
>> +{
>> +    AVFrameSideData *side_data = av_frame_new_side_data(frame,
>> +                                                        AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>> +                                                        sizeof(AVContentLightMetadata));
>> +    if (!side_data)
>> +        return NULL;
>> +
>> +    memset(side_data->data, 0, sizeof(AVContentLightMetadata));
>> +
>> +    return (AVContentLightMetadata *)side_data->data;
>> +}
>> diff --git a/libavutil/mastering_display_metadata.h b/libavutil/mastering_display_metadata.h
>> index 936533fec4..5ad7f5bd42 100644
>> --- a/libavutil/mastering_display_metadata.h
>> +++ b/libavutil/mastering_display_metadata.h
>> @@ -86,4 +86,43 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void);
>>   */
>>  AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame);
>>
>> +/**
>> + * Content light level needed by to transmit HDR over HDMI (CEA 861.3).
>> + *
>> + * To be used as payload of a AVFrameSideData or AVPacketSideData with the
>> + * appropriate type.
>> + *
>> + * @note The struct should be allocated with av_content_light_metadata_alloc()
>> + *       and its size is not a part of the public ABI.
>> + */
>> +typedef struct AVContentLightMetadata {
>> +    /**
>> +     * Max content light level (cd/m^2).
>> +     */
>> +    AVRational max_content_light_level;
>> +
>> +    /**
>> +     * Max avereage light level per picture (cd/m^2).
>
> It might be better to call this how the spec calls it: Maximum
> frame-average light level (MaxFALL), instead of coming up with a
> slight rewording, that could just cause confusion.

I used the names from the HEVC spec I have. But in avutil a more
common name is probably better.

> Maybe including the common acronyms MaxCLL and MaxFALL for both
> elements might be sensible too.

I don't have CEA 861.3 but I think these are the usual names. I will use that.

>> +     */
>> +    AVRational max_pic_avg_light_level;
>> +} AVContentLightMetadata;
>> +
>> +/**
>> + * Allocate an AVContentLightMetadata structure and set its fields to
>> + * default values. The resulting struct can be freed using av_freep().
>> + *
>> + * @return An AVContentLightMetadata filled with default values or NULL
>> + *         on failure.
>> + */
>> +AVContentLightMetadata *av_content_light_metadata_alloc(void);
>> +
>> +/**
>> + * Allocate a complete AVContentLightMetadata and add it to the frame.
>> + *
>> + * @param frame The frame which side data is added to.
>> + *
>> + * @return The AVContentLightMetadata structure to be filled by caller.
>> + */
>> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame);
>> +
>>  #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
>> diff --git a/libavutil/version.h b/libavutil/version.h
>> index a14c0e7eb2..fedc6fa177 100644
>> --- a/libavutil/version.h
>> +++ b/libavutil/version.h
>> @@ -79,7 +79,7 @@
>>   */
>>
>>  #define LIBAVUTIL_VERSION_MAJOR  55
>> -#define LIBAVUTIL_VERSION_MINOR  53
>> +#define LIBAVUTIL_VERSION_MINOR  54
>>  #define LIBAVUTIL_VERSION_MICRO 100
>>
>>  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
>> --
>> 2.11.1
>>
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel@ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Steve Lhomme March 31, 2017, 7:12 a.m. UTC | #4
On Thu, Mar 30, 2017 at 5:50 PM, James Almer <jamrial@gmail.com> wrote:
> On 3/30/2017 11:31 AM, Steve Lhomme wrote:
>> As found in HEVC.
>>
>> I put the code in mastering_display_metadata as they usually go together in
>> Blu-Ray UHD sources.
>> ---
>>  libavutil/frame.c                      |  1 +
>>  libavutil/frame.h                      |  6 ++++++
>>  libavutil/mastering_display_metadata.c | 18 ++++++++++++++++
>>  libavutil/mastering_display_metadata.h | 39 ++++++++++++++++++++++++++++++++++
>>  libavutil/version.h                    |  2 +-
>>  5 files changed, 65 insertions(+), 1 deletion(-)
>>
>> diff --git a/libavutil/frame.c b/libavutil/frame.c
>> index 8811dcdcfe..dd12c5549c 100644
>> --- a/libavutil/frame.c
>> +++ b/libavutil/frame.c
>> @@ -772,6 +772,7 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type)
>>      case AV_FRAME_DATA_SKIP_SAMPLES:    return "Skip samples";
>>      case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:          return "Audio service type";
>>      case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display metadata";
>> +    case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL:         return "Content light level metadata";
>>      case AV_FRAME_DATA_GOP_TIMECODE:                return "GOP timecode";
>>      }
>>      return NULL;
>> diff --git a/libavutil/frame.h b/libavutil/frame.h
>> index 7cb78a1a44..45e21a11d4 100644
>> --- a/libavutil/frame.h
>> +++ b/libavutil/frame.h
>> @@ -127,6 +127,12 @@ enum AVFrameSideDataType {
>>       * libavutil/spherical.h.
>>       */
>>      AV_FRAME_DATA_SPHERICAL,
>> +
>> +    /**
>> +     * Content light level (based on CEA 861.3). This payload containts data in
>> +     * the form of the AVContentLightMetadata struct.
>> +     */
>> +    AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>>  };
>>
>>  enum AVActiveFormatDescription {
>> diff --git a/libavutil/mastering_display_metadata.c b/libavutil/mastering_display_metadata.c
>> index e1683e55c7..c41c90db12 100644
>> --- a/libavutil/mastering_display_metadata.c
>> +++ b/libavutil/mastering_display_metadata.c
>> @@ -41,3 +41,21 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFra
>>
>>      return (AVMasteringDisplayMetadata *)side_data->data;
>>  }
>> +
>> +AVContentLightMetadata *av_content_light_metadata_alloc(void)
>> +{
>> +    return av_mallocz(sizeof(AVContentLightMetadata));
>> +}
>
> Could you add a size_t *size parameter that returns sizeof(AVContentLightMetadata)?
> For the sake of being able to use av_stream_new_side_data() and
> av_stream_add_side_data() once and if required by containers without having to
> use sizeof(AVContentLightMetadata) from libavformat, like it currently happens with
> mastering_display_metadata and stereo3d.

OK.

> See av_spherical_alloc().
>
>> +
>> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame)
>> +{
>> +    AVFrameSideData *side_data = av_frame_new_side_data(frame,
>> +                                                        AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
>> +                                                        sizeof(AVContentLightMetadata));
>> +    if (!side_data)
>> +        return NULL;
>> +
>> +    memset(side_data->data, 0, sizeof(AVContentLightMetadata));
>> +
>> +    return (AVContentLightMetadata *)side_data->data;
>> +}
>> diff --git a/libavutil/mastering_display_metadata.h b/libavutil/mastering_display_metadata.h
>> index 936533fec4..5ad7f5bd42 100644
>> --- a/libavutil/mastering_display_metadata.h
>> +++ b/libavutil/mastering_display_metadata.h
>> @@ -86,4 +86,43 @@ AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void);
>>   */
>>  AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame);
>>
>> +/**
>> + * Content light level needed by to transmit HDR over HDMI (CEA 861.3).
>> + *
>> + * To be used as payload of a AVFrameSideData or AVPacketSideData with the
>> + * appropriate type.
>> + *
>> + * @note The struct should be allocated with av_content_light_metadata_alloc()
>> + *       and its size is not a part of the public ABI.
>> + */
>> +typedef struct AVContentLightMetadata {
>> +    /**
>> +     * Max content light level (cd/m^2).
>> +     */
>> +    AVRational max_content_light_level;
>> +
>> +    /**
>> +     * Max avereage light level per picture (cd/m^2).
>> +     */
>> +    AVRational max_pic_avg_light_level;
>> +} AVContentLightMetadata;
>> +
>> +/**
>> + * Allocate an AVContentLightMetadata structure and set its fields to
>> + * default values. The resulting struct can be freed using av_freep().
>> + *
>> + * @return An AVContentLightMetadata filled with default values or NULL
>> + *         on failure.
>> + */
>> +AVContentLightMetadata *av_content_light_metadata_alloc(void);
>> +
>> +/**
>> + * Allocate a complete AVContentLightMetadata and add it to the frame.
>> + *
>> + * @param frame The frame which side data is added to.
>> + *
>> + * @return The AVContentLightMetadata structure to be filled by caller.
>> + */
>> +AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame);
>> +
>>  #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
>> diff --git a/libavutil/version.h b/libavutil/version.h
>> index a14c0e7eb2..fedc6fa177 100644
>> --- a/libavutil/version.h
>> +++ b/libavutil/version.h
>> @@ -79,7 +79,7 @@
>>   */
>>
>>  #define LIBAVUTIL_VERSION_MAJOR  55
>> -#define LIBAVUTIL_VERSION_MINOR  53
>> +#define LIBAVUTIL_VERSION_MINOR  54
>>  #define LIBAVUTIL_VERSION_MICRO 100
>>
>>  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
>>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Moritz Barsnick April 1, 2017, 6:22 p.m. UTC | #5
On Thu, Mar 30, 2017 at 16:31:47 +0200, Steve Lhomme wrote:
> +     * Content light level (based on CEA 861.3). This payload containts data in
                                                                 ^ contains

> +     * Max avereage light level per picture (cd/m^2).
              ^ average

(Both possibly at other locations in the patches as well.)

Moritz
diff mbox

Patch

diff --git a/libavutil/frame.c b/libavutil/frame.c
index 8811dcdcfe..dd12c5549c 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -772,6 +772,7 @@  const char *av_frame_side_data_name(enum AVFrameSideDataType type)
     case AV_FRAME_DATA_SKIP_SAMPLES:    return "Skip samples";
     case AV_FRAME_DATA_AUDIO_SERVICE_TYPE:          return "Audio service type";
     case AV_FRAME_DATA_MASTERING_DISPLAY_METADATA:  return "Mastering display metadata";
+    case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL:         return "Content light level metadata";
     case AV_FRAME_DATA_GOP_TIMECODE:                return "GOP timecode";
     }
     return NULL;
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 7cb78a1a44..45e21a11d4 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -127,6 +127,12 @@  enum AVFrameSideDataType {
      * libavutil/spherical.h.
      */
     AV_FRAME_DATA_SPHERICAL,
+
+    /**
+     * Content light level (based on CEA 861.3). This payload containts data in
+     * the form of the AVContentLightMetadata struct.
+     */
+    AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
 };
 
 enum AVActiveFormatDescription {
diff --git a/libavutil/mastering_display_metadata.c b/libavutil/mastering_display_metadata.c
index e1683e55c7..c41c90db12 100644
--- a/libavutil/mastering_display_metadata.c
+++ b/libavutil/mastering_display_metadata.c
@@ -41,3 +41,21 @@  AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFra
 
     return (AVMasteringDisplayMetadata *)side_data->data;
 }
+
+AVContentLightMetadata *av_content_light_metadata_alloc(void)
+{
+    return av_mallocz(sizeof(AVContentLightMetadata));
+}
+
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame)
+{
+    AVFrameSideData *side_data = av_frame_new_side_data(frame,
+                                                        AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+                                                        sizeof(AVContentLightMetadata));
+    if (!side_data)
+        return NULL;
+
+    memset(side_data->data, 0, sizeof(AVContentLightMetadata));
+
+    return (AVContentLightMetadata *)side_data->data;
+}
diff --git a/libavutil/mastering_display_metadata.h b/libavutil/mastering_display_metadata.h
index 936533fec4..5ad7f5bd42 100644
--- a/libavutil/mastering_display_metadata.h
+++ b/libavutil/mastering_display_metadata.h
@@ -86,4 +86,43 @@  AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void);
  */
 AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame);
 
+/**
+ * Content light level needed by to transmit HDR over HDMI (CEA 861.3).
+ *
+ * To be used as payload of a AVFrameSideData or AVPacketSideData with the
+ * appropriate type.
+ *
+ * @note The struct should be allocated with av_content_light_metadata_alloc()
+ *       and its size is not a part of the public ABI.
+ */
+typedef struct AVContentLightMetadata {
+    /**
+     * Max content light level (cd/m^2).
+     */
+    AVRational max_content_light_level;
+
+    /**
+     * Max avereage light level per picture (cd/m^2).
+     */
+    AVRational max_pic_avg_light_level;
+} AVContentLightMetadata;
+
+/**
+ * Allocate an AVContentLightMetadata structure and set its fields to
+ * default values. The resulting struct can be freed using av_freep().
+ *
+ * @return An AVContentLightMetadata filled with default values or NULL
+ *         on failure.
+ */
+AVContentLightMetadata *av_content_light_metadata_alloc(void);
+
+/**
+ * Allocate a complete AVContentLightMetadata and add it to the frame.
+ *
+ * @param frame The frame which side data is added to.
+ *
+ * @return The AVContentLightMetadata structure to be filled by caller.
+ */
+AVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame);
+
 #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */
diff --git a/libavutil/version.h b/libavutil/version.h
index a14c0e7eb2..fedc6fa177 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@ 
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  55
-#define LIBAVUTIL_VERSION_MINOR  53
+#define LIBAVUTIL_VERSION_MINOR  54
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \