diff options
| author | Burt P <pburt0@gmail.com> | 2019-08-19 00:38:55 -0500 | 
|---|---|---|
| committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2019-08-22 23:10:17 +0200 | 
| commit | 4a33434d40bb9b3d4d36fb65c80f36dfa492daf6 (patch) | |
| tree | 80ca73bf824eceff1938169b3be2ea045389d3a5 /deps/sysobj_early | |
| parent | 5ea868d6caefeb3dcc93f50631a17c3a1681bd74 (diff) | |
monitors: SVDs, fixes
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'deps/sysobj_early')
| -rw-r--r-- | deps/sysobj_early/include/util_edid.h | 17 | ||||
| -rw-r--r-- | deps/sysobj_early/src/util_edid.c | 100 | ||||
| -rw-r--r-- | deps/sysobj_early/src/util_edid_svd_table.c | 164 | 
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 }, +}; | 
