Mercurial > libdvdread4.hg
annotate dvdread/ifo_types.h @ 64:70c34d162e6e src
Replaces the hard-coded values
The parental management structure has ratings levels. The size
of the bit mask is constant but magic values were being used
instead of named constants. This commit changes them to named
constants. This is based on a patch submitted by Frederic Marchal,
fmarchal at perso dot be. Thanks for this tidy cleanup.
author | erik |
---|---|
date | Sun, 30 Jan 2011 23:44:13 +0000 |
parents | c743d79f187b |
children | 8e12b8e01713 |
rev | line source |
---|---|
3 | 1 /* |
22 | 2 * Copyright (C) 2000, 2001 Björn Englund <d4bjorn@dtek.chalmers.se>, |
3 * Håkan Hjort <d95hjort@dtek.chalmers.se> | |
3 | 4 * |
21
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
5 * This file is part of libdvdread. |
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
6 * |
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
7 * libdvdread is free software; you can redistribute it and/or modify |
3 | 8 * it under the terms of the GNU General Public License as published by |
9 * the Free Software Foundation; either version 2 of the License, or | |
10 * (at your option) any later version. | |
11 * | |
21
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
12 * libdvdread is distributed in the hope that it will be useful, |
3 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 * GNU General Public License for more details. | |
16 * | |
21
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
18 * with libdvdread; if not, write to the Free Software Foundation, Inc., |
4aa618ae094f
Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents:
20
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
3 | 20 */ |
21 | |
23 | 22 #ifndef LIBDVDREAD_IFO_TYPES_H |
23 #define LIBDVDREAD_IFO_TYPES_H | |
24 | |
3 | 25 #include <inttypes.h> |
33
c743d79f187b
Move installed headers into dvdread directory to make them easier to
reimar
parents:
32
diff
changeset
|
26 #include "dvdread/dvd_reader.h" |
3 | 27 |
28 | |
29 #undef ATTRIBUTE_PACKED | |
20 | 30 #undef PRAGMA_PACK_BEGIN |
3 | 31 #undef PRAGMA_PACK_END |
32 | |
33 #if defined(__GNUC__) | |
34 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) | |
35 #define ATTRIBUTE_PACKED __attribute__ ((packed)) | |
36 #define PRAGMA_PACK 0 | |
37 #endif | |
38 #endif | |
39 | |
40 #if !defined(ATTRIBUTE_PACKED) | |
41 #define ATTRIBUTE_PACKED | |
42 #define PRAGMA_PACK 1 | |
43 #endif | |
44 | |
45 #if PRAGMA_PACK | |
46 #pragma pack(1) | |
47 #endif | |
48 | |
49 | |
50 /** | |
51 * Common | |
52 * | |
53 * The following structures are used in both the VMGI and VTSI. | |
54 */ | |
55 | |
56 | |
57 /** | |
58 * DVD Time Information. | |
59 */ | |
60 typedef struct { | |
61 uint8_t hour; | |
62 uint8_t minute; | |
63 uint8_t second; | |
64 uint8_t frame_u; /* The two high bits are the frame rate. */ | |
65 } ATTRIBUTE_PACKED dvd_time_t; | |
66 | |
67 /** | |
68 * Type to store per-command data. | |
69 */ | |
70 typedef struct { | |
71 uint8_t bytes[8]; | |
72 } ATTRIBUTE_PACKED vm_cmd_t; | |
73 #define COMMAND_DATA_SIZE 8U | |
74 | |
75 | |
76 /** | |
77 * Video Attributes. | |
78 */ | |
79 typedef struct { | |
80 unsigned char mpeg_version : 2; | |
81 unsigned char video_format : 2; | |
82 unsigned char display_aspect_ratio : 2; | |
83 unsigned char permitted_df : 2; | |
20 | 84 |
3 | 85 unsigned char line21_cc_1 : 1; |
86 unsigned char line21_cc_2 : 1; | |
87 unsigned char unknown1 : 1; | |
88 unsigned char bit_rate : 1; | |
20 | 89 |
3 | 90 unsigned char picture_size : 2; |
91 unsigned char letterboxed : 1; | |
92 unsigned char film_mode : 1; | |
93 } ATTRIBUTE_PACKED video_attr_t; | |
94 | |
95 /** | |
96 * Audio Attributes. | |
97 */ | |
98 typedef struct { | |
99 unsigned char audio_format : 3; | |
100 unsigned char multichannel_extension : 1; | |
101 unsigned char lang_type : 2; | |
102 unsigned char application_mode : 2; | |
20 | 103 |
3 | 104 unsigned char quantization : 2; |
105 unsigned char sample_frequency : 2; | |
106 unsigned char unknown1 : 1; | |
107 unsigned char channels : 3; | |
108 uint16_t lang_code; | |
109 uint8_t lang_extension; | |
110 uint8_t code_extension; | |
111 uint8_t unknown3; | |
112 union { | |
113 struct ATTRIBUTE_PACKED { | |
114 unsigned char unknown4 : 1; | |
115 unsigned char channel_assignment : 3; | |
116 unsigned char version : 2; | |
117 unsigned char mc_intro : 1; /* probably 0: true, 1:false */ | |
118 unsigned char mode : 1; /* Karaoke mode 0: solo 1: duet */ | |
119 } karaoke; | |
120 struct ATTRIBUTE_PACKED { | |
121 unsigned char unknown5 : 4; | |
122 unsigned char dolby_encoded : 1; /* suitable for surround decoding */ | |
123 unsigned char unknown6 : 3; | |
124 } surround; | |
32
6698620c1477
Because of ARM memory alignment issues the struct app_info has to be
rathann
parents:
27
diff
changeset
|
125 } ATTRIBUTE_PACKED app_info; |
3 | 126 } ATTRIBUTE_PACKED audio_attr_t; |
127 | |
128 | |
129 /** | |
130 * MultiChannel Extension | |
131 */ | |
132 typedef struct { | |
133 unsigned int zero1 : 7; | |
134 unsigned int ach0_gme : 1; | |
135 | |
136 unsigned int zero2 : 7; | |
137 unsigned int ach1_gme : 1; | |
138 | |
139 unsigned int zero3 : 4; | |
140 unsigned int ach2_gv1e : 1; | |
141 unsigned int ach2_gv2e : 1; | |
142 unsigned int ach2_gm1e : 1; | |
143 unsigned int ach2_gm2e : 1; | |
144 | |
145 unsigned int zero4 : 4; | |
146 unsigned int ach3_gv1e : 1; | |
147 unsigned int ach3_gv2e : 1; | |
148 unsigned int ach3_gmAe : 1; | |
149 unsigned int ach3_se2e : 1; | |
150 | |
151 unsigned int zero5 : 4; | |
152 unsigned int ach4_gv1e : 1; | |
153 unsigned int ach4_gv2e : 1; | |
154 unsigned int ach4_gmBe : 1; | |
155 unsigned int ach4_seBe : 1; | |
156 uint8_t zero6[19]; | |
157 } ATTRIBUTE_PACKED multichannel_ext_t; | |
158 | |
159 | |
160 /** | |
161 * Subpicture Attributes. | |
162 */ | |
163 typedef struct { | |
164 /* | |
165 * type: 0 not specified | |
166 * 1 language | |
167 * 2 other | |
168 * coding mode: 0 run length | |
169 * 1 extended | |
170 * 2 other | |
171 * language: indicates language if type == 1 | |
172 * lang extension: if type == 1 contains the lang extension | |
173 */ | |
174 unsigned char code_mode : 3; | |
175 unsigned char zero1 : 3; | |
176 unsigned char type : 2; | |
177 uint8_t zero2; | |
178 uint16_t lang_code; | |
179 uint8_t lang_extension; | |
180 uint8_t code_extension; | |
181 } ATTRIBUTE_PACKED subp_attr_t; | |
182 | |
183 | |
184 | |
185 /** | |
186 * PGC Command Table. | |
20 | 187 */ |
3 | 188 typedef struct { |
189 uint16_t nr_of_pre; | |
190 uint16_t nr_of_post; | |
191 uint16_t nr_of_cell; | |
192 uint16_t zero_1; | |
193 vm_cmd_t *pre_cmds; | |
194 vm_cmd_t *post_cmds; | |
195 vm_cmd_t *cell_cmds; | |
196 } ATTRIBUTE_PACKED pgc_command_tbl_t; | |
197 #define PGC_COMMAND_TBL_SIZE 8U | |
198 | |
199 /** | |
200 * PGC Program Map | |
201 */ | |
20 | 202 typedef uint8_t pgc_program_map_t; |
3 | 203 |
204 /** | |
205 * Cell Playback Information. | |
206 */ | |
207 typedef struct { | |
208 unsigned int block_mode : 2; | |
209 unsigned int block_type : 2; | |
210 unsigned int seamless_play : 1; | |
211 unsigned int interleaved : 1; | |
212 unsigned int stc_discontinuity: 1; | |
213 unsigned int seamless_angle : 1; | |
27
98951f8ec89c
cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents:
23
diff
changeset
|
214 |
3 | 215 unsigned int playback_mode : 1; /**< When set, enter StillMode after each VOBU */ |
216 unsigned int restricted : 1; /**< ?? drop out of fastforward? */ | |
217 unsigned int unknown2 : 6; | |
218 uint8_t still_time; | |
219 uint8_t cell_cmd_nr; | |
220 dvd_time_t playback_time; | |
221 uint32_t first_sector; | |
222 uint32_t first_ilvu_end_sector; | |
223 uint32_t last_vobu_start_sector; | |
224 uint32_t last_sector; | |
225 } ATTRIBUTE_PACKED cell_playback_t; | |
226 | |
227 #define BLOCK_TYPE_NONE 0x0 | |
228 #define BLOCK_TYPE_ANGLE_BLOCK 0x1 | |
229 | |
230 #define BLOCK_MODE_NOT_IN_BLOCK 0x0 | |
231 #define BLOCK_MODE_FIRST_CELL 0x1 | |
232 #define BLOCK_MODE_IN_BLOCK 0x2 | |
233 #define BLOCK_MODE_LAST_CELL 0x3 | |
234 | |
235 /** | |
236 * Cell Position Information. | |
237 */ | |
238 typedef struct { | |
239 uint16_t vob_id_nr; | |
240 uint8_t zero_1; | |
241 uint8_t cell_nr; | |
242 } ATTRIBUTE_PACKED cell_position_t; | |
243 | |
244 /** | |
245 * User Operations. | |
246 */ | |
247 typedef struct { | |
248 unsigned int zero : 7; /* 25-31 */ | |
249 unsigned int video_pres_mode_change : 1; /* 24 */ | |
20 | 250 |
3 | 251 unsigned int karaoke_audio_pres_mode_change : 1; /* 23 */ |
252 unsigned int angle_change : 1; | |
253 unsigned int subpic_stream_change : 1; | |
254 unsigned int audio_stream_change : 1; | |
255 unsigned int pause_on : 1; | |
256 unsigned int still_off : 1; | |
257 unsigned int button_select_or_activate : 1; | |
258 unsigned int resume : 1; /* 16 */ | |
20 | 259 |
3 | 260 unsigned int chapter_menu_call : 1; /* 15 */ |
261 unsigned int angle_menu_call : 1; | |
262 unsigned int audio_menu_call : 1; | |
263 unsigned int subpic_menu_call : 1; | |
264 unsigned int root_menu_call : 1; | |
265 unsigned int title_menu_call : 1; | |
266 unsigned int backward_scan : 1; | |
267 unsigned int forward_scan : 1; /* 8 */ | |
20 | 268 |
3 | 269 unsigned int next_pg_search : 1; /* 7 */ |
270 unsigned int prev_or_top_pg_search : 1; | |
271 unsigned int time_or_chapter_search : 1; | |
272 unsigned int go_up : 1; | |
273 unsigned int stop : 1; | |
274 unsigned int title_play : 1; | |
275 unsigned int chapter_search_or_play : 1; | |
276 unsigned int title_or_time_play : 1; /* 0 */ | |
277 } ATTRIBUTE_PACKED user_ops_t; | |
278 | |
279 /** | |
280 * Program Chain Information. | |
281 */ | |
282 typedef struct { | |
283 uint16_t zero_1; | |
284 uint8_t nr_of_programs; | |
285 uint8_t nr_of_cells; | |
286 dvd_time_t playback_time; | |
287 user_ops_t prohibited_ops; | |
288 uint16_t audio_control[8]; /* New type? */ | |
289 uint32_t subp_control[32]; /* New type? */ | |
290 uint16_t next_pgc_nr; | |
291 uint16_t prev_pgc_nr; | |
292 uint16_t goup_pgc_nr; | |
293 uint8_t still_time; | |
294 uint8_t pg_playback_mode; | |
295 uint32_t palette[16]; /* New type struct {zero_1, Y, Cr, Cb} ? */ | |
296 uint16_t command_tbl_offset; | |
297 uint16_t program_map_offset; | |
298 uint16_t cell_playback_offset; | |
299 uint16_t cell_position_offset; | |
300 pgc_command_tbl_t *command_tbl; | |
301 pgc_program_map_t *program_map; | |
302 cell_playback_t *cell_playback; | |
303 cell_position_t *cell_position; | |
304 } ATTRIBUTE_PACKED pgc_t; | |
305 #define PGC_SIZE 236U | |
306 | |
307 /** | |
308 * Program Chain Information Search Pointer. | |
309 */ | |
310 typedef struct { | |
311 uint8_t entry_id; | |
312 unsigned int block_mode : 2; | |
313 unsigned int block_type : 2; | |
314 unsigned int unknown1 : 4; | |
315 uint16_t ptl_id_mask; | |
316 uint32_t pgc_start_byte; | |
317 pgc_t *pgc; | |
318 } ATTRIBUTE_PACKED pgci_srp_t; | |
319 #define PGCI_SRP_SIZE 8U | |
320 | |
321 /** | |
322 * Program Chain Information Table. | |
323 */ | |
324 typedef struct { | |
325 uint16_t nr_of_pgci_srp; | |
326 uint16_t zero_1; | |
327 uint32_t last_byte; | |
328 pgci_srp_t *pgci_srp; | |
329 } ATTRIBUTE_PACKED pgcit_t; | |
330 #define PGCIT_SIZE 8U | |
331 | |
332 /** | |
333 * Menu PGCI Language Unit. | |
334 */ | |
335 typedef struct { | |
336 uint16_t lang_code; | |
337 uint8_t lang_extension; | |
338 uint8_t exists; | |
339 uint32_t lang_start_byte; | |
340 pgcit_t *pgcit; | |
341 } ATTRIBUTE_PACKED pgci_lu_t; | |
342 #define PGCI_LU_SIZE 8U | |
343 | |
344 /** | |
345 * Menu PGCI Unit Table. | |
346 */ | |
347 typedef struct { | |
348 uint16_t nr_of_lus; | |
349 uint16_t zero_1; | |
350 uint32_t last_byte; | |
351 pgci_lu_t *lu; | |
352 } ATTRIBUTE_PACKED pgci_ut_t; | |
353 #define PGCI_UT_SIZE 8U | |
354 | |
355 /** | |
356 * Cell Address Information. | |
357 */ | |
358 typedef struct { | |
359 uint16_t vob_id; | |
360 uint8_t cell_id; | |
361 uint8_t zero_1; | |
362 uint32_t start_sector; | |
363 uint32_t last_sector; | |
364 } ATTRIBUTE_PACKED cell_adr_t; | |
365 | |
366 /** | |
367 * Cell Address Table. | |
368 */ | |
369 typedef struct { | |
370 uint16_t nr_of_vobs; /* VOBs */ | |
371 uint16_t zero_1; | |
372 uint32_t last_byte; | |
373 cell_adr_t *cell_adr_table; /* No explicit size given. */ | |
374 } ATTRIBUTE_PACKED c_adt_t; | |
375 #define C_ADT_SIZE 8U | |
376 | |
377 /** | |
378 * VOBU Address Map. | |
379 */ | |
380 typedef struct { | |
381 uint32_t last_byte; | |
382 uint32_t *vobu_start_sectors; | |
383 } ATTRIBUTE_PACKED vobu_admap_t; | |
384 #define VOBU_ADMAP_SIZE 4U | |
385 | |
386 | |
387 | |
388 | |
389 /** | |
390 * VMGI | |
391 * | |
392 * The following structures relate to the Video Manager. | |
393 */ | |
394 | |
395 /** | |
396 * Video Manager Information Management Table. | |
397 */ | |
398 typedef struct { | |
399 char vmg_identifier[12]; | |
400 uint32_t vmg_last_sector; | |
401 uint8_t zero_1[12]; | |
402 uint32_t vmgi_last_sector; | |
403 uint8_t zero_2; | |
404 uint8_t specification_version; | |
405 uint32_t vmg_category; | |
406 uint16_t vmg_nr_of_volumes; | |
407 uint16_t vmg_this_volume_nr; | |
408 uint8_t disc_side; | |
409 uint8_t zero_3[19]; | |
410 uint16_t vmg_nr_of_title_sets; /* Number of VTSs. */ | |
411 char provider_identifier[32]; | |
412 uint64_t vmg_pos_code; | |
413 uint8_t zero_4[24]; | |
414 uint32_t vmgi_last_byte; | |
415 uint32_t first_play_pgc; | |
416 uint8_t zero_5[56]; | |
417 uint32_t vmgm_vobs; /* sector */ | |
418 uint32_t tt_srpt; /* sector */ | |
419 uint32_t vmgm_pgci_ut; /* sector */ | |
420 uint32_t ptl_mait; /* sector */ | |
421 uint32_t vts_atrt; /* sector */ | |
422 uint32_t txtdt_mgi; /* sector */ | |
423 uint32_t vmgm_c_adt; /* sector */ | |
424 uint32_t vmgm_vobu_admap; /* sector */ | |
425 uint8_t zero_6[32]; | |
20 | 426 |
3 | 427 video_attr_t vmgm_video_attr; |
428 uint8_t zero_7; | |
429 uint8_t nr_of_vmgm_audio_streams; /* should be 0 or 1 */ | |
430 audio_attr_t vmgm_audio_attr; | |
431 audio_attr_t zero_8[7]; | |
432 uint8_t zero_9[17]; | |
433 uint8_t nr_of_vmgm_subp_streams; /* should be 0 or 1 */ | |
434 subp_attr_t vmgm_subp_attr; | |
435 subp_attr_t zero_10[27]; /* XXX: how much 'padding' here? */ | |
436 } ATTRIBUTE_PACKED vmgi_mat_t; | |
437 | |
438 typedef struct { | |
439 unsigned int zero_1 : 1; | |
440 unsigned int multi_or_random_pgc_title : 1; /* 0: one sequential pgc title */ | |
441 unsigned int jlc_exists_in_cell_cmd : 1; | |
442 unsigned int jlc_exists_in_prepost_cmd : 1; | |
443 unsigned int jlc_exists_in_button_cmd : 1; | |
444 unsigned int jlc_exists_in_tt_dom : 1; | |
445 unsigned int chapter_search_or_play : 1; /* UOP 1 */ | |
446 unsigned int title_or_time_play : 1; /* UOP 0 */ | |
447 } ATTRIBUTE_PACKED playback_type_t; | |
448 | |
449 /** | |
450 * Title Information. | |
451 */ | |
452 typedef struct { | |
453 playback_type_t pb_ty; | |
454 uint8_t nr_of_angles; | |
455 uint16_t nr_of_ptts; | |
456 uint16_t parental_id; | |
457 uint8_t title_set_nr; | |
458 uint8_t vts_ttn; | |
459 uint32_t title_set_sector; | |
460 } ATTRIBUTE_PACKED title_info_t; | |
461 | |
462 /** | |
463 * PartOfTitle Search Pointer Table. | |
464 */ | |
465 typedef struct { | |
466 uint16_t nr_of_srpts; | |
467 uint16_t zero_1; | |
468 uint32_t last_byte; | |
469 title_info_t *title; | |
470 } ATTRIBUTE_PACKED tt_srpt_t; | |
471 #define TT_SRPT_SIZE 8U | |
472 | |
473 | |
474 /** | |
475 * Parental Management Information Unit Table. | |
476 * Level 1 (US: G), ..., 7 (US: NC-17), 8 | |
477 */ | |
64 | 478 #define PTL_MAIT_NUM_LEVEL 8 |
479 typedef uint16_t pf_level_t[PTL_MAIT_NUM_LEVEL]; | |
3 | 480 |
481 /** | |
482 * Parental Management Information Unit Table. | |
483 */ | |
484 typedef struct { | |
485 uint16_t country_code; | |
486 uint16_t zero_1; | |
487 uint16_t pf_ptl_mai_start_byte; | |
488 uint16_t zero_2; | |
489 pf_level_t *pf_ptl_mai; /* table of (nr_of_vtss + 1), video_ts is first */ | |
490 } ATTRIBUTE_PACKED ptl_mait_country_t; | |
491 #define PTL_MAIT_COUNTRY_SIZE 8U | |
492 | |
493 /** | |
494 * Parental Management Information Table. | |
495 */ | |
496 typedef struct { | |
497 uint16_t nr_of_countries; | |
498 uint16_t nr_of_vtss; | |
499 uint32_t last_byte; | |
500 ptl_mait_country_t *countries; | |
501 } ATTRIBUTE_PACKED ptl_mait_t; | |
502 #define PTL_MAIT_SIZE 8U | |
503 | |
504 /** | |
505 * Video Title Set Attributes. | |
506 */ | |
507 typedef struct { | |
508 uint32_t last_byte; | |
509 uint32_t vts_cat; | |
20 | 510 |
3 | 511 video_attr_t vtsm_vobs_attr; |
512 uint8_t zero_1; | |
513 uint8_t nr_of_vtsm_audio_streams; /* should be 0 or 1 */ | |
514 audio_attr_t vtsm_audio_attr; | |
20 | 515 audio_attr_t zero_2[7]; |
3 | 516 uint8_t zero_3[16]; |
517 uint8_t zero_4; | |
518 uint8_t nr_of_vtsm_subp_streams; /* should be 0 or 1 */ | |
519 subp_attr_t vtsm_subp_attr; | |
520 subp_attr_t zero_5[27]; | |
20 | 521 |
3 | 522 uint8_t zero_6[2]; |
20 | 523 |
3 | 524 video_attr_t vtstt_vobs_video_attr; |
525 uint8_t zero_7; | |
526 uint8_t nr_of_vtstt_audio_streams; | |
527 audio_attr_t vtstt_audio_attr[8]; | |
528 uint8_t zero_8[16]; | |
529 uint8_t zero_9; | |
530 uint8_t nr_of_vtstt_subp_streams; | |
531 subp_attr_t vtstt_subp_attr[32]; | |
532 } ATTRIBUTE_PACKED vts_attributes_t; | |
533 #define VTS_ATTRIBUTES_SIZE 542U | |
534 #define VTS_ATTRIBUTES_MIN_SIZE 356U | |
535 | |
536 /** | |
537 * Video Title Set Attribute Table. | |
538 */ | |
539 typedef struct { | |
540 uint16_t nr_of_vtss; | |
541 uint16_t zero_1; | |
542 uint32_t last_byte; | |
543 vts_attributes_t *vts; | |
544 uint32_t *vts_atrt_offsets; /* offsets table for each vts_attributes */ | |
545 } ATTRIBUTE_PACKED vts_atrt_t; | |
546 #define VTS_ATRT_SIZE 8U | |
547 | |
548 /** | |
549 * Text Data. (Incomplete) | |
550 */ | |
551 typedef struct { | |
552 uint32_t last_byte; /* offsets are relative here */ | |
553 uint16_t offsets[100]; /* == nr_of_srpts + 1 (first is disc title) */ | |
20 | 554 #if 0 |
3 | 555 uint16_t unknown; /* 0x48 ?? 0x48 words (16bit) info following */ |
556 uint16_t zero_1; | |
20 | 557 |
3 | 558 uint8_t type_of_info; /* ?? 01 == disc, 02 == Title, 04 == Title part */ |
559 uint8_t unknown1; | |
560 uint8_t unknown2; | |
561 uint8_t unknown3; | |
562 uint8_t unknown4; /* ?? allways 0x30 language?, text format? */ | |
563 uint8_t unknown5; | |
564 uint16_t offset; /* from first */ | |
20 | 565 |
3 | 566 char text[12]; /* ended by 0x09 */ |
567 #endif | |
568 } ATTRIBUTE_PACKED txtdt_t; | |
569 | |
570 /** | |
571 * Text Data Language Unit. (Incomplete) | |
20 | 572 */ |
3 | 573 typedef struct { |
574 uint16_t lang_code; | |
575 uint16_t unknown; /* 0x0001, title 1? disc 1? side 1? */ | |
576 uint32_t txtdt_start_byte; /* prt, rel start of vmg_txtdt_mgi */ | |
577 txtdt_t *txtdt; | |
578 } ATTRIBUTE_PACKED txtdt_lu_t; | |
579 #define TXTDT_LU_SIZE 8U | |
580 | |
581 /** | |
582 * Text Data Manager Information. (Incomplete) | |
583 */ | |
584 typedef struct { | |
585 char disc_name[14]; /* how many bytes?? */ | |
586 uint16_t nr_of_language_units; /* 32bit?? */ | |
587 uint32_t last_byte; | |
588 txtdt_lu_t *lu; | |
589 } ATTRIBUTE_PACKED txtdt_mgi_t; | |
590 #define TXTDT_MGI_SIZE 20U | |
591 | |
592 | |
593 /** | |
594 * VTS | |
595 * | |
596 * Structures relating to the Video Title Set (VTS). | |
597 */ | |
598 | |
599 /** | |
600 * Video Title Set Information Management Table. | |
601 */ | |
602 typedef struct { | |
603 char vts_identifier[12]; | |
604 uint32_t vts_last_sector; | |
605 uint8_t zero_1[12]; | |
606 uint32_t vtsi_last_sector; | |
607 uint8_t zero_2; | |
608 uint8_t specification_version; | |
609 uint32_t vts_category; | |
610 uint16_t zero_3; | |
611 uint16_t zero_4; | |
612 uint8_t zero_5; | |
613 uint8_t zero_6[19]; | |
614 uint16_t zero_7; | |
615 uint8_t zero_8[32]; | |
616 uint64_t zero_9; | |
617 uint8_t zero_10[24]; | |
618 uint32_t vtsi_last_byte; | |
619 uint32_t zero_11; | |
620 uint8_t zero_12[56]; | |
621 uint32_t vtsm_vobs; /* sector */ | |
622 uint32_t vtstt_vobs; /* sector */ | |
623 uint32_t vts_ptt_srpt; /* sector */ | |
624 uint32_t vts_pgcit; /* sector */ | |
625 uint32_t vtsm_pgci_ut; /* sector */ | |
626 uint32_t vts_tmapt; /* sector */ | |
627 uint32_t vtsm_c_adt; /* sector */ | |
628 uint32_t vtsm_vobu_admap; /* sector */ | |
629 uint32_t vts_c_adt; /* sector */ | |
630 uint32_t vts_vobu_admap; /* sector */ | |
631 uint8_t zero_13[24]; | |
20 | 632 |
3 | 633 video_attr_t vtsm_video_attr; |
634 uint8_t zero_14; | |
635 uint8_t nr_of_vtsm_audio_streams; /* should be 0 or 1 */ | |
636 audio_attr_t vtsm_audio_attr; | |
637 audio_attr_t zero_15[7]; | |
638 uint8_t zero_16[17]; | |
639 uint8_t nr_of_vtsm_subp_streams; /* should be 0 or 1 */ | |
640 subp_attr_t vtsm_subp_attr; | |
641 subp_attr_t zero_17[27]; | |
642 uint8_t zero_18[2]; | |
20 | 643 |
3 | 644 video_attr_t vts_video_attr; |
645 uint8_t zero_19; | |
646 uint8_t nr_of_vts_audio_streams; | |
647 audio_attr_t vts_audio_attr[8]; | |
648 uint8_t zero_20[17]; | |
649 uint8_t nr_of_vts_subp_streams; | |
650 subp_attr_t vts_subp_attr[32]; | |
651 uint16_t zero_21; | |
652 multichannel_ext_t vts_mu_audio_attr[8]; | |
653 /* XXX: how much 'padding' here, if any? */ | |
654 } ATTRIBUTE_PACKED vtsi_mat_t; | |
655 | |
656 /** | |
657 * PartOfTitle Unit Information. | |
658 */ | |
659 typedef struct { | |
660 uint16_t pgcn; | |
661 uint16_t pgn; | |
662 } ATTRIBUTE_PACKED ptt_info_t; | |
663 | |
664 /** | |
665 * PartOfTitle Information. | |
666 */ | |
667 typedef struct { | |
668 uint16_t nr_of_ptts; | |
669 ptt_info_t *ptt; | |
670 } ATTRIBUTE_PACKED ttu_t; | |
671 | |
672 /** | |
673 * PartOfTitle Search Pointer Table. | |
674 */ | |
675 typedef struct { | |
676 uint16_t nr_of_srpts; | |
677 uint16_t zero_1; | |
678 uint32_t last_byte; | |
679 ttu_t *title; | |
680 uint32_t *ttu_offset; /* offset table for each ttu */ | |
681 } ATTRIBUTE_PACKED vts_ptt_srpt_t; | |
682 #define VTS_PTT_SRPT_SIZE 8U | |
683 | |
684 | |
685 /** | |
686 * Time Map Entry. | |
687 */ | |
688 /* Should this be bit field at all or just the uint32_t? */ | |
689 typedef uint32_t map_ent_t; | |
690 | |
691 /** | |
692 * Time Map. | |
693 */ | |
694 typedef struct { | |
695 uint8_t tmu; /* Time unit, in seconds */ | |
696 uint8_t zero_1; | |
697 uint16_t nr_of_entries; | |
698 map_ent_t *map_ent; | |
699 } ATTRIBUTE_PACKED vts_tmap_t; | |
700 #define VTS_TMAP_SIZE 4U | |
701 | |
702 /** | |
703 * Time Map Table. | |
704 */ | |
705 typedef struct { | |
706 uint16_t nr_of_tmaps; | |
707 uint16_t zero_1; | |
708 uint32_t last_byte; | |
709 vts_tmap_t *tmap; | |
710 uint32_t *tmap_offset; /* offset table for each tmap */ | |
711 } ATTRIBUTE_PACKED vts_tmapt_t; | |
712 #define VTS_TMAPT_SIZE 8U | |
713 | |
714 | |
715 #if PRAGMA_PACK | |
716 #pragma pack() | |
717 #endif | |
718 | |
719 | |
720 /** | |
721 * The following structure defines an IFO file. The structure is divided into | |
722 * two parts, the VMGI, or Video Manager Information, which is read from the | |
723 * VIDEO_TS.[IFO,BUP] file, and the VTSI, or Video Title Set Information, which | |
724 * is read in from the VTS_XX_0.[IFO,BUP] files. | |
725 */ | |
726 typedef struct { | |
727 dvd_file_t *file; | |
20 | 728 |
3 | 729 /* VMGI */ |
730 vmgi_mat_t *vmgi_mat; | |
731 tt_srpt_t *tt_srpt; | |
20 | 732 pgc_t *first_play_pgc; |
3 | 733 ptl_mait_t *ptl_mait; |
734 vts_atrt_t *vts_atrt; | |
735 txtdt_mgi_t *txtdt_mgi; | |
20 | 736 |
3 | 737 /* Common */ |
738 pgci_ut_t *pgci_ut; | |
739 c_adt_t *menu_c_adt; | |
740 vobu_admap_t *menu_vobu_admap; | |
20 | 741 |
3 | 742 /* VTSI */ |
743 vtsi_mat_t *vtsi_mat; | |
744 vts_ptt_srpt_t *vts_ptt_srpt; | |
745 pgcit_t *vts_pgcit; | |
746 vts_tmapt_t *vts_tmapt; | |
747 c_adt_t *vts_c_adt; | |
748 vobu_admap_t *vts_vobu_admap; | |
749 } ifo_handle_t; | |
750 | |
23 | 751 #endif /* LIBDVDREAD_IFO_TYPES_H */ |