| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -37,6 +37,7 @@ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			enum { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    SEI_MASTERING_DISPLAY       = 0x08, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    SEI_CONTENT_LIGHT_LEVEL     = 0x10, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			typedef struct VAAPIEncodeH265Context { | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -55,6 +56,7 @@ typedef struct VAAPIEncodeH265Context { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    H265RawSEI sei; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    H265RawSEIMasteringDisplayColourVolume 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_LEVEL) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            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); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -706,6 +714,25 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if ((opt->sei & SEI_CONTENT_LIGHT_LEVEL) && | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        (pic->type == PICTURE_TYPE_I || pic->type == PICTURE_TYPE_IDR)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        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 = | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                FFMIN(clm->MaxCLL, 65535); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            priv->content_light_level.max_pic_average_light_level = | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                FFMIN(clm->MaxFALL, 65535); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            priv->sei_needed |= SEI_CONTENT_LIGHT_LEVEL; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    vpic->decoded_curr_pic = (VAPictureHEVC) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        .picture_id    = pic->recon_surface, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        .pic_order_cnt = priv->pic_order_cnt, | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -1127,10 +1154,13 @@ 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_LEVEL }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      0, INT_MAX, FLAGS, "sei" }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "hdr", "Include HDR metadata for mastering display colour volume", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      0, AV_OPT_TYPE_CONST, { .i64 = SEI_MASTERING_DISPLAY }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { "hdr", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      "Include HDR metadata for mastering display colour volume " | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      "and content light level information", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      0, AV_OPT_TYPE_CONST, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      { .i64 = SEI_MASTERING_DISPLAY | SEI_CONTENT_LIGHT_LEVEL }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      INT_MIN, INT_MAX, FLAGS, "sei" }, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { NULL }, | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |