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

walter harms wharms at bfs.de
Fri Sep 8 08:45:12 UTC 2017



Am 07.09.2017 20:03, schrieb Hans Verkuil:
> From: Hans Verkuil <hans.verkuil at cisco.com>
> 
> Support the Room Configuration Data Block and the Speaker Location
> Data Block.
> 
> Signed-off-by: Hans Verkuil <hans.verkuil at cisco.com>
> ---
>  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;
> +}


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;


More information about the xorg-devel mailing list