Re: [PATCH 3/8] edid-decode: add support for Room/Speaker data blocks

2017-09-08 Thread walter harms


Am 07.09.2017 20:03, schrieb Hans Verkuil:
> From: Hans Verkuil 
> 
> Support the Room Configuration Data Block and the Speaker Location
> Data Block.
> 
> Signed-off-by: Hans Verkuil 
> ---
>  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[] = {
>  _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;
> +}


The Name is a bit unfortunate as there is more than a type change
to be fair i have no better name, to_64flt() ?

re,
 wh

> +
> +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;
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

[PATCH 3/8] edid-decode: add support for Room/Speaker data blocks

2017-09-07 Thread Hans Verkuil
From: Hans Verkuil 

Support the Room Configuration Data Block and the Speaker Location
Data Block.

Signed-off-by: Hans Verkuil 
---
 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[] = {
 _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

___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel