[PATCHv3 12/12] edid-decode: add support for the HDMI Audio Data Block
Hans Verkuil
hverkuil at xs4all.nl
Sat Sep 9 10:08:30 UTC 2017
From: Hans Verkuil <hans.verkuil at cisco.com>
This was introduced in HDMI 2.0.
Signed-off-by: Hans Verkuil <hans.verkuil at cisco.com>
---
edid-decode.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 69 insertions(+), 1 deletion(-)
diff --git a/edid-decode.c b/edid-decode.c
index c61fde8a..92dbfcf1 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -1705,6 +1705,7 @@ static const char *speaker_map[] = {
"BtFC - Bottom Front Center",
"BtFL/BtBR - Bottom Front Left/Right",
"TpLS/TpRS - Top Left/Right Surround",
+ "LSd/RSd - Left/Right Surround Direct",
};
static void
@@ -1961,6 +1962,72 @@ cta_ifdb(unsigned char *x)
}
}
+static void
+cta_hdmi_audio_block(unsigned char *x)
+{
+ int length = x[0] & 0x1f;
+ int num_descs;
+
+ if (length <= 3)
+ return;
+ if (x[2] & 3)
+ printf(" Max Stream Count: %d\n", (x[2] & 3) + 1);
+ if (x[2] & 4)
+ printf(" Supports MS NonMixed\n");
+
+ num_descs = x[3] & 7;
+ if (num_descs == 0)
+ return;
+ length -= 3;
+ x += 4;
+ while (length >= 4) {
+ if (length > 4) {
+ int format = x[0] & 0xf;
+
+ printf(" %s, max channels %d\n", audio_format(format),
+ (x[1] & 0x1f)+1);
+ printf(" Supported sample rates (kHz):%s%s%s%s%s%s%s\n",
+ (x[2] & 0x40) ? " 192" : "",
+ (x[2] & 0x20) ? " 176.4" : "",
+ (x[2] & 0x10) ? " 96" : "",
+ (x[2] & 0x08) ? " 88.2" : "",
+ (x[2] & 0x04) ? " 48" : "",
+ (x[2] & 0x02) ? " 44.1" : "",
+ (x[2] & 0x01) ? " 32" : "");
+ if (format == 1)
+ printf(" Supported sample sizes (bits):%s%s%s\n",
+ (x[3] & 0x04) ? " 24" : "",
+ (x[3] & 0x02) ? " 20" : "",
+ (x[3] & 0x01) ? " 16" : "");
+ } else {
+ uint32_t sad = ((x[2] << 16) | (x[1] << 8) | x[0]);
+ int i;
+
+ switch (x[3] >> 4) {
+ case 1:
+ printf(" Speaker Allocation for 10.2 channels:\n");
+ break;
+ case 2:
+ printf(" Speaker Allocation for 22.2 channels:\n");
+ break;
+ case 3:
+ printf(" Speaker Allocation for 30.2 channels:\n");
+ break;
+ default:
+ printf(" Unknown Speaker Allocation (%d)\n", x[3] >> 4);
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(speaker_map); i++) {
+ if ((sad >> i) & 1)
+ printf(" %s\n", speaker_map[i]);
+ }
+ }
+ length -= 4;
+ x += 4;
+ }
+}
+
static void
cta_block(unsigned char *x)
{
@@ -2050,7 +2117,8 @@ cta_block(unsigned char *x)
printf("Vendor-specific audio data block\n");
break;
case 0x12:
- printf("Reserved for HDMI audio data block\n");
+ printf("HDMI audio data block\n");
+ cta_hdmi_audio_block(x);
break;
case 0x13:
printf("Room configuration data block\n");
--
2.14.1
More information about the xorg-devel
mailing list