cta: add support for HDMI Forum vendor-specific data block

Signed-off-by: Simon Ser <contact@emersion.fr>
diff --git a/cta.c b/cta.c
index 3f99328..7b8109f 100644
--- a/cta.c
+++ b/cta.c
@@ -108,6 +108,97 @@
 }
 
 static bool
+parse_vendor_hdmi_forum_block(struct di_edid_cta *cta,
+			      struct di_cta_vendor_hdmi_forum_block_priv *priv,
+			      const uint8_t *data, size_t size)
+{
+	const ssize_t offset = -1; /* Spec gives offset relative to header */
+	const char block_name[] = "Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8";
+	struct di_cta_vendor_hdmi_forum_block *block = &priv->base;
+	uint8_t max_frl_rate;
+
+	/* TODO: check size */
+
+	block->version = data[4 + offset];
+	if (block->version != 1) {
+		add_failure(cta, "%s: Unsupported version %d.", block_name, block->version);
+		return false;
+	}
+
+	block->max_tmds_char_rate_mhz = 5 * data[5 + offset];
+	if (block->max_tmds_char_rate_mhz > 0 && block->max_tmds_char_rate_mhz <= 340) {
+		add_failure(cta, "%s: Max TMDS rate is > 0 and <= 340.", block_name);
+		block->max_tmds_char_rate_mhz = 0;
+	}
+
+	block->supports_3d_osd_disparity = has_bit(data[6 + offset], 0);
+	block->supports_3d_dial_view = has_bit(data[6 + offset], 1);
+	block->supports_3d_independent_view = has_bit(data[6 + offset], 2);
+	block->supports_lte_340mcsc_scramble = has_bit(data[6 + offset], 3);
+	block->supports_ccbpci = has_bit(data[6 + offset], 4);
+	block->supports_scdc_read_request = has_bit(data[6 + offset], 6);
+	block->supports_scdc = has_bit(data[6 + offset], 7);
+	if (has_bit(data[6 + offset], 5))
+		add_failure(cta, "%s: Bit 5 of byte 6 is reserved.", block_name);
+
+	block->supports_dc_30bit_420 = has_bit(data[7 + offset], 0);
+	block->supports_dc_36bit_420 = has_bit(data[7 + offset], 1);
+	block->supports_dc_48bit_420 = has_bit(data[7 + offset], 2);
+	if (has_bit(data[7 + offset], 3))
+		add_failure(cta, "%s: Bit 3 of byte 7 is reserved.", block_name);
+
+	max_frl_rate = get_bit_range(data[7 + offset], 7, 4);
+	if (max_frl_rate != 0) {
+		block->frl = &priv->frl;
+		priv->frl.supports_3gbps_3lanes = max_frl_rate >= 1;
+		priv->frl.supports_6gbps_3lanes = max_frl_rate >= 2;
+		priv->frl.supports_6gbps_4lanes = max_frl_rate >= 3;
+		priv->frl.supports_8gbps_4lanes = max_frl_rate >= 4;
+		priv->frl.supports_10gbps_4lanes = max_frl_rate >= 5;
+		priv->frl.supports_12gbps_4lanes = max_frl_rate >= 6;
+		if (max_frl_rate >= 7)
+			add_failure(cta, "%s: Unknown Max Fixed Rate Link (0x%02x).", block_name, max_frl_rate);
+		if (max_frl_rate == 1 && block->max_tmds_char_rate_mhz < 300)
+			add_failure(cta, "%s: Max Fixed Rate Link is 1, but Max TMDS rate < 300.", block_name);
+		if (max_frl_rate >= 2 && block->max_tmds_char_rate_mhz != 600)
+			add_failure(cta, "%s: Max Fixed Rate Link is >= 2, but Max TMDS rate != 600.", block_name);
+	}
+
+	block->supports_fapa_start_location = has_bit(data[8 + offset], 0);
+	block->supports_allm = has_bit(data[8 + offset], 1);
+	block->supports_fva = has_bit(data[8 + offset], 2);
+	block->supports_cnmvrr = has_bit(data[8 + offset], 3);
+	block->supports_cinema_vrr = has_bit(data[8 + offset], 4);
+	block->m_delta = has_bit(data[8 + offset], 5);
+	if (get_bit_range(data[8 + offset], 7, 6) != 0)
+		add_failure(cta, "%s: Bits 6 and 7 of byte 8 are reserved.", block_name);
+
+	block->vrr_min_hz = get_bit_range(data[9 + offset], 5, 0);
+	block->vrr_max_hz = (get_bit_range(data[9 + offset], 7, 6) << 8) | data[10 + offset];
+
+	if (has_bit(data[11 + offset], 7)) {
+		block->dsc = &priv->dsc;
+		priv->dsc.supports_10bpc = has_bit(data[11 + offset], 0);
+		priv->dsc.supports_12bpc = has_bit(data[11 + offset], 1);
+		priv->dsc.supports_all_bpc = has_bit(data[11 + offset], 3);
+		priv->dsc.supports_native_420 = has_bit(data[11 + offset], 6);
+		if (has_bit(data[11 + offset], 2))
+			add_failure(cta, "%s: DSC_16bpc bit is reserved.", block_name);
+		if (get_bit_range(data[11 + offset], 5, 4) != 0)
+			add_failure(cta, "%s: Bits 4 and 5 of byte 11 are reserved.", block_name);
+		priv->dsc.max_slices = get_bit_range(data[12 + offset], 3, 0);
+		priv->dsc.max_frl_rate_gbps = get_bit_range(data[12 + offset], 7, 4);
+		priv->dsc.max_total_chunk_bytes = get_bit_range(data[13 + offset], 5, 0);
+		if (get_bit_range(data[13 + offset], 7, 6) != 0)
+			add_failure(cta, "%s: Bits 6 and 7 of byte 13 are reserved.", block_name);
+	}
+
+	/* TODO: all other bytes are reserved */
+
+	return true;
+}
+
+static bool
 parse_ycbcr420_block(struct di_edid_cta *cta,
 		     struct di_cta_video_block *ycbcr420,
 		     const uint8_t *data, size_t size)
