Re: [PATCHv2 5/8] edid-decode: add new CTA-861-G VIC codes

2017-09-08 Thread Hans Verkuil
On 09/08/17 15:13, walter harms wrote:
> 
> 
> Am 08.09.2017 12:32, schrieb Hans Verkuil:
>> From: Hans Verkuil 
>>
>> The CTA-861-G standard (successor to CEA-861-F) adds new VIC codes.
>>
>> Signed-off-by: Hans Verkuil 
>> ---
>>  edid-decode.c | 93 
>> +++
>>  1 file changed, 81 insertions(+), 12 deletions(-)
>>
>> diff --git a/edid-decode.c b/edid-decode.c
>> index 4534d58f..074cb821 100644
>> --- a/edid-decode.c
>> +++ b/edid-decode.c
>> @@ -1113,10 +1113,12 @@ cea_audio_block(unsigned char *x)
>>  }
>>  }
>>  
>> -static struct {
>> +struct edid_cea_mode {
>>  const char *name;
>>  int refresh, hor_freq_hz, pixclk_khz;
>> -} edid_cea_modes[] = {
>> +};
>> +
>> +static struct edid_cea_mode edid_cea_modes1[] = {
>>  /* VIC 1 */
>>  {"640x480@60Hz 4:3", 60, 31469, 25175},
>>  {"720x480@60Hz 4:3", 60, 31469, 27000},
>> @@ -1235,14 +1237,80 @@ static struct {
>>  {"3840x2160@30Hz 64:27", 30, 67500, 297000},
>>  {"3840x2160@50Hz 64:27", 50, 112500, 594000},
>>  {"3840x2160@60Hz 64:27", 60, 135000, 594000},
>> +{"1280x720@48Hz 16:9", 48, 36000, 9},
>> +{"1280x720@48Hz 64:27", 48, 36000, 9},
>> +{"1680x720@48Hz 64:27", 48, 36000, 99000},
>> +/* VIC 111 */
>> +{"1920x1080@48Hz 16:9", 48, 54000, 148500},
>> +{"1920x1080@48Hz 64:27", 48, 54000, 148500},
>> +{"2560x1080@48Hz 64:27", 48, 52800, 198000},
>> +{"3840x2160@48Hz 16:9", 48, 108000, 594000},
>> +{"4096x2160@48Hz 256:135", 48, 108000, 594000},
>> +{"3840x2160@48Hz 64:27", 48, 108000, 594000},
>> +{"3840x2160@100Hz 16:9", 100, 225000, 1188000},
>> +{"3840x2160@120Hz 16:9", 120, 27, 1188000},
>> +{"3840x2160@100Hz 64:27", 100, 225000, 1188000},
>> +{"3840x2160@120Hz 64:27", 120, 27, 1188000},
>> +/* VIC 121 */
>> +{"5120x2160@24Hz 64:27", 24, 52800, 396000},
>> +{"5120x2160@25Hz 64:27", 25, 55000, 396000},
>> +{"5120x2160@30Hz 64:27", 30, 66000, 396000},
>> +{"5120x2160@48Hz 64:27", 48, 118800, 742500},
>> +{"5120x2160@50Hz 64:27", 50, 112500, 742500},
>> +{"5120x2160@60Hz 64:27", 60, 135000, 742500},
>> +{"5120x2160@100Hz 64:27", 100, 225000, 1485000},
>> +};
>> +
>> +static struct edid_cea_mode edid_cea_modes2[] = {
>> +/* VIC 193 */
>> +{"5120x2160@120Hz 64:27", 120, 27, 1485000},
>> +{"7680x4320@24Hz 16:9", 24, 108000, 1188000},
>> +{"7680x4320@25Hz 16:9", 25, 11, 1188000},
>> +{"7680x4320@30Hz 16:9", 30, 132000, 1188000},
>> +{"7680x4320@48Hz 16:9", 48, 216000, 2376000},
>> +{"7680x4320@50Hz 16:9", 50, 22, 2376000},
>> +{"7680x4320@60Hz 16:9", 60, 264000, 2376000},
>> +{"7680x4320@100Hz 16:9", 100, 45, 4752000},
>> +/* VIC 201 */
>> +{"7680x4320@120Hz 16:9", 120, 54, 4752000},
>> +{"7680x4320@24Hz 64:27", 24, 108000, 1188000},
>> +{"7680x4320@25Hz 64:27", 25, 11, 1188000},
>> +{"7680x4320@30Hz 64:27", 30, 132000, 1188000},
>> +{"7680x4320@48Hz 64:27", 48, 216000, 2376000},
>> +{"7680x4320@50Hz 64:27", 50, 22, 2376000},
>> +{"7680x4320@60Hz 64:27", 60, 264000, 2376000},
>> +{"7680x4320@100Hz 64:27", 100, 45, 4752000},
>> +{"7680x4320@120Hz 64:27", 120, 54, 4752000},
>> +{"10240x4320@24Hz 64:27", 24, 118800, 1485000},
>> +/* VIC 211 */
>> +{"10240x4320@25Hz 64:27", 25, 11, 1485000},
>> +{"10240x4320@30Hz 64:27", 30, 135000, 1485000},
>> +{"10240x4320@48Hz 64:27", 48, 237600, 297},
>> +{"10240x4320@50Hz 64:27", 50, 22, 297},
>> +{"10240x4320@60Hz 64:27", 60, 27, 297},
>> +{"10240x4320@100Hz 64:27", 100, 45, 594},
>> +{"10240x4320@120Hz 64:27", 120, 54, 594},
>> +{"4096x2160@100Hz 256:135", 100, 225000, 1188000},
>> +{"4096x2160@120Hz 256:135", 120, 27, 1188000},
>>  };
>>  
>> +static const struct edid_cea_mode *
>> +vic_to_mode(unsigned char vic)
>> +{
>> +if (vic > 0 && vic <= ARRAY_SIZE(edid_cea_modes1))
>> +return edid_cea_modes1 + vic - 1;
>> +if (vic >= 193 && vic <= ARRAY_SIZE(edid_cea_modes2) + 193)
>> +return edid_cea_modes2 + vic - 193;
>> +return NULL;
>> +}
>> +
> 
> 
> I do not see details yet, but maybe you can simply the code by
> returning a dummy struct edid_cea_mode [0] =
>  {"Unknown mode 0:0", 0, 0, 0}

I considered that, but it doesn't actually help. Mostly because the VIC codes
are in two ranges with a big hole of reserved VIC codes in between.

Regards,

Hans

> 
> 
>>  static void
>>  cea_svd(unsigned char *x, int n, int for_ycbcr420)
>>  {
>>  int i;
>>  
>>  for (i = 0; i < n; i++)  {
>> +const struct edid_cea_mode *vicmode = NULL;
>>  unsigned char svd = x[i];
>>  unsigned char native;
>>  unsigned char vic;
>> @@ -1261,7 +1329,8 @@ cea_svd(unsigned char *x, int n, int for_ycbcr420)
>>  native = svd & 0x80;
>>  }
>>  
>> -if 

Re: [PATCHv2 5/8] edid-decode: add new CTA-861-G VIC codes

2017-09-08 Thread walter harms


Am 08.09.2017 12:32, schrieb Hans Verkuil:
> From: Hans Verkuil 
> 
> The CTA-861-G standard (successor to CEA-861-F) adds new VIC codes.
> 
> Signed-off-by: Hans Verkuil 
> ---
>  edid-decode.c | 93 
> +++
>  1 file changed, 81 insertions(+), 12 deletions(-)
> 
> diff --git a/edid-decode.c b/edid-decode.c
> index 4534d58f..074cb821 100644
> --- a/edid-decode.c
> +++ b/edid-decode.c
> @@ -1113,10 +1113,12 @@ cea_audio_block(unsigned char *x)
>  }
>  }
>  
> -static struct {
> +struct edid_cea_mode {
>  const char *name;
>  int refresh, hor_freq_hz, pixclk_khz;
> -} edid_cea_modes[] = {
> +};
> +
> +static struct edid_cea_mode edid_cea_modes1[] = {
>  /* VIC 1 */
>  {"640x480@60Hz 4:3", 60, 31469, 25175},
>  {"720x480@60Hz 4:3", 60, 31469, 27000},
> @@ -1235,14 +1237,80 @@ static struct {
>  {"3840x2160@30Hz 64:27", 30, 67500, 297000},
>  {"3840x2160@50Hz 64:27", 50, 112500, 594000},
>  {"3840x2160@60Hz 64:27", 60, 135000, 594000},
> +{"1280x720@48Hz 16:9", 48, 36000, 9},
> +{"1280x720@48Hz 64:27", 48, 36000, 9},
> +{"1680x720@48Hz 64:27", 48, 36000, 99000},
> +/* VIC 111 */
> +{"1920x1080@48Hz 16:9", 48, 54000, 148500},
> +{"1920x1080@48Hz 64:27", 48, 54000, 148500},
> +{"2560x1080@48Hz 64:27", 48, 52800, 198000},
> +{"3840x2160@48Hz 16:9", 48, 108000, 594000},
> +{"4096x2160@48Hz 256:135", 48, 108000, 594000},
> +{"3840x2160@48Hz 64:27", 48, 108000, 594000},
> +{"3840x2160@100Hz 16:9", 100, 225000, 1188000},
> +{"3840x2160@120Hz 16:9", 120, 27, 1188000},
> +{"3840x2160@100Hz 64:27", 100, 225000, 1188000},
> +{"3840x2160@120Hz 64:27", 120, 27, 1188000},
> +/* VIC 121 */
> +{"5120x2160@24Hz 64:27", 24, 52800, 396000},
> +{"5120x2160@25Hz 64:27", 25, 55000, 396000},
> +{"5120x2160@30Hz 64:27", 30, 66000, 396000},
> +{"5120x2160@48Hz 64:27", 48, 118800, 742500},
> +{"5120x2160@50Hz 64:27", 50, 112500, 742500},
> +{"5120x2160@60Hz 64:27", 60, 135000, 742500},
> +{"5120x2160@100Hz 64:27", 100, 225000, 1485000},
> +};
> +
> +static struct edid_cea_mode edid_cea_modes2[] = {
> +/* VIC 193 */
> +{"5120x2160@120Hz 64:27", 120, 27, 1485000},
> +{"7680x4320@24Hz 16:9", 24, 108000, 1188000},
> +{"7680x4320@25Hz 16:9", 25, 11, 1188000},
> +{"7680x4320@30Hz 16:9", 30, 132000, 1188000},
> +{"7680x4320@48Hz 16:9", 48, 216000, 2376000},
> +{"7680x4320@50Hz 16:9", 50, 22, 2376000},
> +{"7680x4320@60Hz 16:9", 60, 264000, 2376000},
> +{"7680x4320@100Hz 16:9", 100, 45, 4752000},
> +/* VIC 201 */
> +{"7680x4320@120Hz 16:9", 120, 54, 4752000},
> +{"7680x4320@24Hz 64:27", 24, 108000, 1188000},
> +{"7680x4320@25Hz 64:27", 25, 11, 1188000},
> +{"7680x4320@30Hz 64:27", 30, 132000, 1188000},
> +{"7680x4320@48Hz 64:27", 48, 216000, 2376000},
> +{"7680x4320@50Hz 64:27", 50, 22, 2376000},
> +{"7680x4320@60Hz 64:27", 60, 264000, 2376000},
> +{"7680x4320@100Hz 64:27", 100, 45, 4752000},
> +{"7680x4320@120Hz 64:27", 120, 54, 4752000},
> +{"10240x4320@24Hz 64:27", 24, 118800, 1485000},
> +/* VIC 211 */
> +{"10240x4320@25Hz 64:27", 25, 11, 1485000},
> +{"10240x4320@30Hz 64:27", 30, 135000, 1485000},
> +{"10240x4320@48Hz 64:27", 48, 237600, 297},
> +{"10240x4320@50Hz 64:27", 50, 22, 297},
> +{"10240x4320@60Hz 64:27", 60, 27, 297},
> +{"10240x4320@100Hz 64:27", 100, 45, 594},
> +{"10240x4320@120Hz 64:27", 120, 54, 594},
> +{"4096x2160@100Hz 256:135", 100, 225000, 1188000},
> +{"4096x2160@120Hz 256:135", 120, 27, 1188000},
>  };
>  
> +static const struct edid_cea_mode *
> +vic_to_mode(unsigned char vic)
> +{
> +if (vic > 0 && vic <= ARRAY_SIZE(edid_cea_modes1))
> + return edid_cea_modes1 + vic - 1;
> +if (vic >= 193 && vic <= ARRAY_SIZE(edid_cea_modes2) + 193)
> + return edid_cea_modes2 + vic - 193;
> +return NULL;
> +}
> +


I do not see details yet, but maybe you can simply the code by
returning a dummy struct edid_cea_mode [0] =
 {"Unknown mode 0:0", 0, 0, 0}


>  static void
>  cea_svd(unsigned char *x, int n, int for_ycbcr420)
>  {
>  int i;
>  
>  for (i = 0; i < n; i++)  {
> + const struct edid_cea_mode *vicmode = NULL;
>   unsigned char svd = x[i];
>   unsigned char native;
>   unsigned char vic;
> @@ -1261,7 +1329,8 @@ cea_svd(unsigned char *x, int n, int for_ycbcr420)
>   native = svd & 0x80;
>   }
>  
> - if (vic > 0 && vic <= ARRAY_SIZE(edid_cea_modes)) {
> + vicmode = vic_to_mode(vic);
> + if (vicmode) {
>   switch (vic) {
>   case 95:
>   supported_hdmi_vic_vsb_codes |= 1 << 0;
> @@ -1276,13 +1345,13 @@ cea_svd(unsigned char *x, int n, int for_ycbcr420)
>   

[PATCHv2 5/8] edid-decode: add new CTA-861-G VIC codes

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

The CTA-861-G standard (successor to CEA-861-F) adds new VIC codes.

Signed-off-by: Hans Verkuil 
---
 edid-decode.c | 93 +++
 1 file changed, 81 insertions(+), 12 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 4534d58f..074cb821 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -1113,10 +1113,12 @@ cea_audio_block(unsigned char *x)
 }
 }
 
-static struct {
+struct edid_cea_mode {
 const char *name;
 int refresh, hor_freq_hz, pixclk_khz;
-} edid_cea_modes[] = {
+};
+
+static struct edid_cea_mode edid_cea_modes1[] = {
 /* VIC 1 */
 {"640x480@60Hz 4:3", 60, 31469, 25175},
 {"720x480@60Hz 4:3", 60, 31469, 27000},
@@ -1235,14 +1237,80 @@ static struct {
 {"3840x2160@30Hz 64:27", 30, 67500, 297000},
 {"3840x2160@50Hz 64:27", 50, 112500, 594000},
 {"3840x2160@60Hz 64:27", 60, 135000, 594000},
+{"1280x720@48Hz 16:9", 48, 36000, 9},
+{"1280x720@48Hz 64:27", 48, 36000, 9},
+{"1680x720@48Hz 64:27", 48, 36000, 99000},
+/* VIC 111 */
+{"1920x1080@48Hz 16:9", 48, 54000, 148500},
+{"1920x1080@48Hz 64:27", 48, 54000, 148500},
+{"2560x1080@48Hz 64:27", 48, 52800, 198000},
+{"3840x2160@48Hz 16:9", 48, 108000, 594000},
+{"4096x2160@48Hz 256:135", 48, 108000, 594000},
+{"3840x2160@48Hz 64:27", 48, 108000, 594000},
+{"3840x2160@100Hz 16:9", 100, 225000, 1188000},
+{"3840x2160@120Hz 16:9", 120, 27, 1188000},
+{"3840x2160@100Hz 64:27", 100, 225000, 1188000},
+{"3840x2160@120Hz 64:27", 120, 27, 1188000},
+/* VIC 121 */
+{"5120x2160@24Hz 64:27", 24, 52800, 396000},
+{"5120x2160@25Hz 64:27", 25, 55000, 396000},
+{"5120x2160@30Hz 64:27", 30, 66000, 396000},
+{"5120x2160@48Hz 64:27", 48, 118800, 742500},
+{"5120x2160@50Hz 64:27", 50, 112500, 742500},
+{"5120x2160@60Hz 64:27", 60, 135000, 742500},
+{"5120x2160@100Hz 64:27", 100, 225000, 1485000},
+};
+
+static struct edid_cea_mode edid_cea_modes2[] = {
+/* VIC 193 */
+{"5120x2160@120Hz 64:27", 120, 27, 1485000},
+{"7680x4320@24Hz 16:9", 24, 108000, 1188000},
+{"7680x4320@25Hz 16:9", 25, 11, 1188000},
+{"7680x4320@30Hz 16:9", 30, 132000, 1188000},
+{"7680x4320@48Hz 16:9", 48, 216000, 2376000},
+{"7680x4320@50Hz 16:9", 50, 22, 2376000},
+{"7680x4320@60Hz 16:9", 60, 264000, 2376000},
+{"7680x4320@100Hz 16:9", 100, 45, 4752000},
+/* VIC 201 */
+{"7680x4320@120Hz 16:9", 120, 54, 4752000},
+{"7680x4320@24Hz 64:27", 24, 108000, 1188000},
+{"7680x4320@25Hz 64:27", 25, 11, 1188000},
+{"7680x4320@30Hz 64:27", 30, 132000, 1188000},
+{"7680x4320@48Hz 64:27", 48, 216000, 2376000},
+{"7680x4320@50Hz 64:27", 50, 22, 2376000},
+{"7680x4320@60Hz 64:27", 60, 264000, 2376000},
+{"7680x4320@100Hz 64:27", 100, 45, 4752000},
+{"7680x4320@120Hz 64:27", 120, 54, 4752000},
+{"10240x4320@24Hz 64:27", 24, 118800, 1485000},
+/* VIC 211 */
+{"10240x4320@25Hz 64:27", 25, 11, 1485000},
+{"10240x4320@30Hz 64:27", 30, 135000, 1485000},
+{"10240x4320@48Hz 64:27", 48, 237600, 297},
+{"10240x4320@50Hz 64:27", 50, 22, 297},
+{"10240x4320@60Hz 64:27", 60, 27, 297},
+{"10240x4320@100Hz 64:27", 100, 45, 594},
+{"10240x4320@120Hz 64:27", 120, 54, 594},
+{"4096x2160@100Hz 256:135", 100, 225000, 1188000},
+{"4096x2160@120Hz 256:135", 120, 27, 1188000},
 };
 
+static const struct edid_cea_mode *
+vic_to_mode(unsigned char vic)
+{
+if (vic > 0 && vic <= ARRAY_SIZE(edid_cea_modes1))
+   return edid_cea_modes1 + vic - 1;
+if (vic >= 193 && vic <= ARRAY_SIZE(edid_cea_modes2) + 193)
+   return edid_cea_modes2 + vic - 193;
+return NULL;
+}
+
 static void
 cea_svd(unsigned char *x, int n, int for_ycbcr420)
 {
 int i;
 
 for (i = 0; i < n; i++)  {
+   const struct edid_cea_mode *vicmode = NULL;
unsigned char svd = x[i];
unsigned char native;
unsigned char vic;
@@ -1261,7 +1329,8 @@ cea_svd(unsigned char *x, int n, int for_ycbcr420)
native = svd & 0x80;
}
 
-   if (vic > 0 && vic <= ARRAY_SIZE(edid_cea_modes)) {
+   vicmode = vic_to_mode(vic);
+   if (vicmode) {
switch (vic) {
case 95:
supported_hdmi_vic_vsb_codes |= 1 << 0;
@@ -1276,13 +1345,13 @@ cea_svd(unsigned char *x, int n, int for_ycbcr420)
supported_hdmi_vic_vsb_codes |= 1 << 3;
break;
}
-   mode = edid_cea_modes[vic - 1].name;
-   min_vert_freq_hz = min(min_vert_freq_hz, edid_cea_modes[vic - 
1].refresh);
-   max_vert_freq_hz = max(max_vert_freq_hz, edid_cea_modes[vic - 
1].refresh);
-   hfreq = edid_cea_modes[vic - 1].hor_freq_hz;
+   mode = vicmode->name;
+