comparison libdvdread/ifo_types.h @ 20615:1a4fcea7ab53

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