aboutsummaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2019-08-19 00:38:55 -0500
committerLeandro A. F. Pereira <leandro@hardinfo.org>2019-08-22 23:10:17 +0200
commit4a33434d40bb9b3d4d36fb65c80f36dfa492daf6 (patch)
tree80ca73bf824eceff1938169b3be2ea045389d3a5 /deps
parent5ea868d6caefeb3dcc93f50631a17c3a1681bd74 (diff)
monitors: SVDs, fixes
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'deps')
-rw-r--r--deps/sysobj_early/include/util_edid.h17
-rw-r--r--deps/sysobj_early/src/util_edid.c100
-rw-r--r--deps/sysobj_early/src/util_edid_svd_table.c164
3 files changed, 252 insertions, 29 deletions
diff --git a/deps/sysobj_early/include/util_edid.h b/deps/sysobj_early/include/util_edid.h
index 9714bfbb..4efee6b3 100644
--- a/deps/sysobj_early/include/util_edid.h
+++ b/deps/sysobj_early/include/util_edid.h
@@ -31,8 +31,8 @@ typedef struct {
float vert_freq_hz;
int is_interlaced;
int stereo_mode;
- int pixel_clock_khz;
- int src; /* 0: edid, 1: etb, 2: std, 3: dtd, 4: cea-dtd, ... */
+ uint64_t pixel_clock_khz;
+ int src; /* 0: edid, 1: etb, 2: std, 3: dtd, 4: cea-dtd, 5: svd ... */
uint64_t pixels; /* h*v: easier to compare */
char class_inch[6];
} edid_output;
@@ -48,6 +48,12 @@ struct edid_dtd {
edid_output out;
};
+struct edid_svd {
+ uint8_t v;
+ int is_native;
+ edid_output out;
+};
+
struct edid_cea_header {
uint8_t *ptr;
int type, len;
@@ -65,10 +71,6 @@ struct edid_cea_audio {
int max_kbps; /* formats 2-8 */
};
-struct edid_cea_video {
- struct edid_cea_header header;
-};
-
struct edid_cea_vendor_spec {
struct edid_cea_header header;
};
@@ -107,6 +109,9 @@ typedef struct {
int dtd_count;
struct edid_dtd *dtds;
+ int svd_count;
+ struct edid_svd *svds;
+
int cea_block_count;
struct edid_cea_block *cea_blocks;
diff --git a/deps/sysobj_early/src/util_edid.c b/deps/sysobj_early/src/util_edid.c
index 7b004dc9..936744e0 100644
--- a/deps/sysobj_early/src/util_edid.c
+++ b/deps/sysobj_early/src/util_edid.c
@@ -29,6 +29,8 @@
#include "util_edid.h"
#include "util_sysobj.h"
+#include "util_edid_svd_table.c"
+
/* block must be 128 bytes */
static int block_check(const void *edid_block_bytes) {
if (!edid_block_bytes) return 0;
@@ -53,9 +55,8 @@ char *hex_bytes(uint8_t *bytes, int count) {
static void cea_block_decode(struct edid_cea_block *blk) {
struct edid_cea_audio *blk_audio = (void*)blk;
- struct edid_cea_video *blk_video = (void*)blk;
struct edid_cea_speaker *blk_speaker = (void*)blk;
- struct edid_cea_vendor_spec *blk_vendor_spec = (void*)blk;
+ //struct edid_cea_vendor_spec *blk_vendor_spec = (void*)blk;
if (blk) {
switch(blk->header.type) {
case 0x1:
@@ -73,7 +74,7 @@ static void cea_block_decode(struct edid_cea_block *blk) {
blk_speaker->alloc_bits = blk->header.ptr[1];
break;
case 0x3:
- case 0x2:
+ case 0x2: /* SVD list is handled elsewhere */
default:
break;
}
@@ -101,17 +102,41 @@ static void edid_output_fill(edid_output *out) {
if (!out->vert_freq_hz && out->pixel_clock_khz) {
uint64_t h = out->horiz_pixels + out->horiz_blanking;
uint64_t v = out->vert_lines + out->vert_blanking;
- uint64_t work = out->pixel_clock_khz * 1000;
- work /= (h*v);
- out->vert_freq_hz = work;
+ if (h && v) {
+ uint64_t work = out->pixel_clock_khz * 1000;
+ work /= (h*v);
+ out->vert_freq_hz = work;
+ }
}
out->pixels = out->horiz_pixels;
out->pixels *= out->vert_pixels;
- static const char *inlbl = "\""; /* TODO: unicode */
- sprintf(out->class_inch, "%0.1f%s", out->diag_in, inlbl);
- util_strchomp_float(out->class_inch);
+ if (out->diag_in) {
+ static const char *inlbl = "\""; /* TODO: unicode */
+ sprintf(out->class_inch, "%0.1f%s", out->diag_in, inlbl);
+ util_strchomp_float(out->class_inch);
+ }
+}
+
+edid_output edid_output_from_svd(uint8_t index) {
+ int i;
+ if (index >= 128 && index <= 192) index &= 0x7f; /* "native" flag for 0-64 */
+ for(i = 0; i < (int)G_N_ELEMENTS(cea_standard_timings); i++) {
+ if (cea_standard_timings[i].index == index) {
+ edid_output out = {};
+ out.horiz_pixels = cea_standard_timings[i].horiz_active;
+ out.vert_lines = cea_standard_timings[i].vert_active;
+ if (strchr(cea_standard_timings[i].short_name, 'i'))
+ out.is_interlaced = 1;
+ out.pixel_clock_khz = cea_standard_timings[i].pixel_clock_mhz * 1000;
+ out.vert_freq_hz = cea_standard_timings[i].vert_freq_hz;
+ out.src = 5;
+ edid_output_fill(&out);
+ return out;
+ }
+ }
+ return (edid_output){};
}
edid *edid_new(const char *data, unsigned int len) {
@@ -128,8 +153,10 @@ edid *edid_new(const char *data, unsigned int len) {
e->dtds = malloc(sizeof(struct edid_dtd) * 1000);
e->cea_blocks = malloc(sizeof(struct edid_cea_block) * 1000);
+ e->svds = malloc(sizeof(struct edid_svd) * 1000);
memset(e->dtds, 0, sizeof(struct edid_dtd) * 1000);
memset(e->cea_blocks, 0, sizeof(struct edid_cea_block) * 1000);
+ memset(e->svds, 0, sizeof(struct edid_svd) * 1000);
uint16_t vid = be16toh(e->u16[4]); /* bytes 8-9 */
e->ven[2] = 64 + (vid & 0x1f);
@@ -196,7 +223,7 @@ edid *edid_new(const char *data, unsigned int len) {
/* standard timings */
for(i = 38; i < 53; i+=2) {
/* 0101 is unused */
- if (e->u8[i] == 0x01 && e->u8[i] == 0x01)
+ if (e->u8[i] == 0x01 && e->u8[i+1] == 0x01)
continue;
double xres = (e->u8[i] + 31) * 8;
double yres = 0;
@@ -270,26 +297,26 @@ edid *edid_new(const char *data, unsigned int len) {
e->std = MAX(e->std, 1);
/* CEA extension */
int db_end = u8[2];
- //printf("db_end: %d\n", db_end);
if (db_end) {
int b = 4;
while(b < db_end) {
int db_type = (u8[b] & 0xe0) >> 5;
int db_size = u8[b] & 0x1f;
- //printf("CEA BLK: %s\n", hex_bytes(&u8[b], db_size+1));
e->cea_blocks[e->cea_block_count].header.ptr = &u8[b];
e->cea_blocks[e->cea_block_count].header.type = db_type;
e->cea_blocks[e->cea_block_count].header.len = db_size;
- cea_block_decode(&e->cea_blocks[e->cea_block_count]);
+ if (db_type == 0x2) {
+ for(i = 1; i <= db_size; i++)
+ e->svds[e->svd_count++].v = u8[b+i];
+ } else
+ cea_block_decode(&e->cea_blocks[e->cea_block_count]);
e->cea_block_count++;
b += db_size + 1;
}
if (b > db_end) b = db_end;
- //printf("dtd start: %d\n", b);
/* DTDs */
while(b < 127) {
if (u8[b]) {
- //printf("DTD: %s\n", hex_bytes(&u8[b], 18));
e->dtds[e->dtd_count].ptr = &u8[b];
e->dtds[e->dtd_count].cea_ext = 1;
e->dtd_count++;
@@ -385,6 +412,15 @@ edid *edid_new(const char *data, unsigned int len) {
e->img_max = e->dtds[0].out;
}
+ /* svds */
+ for(i = 0; i < e->svd_count; i++) {
+ if (e->svds[i].v >= 128 &&
+ e->svds[i].v <= 192) {
+ e->svds[i].is_native = 1;
+ }
+ e->svds[i].out = edid_output_from_svd(e->svds[i].v);
+ }
+
/* squeeze lists */
if (!e->dtd_count) {
free(e->dtds);
@@ -399,6 +435,13 @@ edid *edid_new(const char *data, unsigned int len) {
} else {
e->cea_blocks = realloc(e->cea_blocks, sizeof(struct edid_cea_block) * e->cea_block_count);
}
+ if (!e->svd_count) {
+ if (e->svds)
+ free(e->svds);
+ e->svds = NULL;
+ } else {
+ e->svds = realloc(e->svds, sizeof(struct edid_svd) * e->svd_count);
+ }
return e;
}
@@ -596,9 +639,8 @@ char *edid_cea_block_describe(struct edid_cea_block *blk) {
gchar *ret = NULL;
gchar *tmp[3] = {};
struct edid_cea_audio *blk_audio = (void*)blk;
- struct edid_cea_video *blk_video = (void*)blk;
struct edid_cea_speaker *blk_speaker = (void*)blk;
- struct edid_cea_vendor_spec *blk_vendor_spec = (void*)blk;
+ //struct edid_cea_vendor_spec *blk_vendor_spec = (void*)blk;
if (blk) {
char *hb = hex_bytes(blk->header.ptr, blk->header.len+1);
@@ -653,8 +695,12 @@ char *edid_cea_block_describe(struct edid_cea_block *blk) {
hb);
g_free(tmp[0]);
break;
- case 0x3:
case 0x2:
+ ret = g_strdup_printf("([%x] %s) svds:%d",
+ blk->header.type, _(edid_cea_block_type(blk->header.type)),
+ blk->header.len);
+ break;
+ case 0x3: //TODO
default:
ret = g_strdup_printf("([%x] %s) len:%d -- %s",
blk->header.type, _(edid_cea_block_type(blk->header.type)),
@@ -670,11 +716,13 @@ char *edid_cea_block_describe(struct edid_cea_block *blk) {
char *edid_output_describe(edid_output *out) {
gchar *ret = NULL;
if (out) {
- ret = g_strdup_printf("%dx%d@%.0f%s, %0.1fx%0.1f%s (%0.1f\") %s %s",
- out->horiz_pixels, out->vert_pixels, out->vert_freq_hz, _("Hz"),
- out->horiz_cm, out->vert_cm, _("cm"), out->diag_in,
- out->is_interlaced ? "interlaced" : "progressive",
- out->stereo_mode ? "stereo" : "normal");
+ ret = g_strdup_printf("%dx%d@%.0f%s",
+ out->horiz_pixels, out->vert_pixels, out->vert_freq_hz, _("Hz") );
+ if (out->diag_cm)
+ ret = appfsp(ret, "%0.1fx%0.1f%s (%0.1f\")",
+ out->horiz_cm, out->vert_cm, _("cm"), out->diag_in );
+ ret = appfsp(ret, "%s", out->is_interlaced ? "interlaced" : "progressive");
+ ret = appfsp(ret, "%s", out->stereo_mode ? "stereo" : "normal");
}
return ret;
}
@@ -763,6 +811,12 @@ char *edid_dump2(edid *e) {
ret = appfnl(ret, "cea_block[%d] %s", i, desc);
}
+ for(i = 0; i < e->svd_count; i++) {
+ char *desc = edid_output_describe(&e->svds[i].out);
+ ret = appfnl(ret, "svd[%d] [%02x] %s", i, e->svds[i].v, desc);
+ free(desc);
+ }
+
return ret;
}
diff --git a/deps/sysobj_early/src/util_edid_svd_table.c b/deps/sysobj_early/src/util_edid_svd_table.c
new file mode 100644
index 00000000..4833c77d
--- /dev/null
+++ b/deps/sysobj_early/src/util_edid_svd_table.c
@@ -0,0 +1,164 @@
+
+struct {
+ int index;
+ const char *short_name;
+ const char *disp_ratio, *pixel_ratio;
+ float pixel_clock_mhz, vert_freq_hz, horiz_freq_khz;
+ float horiz_active, vert_active, horiz_total, vert_total;
+ float field_rate_hz;
+} cea_standard_timings[] = {
+{ 1, "DMT0659", "4:3", "1:1", 25.175, 59.94, 31.469, 640, 480, 800, 525, 60 },
+{ 2, "480p", "4:3", "8:9", 27.0, 59.94, 31.469, 720, 480, 858, 525, 60 },
+{ 3, "480pH", "16:9", "32:37", 27.0, 59.94, 31.469, 720, 480, 858, 525, 60 },
+{ 4, "720p", "16:9", "1:1", 74.25, 60, 45.0, 1280, 720, 1650, 750, 60 },
+{ 5, "1080i", "16:9", "1:1", 74.25, 60, 33.75, 1920, 540, 2200, 562.5, 60 },
+{ 6, "480i", "4:3", "8:9", 27.0, 59.94, 15.734, 1440, 240, 1716, 262.5, 60 },
+{ 7, "480iH", "16:9", "32:37", 27.0, 59.94, 15.734, 1440, 240, 1716, 262.5, 60 },
+{ 8, "240p", "4:3", "4:9", 27.0, 59.826, 15.734, 1440, 240, 1716, 262.5, 60 },
+{ 9, "240pH", "16:9", "16:27", 27.0, 59.826, 15.734, 1440, 240, 1716, 262.5, 60 },
+{ 10, "480i4x", "4:3", "2:9-20:9", 54.0, 59.94, 15.734, 2880, 240, 3432, 262.5, 60 },
+{ 11, "480i4xH", "16:9", "8:27-80:27", 54.0, 59.94, 15.734, 2880, 240, 3432, 262.5, 60 },
+{ 12, "240p4x", "4:3", "1:9-10:9", 54.0, 60, 15.734, 2880, 240, 3432, 262.5, 60 },
+{ 13, "240p4xH", "16:9", "4:27-40:37", 54.0, 60, 15.734, 2880, 240, 3432, 262.5, 60 },
+{ 14, "480p2x", "4:3", "4:9 or 8:9", 54.0, 59.94, 31.469, 1440, 480, 1716, 525, 60 },
+{ 15, "480p2xH", "16:9", "16:27 or 32:37", 54.0, 59.94, 31.469, 1440, 480, 1716, 525, 60 },
+{ 16, "1080p", "16:9", "1:1", 148.5, 60, 67.5, 1920, 1080, 2200, 1125, 60 },
+{ 17, "576p", "4:3", "16:15", 27.0, 50, 31.25, 720, 576, 864, 625, 50 },
+{ 18, "576pH", "16:9", "64:45", 27.0, 50, 31.25, 720, 576, 864, 625, 50 },
+{ 19, "720p50", "16:9", "1:1", 74.25, 50, 37.5, 1280, 720, 1980, 750, 50 },
+{ 20, "1080i25", "16:9", "1:1", 74.25, 50, 28.125, 1920, 540, 2640, 562.5, 50 },
+{ 21, "576i", "4:3", "16:15", 27.0, 50, 15.625, 1440, 288, 1728, 312.5, 50 },
+{ 22, "576iH", "16:9", "64:45", 27.0, 50, 15.625, 1440, 288, 1728, 312.5, 50 },
+{ 23, "288p", "4:3", "8:15", 27.0, 50, 15.625, 1440, 288, 1728, 313, 50 },
+{ 24, "288pH", "16:9", "32:45", 27.0, 50, 15.625, 1440, 288, 1728, 313, 50 },
+{ 25, "576i4x", "4:3", "2:15-20:15", 54.0, 50, 15.625, 2880, 288, 3456, 312.5, 50 },
+{ 26, "576i4xH", "16:9", "16:45-160:45", 54.0, 50, 15.625, 2880, 288, 3456, 312.5, 50 },
+{ 27, "288p4x", "4:3", "1:15-10:15", 54.0, 50, 15.625, 2880, 288, 3456, 313, 50 },
+{ 28, "288p4xH", "16:9", "8:45-80:45", 54.0, 50, 15.625, 2880, 288, 3456, 313, 50 },
+{ 29, "576p2x", "4:3", "8:15 or 16:15", 54.0, 50, 31.25, 1440, 576, 1728, 625, 50 },
+{ 30, "576p2xH", "16:9", "32:45 or 64:45", 54.0, 50, 31.25, 1440, 576, 1728, 625, 50 },
+{ 31, "1080p50", "16:9", "1:1", 148.5, 50, 56.25, 1920, 1080, 2640, 1125, 50 },
+{ 32, "1080p24", "16:9", "1:1", 74.25, 23.98, 27.0, 1920, 1080, 2750, 1125, 0 },
+{ 33, "1080p25", "16:9", "1:1", 74.25, 25, 28.125, 1920, 1080, 2640, 1125, 0 },
+{ 34, "1080p30", "16:9", "1:1", 74.25, 29.97, 33.75, 1920, 1080, 2500, 1125, 0 },
+{ 35, "480p4x", "4:3", "2:9, 4:9 or 8:9", 108.0, 59.94, 31.469, 2880, 240, 3432, 262.5, 60 },
+{ 36, "480p4xH", "16:9", "8:27, 16:27 or 32:27", 108.0, 59.94, 31.469, 2880, 240, 3432, 262.5, 60 },
+{ 37, "576p4x", "4:3", "4:15, 8:15, or 16:15", 108.0, 50, 31.25, 2880, 576, 3456, 625, 50 },
+{ 38, "576p4xH", "16:9", "16:45, 32:45 or 64:45", 108.0, 50, 31.25, 2880, 576, 3456, 625, 50 },
+{ 39, "1080i25", "16:9", "1:1", 72.0, 50, 31.25, 1920, 540, 2304, 625, 50 },
+{ 40, "1080i50", "16:9", "1:1", 148.5, 100, 56.25, 1920, 540, 2640, 562.5, 100 },
+{ 41, "720p100", "16:9", "1:1", 148.5, 100, 45.0, 1280, 720, 1980, 750, 100 },
+{ 42, "576p100", "4:3", "16:15", 54.0, 100, 62.5, 720, 576, 864, 625, 100 },
+{ 43, "576p100H", "16:9", "64:45", 54.0, 100, 62.5, 720, 576, 864, 625, 100 },
+{ 44, "576i50", "4:3", "16:15", 54.0, 100, 31.25, 1440, 576, 1728, 625, 100 },
+{ 45, "576i50H", "16:9", "64:45", 54.0, 100, 31.25, 1440, 576, 1728, 625, 100 },
+{ 46, "1080i60", "16:9", "1:1", 148.5, 119.88, 67.5, 1920, 540, 2200, 562.5, 120 },
+{ 47, "720p120", "16:9", "1:1", 148.5, 119.88, 90.0, 1280, 720, 1650, 750, 120 },
+{ 48, "480p119", "4:3", "8:9", 54.0, 119.88, 62.937, 720, 576, 858, 525, 120 },
+{ 49, "480p119H", "16:9", "32:37", 54.0, 119.88, 62.937, 720, 576, 858, 525, 120 },
+{ 50, "480i59", "4:3", "16:15", 54.0, 119.88, 31.469, 1440, 576, 1716, 525, 120 },
+{ 51, "480i59H", "16:9", "64:45", 54.0, 119.88, 31.469, 1440, 576, 1716, 525, 120 },
+{ 52, "576p200", "4:3", "16:15", 108.0, 200, 125.0, 720, 576, 864, 625, 200 },
+{ 53, "576p200H", "16:9", "64:45", 108.0, 200, 125.0, 720, 576, 864, 625, 200 },
+{ 54, "576i100", "4:3", "16:15", 108.0, 200, 62.5, 1440, 288, 1728, 312.5, 200 },
+{ 55, "576i100H", "16:9", "64:45", 108.0, 200, 62.5, 1440, 288, 1728, 312.5, 200 },
+{ 56, "480p239", "4:3", "8:9", 108.0, 239.76, 125.874, 720, 480, 858, 525, 240 },
+{ 57, "480p239H", "16:9", "32:37", 108.0, 239.76, 125.874, 720, 480, 858, 525, 240 },
+{ 58, "480i119", "4:3", "8:9", 108.0, 239.76, 62.937, 1440, 240, 1716, 262.5, 240 },
+{ 59, "480i119H", "16:9", "32:37", 108.0, 239.76, 62.937, 1440, 240, 1716, 262.5, 240 },
+{ 60, "720p24", "16:9", "1:1", 59.4, 23.98, 18.0, 1280, 720, 3300, 750, 0 },
+{ 61, "720p25", "16:9", "1:1", 74.25, 25, 18.75, 1280, 720, 3960, 750, 0 },
+{ 62, "720p30", "16:9", "1:1", 74.25, 29.97, 22.5, 1280, 720, 3300, 750, 0 },
+{ 63, "1080p120", "16:9", "1:1", 297.0, 119.88, 135.0, 1920, 1080, 2200, 1125, 120 },
+{ 64, "1080p100", "16:9", "1:1", 297.0, 100, 112.5, 1920, 1080, 2640, 1125, 100 },
+{ 65, "720p24", "64:27", "4:3", 59.4, 23.98, 18.0, 1280, 720, 3300, 750, 0 },
+{ 66, "720p25", "64:27", "4:3", 74.25, 25, 18.75, 1280, 720, 3960, 750, 0 },
+{ 67, "720p30", "64:27", "4:3", 74.25, 29.97, 22.5, 1280, 720, 3300, 750, 0 },
+{ 68, "720p50", "64:27", "4:3", 74.25, 50, 37.5, 1280, 720, 1980, 750, 50 },
+{ 69, "720p", "64:27", "4:3", 74.25, 60, 45.0, 1650, 750, 1650, 750, 60 },
+{ 70, "720p100", "64:27", "4:3", 148.5, 100, 75.0, 1280, 720, 1980, 750, 100 },
+{ 71, "720p120", "64:27", "4:3", 148.5, 119.88, 90.0, 1280, 720, 1650, 750, 120 },
+{ 72, "1080p24", "64:27", "4:3", 74.25, 23.98, 27.0, 1920, 1080, 2750, 1125, 0 },
+{ 73, "1080p25", "64:27", "4:3", 74.25, 25, 28.125, 1920, 1080, 2640, 1125, 0 },
+{ 74, "1080p30", "64:27", "4:3", 74.25, 29.97, 33.75, 1920, 1080, 2500, 1125, 0 },
+{ 75, "1080p50", "64:27", "4:3", 148.5, 50, 56.25, 1920, 1080, 2640, 1125, 50 },
+{ 76, "1080p", "64:27", "4:3", 148.5, 60, 67.5, 1920, 1080, 2200, 1125, 60 },
+{ 77, "1080p100", "64:27", "4:3", 297.0, 100, 112.5, 1920, 1080, 2640, 1125, 100 },
+{ 78, "1080p120", "64:27", "4:3", 297.0, 119.88, 135.0, 1920, 1080, 2200, 1125, 120 },
+{ 79, "720p2x24", "64:27", "64:63", 59.4, 23.98, 18.0, 1680, 720, 3300, 750, 0 },
+{ 80, "720p2x25", "64:27", "64:63", 59.4, 25, 18.75, 1680, 720, 3168, 750, 0 },
+{ 81, "720p2x30", "64:27", "64:63", 59.4, 29.97, 22.5, 1680, 720, 2640, 750, 0 },
+{ 82, "720p2x50", "64:27", "64:63", 82.5, 50, 37.5, 1680, 720, 2200, 750, 50 },
+{ 83, "720p2x", "64:27", "64:63", 99.0, 60, 45.0, 1680, 720, 2200, 750, 60 },
+{ 84, "720p2x100", "64:27", "64:63", 165.0, 100, 82.5, 1680, 720, 2000, 825, 100 },
+{ 85, "720p2x120", "64:27", "64:63", 198.0, 119.88, 99.0, 1680, 720, 2000, 825, 120 },
+{ 86, "1080p2x24", "64:27", "1:1", 99.0, 23.98, 26.4, 2560, 1080, 3750, 1100, 0 },
+{ 87, "1080p2x25", "64:27", "1:1", 90.0, 25, 28.125, 2560, 1080, 3200, 1125, 0 },
+{ 88, "1080p2x30", "64:27", "1:1", 118.8, 29.97, 33.75, 2560, 1080, 3520, 1125, 0 },
+{ 89, "1080p2x50", "64:27", "1:1", 185.625, 50, 56.25, 2560, 1080, 3000, 1125, 50 },
+{ 90, "1080p2x", "64:27", "1:1", 198.0, 60, 66.0, 2560, 1080, 3000, 1100, 60 },
+{ 91, "1080p2x100", "64:27", "1:1", 371.25, 100, 125.0, 2560, 1080, 2970, 1250, 100 },
+{ 92, "1080p2x120", "64:27", "1:1", 495.0, 119.88, 150.0, 2560, 1080, 3300, 1250, 120 },
+{ 93, "2160p24", "16:9", "1:1", 297.0, 23.98, 54.0, 3840, 2160, 5500, 2250, 0 },
+{ 94, "2160p25", "16:9", "1:1", 297.0, 25, 56.25, 3840, 2160, 5280, 2250, 0 },
+{ 95, "2160p30", "16:9", "1:1", 297.0, 29.97, 67.5, 3840, 2160, 4400, 2250, 0 },
+{ 96, "2160p50", "16:9", "1:1", 594.0, 50, 112.5, 3840, 2160, 5280, 2250, 50 },
+{ 97, "2160p60", "16:9", "1:1", 594.0, 60, 135.0, 3840, 2160, 4400, 2250, 60 },
+{ 98, "2160p24", "256:135", "1:1", 297.0, 23.98, 67.5, 4096, 2160, 5500, 2250, 0 },
+{ 99, "2160p25", "256:135", "1:1", 297.0, 25, 112.5, 4096, 2160, 5280, 2250, 0 },
+{ 100, "2160p30", "256:135", "1:1", 297.0, 29.97, 135.0, 4096, 2160, 4400, 2250, 0 },
+{ 101, "2160p50", "256:135", "1:1", 594.0, 50, 112.5, 4096, 2160, 5280, 2250, 50 },
+{ 102, "2160p", "256:135", "1:1", 594.0, 60, 135.0, 4096, 2160, 4400, 2250, 60 },
+{ 103, "2160p24", "64:27", "4:3", 297.0, 23.98, 67.5, 3840, 2160, 5500, 2250, 0 },
+{ 104, "2160p25", "64:27", "4:3", 297.0, 25, 112.5, 3840, 2160, 5280, 2250, 0 },
+{ 105, "2160p30", "64:27", "4:3", 297.0, 29.97, 135.0, 3840, 2160, 4400, 2250, 0 },
+{ 106, "2160p50", "64:27", "4:3", 594.0, 50, 112.5, 3840, 2160, 5280, 2250, 50 },
+{ 107, "2160p", "64:27", "4:3", 594.0, 60, 135.0, 3840, 2160, 4400, 2250, 60 },
+{ 108, "720p48", "16:9", "1:1", 90.0, 47.96, 36.0, 1280, 720, 2500, 750, 0 },
+{ 109, "720p48", "64:27", "4:3", 90.0, 47.96, 36.0, 1280, 720, 2500, 750, 0 },
+{ 110, "720p2x48", "64:27", "64:63", 99.0, 47.96, 36.0, 1680, 720, 2750, 825, 0 },
+{ 111, "1080p48", "16:9", "1:1", 148.5, 47.96, 54.0, 1920, 1080, 2750, 1125, 0 },
+{ 112, "1080p48", "64:27", "4:3", 148.5, 47.96, 54.0, 1920, 1080, 2750, 1125, 0 },
+{ 113, "1080p2x48", "64:27", "1:1", 198.0, 47.96, 52.8, 2560, 1080, 3750, 1100, 0 },
+{ 114, "2160p48", "16:9", "1:1", 594.0, 47.96, 108.0, 3840, 2160, 5500, 2250, 0 },
+{ 115, "2160p48", "256:135", "1:1", 594.0, 47.96, 108.0, 4096, 2160, 5500, 2250, 0 },
+{ 116, "2160p48", "64:27", "4:3", 594.0, 47.96, 108.0, 3840, 2160, 5500, 2250, 0 },
+{ 117, "2160p100", "16:9", "1:1", 1188.0, 100, 225.0, 3840, 2160, 5280, 2250, 100 },
+{ 118, "2160p120", "16:9", "1:1", 1188.0, 119.88, 270.0, 3840, 2160, 4400, 2250, 120 },
+{ 119, "2160p100", "64:27", "4:3", 1188.0, 100, 225.0, 3840, 2160, 5280, 2250, 100 },
+{ 120, "2160p120", "64:27", "4:3", 1188.0, 119.88, 270.0, 3840, 2160, 4400, 2250, 120 },
+{ 121, "2160p2x24", "64:27", "1:1", 396.0, 23.98, 52.8, 5120, 2160, 7500, 2200, 0 },
+{ 122, "2160p2x25", "64:27", "1:1", 396.0, 25, 55.0, 5120, 2160, 7200, 2200, 0 },
+{ 123, "2160p2x30", "64:27", "1:1", 396.0, 29.97, 66.0, 5120, 2160, 6000, 2200, 0 },
+{ 124, "2160p2x48", "64:27", "1:1", 742.5, 47.96, 118.8, 5120, 2160, 6250, 2450, 0 },
+{ 125, "2160p2x50", "64:27", "1:1", 742.5, 50, 112.5, 5120, 2160, 6600, 2250, 50 },
+{ 126, "2160p2x", "64:27", "1:1", 742.5, 60, 135.0, 5120, 2160, 5500, 2250, 60 },
+{ 127, "2160p2x100", "64:27", "1:1", 1485.0, 100, 225.0, 5120, 2160, 6600, 2250, 100 },
+{ 193, "2160p2x120", "64:27", "1:1", 1485.0, 119.88, 270.0, 5120, 2160, 5500, 2250, 120 },
+{ 194, "4320p24", "16:9", "1:1", 1188.0, 23.98, 108.0, 7680, 4320, 11000, 4500, 0 },
+{ 195, "4320p25", "16:9", "1:1", 1188.0, 25, 110.0, 7680, 4320, 10800, 4400, 0 },
+{ 196, "4320p30", "16:9", "1:1", 1188.0, 29.97, 132.0, 7680, 4320, 9000, 4400, 0 },
+{ 197, "4320p48", "16:9", "1:1", 2376.0, 47.96, 216.0, 7680, 4320, 11000, 4500, 0 },
+{ 198, "4320p50", "16:9", "1:1", 2376.0, 50, 220.0, 7680, 4320, 10800, 4400, 50 },
+{ 199, "4320p", "16:9", "1:1", 2376.0, 60, 264.0, 7680, 4320, 9000, 4400, 60 },
+{ 200, "4320p100", "16:9", "1:1", 4752.0, 100, 450.0, 7680, 4320, 10560, 4500, 100 },
+{ 201, "4320p120", "16:9", "1:1", 4752.0, 119.88, 540.0, 7680, 4320, 8800, 4500, 120 },
+{ 202, "4320p24", "64:27", "4:3", 1188.0, 23.98, 108.0, 7680, 4320, 11000, 4500, 0 },
+{ 203, "4320p25", "64:27", "4:3", 1188.0, 25, 110.0, 7680, 4320, 10800, 4400, 0 },
+{ 204, "4320p30", "64:27", "4:3", 1188.0, 29.97, 132.0, 7680, 4320, 9000, 4400, 0 },
+{ 205, "4320p48", "64:27", "4:3", 2376.0, 47.96, 216.0, 7680, 4320, 11000, 4500, 0 },
+{ 206, "4320p50", "64:27", "4:3", 2376.0, 50, 220.0, 7680, 4320, 10800, 4400, 50 },
+{ 207, "4320p", "64:27", "4:3", 2376.0, 60, 264.0, 7680, 4320, 9000, 4400, 60 },
+{ 208, "4320p100", "64:27", "4:3", 4752.0, 100, 450.0, 7680, 4320, 10560, 4500, 100 },
+{ 209, "4320p120", "64:27", "4:3", 4752.0, 119.88, 540.0, 7680, 4320, 8800, 4500, 120 },
+{ 210, "4320p2x24", "64:27", "1:1", 1485.0, 23.98, 118.8, 10240, 4320, 12500, 4950, 0 },
+{ 211, "4320p2x25", "64:27", "1:1", 1485.0, 25, 110.0, 10240, 4320, 13500, 4400, 0 },
+{ 212, "4320p2x30", "64:27", "1:1", 1485.0, 29.97, 135.0, 10240, 4320, 11000, 4500, 0 },
+{ 213, "4320p2x48", "64:27", "1:1", 2970.0, 47.96, 237.6, 10240, 4320, 12500, 4950, 0 },
+{ 214, "4320p2x50", "64:27", "1:1", 2970.0, 50, 220.0, 10240, 4320, 13500, 4400, 50 },
+{ 215, "4320p2x", "64:27", "1:1", 2970.0, 60, 270.0, 10240, 4320, 11000, 4400, 60 },
+{ 216, "4320p2x100", "64:27", "1:1", 5940.0, 100, 450.0, 10240, 4320, 13200, 4500, 100 },
+{ 217, "4320p2x120", "64:27", "1:1", 5940.0, 119.88, 540.0, 10240, 4320, 11000, 4500, 120 },
+{ 218, "2160p100", "256:135", "1:1", 1188.0, 100, 225.0, 4096, 2160, 5280, 2250, 100 },
+{ 219, "2160p120", "256:135", "1:1", 1188.0, 119.88, 270.0, 4096, 2160, 4400, 2250, 120 },
+};