24 #include "../../SDL_internal.h" 39 return (in & (1 << bit)) >> bit;
45 int mask = (1 << (end - begin + 1)) - 1;
47 return (in >> begin) &
mask;
53 if (memcmp (edid,
"\x00\xff\xff\xff\xff\xff\xff\x00", 8) == 0)
79 edid[0x0c] | edid[0x0d] << 8 | edid[0x0e] << 16 | edid[0x0f] << 24;
82 is_model_year =
FALSE;
132 static const int bit_depth[8] =
134 -1, 6, 8, 10, 12, 14, 16, -1
156 static const double levels[][3] =
159 { 0.714, 0.286, 1.0 },
178 if (edid[0x15] == 0 && edid[0x16] == 0)
184 else if (edid[0x16] == 0)
190 else if (edid[0x15] == 0)
204 if (edid[0x17] == 0xFF)
207 info->
gamma = (edid[0x17] + 100.0) / 100.0;
249 high = (high << 2) | low;
251 for (i = 0; i < 10; ++
i)
275 static const Timing established[][8] =
312 for (i = 0; i < 3; ++
i)
314 for (j = 0; j < 8; ++
j)
316 int byte = edid[0x23 +
i];
318 if (
get_bit (byte, j) && established[i][j].frequency != 0)
330 for (i = 0; i < 8; i++)
332 int first = edid[0x26 + 2 *
i];
333 int second = edid[0x27 + 2 *
i];
335 if (first != 0x01 && second != 0x01)
337 int w = 8 * (first + 31);
342 case 0x00: h = (w / 16) * 10;
break;
343 case 0x01: h = (w / 4) * 3;
break;
344 case 0x02: h = (w / 5) * 4;
break;
345 case 0x03: h = (w / 16) * 9;
break;
361 for (i = 0; i < n_chars; ++
i)
368 else if (s[i] == 0x00)
430 detailed->
pixel_clock = (timing[0x00] | timing[0x01] << 8) * 10000;
431 detailed->
h_addr = timing[0x02] | ((timing[0x04] & 0xf0) << 4);
432 detailed->
h_blank = timing[0x03] | ((timing[0x04] & 0x0f) << 8);
433 detailed->
v_addr = timing[0x05] | ((timing[0x07] & 0xf0) << 4);
434 detailed->
v_blank = timing[0x06] | ((timing[0x07] & 0x0f) << 8);
436 detailed->
h_sync = timing[0x09] |
get_bits (timing[0x0b], 4, 5) << 8;
489 for (i = 0; i < 4; ++
i)
491 int index = 0x36 + i * 18;
493 if (edid[index + 0] == 0x00 && edid[index + 1] == 0x00)
516 for (i = 0; i < 128; ++
i)
547 return v?
"yes" :
"no";
555 printf (
"Checksum: %d (%s)\n",
564 printf (
"Production Week: unspecified\n");
569 printf (
"Production Year: unspecified\n");
572 printf (
"Model Year: %d\n", info->
model_year);
574 printf (
"Model Year: unspecified\n");
578 printf (
"Display is %s\n", info->
is_digital?
"digital" :
"analog");
581 const char *interface;
582 if (info->
ad.
digital.bits_per_primary != -1)
583 printf (
"Bits Per Primary: %d\n", info->
ad.
digital.bits_per_primary);
585 printf (
"Bits Per Primary: undefined\n");
589 case DVI:
interface = "
DVI";
break;
590 case HDMI_A:
interface = "HDMI-a";
break;
591 case HDMI_B:
interface = "HDMI-b";
break;
592 case MDDI:
interface = "
MDDI";
break;
594 case UNDEFINED:
interface = "undefined";
break;
595 default:
interface = "unknown";
break;
597 printf (
"Interface: %s\n", interface);
606 printf (
"Video Signal Level: %f\n", info->
ad.
analog.video_signal_level);
607 printf (
"Sync Signal Level: %f\n", info->
ad.
analog.sync_signal_level);
608 printf (
"Total Signal Level: %f\n", info->
ad.
analog.total_signal_level);
610 printf (
"Blank to Black: %s\n",
612 printf (
"Separate HV Sync: %s\n",
614 printf (
"Composite Sync on H: %s\n",
616 printf (
"Serration on VSync: %s\n",
623 case RGB: s =
"rgb";
break;
625 default: s =
"unknown";
break;
628 printf (
"Color: %s\n", s);
632 printf (
"Width: undefined\n");
634 printf (
"Width: %d mm\n", info->
width_mm);
637 printf (
"Height: undefined\n");
639 printf (
"Height: %d mm\n", info->
height_mm);
644 printf (
"Aspect Ratio: undefined\n");
646 if (info->
gamma >= 0)
647 printf (
"Gamma: %f\n", info->
gamma);
649 printf (
"Gamma: undefined\n");
656 printf (
"Preferred Timing Includes Native: %s\n",
660 printf (
"Red X: %f\n", info->
red_x);
661 printf (
"Red Y: %f\n", info->
red_y);
662 printf (
"Green X: %f\n", info->
green_x);
663 printf (
"Green Y: %f\n", info->
green_y);
664 printf (
"Blue X: %f\n", info->
blue_x);
665 printf (
"Blue Y: %f\n", info->
blue_y);
666 printf (
"White X: %f\n", info->
white_x);
667 printf (
"White Y: %f\n", info->
white_y);
669 printf (
"Established Timings:\n");
671 for (i = 0; i < 24; ++
i)
678 printf (
" %d x %d @ %d Hz\n",
683 printf (
"Standard Timings:\n");
684 for (i = 0; i < 8; ++
i)
691 printf (
" %d x %d @ %d Hz\n",
700 printf (
"Timing%s: \n",
702 " (Preferred)" :
"");
703 printf (
" Pixel Clock: %d\n", timing->
pixel_clock);
704 printf (
" H Addressable: %d\n", timing->
h_addr);
705 printf (
" H Blank: %d\n", timing->
h_blank);
707 printf (
" H Sync: %d\n", timing->
h_sync);
708 printf (
" V Addressable: %d\n", timing->
v_addr);
709 printf (
" V Blank: %d\n", timing->
v_blank);
711 printf (
" V Sync: %d\n", timing->
v_sync);
712 printf (
" Width: %d mm\n", timing->
width_mm);
713 printf (
" Height: %d mm\n", timing->
height_mm);
715 printf (
" Top Border: %d\n", timing->
top_border);
720 case FIELD_RIGHT: s =
"Field Sequential, Right on Sync";
break;
721 case FIELD_LEFT: s =
"Field Sequential, Left on Sync";
break;
727 printf (
" Stereo: %s\n", s);
731 printf (
" Digital Sync:\n");
732 printf (
" composite: %s\n",
yesno (timing->
ad.
digital.composite));
733 printf (
" serrations: %s\n",
yesno (timing->
ad.
digital.serrations));
734 printf (
" negative vsync: %s\n",
736 printf (
" negative hsync: %s\n",
741 printf (
" Analog Sync:\n");
742 printf (
" bipolar: %s\n",
yesno (timing->
ad.
analog.bipolar));
743 printf (
" serrations: %s\n",
yesno (timing->
ad.
analog.serrations));
744 printf (
" sync on green: %s\n",
yesno (
749 printf (
"Detailed Product information:\n");
752 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)
static int decode_header(const uchar *edid)
MonitorInfo * decode_edid(const uchar *edid)
char manufacturer_code[4]
struct DetailedTiming::@40::@41 analog
static void decode_display_descriptor(const uchar *desc, MonitorInfo *info)
GLfloat GLfloat GLfloat GLfloat h
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
struct MonitorInfo::@43::@45 analog
union MonitorInfo::@43 ad
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::@40::@42 digital
static const char * yesno(int v)
static double decode_fraction(int high, int low)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int int in j)
GLubyte GLubyte GLubyte GLubyte w
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)
static int decode_vendor_and_product_identification(const uchar *edid, MonitorInfo *info)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
struct MonitorInfo::@43::@44 digital
DetailedTiming detailed_timings[4]
char dsc_serial_number[14]
static int decode_descriptors(const uchar *edid, MonitorInfo *info)
unsigned int serial_number
static int decode_standard_timings(const uchar *edid, MonitorInfo *info)
union DetailedTiming::@40 ad