Skip to content

Commit

Permalink
video/hdmi: Add Unpack function for DRM infoframe
Browse files Browse the repository at this point in the history
Added unpack function for DRM infoframe for dynamic
range and mastering infoframe readout.

v2: Addressed Ville's review comments.

Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Uma Shankar <uma.shankar@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/1558015817-12025-12-git-send-email-uma.shankar@intel.com
  • Loading branch information
Uma Shankar authored and Ville Syrjälä committed May 22, 2019
1 parent b5e3eed commit 270afb3
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions drivers/video/hdmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1804,6 +1804,70 @@ hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
return 0;
}

/**
* hdmi_drm_infoframe_unpack() - unpack binary buffer to a HDMI DRM infoframe
* @frame: HDMI DRM infoframe
* @buffer: source buffer
* @size: size of buffer
*
* Unpacks the information contained in binary @buffer into a structured
* @frame of the HDMI Dynamic Range and Mastering (DRM) information frame.
* Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4
* specification.
*
* Returns 0 on success or a negative error code on failure.
*/
static int hdmi_drm_infoframe_unpack(struct hdmi_drm_infoframe *frame,
const void *buffer, size_t size)
{
const u8 *ptr = buffer;
const u8 *temp;
u8 x_lsb, x_msb;
u8 y_lsb, y_msb;
int ret;
int i;

if (size < HDMI_INFOFRAME_SIZE(DRM))
return -EINVAL;

if (ptr[0] != HDMI_INFOFRAME_TYPE_DRM ||
ptr[1] != 1 ||
ptr[2] != HDMI_DRM_INFOFRAME_SIZE)
return -EINVAL;

if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(DRM)) != 0)
return -EINVAL;

ret = hdmi_drm_infoframe_init(frame);
if (ret)
return ret;

ptr += HDMI_INFOFRAME_HEADER_SIZE;

frame->eotf = ptr[0] & 0x7;
frame->metadata_type = ptr[1] & 0x7;

temp = ptr + 2;
for (i = 0; i < 3; i++) {
x_lsb = *temp++;
x_msb = *temp++;
frame->display_primaries[i].x = (x_msb << 8) | x_lsb;
y_lsb = *temp++;
y_msb = *temp++;
frame->display_primaries[i].y = (y_msb << 8) | y_lsb;
}

frame->white_point.x = (ptr[15] << 8) | ptr[14];
frame->white_point.y = (ptr[17] << 8) | ptr[16];

frame->max_display_mastering_luminance = (ptr[19] << 8) | ptr[18];
frame->min_display_mastering_luminance = (ptr[21] << 8) | ptr[20];
frame->max_cll = (ptr[23] << 8) | ptr[22];
frame->max_fall = (ptr[25] << 8) | ptr[24];

return 0;
}

/**
* hdmi_infoframe_unpack() - unpack binary buffer to a HDMI infoframe
* @frame: HDMI infoframe
Expand All @@ -1830,6 +1894,9 @@ int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
case HDMI_INFOFRAME_TYPE_AVI:
ret = hdmi_avi_infoframe_unpack(&frame->avi, buffer, size);
break;
case HDMI_INFOFRAME_TYPE_DRM:
ret = hdmi_drm_infoframe_unpack(&frame->drm, buffer, size);
break;
case HDMI_INFOFRAME_TYPE_SPD:
ret = hdmi_spd_infoframe_unpack(&frame->spd, buffer, size);
break;
Expand Down

0 comments on commit 270afb3

Please sign in to comment.