edid: Parse CTA-861 Colorimetry Data Block (CDB)

Parses the CTA-861 extensions data blocks to extract the supported
colorimetry which can be set with the KMS connectors `Colorspace`
property.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2351>
This commit is contained in:
Sebastian Wick 2022-03-29 15:25:31 +02:00 committed by Jonas Ådahl
parent d76f9e6c4a
commit 80626edfea
2 changed files with 30 additions and 0 deletions

View File

@ -44,6 +44,7 @@
#define EDID_EXT_CTA_DESCRIPTOR_OFFSET_ADDR 0x02
#define EDID_EXT_CTA_DATA_BLOCK_OFFSET 0x04
#define EDID_EXT_CTA_TAG_EXTENDED 0x07
#define EDID_EXT_CTA_TAG_EXTENDED_COLORIMETRY 0x0705
static int
get_bit (int in, int bit)
@ -554,6 +555,15 @@ decode_descriptors (const uint8_t *edid,
return TRUE;
}
static gboolean
decode_ext_cta_colorimetry (const uint8_t *data_block,
MetaEdidInfo *info)
{
/* CTA-861-H: Table 78 - Colorimetry Data Block (CDB) */
info->colorimetry = (data_block[3] << 8) + data_block[2];
return TRUE;
}
static gboolean
decode_ext_cta (const uint8_t *cta_block,
MetaEdidInfo *info)
@ -600,6 +610,10 @@ decode_ext_cta (const uint8_t *cta_block,
switch (tag)
{
case EDID_EXT_CTA_TAG_EXTENDED_COLORIMETRY:
if (!decode_ext_cta_colorimetry (data_block, info))
return FALSE;
break;
}
}

View File

@ -60,6 +60,20 @@ typedef enum
META_EDID_STEREO_TYPE_SIDE_BY_SIDE
} MetaEdidStereoType;
typedef enum
{
META_EDID_COLORIMETRY_XVYCC601 = (1 << 0),
META_EDID_COLORIMETRY_XVYCC709 = (1 << 1),
META_EDID_COLORIMETRY_SYCC601 = (1 << 2),
META_EDID_COLORIMETRY_OPYCC601 = (1 << 3),
META_EDID_COLORIMETRY_OPRGB = (1 << 4),
META_EDID_COLORIMETRY_BT2020CYCC = (1 << 5),
META_EDID_COLORIMETRY_BT2020YCC = (1 << 6),
META_EDID_COLORIMETRY_BT2020RGB = (1 << 7),
META_EDID_COLORIMETRY_ST2113RGB = (1 << 14),
META_EDID_COLORIMETRY_ICTCP = (1 << 15),
} MetaEdidColorimetry;
struct _MetaEdidTiming
{
int width;
@ -187,6 +201,8 @@ struct _MetaEdidInfo
char dsc_serial_number[14];
char dsc_product_name[14];
char dsc_string[14]; /* Unspecified ASCII data */
MetaEdidColorimetry colorimetry;
};
MetaEdidInfo *meta_edid_info_new_parse (const uint8_t *data);