diff mbox

[FFmpeg-devel,4/4] vaapi_encode_h265: Insert content light level information

Message ID 20180503030730.8504-4-haihao.xiang@intel.com
State Superseded
Headers show

Commit Message

Xiang, Haihao May 3, 2018, 3:07 a.m. UTC
Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
 libavcodec/vaapi_encode_h265.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

Comments

Xiang, Haihao May 3, 2018, 6:12 a.m. UTC | #1
On Thu, 2018-05-03 at 11:07 +0800, Haihao Xiang wrote:
> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>

> ---

>  libavcodec/vaapi_encode_h265.c | 29 ++++++++++++++++++++++++++++-

>  1 file changed, 28 insertions(+), 1 deletion(-)

> 

> diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c

> index 326fe4fe66..5fe487dfc5 100644

> --- a/libavcodec/vaapi_encode_h265.c

> +++ b/libavcodec/vaapi_encode_h265.c

> @@ -37,6 +37,7 @@

>  

>  enum {

>      SEI_MASTERING_DISPLAY       = 0x08,

> +    SEI_CONTENT_LIGHT_LEVLE     = 0x10,


A stupid typo for LEVEL, I will fix it.

>  };

>  

>  typedef struct VAAPIEncodeH265Context {

> @@ -55,6 +56,7 @@ typedef struct VAAPIEncodeH265Context {

>      H265RawSEI sei;

>  

>      H265RawSEIMasteringDiplayColourVolume mastering_display;

> +    H265RawSEIContentLightLevelInfo content_light_level;

>  

>      int64_t last_idr_frame;

>      int pic_order_cnt;

> @@ -218,6 +220,12 @@ static int

> vaapi_encode_h265_write_extra_header(AVCodecContext *avctx,

>              ++i;

>          }

>  

> +        if (priv->sei_needed & SEI_CONTENT_LIGHT_LEVLE) {

> +            priv->sei.payload[i].payload_type =

> HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO;

> +            priv->sei.payload[i].payload.content_light_level = priv-

> >content_light_level;

> +            ++i;

> +        }

> +

>          priv->sei.payload_count = i;

>          av_assert0(priv->sei.payload_count > 0);

>  

> @@ -702,6 +710,22 @@ static int

> vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,

>          }

>      }

>  

> +    if (opt->sei & SEI_CONTENT_LIGHT_LEVLE) {

> +        AVFrameSideData *sd =

> +            av_frame_get_side_data(pic->input_image,

> +                                   AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);

> +

> +        if (sd) {

> +            AVContentLightMetadata *clm =

> +                (AVContentLightMetadata *)sd->data;

> +

> +            priv->content_light_level.max_content_light_level = clm->MaxCLL;

> +            priv->content_light_level.max_pic_average_light_level = clm-

> >MaxFALL;

> +

> +            priv->sei_needed |= SEI_CONTENT_LIGHT_LEVLE;

> +        }

> +    }

> +

