Re: [PATCHv2 5/8] edid-decode: add new CTA-861-G VIC codes
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
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
From: Hans VerkuilThe 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; +