From: Hans Verkuil <[email protected]> Support the Room Configuration Data Block and the Speaker Location Data Block.
Signed-off-by: Hans Verkuil <[email protected]> --- edid-decode.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/edid-decode.c b/edid-decode.c index 9b6c297e..bdeb0c49 100644 --- a/edid-decode.c +++ b/edid-decode.c @@ -1614,7 +1614,7 @@ static struct field *vcdb_fields[] = { &CE_scan, }; -static const char *sadb_map[] = { +static const char *speaker_map[] = { "FL/FR - Front Left/Right", "LFE - Low Frequency Effects", "FC - Front Center", @@ -1647,13 +1647,78 @@ cea_sadb(unsigned char *x) printf(" Speaker map:\n"); - for (i = 0; i < ARRAY_SIZE(sadb_map); i++) { + for (i = 0; i < ARRAY_SIZE(speaker_map); i++) { if ((sad >> i) & 1) - printf(" %s\n", sadb_map[i]); + printf(" %s\n", speaker_map[i]); } } } +static float +uchar_to_float(unsigned char x) +{ + signed char s = (signed char)x; + + return s / 64.0; +} + +static void +cea_rcdb(unsigned char *x) +{ + int length = x[0] & 0x1f; + uint32_t spm = ((x[5] << 16) | (x[4] << 8) | x[3]); + int i; + + if (length < 12) + return; + + if (x[2] & 0x40) + printf(" Speaker count: %d\n", x[2] & 0x1f); + + printf(" Speaker Presence Mask:\n"); + for (i = 0; i < ARRAY_SIZE(speaker_map); i++) { + if ((spm >> i) & 1) + printf(" %s\n", speaker_map[i]); + } + if (x[2] & 0x20) { + printf(" Xmax: %d dm\n", x[6]); + printf(" Ymax: %d dm\n", x[7]); + printf(" Zmax: %d dm\n", x[8]); + } + if (x[2] & 0x80) { + printf(" DisplayX: %.3f * Xmax\n", uchar_to_float(x[9])); + printf(" DisplayY: %.3f * Ymax\n", uchar_to_float(x[10])); + printf(" DisplayZ: %.3f * Zmax\n", uchar_to_float(x[11])); + } +} + +static void +cea_sldb(unsigned char *x) +{ + int length = x[0] & 0x1f; + + if (length < 2) + return; + + x += 2; + length -= 2; + + while (length >= 2) { + printf(" Channel: %d (%sactive)\n", x[0] & 0x1f, + (x[0] & 0x20) ? "" : "not "); + if ((x[1] & 0x1f) < ARRAY_SIZE(speaker_map)) + printf(" Speaker: %s\n", speaker_map[x[1] & 0x1f]); + if (length >= 5 && (x[0] & 0x40)) { + printf(" X: %.3f * Xmax\n", uchar_to_float(x[2])); + printf(" Y: %.3f * Ymax\n", uchar_to_float(x[3])); + printf(" Z: %.3f * Zmax\n", uchar_to_float(x[4])); + length -= 3; + } + + length -= 2; + } +} + static void cea_vcdb(unsigned char *x) { @@ -1811,6 +1876,14 @@ cea_block(unsigned char *x) case 0x12: printf("HDMI audio data block\n"); break; + case 0x13: + printf("Room configuration data block\n"); + cea_rcdb(x); + break; + case 0x14: + printf("Speaker location data block\n"); + cea_sldb(x); + break; case 0x20: printf("InfoFrame data block\n"); break; -- 2.14.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