>      vpic->decoded_curr_pic = (VAPictureHEVC) {

>          .picture_id    = pic->recon_surface,

>          .pic_order_cnt = priv->pic_order_cnt,

> @@ -1123,11 +1147,14 @@ static const AVOption vaapi_encode_h265_options[] = {

>  

>      { "sei", "Set SEI to include",

>        OFFSET(sei), AV_OPT_TYPE_FLAGS,

> -      { .i64 = SEI_MASTERING_DISPLAY },

> +      { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVLE },

>        0, INT_MAX, FLAGS, "sei" },

>      { "mastering_display", "Include mastering display colour volume",

>        0, AV_OPT_TYPE_CONST, { .i64 = SEI_MASTERING_DISPLAY },

>        INT_MIN, INT_MAX, FLAGS, "sei" },

> +    { "content_light_level", "Include content light level information",

> +      0, AV_OPT_TYPE_CONST, { .i64 = SEI_CONTENT_LIGHT_LEVLE },

> +      INT_MIN, INT_MAX, FLAGS, "sei" },

>  

>      { NULL },

>  };
Mark Thompson May 3, 2018, 9:49 p.m. UTC | #2
On 03/05/18 04:07, Haihao Xiang wrote:
> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
> ---
>  libavcodec/vaapi_encode_h265.c | 29 ++++++++++++++++++++++++++++-
>  1 file changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
> index 326fe4fe66..5fe487dfc5 100644
> --- a/libavcodec/vaapi_encode_h265.c
> +++ b/libavcodec/vaapi_encode_h265.c
> @@ -37,6 +37,7 @@
>  
>  enum {
>      SEI_MASTERING_DISPLAY       = 0x08,
> +    SEI_CONTENT_LIGHT_LEVLE     = 0x10,
>  };
>  
>  typedef struct VAAPIEncodeH265Context {
> @@ -55,6 +56,7 @@ typedef struct VAAPIEncodeH265Context {
>      H265RawSEI sei;
>  
>      H265RawSEIMasteringDiplayColourVolume mastering_display;
> +    H265RawSEIContentLightLevelInfo content_light_level;
>  
>      int64_t last_idr_frame;
>      int pic_order_cnt;
> @@ -218,6 +220,12 @@ static int vaapi_encode_h265_write_extra_header(AVCodecContext *avctx,
>              ++i;
>          }
>  
> +        if (priv->sei_needed & SEI_CONTENT_LIGHT_LEVLE) {
> +            priv->sei.payload[i].payload_type = HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO;
> +            priv->sei.payload[i].payload.content_light_level = priv->content_light_level;
> +            ++i;
> +        }
> +
>          priv->sei.payload_count = i;
>          av_assert0(priv->sei.payload_count > 0);
>  
> @@ -702,6 +710,22 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
>          }
>      }
>  
> +    if (opt->sei & SEI_CONTENT_LIGHT_LEVLE) {
> +        AVFrameSideData *sd =
> +            av_frame_get_side_data(pic->input_image,
> +                                   AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);

Same question about when this side data is set as for mastering display.

> +
> +        if (sd) {
> +            AVContentLightMetadata *clm =
> +                (AVContentLightMetadata *)sd->data;
> +
> +            priv->content_light_level.max_content_light_level = clm->MaxCLL;
> +            priv->content_light_level.max_pic_average_light_level = clm->MaxFALL;

Possibly needs to be clipped to 16 bits?

> +
> +            priv->sei_needed |= SEI_CONTENT_LIGHT_LEVLE;
> +        }
> +    }
> +
>      vpic->decoded_curr_pic = (VAPictureHEVC) {
>          .picture_id    = pic->recon_surface,
>          .pic_order_cnt = priv->pic_order_cnt,
> @@ -1123,11 +1147,14 @@ static const AVOption vaapi_encode_h265_options[] = {
>  
>      { "sei", "Set SEI to include",
>        OFFSET(sei), AV_OPT_TYPE_FLAGS,
> -      { .i64 = SEI_MASTERING_DISPLAY },
> +      { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVLE },
>        0, INT_MAX, FLAGS, "sei" },
>      { "mastering_display", "Include mastering display colour volume",
>        0, AV_OPT_TYPE_CONST, { .i64 = SEI_MASTERING_DISPLAY },
>        INT_MIN, INT_MAX, FLAGS, "sei" },
> +    { "content_light_level", "Include content light level information",
> +      0, AV_OPT_TYPE_CONST, { .i64 = SEI_CONTENT_LIGHT_LEVLE },
> +      INT_MIN, INT_MAX, FLAGS, "sei" },

If you still like the idea of an "hdr" option (so that '-sei hdr' works), you can make it have the value SEI_MASTERING_DISPLAY|SEI_CONTENT_LIGHT_LEVEL.

>  
>      { NULL },
>  };
>
Xiang, Haihao May 4, 2018, 1:08 p.m. UTC | #3
>-----Original Message-----

>From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf Of

>Mark Thompson

>Sent: Friday, May 4, 2018 5:49 AM

>To: ffmpeg-devel@ffmpeg.org

>Subject: Re: [FFmpeg-devel] [PATCH 4/4] vaapi_encode_h265: Insert content

>light level information

>

>On 03/05/18 04:07, Haihao Xiang wrote:

>> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>

>> ---

>>  libavcodec/vaapi_encode_h265.c | 29 ++++++++++++++++++++++++++++-

>>  1 file changed, 28 insertions(+), 1 deletion(-)

>>

>> diff --git a/libavcodec/vaapi_encode_h265.c

>> b/libavcodec/vaapi_encode_h265.c index 326fe4fe66..5fe487dfc5 100644

>> --- a/libavcodec/vaapi_encode_h265.c

>> +++ b/libavcodec/vaapi_encode_h265.c

>> @@ -37,6 +37,7 @@

>>

>>  enum {

>>      SEI_MASTERING_DISPLAY       = 0x08,

>> +    SEI_CONTENT_LIGHT_LEVLE     = 0x10,

>>  };

>>

>>  typedef struct VAAPIEncodeH265Context { @@ -55,6 +56,7 @@ typedef

>> struct VAAPIEncodeH265Context {

>>      H265RawSEI sei;

>>

>>      H265RawSEIMasteringDiplayColourVolume mastering_display;

>> +    H265RawSEIContentLightLevelInfo content_light_level;

>>

>>      int64_t last_idr_frame;

>>      int pic_order_cnt;

>> @@ -218,6 +220,12 @@ static int

>vaapi_encode_h265_write_extra_header(AVCodecContext *avctx,

>>              ++i;

>>          }

>>

>> +        if (priv->sei_needed & SEI_CONTENT_LIGHT_LEVLE) {

>> +            priv->sei.payload[i].payload_type =

>HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO;

>> +            priv->sei.payload[i].payload.content_light_level = priv-

>>content_light_level;

>> +            ++i;

>> +        }

>> +

>>          priv->sei.payload_count = i;

>>          av_assert0(priv->sei.payload_count > 0);

>>

>> @@ -702,6 +710,22 @@ static int

>vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,

>>          }

>>      }

>>

>> +    if (opt->sei & SEI_CONTENT_LIGHT_LEVLE) {

>> +        AVFrameSideData *sd =

>> +            av_frame_get_side_data(pic->input_image,

>> +

>> + AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);

>

>Same question about when this side data is set as for mastering display.

>


The persistence scope for content light level is also CLVS, my understanding is to set this side-data per I/IDR frame 

>> +

>> +        if (sd) {

>> +            AVContentLightMetadata *clm =

>> +                (AVContentLightMetadata *)sd->data;

>> +

>> +            priv->content_light_level.max_content_light_level = clm->MaxCLL;

>> +            priv->content_light_level.max_pic_average_light_level =

>> + clm->MaxFALL;

>

>Possibly needs to be clipped to 16 bits?



Yes, I will change it.

>

>> +

>> +            priv->sei_needed |= SEI_CONTENT_LIGHT_LEVLE;

>> +        }

>> +    }

>> +

>>      vpic->decoded_curr_pic = (VAPictureHEVC) {

>>          .picture_id    = pic->recon_surface,

>>          .pic_order_cnt = priv->pic_order_cnt, @@ -1123,11 +1147,14 @@

>> static const AVOption vaapi_encode_h265_options[] = {

>>

>>      { "sei", "Set SEI to include",

>>        OFFSET(sei), AV_OPT_TYPE_FLAGS,

>> -      { .i64 = SEI_MASTERING_DISPLAY },

>> +      { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVLE },

>>        0, INT_MAX, FLAGS, "sei" },

>>      { "mastering_display", "Include mastering display colour volume",

>>        0, AV_OPT_TYPE_CONST, { .i64 = SEI_MASTERING_DISPLAY },

>>        INT_MIN, INT_MAX, FLAGS, "sei" },

>> +    { "content_light_level", "Include content light level information",

>> +      0, AV_OPT_TYPE_CONST, { .i64 = SEI_CONTENT_LIGHT_LEVLE },

>> +      INT_MIN, INT_MAX, FLAGS, "sei" },

>

>If you still like the idea of an "hdr" option (so that '-sei hdr' works), you can

>make it have the value SEI_MASTERING_DISPLAY|SEI_CONTENT_LIGHT_LEVEL.

>


Sure, I will change it to '-sei hdr'.

>>

>>      { NULL },

>>  };

>>

>_______________________________________________

>ffmpeg-devel mailing list

>ffmpeg-devel@ffmpeg.org

>http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
diff mbox

Patch

diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
index 326fe4fe66..5fe487dfc5 100644
--- a/libavcodec/vaapi_encode_h265.c
+++ b/libavcodec/vaapi_encode_h265.c
@@ -37,6 +37,7 @@ 
 
 enum {
     SEI_MASTERING_DISPLAY       = 0x08,
+    SEI_CONTENT_LIGHT_LEVLE     = 0x10,
 };
 
 typedef struct VAAPIEncodeH265Context {
@@ -55,6 +56,7 @@  typedef struct VAAPIEncodeH265Context {
     H265RawSEI sei;
 
     H265RawSEIMasteringDiplayColourVolume mastering_display;
+    H265RawSEIContentLightLevelInfo content_light_level;
 
     int64_t last_idr_frame;
     int pic_order_cnt;
@@ -218,6 +220,12 @@  static int vaapi_encode_h265_write_extra_header(AVCodecContext *avctx,
             ++i;
         }
 
+        if (priv->sei_needed & SEI_CONTENT_LIGHT_LEVLE) {
+            priv->sei.payload[i].payload_type = HEVC_SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO;
+            priv->sei.payload[i].payload.content_light_level = priv->content_light_level;
+            ++i;
+        }
+
         priv->sei.payload_count = i;
         av_assert0(priv->sei.payload_count > 0);
 
@@ -702,6 +710,22 @@  static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx,
         }
     }
 
+    if (opt->sei & SEI_CONTENT_LIGHT_LEVLE) {
+        AVFrameSideData *sd =
+            av_frame_get_side_data(pic->input_image,
+                                   AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+
+        if (sd) {
+            AVContentLightMetadata *clm =
+                (AVContentLightMetadata *)sd->data;
+
+            priv->content_light_level.max_content_light_level = clm->MaxCLL;
+            priv->content_light_level.max_pic_average_light_level = clm->MaxFALL;
+
+            priv->sei_needed |= SEI_CONTENT_LIGHT_LEVLE;
+        }
+    }
+
     vpic->decoded_curr_pic = (VAPictureHEVC) {
         .picture_id    = pic->recon_surface,
         .pic_order_cnt = priv->pic_order_cnt,
@@ -1123,11 +1147,14 @@  static const AVOption vaapi_encode_h265_options[] = {
 
     { "sei", "Set SEI to include",
       OFFSET(sei), AV_OPT_TYPE_FLAGS,
-      { .i64 = SEI_MASTERING_DISPLAY },
+      { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVLE },
       0, INT_MAX, FLAGS, "sei" },
     { "mastering_display", "Include mastering display colour volume",
       0, AV_OPT_TYPE_CONST, { .i64 = SEI_MASTERING_DISPLAY },
       INT_MIN, INT_MAX, FLAGS, "sei" },
+    { "content_light_level", "Include content light level information",
+      0, AV_OPT_TYPE_CONST, { .i64 = SEI_CONTENT_LIGHT_LEVLE },
+      INT_MIN, INT_MAX, FLAGS, "sei" },
 
     { NULL },
 };