summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2017-08-31 13:40:56 +0200
committerAdam Jackson <ajax@redhat.com>2017-09-07 12:13:29 -0400
commitb4f8eefc0c58fc40450f0233bae1d621d87843ca (patch)
tree33760a4c92fba39a825d8c5dfcac85065dbebabe
parentb120a093f38aebaf146a3ed45b39b8eeb6fd0747 (diff)
edid-decode: report picture aspect ratio
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
-rw-r--r--edid-decode.c296
1 files changed, 157 insertions, 139 deletions
diff --git a/edid-decode.c b/edid-decode.c
index 4deceba..31aca8a 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -158,6 +158,7 @@ static int
detailed_cvt_descriptor(unsigned char *x, int first)
{
const unsigned char empty[3] = { 0, 0, 0 };
+ const char *ratio;
char *names[] = { "50", "60", "75", "85" };
int width, height;
int valid = 1;
@@ -173,13 +174,21 @@ detailed_cvt_descriptor(unsigned char *x, int first)
switch (x[1] & 0x0c) {
case 0x00:
- width = (height * 4) / 3; break;
+ width = (height * 4) / 3;
+ ratio = "4:3";
+ break;
case 0x04:
- width = (height * 16) / 9; break;
+ width = (height * 16) / 9;
+ ratio = "16:9";
+ break;
case 0x08:
- width = (height * 16) / 10; break;
+ width = (height * 16) / 10;
+ ratio = "16:10";
+ break;
case 0x0c:
- width = (height * 15) / 9; break;
+ width = (height * 15) / 9;
+ ratio = "15:9";
+ break;
}
if (x[1] & 0x03)
@@ -198,12 +207,13 @@ detailed_cvt_descriptor(unsigned char *x, int first)
if (!valid) {
printf(" (broken)\n");
} else {
- printf(" %dx%d @ ( %s%s%s%s%s) Hz (%s%s preferred)\n", width, height,
+ printf(" %dx%d @ ( %s%s%s%s%s) Hz %s (%s%s preferred)\n", width, height,
fifty ? "50 " : "",
sixty ? "60 " : "",
seventyfive ? "75 " : "",
eightyfive ? "85 " : "",
reduced ? "60RB " : "",
+ ratio,
names[(x[2] & 0x60) >> 5],
(((x[2] & 0x60) == 0x20) && reduced) ? "RB" : "");
}
@@ -652,113 +662,113 @@ cea_audio_block(unsigned char *x)
}
static const char *edid_cea_modes[] = {
- "640x480@60Hz",
- "720x480@60Hz",
- "720x480@60Hz",
- "1280x720@60Hz",
- "1920x1080i@60Hz",
- "1440x480i@60Hz",
- "1440x480i@60Hz",
- "1440x240@60Hz",
- "1440x240@60Hz",
- "2880x480i@60Hz",
- "2880x480i@60Hz",
- "2880x240@60Hz",
- "2880x240@60Hz",
- "1440x480@60Hz",
- "1440x480@60Hz",
- "1920x1080@60Hz",
- "720x576@50Hz",
- "720x576@50Hz",
- "1280x720@50Hz",
- "1920x1080i@50Hz",
- "1440x576i@50Hz",
- "1440x576i@50Hz",
- "1440x288@50Hz",
- "1440x288@50Hz",
- "2880x576i@50Hz",
- "2880x576i@50Hz",
- "2880x288@50Hz",
- "2880x288@50Hz",
- "1440x576@50Hz",
- "1440x576@50Hz",
- "1920x1080@50Hz",
- "1920x1080@24Hz",
- "1920x1080@25Hz",
- "1920x1080@30Hz",
- "2880x480@60Hz",
- "2880x480@60Hz",
- "2880x576@50Hz",
- "2880x576@50Hz",
- "1920x1080i@50Hz",
- "1920x1080i@100Hz",
- "1280x720@100Hz",
- "720x576@100Hz",
- "720x576@100Hz",
- "1440x576@100Hz",
- "1440x576@100Hz",
- "1920x1080i@120Hz",
- "1280x720@120Hz",
- "720x480@120Hz",
- "720x480@120Hz",
- "1440x480i@120Hz",
- "1440x480i@120Hz",
- "720x576@200Hz",
- "720x576@200Hz",
- "1440x576i@200Hz",
- "1440x576i@200Hz",
- "720x480@240Hz",
- "720x480@240Hz",
- "1440x480i@240Hz",
- "1440x480i@240Hz",
- "1280x720@24Hz",
- "1280x720@25Hz",
- "1280x720@30Hz",
- "1920x1080@120Hz",
- "1920x1080@100Hz",
- "1280x720@24Hz",
- "1280x720@25Hz",
- "1280x720@30Hz",
- "1280x720@50Hz",
- "1280x720@60Hz",
- "1280x720@100Hz",
- "1280x720@120Hz",
- "1920x1080@24Hz",
- "1920x1080@25Hz",
- "1920x1080@30Hz",
- "1920x1080@50Hz",
- "1920x1080@60Hz",
- "1920x1080@100Hz",
- "1920x1080@120Hz",
- "1680x720@24Hz",
- "1680x720@25Hz",
- "1680x720@30Hz",
- "1680x720@50Hz",
- "1680x720@60Hz",
- "1680x720@100Hz",
- "1680x720@120Hz",
- "2560x1080@24Hz",
- "2560x1080@25Hz",
- "2560x1080@30Hz",
- "2560x1080@50Hz",
- "2560x1080@60Hz",
- "2560x1080@100Hz",
- "2560x1080@120Hz",
- "3840x2160@24Hz",
- "3840x2160@25Hz",
- "3840x2160@30Hz",
- "3840x2160@50Hz",
- "3840x2160@60Hz",
- "4096x2160@24Hz",
- "4096x2160@25Hz",
- "4096x2160@30Hz",
- "4096x2160@50Hz",
- "4096x2160@60Hz",
- "3840x2160@24Hz",
- "3840x2160@25Hz",
- "3840x2160@30Hz",
- "3840x2160@50Hz",
- "3840x2160@60Hz",
+ "640x480@60Hz 4:3",
+ "720x480@60Hz 4:3",
+ "720x480@60Hz 16:9",
+ "1280x720@60Hz 16:9",
+ "1920x1080i@60Hz 16:9",
+ "1440x480i@60Hz 4:3",
+ "1440x480i@60Hz 16:9",
+ "1440x240@60Hz 4:3",
+ "1440x240@60Hz 16:9",
+ "2880x480i@60Hz 4:3",
+ "2880x480i@60Hz 16:9",
+ "2880x240@60Hz 4:3",
+ "2880x240@60Hz 16:9",
+ "1440x480@60Hz 4:3",
+ "1440x480@60Hz 16:9",
+ "1920x1080@60Hz 16:9",
+ "720x576@50Hz 4:3",
+ "720x576@50Hz 16:9",
+ "1280x720@50Hz 16:9",
+ "1920x1080i@50Hz 16:9",
+ "1440x576i@50Hz 4:3",
+ "1440x576i@50Hz 16:9",
+ "1440x288@50Hz 4:3",
+ "1440x288@50Hz 16:9",
+ "2880x576i@50Hz 4:3",
+ "2880x576i@50Hz 16:9",
+ "2880x288@50Hz 4:3",
+ "2880x288@50Hz 16:9",
+ "1440x576@50Hz 4:3",
+ "1440x576@50Hz 16:9",
+ "1920x1080@50Hz 16:9",
+ "1920x1080@24Hz 16:9",
+ "1920x1080@25Hz 16:9",
+ "1920x1080@30Hz 16:9",
+ "2880x480@60Hz 4:3",
+ "2880x480@60Hz 16:9",
+ "2880x576@50Hz 4:3",
+ "2880x576@50Hz 16:9",
+ "1920x1080i@50Hz 16:9",
+ "1920x1080i@100Hz 16:9",
+ "1280x720@100Hz 16:9",
+ "720x576@100Hz 4:3",
+ "720x576@100Hz 16:9",
+ "1440x576@100Hz 4:3",
+ "1440x576@100Hz 16:9",
+ "1920x1080i@120Hz 16:9",
+ "1280x720@120Hz 16:9",
+ "720x480@120Hz 4:3",
+ "720x480@120Hz 16:9",
+ "1440x480i@120Hz 4:3",
+ "1440x480i@120Hz 16:9",
+ "720x576@200Hz 4:3",
+ "720x576@200Hz 16:9",
+ "1440x576i@200Hz 4:3",
+ "1440x576i@200Hz 16:9",
+ "720x480@240Hz 4:3",
+ "720x480@240Hz 16:9",
+ "1440x480i@240Hz 4:3",
+ "1440x480i@240Hz 16:9",
+ "1280x720@24Hz 16:9",
+ "1280x720@25Hz 16:9",
+ "1280x720@30Hz 16:9",
+ "1920x1080@120Hz 16:9",
+ "1920x1080@100Hz 16:9",
+ "1280x720@24Hz 64:27",
+ "1280x720@25Hz 64:27",
+ "1280x720@30Hz 64:27",
+ "1280x720@50Hz 64:27",
+ "1280x720@60Hz 64:27",
+ "1280x720@100Hz 64:27",
+ "1280x720@120Hz 64:27",
+ "1920x1080@24Hz 64:27",
+ "1920x1080@25Hz 64:27",
+ "1920x1080@30Hz 64:27",
+ "1920x1080@50Hz 64:27",
+ "1920x1080@60Hz 64:27",
+ "1920x1080@100Hz 64:27",
+ "1920x1080@120Hz 64:27",
+ "1680x720@24Hz 64:27",
+ "1680x720@25Hz 64:27",
+ "1680x720@30Hz 64:27",
+ "1680x720@50Hz 64:27",
+ "1680x720@60Hz 64:27",
+ "1680x720@100Hz 64:27",
+ "1680x720@120Hz 64:27",
+ "2560x1080@24Hz 64:27",
+ "2560x1080@25Hz 64:27",
+ "2560x1080@30Hz 64:27",
+ "2560x1080@50Hz 64:27",
+ "2560x1080@60Hz 64:27",
+ "2560x1080@100Hz 64:27",
+ "2560x1080@120Hz 64:27",
+ "3840x2160@24Hz 16:9",
+ "3840x2160@25Hz 16:9",
+ "3840x2160@30Hz 16:9",
+ "3840x2160@50Hz 16:9",
+ "3840x2160@60Hz 16:9",
+ "4096x2160@24Hz 256:135",
+ "4096x2160@25Hz 256:135",
+ "4096x2160@30Hz 256:135",
+ "4096x2160@50Hz 256:135",
+ "4096x2160@60Hz 256:135",
+ "3840x2160@24Hz 64:27",
+ "3840x2160@25Hz 64:27",
+ "3840x2160@30Hz 64:27",
+ "3840x2160@50Hz 64:27",
+ "3840x2160@60Hz 64:27",
};
static void
@@ -839,10 +849,10 @@ cea_vfpdb(unsigned char *x)
}
static const char *edid_cea_hdmi_modes[] = {
- "3840x2160@30Hz",
- "3840x2160@25Hz",
- "3840x2160@24Hz",
- "4096x2160@24Hz",
+ "3840x2160@30Hz 16:9",
+ "3840x2160@25Hz 16:9",
+ "3840x2160@24Hz 16:9",
+ "4096x2160@24Hz 256:135",
};
static void
@@ -1759,28 +1769,28 @@ extract_edid(int fd)
}
static const struct {
- int x, y, refresh;
+ int x, y, refresh, ratio_w, ratio_h;
} established_timings[] = {
/* 0x23 bit 7 - 0 */
- {720, 400, 70},
- {720, 400, 88},
- {640, 480, 60},
- {640, 480, 67},
- {640, 480, 72},
- {640, 480, 75},
- {800, 600, 56},
- {800, 600, 60},
+ {720, 400, 70, 9, 5},
+ {720, 400, 88, 9, 5},
+ {640, 480, 60, 4, 3},
+ {640, 480, 67, 4, 3},
+ {640, 480, 72, 4, 3},
+ {640, 480, 75, 4, 3},
+ {800, 600, 56, 4, 3},
+ {800, 600, 60, 4, 3},
/* 0x24 bit 7 - 0 */
- {800, 600, 72},
- {800, 600, 75},
- {832, 624, 75},
- {1280, 768, 87},
- {1024, 768, 60},
- {1024, 768, 70},
- {1024, 768, 75},
- {1280, 1024, 75},
+ {800, 600, 72, 4, 3},
+ {800, 600, 75, 4, 3},
+ {832, 624, 75, 4, 3},
+ {1280, 768, 87, 5, 3},
+ {1024, 768, 60, 4, 3},
+ {1024, 768, 70, 4, 3},
+ {1024, 768, 75, 4, 3},
+ {1280, 1024, 75, 5, 4},
/* 0x25 bit 7*/
- {1152, 870, 75},
+ {1152, 870, 75, 192, 145},
};
static void print_subsection(char *name, unsigned char *edid, int start,
@@ -2066,13 +2076,15 @@ int main(int argc, char **argv)
printf("Established timings supported:\n");
for (i = 0; i < 17; i++) {
if (edid[0x23 + i / 8] & (1 << (7 - i % 8))) {
- printf(" %dx%d@%dHz\n", established_timings[i].x,
- established_timings[i].y, established_timings[i].refresh);
+ printf(" %dx%d@%dHz %u:%u\n", established_timings[i].x,
+ established_timings[i].y, established_timings[i].refresh,
+ established_timings[i].ratio_w, established_timings[i].ratio_h);
}
}
printf("Standard timings supported:\n");
for (i = 0; i < 8; i++) {
+ const char *ratio;
uint8_t b1 = edid[0x26 + i * 2], b2 = edid[0x26 + i * 2 + 1];
unsigned int x, y, refresh;
@@ -2086,24 +2098,30 @@ int main(int argc, char **argv)
x = (b1 + 31) * 8;
switch ((b2 >> 6) & 0x3) {
case 0x00:
- if (claims_one_point_three)
+ if (claims_one_point_three) {
y = x * 10 / 16;
- else
+ ratio = "16:10";
+ } else {
y = x;
+ ratio = "1:1";
+ }
break;
case 0x01:
y = x * 3 / 4;
+ ratio = "4:3";
break;
case 0x02:
y = x * 4 / 5;
+ ratio = "5:4";
break;
case 0x03:
y = x * 9 / 16;
+ ratio = "16:9";
break;
}
refresh = 60 + (b2 & 0x3f);
- printf(" %dx%d@%dHz\n", x, y, refresh);
+ printf(" %dx%d@%dHz %s\n", x, y, refresh, ratio);
}
/* detailed timings */