mirror of https://github.com/x64dbg/btparser
734 lines
27 KiB
Plaintext
734 lines
27 KiB
Plaintext
|
1:
|
||
|
2:
|
||
|
3:
|
||
|
4:
|
||
|
5:
|
||
|
6:
|
||
|
7:
|
||
|
8:
|
||
|
9:
|
||
|
10:
|
||
|
11:
|
||
|
12:
|
||
|
13:
|
||
|
14:
|
||
|
15:
|
||
|
16: typedef uint16 EISAId < read = EISAIdToString , write = StringToEISAId > ;
|
||
|
17:
|
||
|
18: string EISAIdToString ( EISAId x )
|
||
|
19: {
|
||
|
20: uint16 sw = SwapBytes ( x ) ;
|
||
|
21: string s ;
|
||
|
22: SPrintf ( s , "%c%c%c" , '@' + ( sw >> 10 & 0x1F ) , '@' + ( sw >> 5 & 0x1F ) , '@' + ( sw >> 0 & 0x1F ) ) ;
|
||
|
23: return s ;
|
||
|
24: }
|
||
|
25:
|
||
|
26: void StringToEISAId ( EISAId & x , string s )
|
||
|
27: {
|
||
|
28: char c [ 3 ] ;
|
||
|
29: SScan ( s , "%c%c%c" , c [ 0 ] , c [ 1 ] , c2 [ 2 ] ) ;
|
||
|
30: x = ( c [ 0 ] - '@' ) << 10 | ( c [ 1 ] - '@' ) << 5 | ( c [ 2 ] - '@' ) << 0 ;
|
||
|
31: x = SwapBytes ( x ) ;
|
||
|
32: }
|
||
|
33:
|
||
|
34:
|
||
|
35:
|
||
|
36: typedef struct
|
||
|
37: {
|
||
|
38: ubyte x_resolution ;
|
||
|
39: ubyte vFrequency : 6 ;
|
||
|
40: ubyte pixelRatio : 2 ;
|
||
|
41: } Timing < read = TimingToString > ;
|
||
|
42:
|
||
|
43: string TimingToString ( Timing & t )
|
||
|
44: {
|
||
|
45: if ( t . x_resolution == 1 && t . vFrequency == 1 && t . pixelRatio == 0 ) return "-" ;
|
||
|
46: int x = ( t . x_resolution + 31 ) * 8 ;
|
||
|
47: int y ;
|
||
|
48: switch ( t . pixelRatio )
|
||
|
49: {
|
||
|
50: case 0 : y = x * 10 / 16 ; break ;
|
||
|
51: case 1 : y = x * 3 / 4 ; break ;
|
||
|
52: case 2 : y = x * 4 / 5 ; break ;
|
||
|
53: case 3 : y = x * 9 / 16 ; break ;
|
||
|
54: }
|
||
|
55: string s ;
|
||
|
56: SPrintf ( s , "%ux%u, %uHz" , x , y , t . vFrequency + 60 ) ;
|
||
|
57: return s ;
|
||
|
58: }
|
||
|
59:
|
||
|
60:
|
||
|
61:
|
||
|
62: enum < ubyte > DescriptorType
|
||
|
63: {
|
||
|
64: TIMINGS = 0xFA ,
|
||
|
65: WHITE_POINT = 0xFB ,
|
||
|
66: MONITOR_NAME = 0xFC ,
|
||
|
67: RANGE_LIMITS = 0xFD ,
|
||
|
68: UNSPECIFIED_TEXT = 0xFE ,
|
||
|
69: SERIAL_NUMBER = 0xFF ,
|
||
|
70: } ;
|
||
|
71:
|
||
|
72:
|
||
|
73:
|
||
|
74: enum < ubyte > FormatCode
|
||
|
75: {
|
||
|
76: RESERVED = 0 ,
|
||
|
77: LPCM = 1 ,
|
||
|
78: AC_3 = 2 ,
|
||
|
79: MPEG1 = 3 ,
|
||
|
80: MP3 = 4 ,
|
||
|
81: MPEG2 = 5 ,
|
||
|
82: AAC = 6 ,
|
||
|
83: DTS = 7 ,
|
||
|
84: ATRAC = 8 ,
|
||
|
85: SACD = 9 ,
|
||
|
86: DD_PLUS = 10 ,
|
||
|
87: DTS_HD = 11 ,
|
||
|
88: MLP_TRUEHD = 12 ,
|
||
|
89: DST = 13 ,
|
||
|
90: WMA_PRO = 14 ,
|
||
|
91: RESERVED2 = 15 ,
|
||
|
92: } ;
|
||
|
93:
|
||
|
94:
|
||
|
95:
|
||
|
96: enum < ubyte > BlockType
|
||
|
97: {
|
||
|
98: AUDIO = 1 ,
|
||
|
99: VIDEO = 2 ,
|
||
|
100: VENDOR_SPECIFIC = 3 ,
|
||
|
101: SPEAKER = 4 ,
|
||
|
102: } ;
|
||
|
103:
|
||
|
104:
|
||
|
105:
|
||
|
106: enum < ubyte > SVDIndex
|
||
|
107: {
|
||
|
108: _DMT0659 = 1 ,
|
||
|
109: _480p = 2 ,
|
||
|
110: _480pH = 3 ,
|
||
|
111: _720p = 4 ,
|
||
|
112: _1080i = 5 ,
|
||
|
113: _480i = 6 ,
|
||
|
114: _480iH = 7 ,
|
||
|
115: _240p = 8 ,
|
||
|
116: _240pH = 9 ,
|
||
|
117: _480i4x = 10 ,
|
||
|
118: _480i4xH = 11 ,
|
||
|
119: _240p4x = 12 ,
|
||
|
120: _240p4xH = 13 ,
|
||
|
121: _480p2x = 14 ,
|
||
|
122: _480p2xH = 15 ,
|
||
|
123: _1080p = 16 ,
|
||
|
124: _576p = 17 ,
|
||
|
125: _576pH = 18 ,
|
||
|
126: _720p50 = 19 ,
|
||
|
127: _1080i25 = 20 ,
|
||
|
128: _576i = 21 ,
|
||
|
129: _576iH = 22 ,
|
||
|
130: _288p = 23 ,
|
||
|
131: _288pH = 24 ,
|
||
|
132: _576i4x = 25 ,
|
||
|
133: _576i4xH = 26 ,
|
||
|
134: _288p4x = 27 ,
|
||
|
135: _288p4xH = 28 ,
|
||
|
136: _576p2x = 29 ,
|
||
|
137: _576p2xH = 30 ,
|
||
|
138: _1080p50 = 31 ,
|
||
|
139: _1080p24 = 32 ,
|
||
|
140: _1080p25 = 33 ,
|
||
|
141: _1080p30 = 34 ,
|
||
|
142: _480p4x = 35 ,
|
||
|
143: _480p4xH = 36 ,
|
||
|
144: _576p4x = 37 ,
|
||
|
145: _576p4xH = 38 ,
|
||
|
146: _1080i25b = 39 ,
|
||
|
147: _1080i50 = 40 ,
|
||
|
148: _720p100 = 41 ,
|
||
|
149: _576p100 = 42 ,
|
||
|
150: _576p100H = 43 ,
|
||
|
151: _576i50 = 44 ,
|
||
|
152: _576i50H = 45 ,
|
||
|
153: _1080i60 = 46 ,
|
||
|
154: _720p120 = 47 ,
|
||
|
155: _480p119 = 48 ,
|
||
|
156: _480p119H = 49 ,
|
||
|
157: _480i59 = 50 ,
|
||
|
158: _480i59H = 51 ,
|
||
|
159: _576p200 = 52 ,
|
||
|
160: _576p200H = 53 ,
|
||
|
161: _576i100 = 54 ,
|
||
|
162: _576i100H = 55 ,
|
||
|
163: _480p239 = 56 ,
|
||
|
164: _480p239H = 57 ,
|
||
|
165: _480i119 = 58 ,
|
||
|
166: _480i119H = 59 ,
|
||
|
167: _720p24 = 60 ,
|
||
|
168: _720p25 = 61 ,
|
||
|
169: _720p30 = 62 ,
|
||
|
170: _1080p120 = 63 ,
|
||
|
171: } ;
|
||
|
172:
|
||
|
173: typedef struct
|
||
|
174: {
|
||
|
175: SVDIndex index : 7 < comment = "index value to a table of standard resolutions/timings from CEA/EIA-861E" > ;
|
||
|
176: ubyte native : 1 < comment = "1 to designate that this should be considered a \"native\" resolution, 0 for non-native" > ;
|
||
|
177: } SVD < read = SVDToString , comment = "Short Video Descriptor" > ;
|
||
|
178:
|
||
|
179: string SVDToString ( SVD & svd )
|
||
|
180: {
|
||
|
181: string s ;
|
||
|
182: SPrintf ( s , "%s%s (%u)" , ( svd . native ? "*" : "" ) , EnumToString ( svd . index ) , svd . index ) ;
|
||
|
183: return s ;
|
||
|
184: }
|
||
|
185:
|
||
|
186:
|
||
|
187:
|
||
|
188: string SPAToString ( uint16 spa )
|
||
|
189: {
|
||
|
190: string s ;
|
||
|
191: SPrintf ( s , "%u.%u.%u.%u" , spa >> 4 & 15 , spa >> 0 & 15 , spa >> 12 & 15 , spa >> 8 & 15 ) ;
|
||
|
192: return s ;
|
||
|
193: }
|
||
|
194:
|
||
|
195:
|
||
|
196:
|
||
|
197: string TDMSFreqToString ( ubyte f )
|
||
|
198: {
|
||
|
199: string s ;
|
||
|
200: SPrintf ( s , "%u MHz" , ( uint ) f * 5 ) ;
|
||
|
201: return s ;
|
||
|
202: }
|
||
|
203:
|
||
|
204:
|
||
|
205:
|
||
|
206: string PixelClockToString ( uint16 f )
|
||
|
207: {
|
||
|
208: string s ;
|
||
|
209: SPrintf ( s , "%.2lf MHz" , ( double ) f / 100 ) ;
|
||
|
210: return s ;
|
||
|
211: }
|
||
|
212:
|
||
|
213: void StringToPixelClock ( uint16 & f , string s )
|
||
|
214: {
|
||
|
215: f = Atof ( s ) * 100 ;
|
||
|
216: }
|
||
|
217:
|
||
|
218:
|
||
|
219:
|
||
|
220: typedef ubyte PixelRate < read = PixelRateToString , write = StringToPixelRate > ;
|
||
|
221:
|
||
|
222: string PixelRateToString ( PixelRate f )
|
||
|
223: {
|
||
|
224: string s ;
|
||
|
225: SPrintf ( s , "%u MHz" , ( uint ) f * 10 ) ;
|
||
|
226: return s ;
|
||
|
227: }
|
||
|
228:
|
||
|
229: void StringToPixelRate ( PixelRate & f , string s )
|
||
|
230: {
|
||
|
231: f = Atof ( s ) / 10 ;
|
||
|
232: }
|
||
|
233:
|
||
|
234:
|
||
|
235:
|
||
|
236: typedef ubyte BitRate < read = BitRateToString , write = StringToBitRate , comment = "maximum supported bitrate divided by 8 kbit/s" > ;
|
||
|
237:
|
||
|
238: string BitRateToString ( BitRate b )
|
||
|
239: {
|
||
|
240: string s ;
|
||
|
241: SPrintf ( s , "%u kHz" , ( uint ) b * 8 ) ;
|
||
|
242: return s ;
|
||
|
243: }
|
||
|
244:
|
||
|
245: void StringToBitRate ( BitRate & b , string s )
|
||
|
246: {
|
||
|
247: b = Atof ( s ) / 8 ;
|
||
|
248: }
|
||
|
249:
|
||
|
250:
|
||
|
251:
|
||
|
252: typedef ubyte Latency < read = LatencyToString , write = StringToLatency , comment = "Latency (value=1+ms/2 with a max of 251 meaning 500ms)" > ;
|
||
|
253:
|
||
|
254: string LatencyToString ( Latency l )
|
||
|
255: {
|
||
|
256: if ( l == 0 ) return "-" ;
|
||
|
257: string s ;
|
||
|
258: SPrintf ( s , "%u ms" , ( ( uint ) l - 1 ) * 2 ) ;
|
||
|
259: return s ;
|
||
|
260: }
|
||
|
261:
|
||
|
262: void StringToLatency ( Latency & l , string s )
|
||
|
263: {
|
||
|
264: if ( s == "-" ) l = 0 ; else l = ( uint ) ( Atof ( s ) / 2 ) + 1 ;
|
||
|
265: }
|
||
|
266:
|
||
|
267:
|
||
|
268:
|
||
|
269: typedef struct
|
||
|
270: {
|
||
|
271: ubyte size : 5 < comment = "Total number of bytes in this block following this byte" > ;
|
||
|
272: BlockType typeTag : 3 < comment = "Block Type Tag (1 is audio, 2 is video, 3 is vendor specific, 4 is speaker allocation, all other values Reserved)" > ;
|
||
|
273:
|
||
|
274:
|
||
|
275: switch ( typeTag )
|
||
|
276: {
|
||
|
277: case AUDIO :
|
||
|
278: {
|
||
|
279: ubyte channelCount : 3 < comment = "number of channels minus 1" > ;
|
||
|
280: FormatCode formatCode : 4 < comment = "Audio format code" > ;
|
||
|
281: ubyte reserved1 : 1 ;
|
||
|
282: struct SampleRates
|
||
|
283: {
|
||
|
284: ubyte _32kHz : 1 ;
|
||
|
285: ubyte _44kHz : 1 ;
|
||
|
286: ubyte _48kHz : 1 ;
|
||
|
287: ubyte _88kHz : 1 ;
|
||
|
288: ubyte _96kHz : 1 ;
|
||
|
289: ubyte _176kHz : 1 ;
|
||
|
290: ubyte _192kHz : 1 ;
|
||
|
291: ubyte reserved : 1 ;
|
||
|
292: } sampleRates < comment = "sampling frequencies supported" > ;
|
||
|
293: if ( formatCode == 1 )
|
||
|
294: {
|
||
|
295: ubyte _16bits : 1 ;
|
||
|
296: ubyte _20bits : 1 ;
|
||
|
297: ubyte _24bits : 1 ;
|
||
|
298: ubyte reserved : 5 ;
|
||
|
299: }
|
||
|
300: else
|
||
|
301: {
|
||
|
302: BitRate bitrate ;
|
||
|
303: }
|
||
|
304: break ;
|
||
|
305: }
|
||
|
306:
|
||
|
307: case VIDEO :
|
||
|
308: {
|
||
|
309: SVD svds [ size ] < bgcolor = cLtGreen , comment = "Short Video Descriptors" > ;
|
||
|
310: break ;
|
||
|
311: }
|
||
|
312:
|
||
|
313: case VENDOR_SPECIFIC :
|
||
|
314: {
|
||
|
315: ubyte oui [ 3 ] < format = hex , comment = "IEEE Registration Identifier" > ;
|
||
|
316: uint16 spa < read = SPAToString , comment = "Source Physical Address" > ;
|
||
|
317: if ( size >= 3 )
|
||
|
318: {
|
||
|
319: ubyte DVI_Dual : 1 < comment = "sink supports DVI Dual Link Operation" > ;
|
||
|
320: ubyte reserved : 1 ;
|
||
|
321: ubyte reserved : 1 ;
|
||
|
322: ubyte dc_Y444 : 1 < comment = "sink supports 4:4:4 in deep color modes" > ;
|
||
|
323: ubyte dc_30bit : 1 < comment = "sink supports 10-bit-per-channel deep color" > ;
|
||
|
324: ubyte dc_36bit : 1 < comment = "sink supports 12-bit-per-channel deep color" > ;
|
||
|
325: ubyte dc_48bit : 1 < comment = "sink supports 16-bit-per-channel deep color" > ;
|
||
|
326: ubyte supports_AI : 1 < comment = "sink supports a function that needs info from ACP or ISRC packets" > ;
|
||
|
327: }
|
||
|
328: if ( size >= 4 )
|
||
|
329: ubyte max_TMDS_Frequency < read = TDMSFreqToString , comment = "Maximum TMDS frequency" > ;
|
||
|
330: if ( size >= 5 )
|
||
|
331: {
|
||
|
332: ubyte reserved : 6 ;
|
||
|
333: ubyte i_latency_fields : 1 < comment = "set if interlaced latency fields are present; if set four latency fields will be present" > ;
|
||
|
334: ubyte latency_fields : 1 < comment = "set if latency fields are present" > ;
|
||
|
335: if ( latency_fields )
|
||
|
336: {
|
||
|
337: Latency videoLatency < comment = "Video Latency (value=1+ms/2 with a max of 251 meaning 500ms)" > ;
|
||
|
338: Latency audioLatency < comment = "Audio Latency (value=1+ms/2 with a max of 251 meaning 500ms)" > ;
|
||
|
339: }
|
||
|
340: if ( i_latency_fields )
|
||
|
341: {
|
||
|
342: Latency interlacedVideoLatency < comment = "Interlaced Video Latency (value=1+ms/2 with a max of 251 meaning 500ms)" > ;
|
||
|
343: Latency interlacedAudioLatency < comment = "Interlaced Audio Latency (value=1+ms/2 with a max of 251 meaning 500ms)" > ;
|
||
|
344: }
|
||
|
345: }
|
||
|
346: break ;
|
||
|
347: }
|
||
|
348:
|
||
|
349: case SPEAKER :
|
||
|
350: {
|
||
|
351: ubyte frontLeftRight : 1 < comment = "Front Left / Front Right present for 1, absent for 0" > ;
|
||
|
352: ubyte LFE : 1 < comment = "LFE present for 1, absent for 0" > ;
|
||
|
353: ubyte frontCenter : 1 < comment = "Front Center present for 1, absent for 0" > ;
|
||
|
354: ubyte rearLeftRight : 1 < comment = "Rear Left / Rear Right present for 1, absent for 0" > ;
|
||
|
355: ubyte rearCenter : 1 < comment = "Rear Center present for 1, absent for 0" > ;
|
||
|
356: ubyte frontLeftRightCenter : 1 < comment = "Front Left Center / Front Right Center present for 1, absent for 0" > ;
|
||
|
357: ubyte rearLeftRightCenter : 1 < comment = "Rear Left Center / Rear Right Center present for 1, absent for 0" > ;
|
||
|
358: ubyte reserved : 1 ;
|
||
|
359: ubyte reserved [ 2 ] ;
|
||
|
360: break ;
|
||
|
361: }
|
||
|
362: }
|
||
|
363:
|
||
|
364:
|
||
|
365:
|
||
|
366:
|
||
|
367:
|
||
|
368:
|
||
|
369:
|
||
|
370:
|
||
|
371:
|
||
|
372: } DataBlock < size = DataBlockSize , optimize = false , open = true , comment = "Data block" > ;
|
||
|
373:
|
||
|
374: int DataBlockSize ( DataBlock & b )
|
||
|
375: {
|
||
|
376: return ( ReadUByte ( startof ( b ) ) & 0x1F ) ;
|
||
|
377: }
|
||
|
378:
|
||
|
379:
|
||
|
380:
|
||
|
381: typedef struct
|
||
|
382: {
|
||
|
383: uint16 pixelClock < read = PixelClockToString , write = StringToPixelClock , comment = "Pixel clock in 10 kHz units. (0.01-655.35 MHz, little-endian)" > ;
|
||
|
384:
|
||
|
385: ubyte hActive_lsb < comment = "Horizontal active pixels 8 lsbits (0-4095)" > ;
|
||
|
386: ubyte hBlanking_lsb < comment = "Horizontal blanking pixels 8 lsbits (0-4095) End of active to start of next active." > ;
|
||
|
387: ubyte hBlanking_msb : 4 < comment = "Horizontal blanking pixels 4 msbits" > ;
|
||
|
388: ubyte hActive_msb : 4 < comment = "Horizontal active pixels 4 msbits" > ;
|
||
|
389: ubyte vActive_lsb < comment = "Vertical active lines 8 lsbits (0-4095)" > ;
|
||
|
390: ubyte vBlanking_lsb < comment = "Vertical blanking lines 8 lsbits (0-4095)" > ;
|
||
|
391: ubyte vBlanking_msb : 4 < comment = "Vertical blanking lines 4 msbits" > ;
|
||
|
392: ubyte vActive_msb : 4 < comment = "Vertical active lines 4 msbits" > ;
|
||
|
393: ubyte hSyncOffset_lsb < comment = "Horizontal sync offset pixels 8 lsbits (0-1023) From blanking start" > ;
|
||
|
394: ubyte hSync_lsb < comment = "Horizontal sync pulse width pixels 8 lsbits (0-1023)" > ;
|
||
|
395: ubyte vSync_lsb : 4 < comment = "Vertical sync pulse width lines 4 lsbits (0-63)" > ;
|
||
|
396: ubyte vSyncOffset_lsb : 4 < comment = "Vertical sync offset lines 4 lsbits (0-63)" > ;
|
||
|
397: ubyte vSync_msb : 2 < comment = "Vertical sync pulse width lines 2 msbits" > ;
|
||
|
398: ubyte vSyncOffset_msb : 2 < comment = "Vertical sync offset lines 2 msbits" > ;
|
||
|
399: ubyte hSync_msb : 2 < comment = "Horizontal sync pulse width pixels 2 msbits" > ;
|
||
|
400: ubyte hSyncOffset_msb : 2 < comment = "Horizontal sync offset pixels 2 msbits" > ;
|
||
|
401: ubyte hSize_lsb < comment = "Horizontal display size, mm, 8 lsbits (0-4095 mm, 161 in)" > ;
|
||
|
402: ubyte vSize_lsb < comment = "Vertical display size, mm, 8 lsbits (0-4095 mm, 161 in)" > ;
|
||
|
403: ubyte vSize_msb : 4 < comment = "Vertical display size, mm, 4 msbits" > ;
|
||
|
404: ubyte hSize_msb : 4 < comment = "Horizontal display size, mm, 4 msbits" > ;
|
||
|
405: ubyte hBorder < comment = "Horizontal border pixels (each side; total is twice this)" > ;
|
||
|
406: ubyte vBorder < comment = "Vertical border lines (each side; total is twice this)" > ;
|
||
|
407:
|
||
|
408: ubyte _f0 : 1 < comment = "2-way line-interleaved stereo, if bits 4-3 are not 00." > ;
|
||
|
409: ubyte _f1 : 1 < comment = "If analog sync: Sync on all 3 RGB lines (else green only). Digital: HSync polarity (1=positive)" > ;
|
||
|
410: ubyte _f2 : 1 < comment = "If digital separate: Vertical sync polarity (1=positive). Other types: VSync serrated (HSync during VSync)" > ;
|
||
|
411: ubyte _f34 : 2 < comment = "Sync type: 00=Analog composite; 01=Bipolar analog composite; 10=Digital composite (on HSync); 11=Digital separate" > ;
|
||
|
412: ubyte _f56 : 2 < comment = "Stereo mode: 00=No stereo; other values depend on bit 0: Bit 0=0: 01=Field sequential, sync=1 during right; 10=similar, sync=1 during left; 11=4-way interleaved stereo. Bit 0=1 2-way interleaved stereo: 01=Right image on even lines; 10=Left image on even lines; 11=side-by-side" > ;
|
||
|
413: ubyte interlaced : 1 < comment = "Interlaced" > ;
|
||
|
414:
|
||
|
415:
|
||
|
416:
|
||
|
417: } ModeLine < read = ModeLineToString , write = StringToModeLine , comment = "Xfree86 modeline" > ;
|
||
|
418:
|
||
|
419: string ModeLineToString ( ModeLine & n )
|
||
|
420: {
|
||
|
421: uint hActive = ( uint ) n . hActive_msb << 8 | n . hActive_lsb ;
|
||
|
422: uint hSyncOffset = ( uint ) n . hSyncOffset_msb << 8 | n . hSyncOffset_lsb ;
|
||
|
423: uint hSync = ( uint ) n . hSync_msb << 8 | n . hSync_lsb ;
|
||
|
424: uint hBlanking = ( uint ) n . hBlanking_msb << 8 | n . hBlanking_lsb ;
|
||
|
425:
|
||
|
426: uint vActive = ( uint ) n . vActive_msb << 8 | n . vActive_lsb ;
|
||
|
427: uint vSyncOffset = ( uint ) n . vSyncOffset_msb << 8 | n . vSyncOffset_lsb ;
|
||
|
428: uint vSync = ( uint ) n . vSync_msb << 8 | n . vSync_lsb ;
|
||
|
429: uint vBlanking = ( uint ) n . vBlanking_msb << 8 | n . vBlanking_lsb ;
|
||
|
430:
|
||
|
431: uint im = n . interlaced ? 2 : 1 ;
|
||
|
432: string s ;
|
||
|
433: SPrintf ( s , "Modeline \"%ux%u\" %.2lf %4u %4u %4u %4u %4u %4u %4u %4u %chsync %cvsync %s ; %u %u" ,
|
||
|
434: hActive , vActive * im , ( double ) n . pixelClock / 100 ,
|
||
|
435: hActive , hActive + hSyncOffset , hActive + hSyncOffset + hSync , hActive + hBlanking ,
|
||
|
436: vActive * im , ( vActive + vSyncOffset ) * im , ( vActive + vSyncOffset + vSync ) * im , ( vActive + vBlanking ) * im ,
|
||
|
437: n . _f1 ? '+' : '-' , n . _f2 ? '+' : '-' ,
|
||
|
438: n . interlaced ? "Interlace" : "" ,
|
||
|
439: n . hBorder , n . vBorder
|
||
|
440: ) ;
|
||
|
441: return s ;
|
||
|
442: }
|
||
|
443:
|
||
|
444: void StringToModeLine ( ModeLine & n , string s )
|
||
|
445: {
|
||
|
446: uint dummy ;
|
||
|
447: uint hActive , hActive_hSyncOffset , hActive_hSyncOffset_hSync , hActive_hBlanking ;
|
||
|
448: uint vActive , vActive_vSyncOffset , vActive_vSyncOffset_vSync , vActive_vBlanking ;
|
||
|
449: char hsync , vsync ;
|
||
|
450: string interlaced ;
|
||
|
451: double f ;
|
||
|
452: SScanf ( s , "Modeline \"%ux%u\" %lf %u %u %u %u %u %u %u %u %chsync %cvsync %[^0-9;]" ,
|
||
|
453: dummy , dummy , f ,
|
||
|
454: hActive , hActive_hSyncOffset , hActive_hSyncOffset_hSync , hActive_hBlanking ,
|
||
|
455: vActive , vActive_vSyncOffset , vActive_vSyncOffset_vSync , vActive_vBlanking ,
|
||
|
456: hsync , vsync ,
|
||
|
457: interlaced
|
||
|
458: ) ;
|
||
|
459: int p = Strchr ( s , ';' ) ;
|
||
|
460: if ( p >= 0 ) SScanf ( SubStr ( s , p ) , "; %u %u" , n . hBorder , n . vBorder ) ;
|
||
|
461:
|
||
|
462: n . interlaced = ( interlaced [ 0 ] == 'I' ) ;
|
||
|
463: uint im = n . interlaced ? 2 : 1 ;
|
||
|
464:
|
||
|
465: uint hBlanking = hActive_hBlanking - hActive ;
|
||
|
466: uint hSync = hActive_hSyncOffset_hSync - hActive_hSyncOffset ;
|
||
|
467: uint hSyncOffset = hActive_hSyncOffset - hActive ;
|
||
|
468: n . hActive_msb = hActive >> 8 ; n . hActive_lsb = ( ubyte ) hActive ;
|
||
|
469: n . hSyncOffset_msb = hSyncOffset >> 8 ; n . hSyncOffset_lsb = ( ubyte ) hSyncOffset ;
|
||
|
470: n . hSync_msb = hSync >> 8 ; n . hSync_lsb = ( ubyte ) hSync ;
|
||
|
471: n . hBlanking_msb = hBlanking >> 8 ; n . hBlanking_lsb = ( ubyte ) hBlanking ;
|
||
|
472:
|
||
|
473: uint vBlanking = ( vActive_vBlanking - vActive ) / im ;
|
||
|
474: uint vSync = ( vActive_vSyncOffset_vSync - vActive_vSyncOffset ) / im ;
|
||
|
475: uint vSyncOffset = ( vActive_vSyncOffset - vActive ) / im ;
|
||
|
476: vActive /= im ;
|
||
|
477: n . vActive_msb = vActive >> 8 ; n . vActive_lsb = ( ubyte ) vActive ;
|
||
|
478: n . vSyncOffset_msb = vSyncOffset >> 8 ; n . vSyncOffset_lsb = ( ubyte ) vSyncOffset ;
|
||
|
479: n . vSync_msb = vSync >> 8 ; n . vSync_lsb = ( ubyte ) vSync ;
|
||
|
480: n . vBlanking_msb = vBlanking >> 8 ; n . vBlanking_lsb = ( ubyte ) vBlanking ;
|
||
|
481:
|
||
|
482: n . _f1 = hsync == '+' ? 1 : 0 ;
|
||
|
483: n . _f2 = vsync == '+' ? 1 : 0 ;
|
||
|
484: n . pixelClock = f * 100 ;
|
||
|
485: }
|
||
|
486:
|
||
|
487:
|
||
|
488:
|
||
|
489: struct File
|
||
|
490: {
|
||
|
491: struct Header
|
||
|
492: {
|
||
|
493: ubyte pattern [ 8 ] < format = hex , comment = "Fixed header pattern: 00 FF FF FF FF FF FF 00" > ;
|
||
|
494: EISAId eisaId < comment = "EISA ID. Encoded as 3 5-bit letters (1=A, 26=Z), big-endian, with msbit reserved." > ;
|
||
|
495: uint16 mfgProductId < comment = "Manufacturer product code. 16-bit number, little-endian." > ;
|
||
|
496: uint32 serial < comment = "Serial number. 32 bits, little endian." > ;
|
||
|
497: ubyte mfgWeek < comment = "Week of manufacture. Week numbering is not consistent between manufacturers." > ;
|
||
|
498: ubyte mfgYear < comment = "Year of manufacture, less 1990. (1990-2245). If week=255, it is the model year instead." > ;
|
||
|
499: ubyte edidVersion < comment = "EDID version, usually 1 (for 1.3)" > ;
|
||
|
500: ubyte edidRevision < comment = "EDID revision, usually 3 (for 1.3)" > ;
|
||
|
501: } header < open = false , comment = "Header information" > ;
|
||
|
502:
|
||
|
503: struct Basic
|
||
|
504: {
|
||
|
505: union Bitmap
|
||
|
506: {
|
||
|
507: ubyte hmz ;
|
||
|
508: if ( hmz & 0x80 )
|
||
|
509: {
|
||
|
510: struct Digital
|
||
|
511: {
|
||
|
512: ubyte vesa : 1 < comment = "Signal is compatible with VESA DFP 1.x TMDS CRGB, 1 pixel per clock, up to 8 bits per color, MSB aligned," > ;
|
||
|
513: ubyte reserved : 6 < comment = "Reserved, must be 0" > ;
|
||
|
514: ubyte digital : 1 < comment = "1=Digital input" > ;
|
||
|
515: } digital ;
|
||
|
516: }
|
||
|
517: else
|
||
|
518: {
|
||
|
519: struct Analog
|
||
|
520: {
|
||
|
521: ubyte vSeparate : 1 < comment = "VSync pulse must be separated when composite or sync-on-green is used" > ;
|
||
|
522: ubyte syncOnGreen : 1 < comment = "Sync on green supported" > ;
|
||
|
523:
|
||
|
524: ubyte compositeSync : 1 < comment = "Composite sync (on HSync) supported" > ;
|
||
|
525: ubyte separateSync : 1 < comment = "Separate sync supported" > ;
|
||
|
526: ubyte blankToBlack : 1 < comment = "Blank-to-black setup (pedestal) expected" > ;
|
||
|
527: ubyte level : 2 < comment = "Video white and sync levels, relative to blank: 00=+0.7/0.3 V; 01=+0.714/0.286 V; 10=+1.0/0.4 V; 11=+0.7/0 V" > ;
|
||
|
528: ubyte analog : 1 < comment = "0=Analog input" > ;
|
||
|
529: } analog ;
|
||
|
530: }
|
||
|
531: } bitmap < comment = "Video input parameters bitmap" > ;
|
||
|
532:
|
||
|
533: ubyte width < comment = "Maximum horizontal image size, in centimetres (max 292 cm/115 in at 16:9 aspect ratio)" > ;
|
||
|
534: ubyte height < comment = "Maximum vertical image size, in centimetres. If either byte is 0, undefined (e.g. projector)" > ;
|
||
|
535: ubyte gamma < comment = "Display gamma, minus 1, times 100 (range 1.00-3.54)" > ;
|
||
|
536:
|
||
|
537: struct Features
|
||
|
538: {
|
||
|
539: ubyte gtf : 1 < comment = "GTF supported with default parameter values." > ;
|
||
|
540: ubyte prefTimingDesc1 : 1 < comment = "Preferred timing mode specified in descriptor block 1." > ;
|
||
|
541: ubyte sRGB : 1 < comment = "Standard sRGB colour space. Bytes 25-34 must contain sRGB standard values." > ;
|
||
|
542: if ( bitmap . hmz & 0x80 )
|
||
|
543: ubyte displayType : 2 < comment = "Display type (digital): 00 = RGB 4:4:4; 01 = RGB 4:4:4 + YCrCb 4:4:4; 10 = RGB 4:4:4 + YCrCb 4:2:2; 11 = RGB 4:4:4 + YCrCb 4:4:4 + YCrCb 4:2:2" > ;
|
||
|
544: else
|
||
|
545: ubyte displayType : 2 < comment = "Display type (analog): 00 = Monochrome or Grayscale; 01 = RGB color; 10 = Non-RGB color; 11 = Undefined" > ;
|
||
|
546: ubyte dpmsActiveOff : 1 < comment = "DPMS active-off supported" > ;
|
||
|
547: ubyte dpmsSusepend : 1 < comment = "DPMS suspend supported" > ;
|
||
|
548: ubyte dpmsStandby : 1 < comment = "DPMS standby supported" > ;
|
||
|
549: } features < comment = "Supported features bitmap" > ;
|
||
|
550: } basic < open = false , comment = "Basic display parameters" > ;
|
||
|
551:
|
||
|
552: struct Chromaticity
|
||
|
553: {
|
||
|
554: ubyte green_y_lsb : 2 < comment = "Green y value least-significant 2 bits" > ;
|
||
|
555: ubyte green_x_lsb : 2 < comment = "Green x value least-significant 2 bits" > ;
|
||
|
556: ubyte red_y_lsb : 2 < comment = "Red y value least-significant 2 bits" > ;
|
||
|
557: ubyte red_x_lsb : 2 < comment = "Red x value least-significant 2 bits" > ;
|
||
|
558: ubyte bluewhite_lsb : 2 < comment = "Blue and white least-significant 2 bits" > ;
|
||
|
559: ubyte zero : 6 ;
|
||
|
560: ubyte red_x_msb < comment = "Red x value most significant 8 bits. 0-255 encodes 0-0.996 (255/256); 0-0.999 (1023/1024) with lsbits" > ;
|
||
|
561: ubyte red_y_msb < comment = "Red y value most significant 8 bits" > ;
|
||
|
562: ubyte green_x_msb < comment = "Green x value most significant 8 bits" > ;
|
||
|
563: ubyte green_y_msb < comment = "Green y value most significant 8 bits" > ;
|
||
|
564: ubyte blue_x_msb < comment = "Blue x value most significant 8 bits" > ;
|
||
|
565: ubyte blue_y_msb < comment = "Blue y value most significant 8 bits" > ;
|
||
|
566: ubyte white_x_msb < comment = "Default white point x value most significant 8 bits" > ;
|
||
|
567: ubyte white_y_msb < comment = "Default white point y value most significant 8 bits" > ;
|
||
|
568: } chromaticity < bgcolor = cLtAqua , comment = "Chromaticity coordinates. 10-bit CIE xy coordinates for red, green, blue, and white. [0-1023/1024]." > ;
|
||
|
569:
|
||
|
570: struct Timings
|
||
|
571: {
|
||
|
572: ubyte _800x600_60 : 1 ;
|
||
|
573: ubyte _800x600_56 : 1 ;
|
||
|
574: ubyte _640x480_75 : 1 ;
|
||
|
575: ubyte _640x480_72 : 1 ;
|
||
|
576: ubyte _640x480_67 : 1 ;
|
||
|
577: ubyte _640x480_60 : 1 ;
|
||
|
578: ubyte _720x400_88 : 1 ;
|
||
|
579: ubyte _720x400_70 : 1 ;
|
||
|
580: ubyte _1280x1024_75 : 1 ;
|
||
|
581: ubyte _1024x768_75 : 1 ;
|
||
|
582: ubyte _1024x768_72 : 1 ;
|
||
|
583: ubyte _1024x768_60 : 1 ;
|
||
|
584: ubyte _1024x768i_87 : 1 ;
|
||
|
585: ubyte _832x624_75 : 1 ;
|
||
|
586: ubyte _800x600_75 : 1 ;
|
||
|
587: ubyte _800x600_72 : 1 ;
|
||
|
588: ubyte mfgSpecific : 7 ;
|
||
|
589: ubyte _1152x870_75 : 1 ;
|
||
|
590: } timings < bgcolor = cLtGreen , comment = "Established timing bitmap. Supported bitmap for very common timing modes." > ;
|
||
|
591:
|
||
|
592: Timing timings2 [ 8 ] < bgcolor = cLtGreen , comment = "Standard timing information. Up to 8 2-byte fields describing standard display modes." > ;
|
||
|
593:
|
||
|
594: struct Descriptor
|
||
|
595: {
|
||
|
596: if ( ReadUShort ( FTell ( ) ) != 0 )
|
||
|
597: {
|
||
|
598: ModeLine numbers ;
|
||
|
599: }
|
||
|
600: else
|
||
|
601: {
|
||
|
602: uint16 zero ;
|
||
|
603: ubyte zero ;
|
||
|
604: DescriptorType descriptorType ;
|
||
|
605: ubyte zero ;
|
||
|
606: switch ( descriptorType )
|
||
|
607: {
|
||
|
608: case TIMINGS :
|
||
|
609: Timing timings [ 6 ] < comment = "Additional standard timing identifiers. 6- 2-byte descriptors, padded with 0A." > ;
|
||
|
610: break ;
|
||
|
611:
|
||
|
612: case MONITOR_NAME :
|
||
|
613: char name [ 13 ] < comment = "Monitor name (text)" > ;
|
||
|
614: break ;
|
||
|
615:
|
||
|
616: case SERIAL_NUMBER :
|
||
|
617: char serial [ 13 ] < comment = "Monitor serial number (text)" > ;
|
||
|
618: break ;
|
||
|
619:
|
||
|
620: case UNSPECIFIED_TEXT :
|
||
|
621: char text [ 13 ] < comment = "Unspecified text (text)" > ;
|
||
|
622: break ;
|
||
|
623:
|
||
|
624: case RANGE_LIMITS :
|
||
|
625: {
|
||
|
626: ubyte vMinRate < comment = "Minimum vertical field rate" > ;
|
||
|
627: ubyte vMaxRate < comment = "Maximum vertical field rate" > ;
|
||
|
628: ubyte hMinRate < comment = "Minimum horizontal line rate" > ;
|
||
|
629: ubyte hMaxRate < comment = "Maximum horizontal line rate" > ;
|
||
|
630: PixelRate maxPixelRate < comment = "Maximum pixel clock rate, rounded up to 10 MHz multiple (10-2550 MHz)" > ;
|
||
|
631: ubyte extended < comment = "02: Secondary GTF supported, parameters as follows." > ;
|
||
|
632: if ( extended == 0x2 )
|
||
|
633: {
|
||
|
634: ubyte reserved ;
|
||
|
635: ubyte startFreqSecondCurve < comment = "Start frequency for secondary curve, divided by 2 kHz (0-510 kHz)" > ;
|
||
|
636: ubyte gtf_C < comment = "C value, multiplied by 2 (0-127.5)" > ;
|
||
|
637: uint16 gtf_M < comment = "GTF M value (0-65535, little-endian)" > ;
|
||
|
638: ubyte gtf_K < comment = "GTF K value (0-255)" > ;
|
||
|
639: ubyte gtf_J < comment = "GTF J value, multiplied by 2 (0-127.5)" > ;
|
||
|
640: }
|
||
|
641: else
|
||
|
642: {
|
||
|
643: ubyte padding [ 7 ] < comment = "0A 20 20 20 20 20 20" > ;
|
||
|
644: }
|
||
|
645: break ;
|
||
|
646: }
|
||
|
647:
|
||
|
648: case WHITE_POINT :
|
||
|
649: {
|
||
|
650: struct
|
||
|
651: {
|
||
|
652: ubyte indexNumber < comment = "Point index number (1-255) Usually 1; 0 indicates descriptor not used." > ;
|
||
|
653: ubyte white_y_lsb : 2 < comment = "White point y value least-significant 2 bits" > ;
|
||
|
654: ubyte white_x_lsb : 2 < comment = "White point x value least-significant 2 bits" > ;
|
||
|
655: ubyte unused : 4 ;
|
||
|
656: ubyte white_x_msb < comment = "White point x value most significant 8 bits (like EDID byte 27)" > ;
|
||
|
657: ubyte white_y_msb < comment = "White point y value most significant 8 bits (like EDID byte 28)" > ;
|
||
|
658: ubyte gamma < comment = "Gamma value, minus 1, time 100 (1.0-3.54, like EDID byte 23)" > ;
|
||
|
659: } whitePoints [ 2 ] < bgcolor = cLtAqua , comment = "Additional white point descriptors" > ;
|
||
|
660: ubyte padding [ 3 ] < comment = "0A 20 20" > ;
|
||
|
661: break ;
|
||
|
662: }
|
||
|
663:
|
||
|
664: default :
|
||
|
665: {
|
||
|
666: ubyte unknown [ 13 ] ;
|
||
|
667: Warning ( "Unknown descriptor type" ) ;
|
||
|
668: break ;
|
||
|
669: }
|
||
|
670: }
|
||
|
671: }
|
||
|
672: } descriptors [ 4 ] < optimize = false , bgcolor = cLtGray , comment = "Detailed Timing Descriptor blocks, in decreasing preference order. After all detailed timing descriptors, additional descriptors are permitted." > ;
|
||
|
673:
|
||
|
674:
|
||
|
675: ubyte extensionCount < comment = "Number of extensions to follow. 0 if no extensions." > ;
|
||
|
676: ubyte checksum < format = hex , comment = "Sum of all 128 bytes should equal 0 (mod 256)." > ;
|
||
|
677:
|
||
|
678:
|
||
|
679:
|
||
|
680: struct CEA_EDID
|
||
|
681: {
|
||
|
682: local int64 extensionBlockStart < hidden = true > = FTell ( ) ;
|
||
|
683:
|
||
|
684: ubyte extensionTag < comment = "Extension tag (which kind of extension block this is); 02h for CEA EDID" > ;
|
||
|
685: switch ( extensionTag )
|
||
|
686: {
|
||
|
687: case 0x2 :
|
||
|
688: {
|
||
|
689: ubyte revision < comment = "Revision number (Version number); 03h for Version 3" > ;
|
||
|
690: ubyte dtdStart < comment = "Byte number \"d\" within this block where the 18-byte DTDs begin." > ;
|
||
|
691: ubyte dtdCount : 4 < comment = "total number of native formats in the DTDs included in this block" > ;
|
||
|
692: ubyte YCbCr422 : 1 < comment = "1 if display supports YCbCr 4:2:2, 0 if not" > ;
|
||
|
693: ubyte YCbCr444 : 1 < comment = "1 if display supports YCbCr 4:4:4, 0 if not" > ;
|
||
|
694: ubyte basic_audio : 1 < comment = "1 if display supports basic audio, 0 if not" > ;
|
||
|
695: ubyte underscan : 1 < comment = "if display supports underscan, 0 if not" > ;
|
||
|
696:
|
||
|
697: while ( FTell ( ) < extensionBlockStart + dtdStart )
|
||
|
698: {
|
||
|
699: DataBlock dataBlock ;
|
||
|
700: }
|
||
|
701:
|
||
|
702: if ( FTell ( ) != extensionBlockStart + dtdStart )
|
||
|
703: {
|
||
|
704: Warning ( "Unexpected DTD start" ) ;
|
||
|
705: }
|
||
|
706:
|
||
|
707: FSeek ( extensionBlockStart + dtdStart ) ;
|
||
|
708:
|
||
|
709: while ( ReadUShort ( FTell ( ) ) != 0 )
|
||
|
710: {
|
||
|
711: Descriptor descriptor < optimize = false , bgcolor = cLtGray , comment = "Detailed Timing Descriptor block" > ;
|
||
|
712: }
|
||
|
713:
|
||
|
714: ubyte padding [ 127 - ( FTell ( ) - extensionBlockStart ) ] < format = hex , comment = "Post-DTD padding. Should be populated with 00h" > ;
|
||
|
715: ubyte checksum < format = hex , comment = "This byte should be programmed such that the sum of all 128 bytes equals 00h." > ;
|
||
|
716: if ( Checksum ( CHECKSUM_SUM8 , extensionBlockStart , 128 ) != 0 ) Warning ( "Invalid extension block checksum!" ) ;
|
||
|
717:
|
||
|
718: break ;
|
||
|
719: }
|
||
|
720:
|
||
|
721: default :
|
||
|
722: Warning ( "Unsupported extension block" ) ;
|
||
|
723: break ;
|
||
|
724: }
|
||
|
725: } extensions [ extensionCount ] < optimize = false , open = true , comment = "EDID Extensions" > ;
|
||
|
726:
|
||
|
727:
|
||
|
728: } file < open = true , fgcolor = cBlue > ;
|
||
|
729:
|
||
|
730:
|
||
|
731: tok_eof
|
||
|
warning: \0 character in file data
|
||
|
warning: \0 character in file data
|
||
|
warning: \0 character in file data
|