[PATCH 07/11] drm: set output colorspace in AVI infoframe

Sharma, Shashank shashank.sharma at intel.com
Wed Apr 19 15:55:53 UTC 2017


Regards

Shashank


On 4/12/2017 3:19 PM, Jose Abreu wrote:
> Hi Shashank,
>
>
> On 07-04-2017 17:39, Shashank Sharma wrote:
>> HDMI source must set output colorspace information in AVI
>> infoframes, so that the sink can decode upcoming frames
>> accordingly.
>>
>> As this patch series is adding support for HDMI output modes
>> other than RGB, this patch adds a function in DRM layer, to
>> add the output colorspace information in the AVI infoframes.
>>
>> Cc: Ville Syrjala <ville.syrjala at linux.intel.com>
>> Cc: Jose Abreu <Jose.Abreu at synopsys.com>
>> Signed-off-by: Shashank Sharma <shashank.sharma at intel.com>
>> ---
>>   drivers/gpu/drm/drm_edid.c | 40 ++++++++++++++++++++++++++++++++++++++++
>>   include/drm/drm_edid.h     |  5 +++++
>>   2 files changed, 45 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
>> index 828b781..a02d35b 100644
>> --- a/drivers/gpu/drm/drm_edid.c
>> +++ b/drivers/gpu/drm/drm_edid.c
>> @@ -4734,6 +4734,46 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
>>   EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode);
>>   
>>   /**
>> + * drm_hdmi_avi_infoframe_set_colorspace() - fill an HDMI AVI infoframe with
>> + * colorspace data of the output type
>> + *
>> + * @frame: HDMI AVI infoframe
>> + * @mode: DRM display mode
>> + * @hdmi_output: HDMI output colorspace
>> + *
>> + * Return: 0 on success or a negative error code on failure.
>> + */
>> +int
>> +drm_hdmi_avi_infoframe_set_colorspace(struct hdmi_avi_infoframe *frame,
>> +					 const struct drm_display_mode *mode,
>> +					 enum drm_hdmi_output_type hdmi_output)
>> +{
>> +	switch (hdmi_output) {
>> +	case DRM_HDMI_OUTPUT_YCBCR444:
>> +		frame->colorspace = HDMI_COLORSPACE_YUV444;
>> +		break;
>> +	case DRM_HDMI_OUTPUT_YCBCR422:
>> +		frame->colorspace = HDMI_COLORSPACE_YUV422;
>> +		break;
>> +	case DRM_HDMI_OUTPUT_YCBCR420:
>> +		frame->colorspace = HDMI_COLORSPACE_YUV420;
>> +		frame->pixel_repeat = 0;
> Why only 4:2:0 is set with pixel repetition off? Is this per spec?
Yes, the HDMI 2.0/CEA-861-F mandates the source to turn off pixel 
repetition for YCBCR420 output.
>> +		break;
>> +	case DRM_HDMI_OUTPUT_DEFAULT_RGB:
>> +		frame->colorspace = HDMI_COLORSPACE_RGB;
>> +		break;
>> +	case DRM_HDMI_OUTPUT_YCBCR_HQ:
>> +	case DRM_HDMI_OUTPUT_YCBCR_LQ:
>> +	case DRM_HDMI_OUTPUT_INVALID:
> Maybe default to RGB here? I don't know if spec says anything
> about sending empty colorspace field.
Actually, by default the enum value for RGB is 0, that's why we were not 
setting this field at all, as there was only RGB output.
case HQ/LQ indicate that user wanted to have YCBCR output (but it should 
have never reached this point), so I am not sure if its
good idea to default to RGB, or is it :) ? lets hear from others too.

- Shashank
> Best regards,
> Jose Miguel Abreu
>
>> +		DRM_ERROR("Invalid HDMI output type\n");
>> +		return -EINVAL;
>> +	}
>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(drm_hdmi_avi_infoframe_set_colorspace);
>> +
>> +/**
>>    * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe
>>    *                                        quantization range information
>>    * @frame: HDMI AVI infoframe
>> diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
>> index a4d174e7..8980366 100644
>> --- a/include/drm/drm_edid.h
>> +++ b/include/drm/drm_edid.h
>> @@ -329,6 +329,7 @@ struct cea_sad {
>>   struct drm_encoder;
>>   struct drm_connector;
>>   struct drm_display_mode;
>> +enum drm_hdmi_output_type;
>>   
>>   void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid);
>>   int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads);
>> @@ -351,6 +352,10 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
>>   					 const struct drm_display_mode *mode,
>>   					 bool is_hdmi2);
>>   int
>> +drm_hdmi_avi_infoframe_set_colorspace(struct hdmi_avi_infoframe *frame,
>> +					 const struct drm_display_mode *mode,
>> +					 enum drm_hdmi_output_type hdmi_output);
>> +int
>>   drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
>>   					    const struct drm_display_mode *mode);
>>   void



More information about the dri-devel mailing list