@@ -1258,6 +1349,7 @@
 	enum di_cta_data_block_tag tag;
 	uint8_t extended_tag;
 	struct di_cta_data_block *data_block;
+	uint32_t ieee_oui;
 
 	data_block = calloc(1, sizeof(*data_block));
 	if (!data_block) {
@@ -1277,7 +1369,26 @@
 		break;
 	case 3:
 		/* Vendor-Specific Data Block */
-		goto skip;
+
+		if (size < 3) {
+			add_failure(cta,
+				    "Vendor-Specific Data Block: Data block length (%zu) is not enough to contain an OUI.",
+				    size);
+			goto skip;
+		}
+
+		ieee_oui = (data[2] << 16) | (data[1] << 8) | data[0];
+		switch (ieee_oui) {
+		case IEEE_OUI_HDMI_FORUM:
+			tag = DI_CTA_DATA_BLOCK_VENDOR_HDMI_FORUM;
+			if (!parse_vendor_hdmi_forum_block(cta, &data_block->vendor_hdmi_forum,
+							   data, size))
+				goto skip;
+			break;
+		default:
+			goto skip;
+		}
+		break;
 	case 4:
 		tag = DI_CTA_DATA_BLOCK_SPEAKER_ALLOC;
 		if (!parse_speaker_alloc_block(cta, &data_block->speaker_alloc,
diff --git a/di-edid-decode/cta.c b/di-edid-decode/cta.c
index d0c7021..3825e97 100644
--- a/di-edid-decode/cta.c
+++ b/di-edid-decode/cta.c
@@ -752,6 +752,8 @@
 		return "HDMI Forum EDID Extension Override Data Block";
 	case DI_CTA_DATA_BLOCK_HDMI_SINK_CAP:
 		return "HDMI Forum Sink Capability Data Block";
+	case DI_CTA_DATA_BLOCK_VENDOR_HDMI_FORUM:
+		return "Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8";
 	}
 	return "Unknown CTA-861 Data Block";
 }
diff --git a/include/cta.h b/include/cta.h
index fc57735..a963f24 100644
--- a/include/cta.h
+++ b/include/cta.h
@@ -58,6 +58,8 @@
  */
 #define EDID_CTA_INFOFRAME_BLOCK_ENTRIES 61
 
+#define IEEE_OUI_HDMI_FORUM 0xC45DD8
+
 struct di_edid_cta {
 	int revision;
 	struct di_edid_cta_flags flags;
@@ -128,6 +130,12 @@
 	size_t infoframes_len;
 };
 
+struct di_cta_vendor_hdmi_forum_block_priv {
+	struct di_cta_vendor_hdmi_forum_block base;
+	struct di_cta_vendor_hdmi_forum_block_frl frl;
+	struct di_cta_vendor_hdmi_forum_block_dsc dsc;
+};
+
 struct di_cta_data_block {
 	enum di_cta_data_block_tag tag;
 
@@ -155,6 +163,8 @@
 	struct di_cta_ycbcr420_cap_map ycbcr420_cap_map;
 	/* Used for DI_CTA_DATA_BLOCK_INFOFRAME */
 	struct di_cta_infoframe_block_priv infoframe;
+	/* Used for DI_CTA_DATA_BLOCK_VENDOR_HDMI_FORUM */
+	struct di_cta_vendor_hdmi_forum_block_priv vendor_hdmi_forum;
 };
 
 extern const struct di_cta_video_format _di_cta_video_formats[];
diff --git a/include/libdisplay-info/cta.h b/include/libdisplay-info/cta.h
index 18459c5..2616466 100644
--- a/include/libdisplay-info/cta.h
+++ b/include/libdisplay-info/cta.h
@@ -165,6 +165,9 @@
 	DI_CTA_DATA_BLOCK_HDMI_EDID_EXT_OVERRIDE,
 	/* HDMI Forum Sink Capability Data Block */
 	DI_CTA_DATA_BLOCK_HDMI_SINK_CAP,
+
+	/* HDMI Forum Vendor-Specific Data Block */
+	DI_CTA_DATA_BLOCK_VENDOR_HDMI_FORUM = 0x1000,
 };
 
 /**
@@ -925,6 +928,107 @@
 di_cta_data_block_get_infoframe(const struct di_cta_data_block *block);
 
 /**
+ * Fixed Rate Link (FRL) support.
+ */
+struct di_cta_vendor_hdmi_forum_block_frl {
+	bool supports_3gbps_3lanes; /* 3 Gbit/s per lane on 3 lanes */
+	bool supports_6gbps_3lanes; /* 6 Gbit/s per lane on 3 lanes */
+	bool supports_6gbps_4lanes; /* 6 Gbit/s per lane on 4 lanes */
+	bool supports_8gbps_4lanes; /* 8 Gbit/s per lane on 4 lanes */
+	bool supports_10gbps_4lanes; /* 10 Gbit/s per lane on 4 lanes */
+	bool supports_12gbps_4lanes; /* 12 Gbit/s per lane on 4 lanes */
+};
+
+/**
+ * Display Stream Compression (DSC) support.
+ */
+struct di_cta_vendor_hdmi_forum_block_dsc {
+	/* Supports Display Stream Compression for 10bpc */
+	bool supports_10bpc;
+	/* Supports Display Stream Compression for 12bpc */
+	bool supports_12bpc;
+	/* Supports Display Stream Compression for any bpc between 1 and 16 */
+	bool supports_all_bpc;
+	/* Supports Display Stream Compression for 4:2:0 pixel encodings */
+	bool supports_native_420;
+	/* Maximum number of horizontal slices, zero if unsupported */
+	int max_slices;
+	/* Maximum FRL_Rate in Gbit/s, zero if unsupported */
+	int max_frl_rate_gbps;
+	/* Maximum total number of bytes in a line of chunks, zero if
+	 * unsupported */
+	int max_total_chunk_bytes;
+};
+
+/**
+ * HDMI Forum vendor-specific data block.
+ *
+ * This block is defined in HDMI 2.1 section 10.3.2.
+ */
+struct di_cta_vendor_hdmi_forum_block {
+	/* Version */
+	int version;
+	/* Maximum TMDS character rate in MHz, zero if unset */
+	int max_tmds_char_rate_mhz;
+	/* Supports 3D OSD disparity indication in HF-VSIF */
+	bool supports_3d_osd_disparity;
+	/* Supports 3D dual view signaling in HF-VSIF */
+	bool supports_3d_dial_view;
+	/* Supports 3D independent view signaling in HF-VSIF */
+	bool supports_3d_independent_view;
+	/* Supports scrambling for TMDS character rates at or below 340 Mcsc */
+	bool supports_lte_340mcsc_scramble;
+	/* Supports Color Content Bits Per Component Indication */
+	bool supports_ccbpci;
+	/* Supports SCDC read request initiation */
+	bool supports_scdc_read_request;
+	/* Supports SCDC */
+	bool supports_scdc;
+	/* Supports 10 bits per component deep color 4:2:0 pixel encoding */
+	bool supports_dc_30bit_420;
+	/* Supports 12 bits per component deep color 4:2:0 pixel encoding */
+	bool supports_dc_36bit_420;
+	/* Supports 16 bits per component deep color 4:2:0 pixel encoding */
+	bool supports_dc_48bit_420;
+	/* Fixed Rate Link (FRL) support, NULL if unsupported */
+	const struct di_cta_vendor_hdmi_forum_block_frl *frl;
+	/* Supports FAPA beginning on the first horizontal Blank Pixel
+	 * immediately following the first Active Video Pixel of a video
+	 * frame/field */
+	bool supports_fapa_start_location;
+	/* Supports Auto Low-Latency Mode */
+	bool supports_allm;
+	/* Supports Fast VActive */
+	bool supports_fva;
+	/* Supports negative M_VRR values when VRR and FVA are enabled */
+	bool supports_cnmvrr;
+	/* Supports fractional and integer media rates that lie below the
+	 * specified VRR_MIN when VRR is enabled and M_CONST is in use */
+	bool supports_cinema_vrr;
+	/* Has a limit on rate-of-change variations in M_VRR values */
+	bool m_delta;
+	/* Lowest frame rate in Hz for Variable Refresh Rate, zero if VRR is
+	 * not supported */
+	int vrr_min_hz;
+	/* Highest frame rate in Hz for Variable Refresh Rate, zero if unset */
+	int vrr_max_hz;
+	/* Display Stream Compression (DSC) support, NULL if VESA DSC 1.2a is
+	 * unsupported */
+	const struct di_cta_vendor_hdmi_forum_block_dsc *dsc;
+};
+
+/**
+ * Get the vendor-specific HDMI Forum information from a CTA data block.
+ *
+ * Note, the HDMI and HDMI Forum vendor-specific data blocks are different.
+ *
+ * Returns NULL if the data block tag is not
+ * DI_CTA_DATA_BLOCK_VENDOR_HDMI_FORUM.
+ */
+const struct di_cta_vendor_hdmi_forum_block *
+di_cta_data_block_get_vendor_hdmi_forum(const struct di_cta_data_block *block);
+
+/**
  * Get a list of EDID detailed timing definitions.
  *
  * The returned array is NULL-terminated.
diff --git a/test/data/cta-timings.diff b/test/data/cta-timings.diff
index c489a2d..05523c3 100644
--- a/test/data/cta-timings.diff
+++ b/test/data/cta-timings.diff
@@ -9,7 +9,7 @@
  Checksum: 0x0c
  
  ----------------
-@@ -88,21 +86,6 @@
+@@ -88,21 +86,7 @@
        Max channels: 2
        Supported sample rates (kHz): 48 44.1 32
        Supported sample sizes (bits): 24 20 16
@@ -23,7 +23,7 @@
 -        HDMI VIC 1:  3840x2160   30.000000 Hz  16:9     67.500 kHz    297.000000 MHz
 -        HDMI VIC 2:  3840x2160   25.000000 Hz  16:9     56.250 kHz    297.000000 MHz
 -        HDMI VIC 3:  3840x2160   24.000000 Hz  16:9     54.000 kHz    297.000000 MHz
--  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
+   Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
 -    Version: 1
 -    Maximum TMDS Character Rate: 600 MHz
 -    SCDC Present
@@ -31,7 +31,7 @@
    Video Capability Data Block:
      YCbCr quantization: Selectable (via AVI YQ)
      RGB quantization: Selectable (via AVI Q)
-@@ -110,31 +93,15 @@
+@@ -110,31 +94,15 @@
      IT scan behavior: Always Underscanned
      CE scan behavior: Always Underscanned
    Video Format Preference Data Block:
@@ -63,7 +63,7 @@
    Detailed Timing Descriptors:
      DTD 2:  3840x2160   59.996625 Hz  16:9    133.312 kHz    533.250000 MHz (960 mm x 540 mm)
                   Hfront   48 Hsync  32 Hback   80 Hpol P
-@@ -152,9 +119,9 @@
+@@ -152,10 +120,17 @@
    Native detailed modes: 1
    Detailed Timing Descriptors:
      DTD 3:  1280x720    59.855126 Hz  16:9     44.772 kHz     74.500000 MHz (analog composite, sync-on-green, 960 mm x 540 mm)
@@ -76,3 +76,12 @@
  
  ----------------
  
+-EDID conformity: PASS
++Failures:
++
++Block 2, CTA-861 Extension Block:
++  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: Bit 3 of byte 7 is reserved.
++  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: Bits 6 and 7 of byte 8 are reserved.
++  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: Bits 4 and 5 of byte 11 are reserved.
++  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: Bits 6 and 7 of byte 13 are reserved.
++EDID conformity: FAIL
diff --git a/test/data/dell-g3223q.diff b/test/data/dell-g3223q.diff
index f04d99e..3a22768 100644
--- a/test/data/dell-g3223q.diff
+++ b/test/data/dell-g3223q.diff
@@ -9,7 +9,7 @@
  Checksum: 0x9e
  
  ----------------
-@@ -84,53 +82,11 @@
+@@ -84,53 +82,12 @@
        Supported sample sizes (bits): 24 20 16
    Speaker Allocation Data Block:
      FL/FR - Front Left/Right
@@ -24,7 +24,7 @@
 -        HDMI VIC 1:  3840x2160   30.000000 Hz  16:9     67.500 kHz    297.000000 MHz
 -        HDMI VIC 2:  3840x2160   25.000000 Hz  16:9     56.250 kHz    297.000000 MHz
 -        HDMI VIC 3:  3840x2160   24.000000 Hz  16:9     54.000 kHz    297.000000 MHz
--  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
+   Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
 -    Version: 1
 -    Maximum TMDS Character Rate: 600 MHz
 -    SCDC Present
@@ -63,7 +63,7 @@
    HDR Static Metadata Data Block:
      Electro optical transfer functions:
        Traditional gamma - SDR luminance range
-@@ -159,13 +115,12 @@
+@@ -159,13 +116,12 @@
      DTD 3:  2560x1440  119.997589 Hz  16:9    182.996 kHz    497.750000 MHz (708 mm x 399 mm)
                   Hfront   48 Hsync  32 Hback   80 Hpol P
                   Vfront    3 Vsync   5 Vback   77 Vpol P
@@ -78,7 +78,7 @@
    Display Product Type: Standalone display device
    Video Timing Modes Type 1 - Detailed Timings Data Block:
      DTD:  3840x2160  143.962777 Hz  16:9    318.878 kHz   1250.000000 MHz (aspect 16:9, no 3D stereo)
-@@ -183,30 +138,13 @@
+@@ -183,30 +139,13 @@
      DTD:  2560x1440   59.950550 Hz  16:9     88.787 kHz    241.500000 MHz (aspect 16:9, no 3D stereo)
                 Hfront   48 Hsync  32 Hback   80 Hpol P
                 Vfront    3 Vsync   5 Vback   33 Vpol N
diff --git a/test/data/hitachi-55r6+.diff b/test/data/hitachi-55r6+.diff
index a53883b..a2d6936 100644
--- a/test/data/hitachi-55r6+.diff
+++ b/test/data/hitachi-55r6+.diff
@@ -1,6 +1,6 @@
 --- ref
 +++ di
-@@ -102,26 +102,6 @@
+@@ -102,26 +102,7 @@
    Colorimetry Data Block:
      BT2020YCC
      BT2020RGB
@@ -17,7 +17,7 @@
 -        HDMI VIC 1:  3840x2160   30.000000 Hz  16:9     67.500 kHz    297.000000 MHz
 -        HDMI VIC 3:  3840x2160   24.000000 Hz  16:9     54.000 kHz    297.000000 MHz
 -        HDMI VIC 4:  4096x2160   24.000000 Hz 256:135   54.000 kHz    297.000000 MHz
--  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
+   Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
 -    Version: 1
 -    Maximum TMDS Character Rate: 600 MHz
 -    SCDC Present
@@ -27,7 +27,7 @@
    HDR Static Metadata Data Block:
      Electro optical transfer functions:
        Traditional gamma - SDR luminance range
-@@ -129,23 +109,6 @@
+@@ -129,23 +110,6 @@
        Hybrid Log-Gamma
      Supported static metadata descriptors:
        Static metadata type 1
@@ -51,7 +51,7 @@
    YCbCr 4:2:0 Capability Map Data Block:
      VIC  97:  3840x2160   60.000000 Hz  16:9    135.000 kHz    594.000000 MHz
      VIC 102:  4096x2160   60.000000 Hz 256:135  135.000 kHz    594.000000 MHz
-@@ -156,22 +119,8 @@
+@@ -156,22 +120,8 @@
      DTD 3:  1360x768    60.015162 Hz  85:48    47.712 kHz     85.500000 MHz
                   Hfront   64 Hsync 112 Hback  256 Hpol P
                   Vfront    3 Vsync   6 Vback   18 Vpol P
diff --git a/test/data/msi-mag321curv-dp.diff b/test/data/msi-mag321curv-dp.diff
index 0107cf8..1130f48 100644
--- a/test/data/msi-mag321curv-dp.diff
+++ b/test/data/msi-mag321curv-dp.diff
@@ -1,6 +1,6 @@
 --- ref
 +++ di
-@@ -97,30 +97,12 @@
+@@ -97,30 +97,13 @@
        Supported sample sizes (bits): 24 20 16
    Speaker Allocation Data Block:
      FL/FR - Front Left/Right
@@ -15,7 +15,7 @@
 -        HDMI VIC 1:  3840x2160   30.000000 Hz  16:9     67.500 kHz    297.000000 MHz
 -        HDMI VIC 2:  3840x2160   25.000000 Hz  16:9     56.250 kHz    297.000000 MHz
 -        HDMI VIC 3:  3840x2160   24.000000 Hz  16:9     54.000 kHz    297.000000 MHz
--  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
+   Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
 -    Version: 1
 -    Maximum TMDS Character Rate: 600 MHz
 -    SCDC Present
@@ -31,7 +31,7 @@
    YCbCr 4:2:0 Capability Map Data Block:
      VIC  97:  3840x2160   60.000000 Hz  16:9    135.000 kHz    594.000000 MHz
      VIC  96:  3840x2160   50.000000 Hz  16:9    112.500 kHz    594.000000 MHz
-@@ -133,7 +115,6 @@
+@@ -133,7 +116,6 @@
        Static metadata type 1
      Desired content max luminance: 92 (366.802 cd/m^2)
      Desired content max frame-average luminance: 92 (366.802 cd/m^2)
@@ -39,7 +39,7 @@
    Detailed Timing Descriptors:
      DTD 2:  2560x1440   59.950550 Hz  16:9     88.787 kHz    241.500000 MHz (700 mm x 390 mm)
                   Hfront   48 Hsync  32 Hback   80 Hpol P
-@@ -144,28 +125,12 @@
+@@ -144,28 +126,13 @@
      DTD 4:  1280x768    59.870228 Hz   5:3     47.776 kHz     79.500000 MHz (700 mm x 390 mm)
                   Hfront   64 Hsync 128 Hback  192 Hpol N
                   Vfront    3 Vsync   7 Vback   20 Vpol P
@@ -68,5 +68,6 @@
 -  HDMI VIC Codes must have their CTA-861 VIC equivalents in the VSB.
 -  Missing VCDB, needed for Set Selectable RGB Quantization to avoid interop issues.
 -
++  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: Bits 6 and 7 of byte 8 are reserved.
 +  Colorimetry Data Block: Reserved bits MD0-MD3 must be 0.
  EDID conformity: FAIL
diff --git a/test/data/philips-ftv-490.diff b/test/data/philips-ftv-490.diff
index aaefdfe..00a27ac 100644
--- a/test/data/philips-ftv-490.diff
+++ b/test/data/philips-ftv-490.diff
@@ -14,7 +14,7 @@
      MAT (MLP):
        Max channels: 8
        Supported sample rates (kHz): 48
-@@ -106,29 +103,9 @@
+@@ -106,29 +103,10 @@
        Hash calculation not required for object audio PCM or channel-based PCM
    Speaker Allocation Data Block:
      FL/FR - Front Left/Right
@@ -31,7 +31,7 @@
 -        HDMI VIC 1:  3840x2160   30.000000 Hz  16:9     67.500 kHz    297.000000 MHz
 -        HDMI VIC 2:  3840x2160   25.000000 Hz  16:9     56.250 kHz    297.000000 MHz
 -        HDMI VIC 3:  3840x2160   24.000000 Hz  16:9     54.000 kHz    297.000000 MHz
--  Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
+   Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
 -    Version: 1
 -    Maximum TMDS Character Rate: 600 MHz
 -    SCDC Present
@@ -45,7 +45,7 @@
      PT scan behavior: No Data
      IT scan behavior: Always Underscanned
      CE scan behavior: Always Overscanned
-@@ -148,42 +125,12 @@
+@@ -148,42 +126,12 @@
    HDR Dynamic Metadata Data Block:
      HDR Dynamic Metadata Type 4
        Version: 4