Go to the documentation of this file.
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)
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);
int preferred_timing_includes_native
static int decode_descriptors(const uchar *edid, MonitorInfo *info)
static void decode_detailed_timing(const uchar *timing, DetailedTiming *detailed)
GLboolean GLboolean GLboolean b
union MonitorInfo::@270 ad
static void decode_display_descriptor(const uchar *desc, MonitorInfo *info)
char manufacturer_code[4]
static int decode_edid_version(const uchar *edid, MonitorInfo *info)
static void decode_lf_string(const uchar *s, int n_chars, char *result)
static int decode_established_timings(const uchar *edid, MonitorInfo *info)
GLboolean GLboolean GLboolean GLboolean a
GLfloat GLfloat GLfloat GLfloat h
static int decode_display_parameters(const uchar *edid, MonitorInfo *info)
struct MonitorInfo::@270::@272 analog
struct DetailedTiming::@267::@268 analog
static int decode_color_characteristics(const uchar *edid, MonitorInfo *info)
char dsc_serial_number[14]
struct DetailedTiming::@267::@269 digital
static int get_bit(int in, int bit)
static double decode_fraction(int high, int low)
static int decode_header(const uchar *edid)
unsigned int serial_number
static const char * yesno(int v)
void dump_monitor_info(MonitorInfo *info)
MonitorInfo * decode_edid(const uchar *edid)
DetailedTiming detailed_timings[4]
static void decode_check_sum(const uchar *edid, MonitorInfo *info)
struct MonitorInfo::@270::@271 digital
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
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 int in j)
char dsc_product_name[14]
static int decode_standard_timings(const uchar *edid, MonitorInfo *info)
static int get_bits(int in, int begin, int end)
union DetailedTiming::@267 ad
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 idx
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)
GLubyte GLubyte GLubyte GLubyte w