37 return (in & (1 << bit)) >> bit;
43 int mask = (1 << (end - begin + 1)) - 1;
45 return (in >> begin) &
mask;
51 if (memcmp (edid,
"\x00\xff\xff\xff\xff\xff\xff\x00", 8) == 0)
77 edid[0x0c] | edid[0x0d] << 8 | edid[0x0e] << 16 | edid[0x0f] << 24;
80 is_model_year =
FALSE;
130 static const int bit_depth[8] =
132 -1, 6, 8, 10, 12, 14, 16, -1
154 static const double levels[][3] =
157 { 0.714, 0.286, 1.0 },
162 info->
analog.video_signal_level = levels[
bits][0];
163 info->
analog.sync_signal_level = levels[
bits][1];
164 info->
analog.total_signal_level = levels[
bits][2];
170 info->
analog.composite_sync_on_green =
get_bit (edid[0x14], 1);
176 if (edid[0x15] == 0 && edid[0x16] == 0)
182 else if (edid[0x16] == 0)
188 else if (edid[0x15] == 0)
202 if (edid[0x17] == 0xFF)
205 info->
gamma = (edid[0x17] + 100.0) / 100.0;
247 high = (high << 2) | low;
249 for (i = 0; i < 10; ++
i)
250 result +=
get_bit (high, i) * pow (2, i - 10);
273 static const Timing established[][8] =
310 for (i = 0; i < 3; ++
i)
312 for (j = 0; j < 8; ++
j)
314 int byte = edid[0x23 +
i];
316 if (
get_bit (byte, j) && established[i][j].frequency != 0)
328 for (i = 0; i < 8; i++)
330 int first = edid[0x26 + 2 *
i];
331 int second = edid[0x27 + 2 *
i];
333 if (first != 0x01 && second != 0x01)
335 int w = 8 * (first + 31);
340 case 0x00: h = (w / 16) * 10;
break;
341 case 0x01: h = (w / 4) * 3;
break;
342 case 0x02: h = (w / 5) * 4;
break;
343 case 0x03: h = (w / 16) * 9;
break;
359 for (i = 0; i < n_chars; ++
i)
366 else if (s[i] == 0x00)
428 detailed->
pixel_clock = (timing[0x00] | timing[0x01] << 8) * 10000;
429 detailed->
h_addr = timing[0x02] | ((timing[0x04] & 0xf0) << 4);
430 detailed->
h_blank = timing[0x03] | ((timing[0x04] & 0x0f) << 8);
431 detailed->
v_addr = timing[0x05] | ((timing[0x07] & 0xf0) << 4);
432 detailed->
v_blank = timing[0x06] | ((timing[0x07] & 0x0f) << 8);
434 detailed->
h_sync = timing[0x09] |
get_bits (timing[0x0b], 4, 5) << 8;
458 if (detailed->
digital.composite)
487 for (i = 0; i < 4; ++
i)
489 int index = 0x36 + i * 18;
491 if (edid[index + 0] == 0x00 && edid[index + 1] == 0x00)
514 for (i = 0; i < 128; ++
i)
545 return v?
"yes" :
"no";
554 printf (
"Checksum: %d (%s)\n",
563 printf (
"Production Week: unspecified\n");
568 printf (
"Production Year: unspecified\n");
571 printf (
"Model Year: %d\n", info->
model_year);
573 printf (
"Model Year: unspecified\n");
577 printf (
"Display is %s\n", info->
is_digital?
"digital" :
"analog");
580 const char *interface;
581 if (info->
digital.bits_per_primary != -1)
582 printf (
"Bits Per Primary: %d\n", info->
digital.bits_per_primary);
584 printf (
"Bits Per Primary: undefined\n");
586 switch (info->
digital.interface)
588 case DVI:
interface = "
DVI";
break;
589 case HDMI_A:
interface = "HDMI-a";
break;
590 case HDMI_B:
interface = "HDMI-b";
break;
591 case MDDI:
interface = "
MDDI";
break;
593 case UNDEFINED:
interface = "undefined";
break;
594 default:
interface = "unknown";
break;
596 printf (
"Interface: %s\n", interface);
598 printf (
"RGB 4:4:4: %s\n",
yesno (info->
digital.rgb444));
599 printf (
"YCrCb 4:4:4: %s\n",
yesno (info->
digital.ycrcb444));
600 printf (
"YCrCb 4:2:2: %s\n",
yesno (info->
digital.ycrcb422));
604 printf (
"Video Signal Level: %f\n", info->
analog.video_signal_level);
605 printf (
"Sync Signal Level: %f\n", info->
analog.sync_signal_level);
606 printf (
"Total Signal Level: %f\n", info->
analog.total_signal_level);
608 printf (
"Blank to Black: %s\n",
610 printf (
"Separate HV Sync: %s\n",
612 printf (
"Composite Sync on H: %s\n",
614 printf (
"Serration on VSync: %s\n",
617 switch (info->
analog.color_type)
621 case RGB: s =
"rgb";
break;
623 default: s =
"unknown";
break;
626 printf (
"Color: %s\n", s);
630 printf (
"Width: undefined\n");
632 printf (
"Width: %d mm\n", info->
width_mm);
635 printf (
"Height: undefined\n");
637 printf (
"Height: %d mm\n", info->
height_mm);
642 printf (
"Aspect Ratio: undefined\n");
644 if (info->
gamma >= 0)
645 printf (
"Gamma: %f\n", info->
gamma);
647 printf (
"Gamma: undefined\n");
654 printf (
"Preferred Timing Includes Native: %s\n",
658 printf (
"Red X: %f\n", info->
red_x);
659 printf (
"Red Y: %f\n", info->
red_y);
660 printf (
"Green X: %f\n", info->
green_x);
661 printf (
"Green Y: %f\n", info->
green_y);
662 printf (
"Blue X: %f\n", info->
blue_x);
663 printf (
"Blue Y: %f\n", info->
blue_y);
664 printf (
"White X: %f\n", info->
white_x);
665 printf (
"White Y: %f\n", info->
white_y);
667 printf (
"Established Timings:\n");
669 for (i = 0; i < 24; ++
i)
676 printf (
" %d x %d @ %d Hz\n",
681 printf (
"Standard Timings:\n");
682 for (i = 0; i < 8; ++
i)
689 printf (
" %d x %d @ %d Hz\n",
698 printf (
"Timing%s: \n",
700 " (Preferred)" :
"");
701 printf (
" Pixel Clock: %d\n", timing->
pixel_clock);
702 printf (
" H Addressable: %d\n", timing->
h_addr);
703 printf (
" H Blank: %d\n", timing->
h_blank);
705 printf (
" H Sync: %d\n", timing->
h_sync);
706 printf (
" V Addressable: %d\n", timing->
v_addr);
707 printf (
" V Blank: %d\n", timing->
v_blank);
709 printf (
" V Sync: %d\n", timing->
v_sync);
710 printf (
" Width: %d mm\n", timing->
width_mm);
711 printf (
" Height: %d mm\n", timing->
height_mm);
713 printf (
" Top Border: %d\n", timing->
top_border);
718 case FIELD_RIGHT: s =
"Field Sequential, Right on Sync";
break;
719 case FIELD_LEFT: s =
"Field Sequential, Left on Sync";
break;
725 printf (
" Stereo: %s\n", s);
729 printf (
" Digital Sync:\n");
730 printf (
" composite: %s\n",
yesno (timing->
digital.composite));
731 printf (
" serrations: %s\n",
yesno (timing->
digital.serrations));
732 printf (
" negative vsync: %s\n",
734 printf (
" negative hsync: %s\n",
739 printf (
" Analog Sync:\n");
740 printf (
" bipolar: %s\n",
yesno (timing->
analog.bipolar));
741 printf (
" serrations: %s\n",
yesno (timing->
analog.serrations));
742 printf (
" sync on green: %s\n",
yesno (
743 timing->
analog.sync_on_green));
747 printf (
"Detailed Product information:\n");
750 printf (
" Unspecified String: %s\n", info->
dsc_string);
char dsc_product_name[14]
static void decode_lf_string(const uchar *s, int n_chars, char *result)
static int decode_color_characteristics(const uchar *edid, MonitorInfo *info)
static int get_bits(int in, int begin, int end)
static void decode_detailed_timing(const uchar *timing, DetailedTiming *detailed)
GLfloat GLfloat GLfloat GLfloat h
static int decode_header(const uchar *edid)
MonitorInfo * decode_edid(const uchar *edid)
char manufacturer_code[4]
static void decode_display_descriptor(const uchar *desc, MonitorInfo *info)
struct MonitorInfo::@93::@96 analog
static int decode_edid_version(const uchar *edid, MonitorInfo *info)
static int get_bit(int in, int bit)
void dump_monitor_info(MonitorInfo *info)
static int decode_established_timings(const uchar *edid, MonitorInfo *info)
struct DetailedTiming::@89::@91 analog
static const char * yesno(int v)
static double decode_fraction(int high, int low)
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
static void decode_check_sum(const uchar *edid, MonitorInfo *info)
int preferred_timing_includes_native
static int decode_display_parameters(const uchar *edid, MonitorInfo *info)
struct MonitorInfo::@93::@95 digital
static int decode_vendor_and_product_identification(const uchar *edid, MonitorInfo *info)
DetailedTiming detailed_timings[4]
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
char dsc_serial_number[14]
static int decode_descriptors(const uchar *edid, MonitorInfo *info)
GLint GLint GLint GLint GLint w
unsigned int serial_number
static int decode_standard_timings(const uchar *edid, MonitorInfo *info)
struct DetailedTiming::@89::@92 digital