libdvdread 7.1.0
ifo_types.h
1/*
2 * Copyright (C) 2000, 2001 Björn Englund <d4bjorn@dtek.chalmers.se>,
3 * Håkan Hjort <d95hjort@dtek.chalmers.se>
4 *
5 * This file is part of libdvdread.
6 *
7 * libdvdread is free software; you can redistribute it and/or modify
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 *
12 * libdvdread is distributed in the hope that it will be useful,
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 *
17 * You should have received a copy of the GNU General Public License along
18 * with libdvdread; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22#ifndef LIBDVDREAD_IFO_TYPES_H
23#define LIBDVDREAD_IFO_TYPES_H
24
25#include <inttypes.h>
26
27#include <dvdread/dvd_reader.h>
28
29#undef ATTRIBUTE_PACKED
30
31#if defined(__GNUC__)
32# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
33# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && !defined(__clang__)
34# define ATTRIBUTE_PACKED __attribute__ ((packed,gcc_struct))
35# else
36# define ATTRIBUTE_PACKED __attribute__ ((packed))
37# endif
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
57
58
62typedef 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#define DVD_TIME_SIZE 4U
69
73typedef struct {
74 uint8_t bytes[8];
75} ATTRIBUTE_PACKED vm_cmd_t;
76#define COMMAND_DATA_SIZE 8U
77
78
82typedef struct {
83 unsigned char mpeg_version : 2;
84 unsigned char video_format : 2;
85 unsigned char display_aspect_ratio : 2;
86 unsigned char permitted_df : 2;
87
88 unsigned char line21_cc_1 : 1;
89 unsigned char line21_cc_2 : 1;
90 unsigned char unknown1 : 1;
91 unsigned char bit_rate : 1;
92
93 unsigned char picture_size : 2;
94 unsigned char letterboxed : 1;
95 unsigned char film_mode : 1;
96} ATTRIBUTE_PACKED video_attr_t;
97#define VIDEO_ATTR_SIZE 2U
98
102typedef enum {
103 DVD_AUDIO_CODE_EXT_UNSPECIFIED = 0,
104 DVD_AUDIO_CODE_EXT_NORMAL = 1,
105 DVD_AUDIO_CODE_EXT_VISUALLY_IMPAIRED = 2,
106 DVD_AUDIO_CODE_EXT_DIRECTOR = 3,
107 DVD_AUDIO_CODE_EXT_ALT_DIRECTOR = 4,
108} dvd_audio_code_ext_t;
109
113typedef struct {
114 unsigned char audio_format : 3;
115 unsigned char multichannel_extension : 1;
116 unsigned char lang_type : 2;
117 unsigned char application_mode : 2;
118
119 unsigned char quantization : 2;
120 unsigned char sample_frequency : 2;
121 unsigned char unknown1 : 1;
122 unsigned char channels : 3;
123 uint16_t lang_code;
124 uint8_t lang_extension;
126 uint8_t unknown3;
127 union {
128 struct ATTRIBUTE_PACKED {
129 unsigned char unknown4 : 1;
130 unsigned char channel_assignment : 3;
131 unsigned char version : 2;
132 unsigned char mc_intro : 1; /* probably 0: true, 1:false */
133 unsigned char mode : 1; /* Karaoke mode 0: solo 1: duet */
134 } karaoke;
135 struct ATTRIBUTE_PACKED {
136 unsigned char unknown5 : 4;
137 unsigned char dolby_encoded : 1; /* suitable for surround decoding */
138 unsigned char unknown6 : 3;
139 } surround;
140 } ATTRIBUTE_PACKED app_info;
141} ATTRIBUTE_PACKED audio_attr_t;
142#define AUDIO_ATTR_SIZE 8U
143
144
148typedef struct {
149 unsigned char zero1 : 7;
150 unsigned char ach0_gme : 1;
151
152 unsigned char zero2 : 7;
153 unsigned char ach1_gme : 1;
154
155 unsigned char zero3 : 4;
156 unsigned char ach2_gv1e : 1;
157 unsigned char ach2_gv2e : 1;
158 unsigned char ach2_gm1e : 1;
159 unsigned char ach2_gm2e : 1;
160
161 unsigned char zero4 : 4;
162 unsigned char ach3_gv1e : 1;
163 unsigned char ach3_gv2e : 1;
164 unsigned char ach3_gmAe : 1;
165 unsigned char ach3_se2e : 1;
166
167 unsigned char zero5 : 4;
168 unsigned char ach4_gv1e : 1;
169 unsigned char ach4_gv2e : 1;
170 unsigned char ach4_gmBe : 1;
171 unsigned char ach4_seBe : 1;
172 uint8_t zero6[19];
173} ATTRIBUTE_PACKED multichannel_ext_t;
174#define MULTICHANNEL_EXT_SIZE 24U
175
176
180typedef enum {
181 DVD_SUBP_CODE_EXT_UNSPECIFIED = 0,
182 DVD_SUBP_CODE_EXT_NORMAL = 1,
183 DVD_SUBP_CODE_EXT_LARGE = 2,
184 DVD_SUBP_CODE_EXT_CHILDREN = 3,
185 DVD_SUBP_CODE_EXT_NORMAL_CAPTIONS = 5,
186 DVD_SUBP_CODE_EXT_LARGE_CAPTIONS = 6,
187 DVD_SUBP_CODE_EXT_CHILDREN_CAPTIONS = 7,
188 DVD_SUBP_CODE_EXT_FORCED = 9,
189 DVD_SUBP_CODE_EXT_DIRECTOR = 13,
190 DVD_SUBP_CODE_EXT_LARGE_DIRECTOR = 14,
191 DVD_SUBP_CODE_EXT_CHILDREN_DIRECTOR = 15,
192} dvd_subp_code_ext_t;
193
197typedef struct {
198 /*
199 * type: 0 not specified
200 * 1 language
201 * 2 other
202 * coding mode: 0 run length
203 * 1 extended
204 * 2 other
205 * language: indicates language if type == 1
206 * lang extension: if type == 1 contains the lang extension
207 */
208 unsigned char code_mode : 3;
209 unsigned char zero1 : 3;
210 unsigned char type : 2;
211 uint8_t zero2;
212 uint16_t lang_code;
213 uint8_t lang_extension;
214 uint8_t code_extension;
215} ATTRIBUTE_PACKED subp_attr_t;
216#define SUBP_ATTR_SIZE 6U
217
218
219
223typedef struct {
224 uint16_t nr_of_pre;
225 uint16_t nr_of_post;
226 uint16_t nr_of_cell;
227 uint16_t last_byte;
228 vm_cmd_t *pre_cmds;
229 vm_cmd_t *post_cmds;
230 vm_cmd_t *cell_cmds;
231} ATTRIBUTE_PACKED pgc_command_tbl_t;
232#define PGC_COMMAND_TBL_SIZE 8U
233
237typedef uint8_t pgc_program_map_t;
238
242typedef struct {
243 unsigned char block_mode : 2;
244 unsigned char block_type : 2;
245 unsigned char seamless_play : 1;
246 unsigned char interleaved : 1;
247 unsigned char stc_discontinuity: 1;
248 unsigned char seamless_angle : 1;
249 unsigned char zero_1 : 1;
250 unsigned char playback_mode : 1;
251 unsigned char restricted : 1;
252 unsigned char cell_type : 5;
253 uint8_t still_time;
254 uint8_t cell_cmd_nr;
255 dvd_time_t playback_time;
256 uint32_t first_sector;
257 uint32_t first_ilvu_end_sector;
258 uint32_t last_vobu_start_sector;
259 uint32_t last_sector;
260} ATTRIBUTE_PACKED cell_playback_t;
261#define CELL_PLAYBACK_SIZE 24U
262
263#define BLOCK_TYPE_NONE 0x0
264#define BLOCK_TYPE_ANGLE_BLOCK 0x1
265
266#define BLOCK_MODE_NOT_IN_BLOCK 0x0
267#define BLOCK_MODE_FIRST_CELL 0x1
268#define BLOCK_MODE_IN_BLOCK 0x2
269#define BLOCK_MODE_LAST_CELL 0x3
270
274typedef struct {
275 uint16_t vob_id_nr;
276 uint8_t zero_1;
277 uint8_t cell_nr;
278} ATTRIBUTE_PACKED cell_position_t;
279#define CELL_POSITION_SIZE 4U
280
284typedef struct {
285 unsigned char zero : 7; /* 25-31 */
286 unsigned char video_pres_mode_change : 1; /* 24 */
287
288 unsigned char karaoke_audio_pres_mode_change : 1; /* 23 */
289 unsigned char angle_change : 1;
290 unsigned char subpic_stream_change : 1;
291 unsigned char audio_stream_change : 1;
292 unsigned char pause_on : 1;
293 unsigned char still_off : 1;
294 unsigned char button_select_or_activate : 1;
295 unsigned char resume : 1; /* 16 */
296
297 unsigned char chapter_menu_call : 1; /* 15 */
298 unsigned char angle_menu_call : 1;
299 unsigned char audio_menu_call : 1;
300 unsigned char subpic_menu_call : 1;
301 unsigned char root_menu_call : 1;
302 unsigned char title_menu_call : 1;
303 unsigned char backward_scan : 1;
304 unsigned char forward_scan : 1; /* 8 */
305
306 unsigned char next_pg_search : 1; /* 7 */
307 unsigned char prev_or_top_pg_search : 1;
308 unsigned char time_or_chapter_search : 1;
309 unsigned char go_up : 1;
310 unsigned char stop : 1;
311 unsigned char title_play : 1;
312 unsigned char chapter_search_or_play : 1;
313 unsigned char title_or_time_play : 1; /* 0 */
314} ATTRIBUTE_PACKED user_ops_t;
315#define USER_OPS_SIZE 4U
316
320typedef struct {
321 uint16_t zero_1;
322 uint8_t nr_of_programs;
323 uint8_t nr_of_cells;
324 dvd_time_t playback_time;
325 user_ops_t prohibited_ops;
326 uint16_t audio_control[8]; /* New type? */
327 uint32_t subp_control[32]; /* New type? */
328 uint16_t next_pgc_nr;
329 uint16_t prev_pgc_nr;
330 uint16_t goup_pgc_nr;
331 uint8_t pg_playback_mode;
332 uint8_t still_time;
333 uint32_t palette[16]; /* New type struct {zero_1, Y, Cr, Cb} ? */
334 uint16_t command_tbl_offset;
335 uint16_t program_map_offset;
336 uint16_t cell_playback_offset;
337 uint16_t cell_position_offset;
338 pgc_command_tbl_t *command_tbl;
339 pgc_program_map_t *program_map;
340 cell_playback_t *cell_playback;
341 cell_position_t *cell_position;
342 int ref_count;
343} ATTRIBUTE_PACKED pgc_t;
344#define PGC_SIZE 236U
345
349typedef struct {
350 uint8_t entry_id;
351 unsigned char block_mode : 2;
352 unsigned char block_type : 2;
353 unsigned char zero_1 : 4;
354 uint16_t ptl_id_mask;
355 uint32_t pgc_start_byte;
356 pgc_t *pgc;
357} ATTRIBUTE_PACKED pgci_srp_t;
358#define PGCI_SRP_SIZE 8U
359
363typedef struct {
364 uint16_t nr_of_pgci_srp;
365 uint16_t zero_1;
366 uint32_t last_byte;
367 pgci_srp_t *pgci_srp;
368 int ref_count;
369} ATTRIBUTE_PACKED pgcit_t;
370#define PGCIT_SIZE 8U
371
375typedef struct {
376 uint16_t lang_code;
377 uint8_t lang_extension;
378 uint8_t exists;
379 uint32_t lang_start_byte;
380 pgcit_t *pgcit;
381} ATTRIBUTE_PACKED pgci_lu_t;
382#define PGCI_LU_SIZE 8U
383
387typedef struct {
388 uint16_t nr_of_lus;
389 uint16_t zero_1;
390 uint32_t last_byte;
391 pgci_lu_t *lu;
392} ATTRIBUTE_PACKED pgci_ut_t;
393#define PGCI_UT_SIZE 8U
394
398typedef struct {
399 uint16_t vob_id;
400 uint8_t cell_id;
401 uint8_t zero_1;
402 uint32_t start_sector;
403 uint32_t last_sector;
404} ATTRIBUTE_PACKED cell_adr_t;
405#define CELL_ADDR_SIZE 12U
406
410typedef struct {
411 uint16_t nr_of_vobs; /* VOBs */
412 uint16_t zero_1;
413 uint32_t last_byte;
414 cell_adr_t *cell_adr_table; /* No explicit size given. */
415} ATTRIBUTE_PACKED c_adt_t;
416#define C_ADT_SIZE 8U
417
421typedef struct {
422 uint32_t last_byte;
423 uint32_t *vobu_start_sectors;
424} ATTRIBUTE_PACKED vobu_admap_t;
425#define VOBU_ADMAP_SIZE 4U
426
427
428
429
435
439typedef struct {
440 char vmg_identifier[12];
441 uint32_t vmg_last_sector;
442 uint8_t zero_1[12];
443 uint32_t vmgi_last_sector;
444 uint8_t zero_2;
445 uint8_t specification_version;
446 uint32_t vmg_category;
447 uint16_t vmg_nr_of_volumes;
448 uint16_t vmg_this_volume_nr;
449 uint8_t disc_side;
450 uint8_t zero_3[19];
451 uint16_t vmg_nr_of_title_sets; /* Number of VTSs. */
452 char provider_identifier[32];
453 uint64_t vmg_pos_code;
454 uint8_t zero_4[24];
455 uint32_t vmgi_last_byte;
456 uint32_t first_play_pgc;
457 uint8_t zero_5[56];
458 uint32_t vmgm_vobs; /* sector */
459 uint32_t tt_srpt; /* sector */
460 uint32_t vmgm_pgci_ut; /* sector */
461 uint32_t ptl_mait; /* sector */
462 uint32_t vts_atrt; /* sector */
463 uint32_t txtdt_mgi; /* sector */
464 uint32_t vmgm_c_adt; /* sector */
465 uint32_t vmgm_vobu_admap; /* sector */
466 uint8_t zero_6[32];
467
468 video_attr_t vmgm_video_attr;
469 uint8_t zero_7;
470 uint8_t nr_of_vmgm_audio_streams; /* should be 0 or 1 */
471 audio_attr_t vmgm_audio_attr;
472 audio_attr_t zero_8[7];
473 uint8_t zero_9[17];
474 uint8_t nr_of_vmgm_subp_streams; /* should be 0 or 1 */
475 subp_attr_t vmgm_subp_attr;
476 subp_attr_t zero_10[27]; /* XXX: how much 'padding' here? */
477} ATTRIBUTE_PACKED vmgi_mat_t;
478#define VMGI_MAT_SIZE 510U
479
480/* Downmix coefficients can be used to reduce 5.1 channels to stereo in DVD-Audio Discs */
501
502typedef struct {
503 /* it seems each entry is started and ended with padding */
504 uint16_t zero_1;
505 /* each coefficient corresponds to stereo side for a channel in 5.1 */
506 uint8_t Lf_left;
507 uint8_t Lf_right;
508 uint8_t Rf_left;
509 uint8_t Rf_right;
510 uint8_t C_left;
511 uint8_t C_right;
512 uint8_t LFE_left;
513 uint8_t LFE_right;
514 uint8_t Ls_left;
515 uint8_t Ls_right;
516 uint8_t Rs_left;
517 uint8_t Rs_right;
518
519 uint16_t zero_2;
520} ATTRIBUTE_PACKED downmix_coeff_t;
521#define DOWNMIX_COEFF_SIZE 16U
522
523
529
533
534typedef struct {
535 uint16_t zero_1;
536 uint8_t group_num;
537 uint8_t chapter_num; /* chapter number within group*/
538 uint32_t timestamp_pts; /* this is MPEG time, Not DVD time */
539 uint32_t chapter_len;
540 uint32_t zero_2;
541 uint8_t record_code;
542 uint8_t bit_depth;
543 uint8_t sampling_rate;
544 uint8_t nr_channels;
545 /* some DVD's made with authoring software keep downmix coefficients here */
546 /* since I do not have samples of commercial discs that do this, I will not include it */
547 uint8_t zero_3[20];
548 uint32_t start_sector_1; /*aob start sector*/
549 uint32_t start_sector_2; /*aob start sector is repeated again */
550 uint32_t end_sector;
551} ATTRIBUTE_PACKED samg_chapter_t;
552#define SAMG_CHAPTER_SIZE 52U
553
554typedef struct {
555 char samg_identifier[12];
556 uint16_t nr_chapters;
557 uint16_t specification_version;
558 samg_chapter_t *samg_chapters;
559} ATTRIBUTE_PACKED samg_mat_t;
560#define SAMG_MAT_SIZE 16U
561
567
571typedef struct {
572 char amg_identifier[12];
573 uint32_t amg_start_sector;
574 uint8_t zero_1[12];
575 uint32_t amgi_last_sector;
576 uint16_t specification_version;
577 uint8_t zero_2[4];
578 uint16_t amg_nr_of_volumes;
579 uint16_t amg_this_volume_nr;
580 uint8_t disc_side;
581 uint8_t zero_3[4];
582 uint8_t autoplay;
583 uint32_t audio_sv_ifo_relative_p;
584 uint16_t unknown_1; /* some discs have a value here, undocumented in DVD-Audio specs */
585 uint8_t zero_4[8];
586 uint8_t vmg_nr_of_title_sets; /* Number of video titlesets in audio zone. */
587 uint8_t amg_nr_of_title_sets; /* Number of audio titlesets in audio zone. */
588 uint8_t unknown_2[32]; /* may be set to zeros */
589 uint8_t unknown_3[8]; /* may be set to zeros */
590 uint8_t zero_5[24];
591 uint32_t amg_end_byte_address;
592 uint8_t unknown_4[4]; /* may be set to zeros */
593 uint8_t zero_6[56];
594 uint16_t menu_prescence_1; /* may be set to zero, or some other value, optional field*/
595 uint8_t unknown_5[4];
596 uint16_t unknown_6; /* should be 0x01 */
597 uint8_t zero_7[2];
598 uint16_t amg_nr_of_zones; /* may be set to 0x02*/
599 uint8_t zero_8[2];
600 uint16_t menu_prescence_2; /* may be set to 0x03*/
601 uint8_t zero_9[48];
602 uint8_t last_sector_audio_sys_space;
603 uint8_t zero_10[79];
604 uint8_t menu_prescence_3; /* will be set to 0x01*/
605 /* XXX lots of padding after this to complete the sector*/
606} ATTRIBUTE_PACKED amgi_mat_t;
607#define AMGI_MAT_SIZE 337U
608
609/* Sector 2 may have video tracks, sector 3 will not. If there are no video tracks the tables will be the same*/
610
611/*this struct repeats for every audio or video track*/
612typedef struct {
613 uint8_t type_and_rank; /*first nibble is type, second rank, from 1-9*/
614 uint8_t nr_chapters_in_title;
615 uint8_t nr_visible_chapters_in_vts_title; /* this will be zeros in an audio record */
616 uint8_t zero_1;
617 uint32_t len_audio_zone_pts; /* this is MPEG time, Not DVD time */
618
619 uint8_t group_property; /* in a video track, this is video titleset number, in audio its rank of group */
620 uint8_t title_property; /* in video track this is title number , in audio track this is rank of title*/
621 uint32_t ts_pointer_relative_sector; /* for ats or vts*/
622} ATTRIBUTE_PACKED track_info_t;
623#define TRACK_INFO_SIZE 14U
624
625typedef struct {
626 uint16_t nr_of_titles;
627 uint16_t last_byte_in_table;
628 track_info_t *tracks_info;
629} ATTRIBUTE_PACKED tracks_info_table_t;
630#define TRACKS_INFO_TABLE_SIZE 4U
631
632
633typedef struct {
634 unsigned char zero_1 : 1;
635 unsigned char multi_or_random_pgc_title : 1; /* 0: one sequential pgc title */
636 unsigned char jlc_exists_in_cell_cmd : 1;
637 unsigned char jlc_exists_in_prepost_cmd : 1;
638 unsigned char jlc_exists_in_button_cmd : 1;
639 unsigned char jlc_exists_in_tt_dom : 1;
640 unsigned char chapter_search_or_play : 1; /* UOP 1 */
641 unsigned char title_or_time_play : 1; /* UOP 0 */
642} ATTRIBUTE_PACKED playback_type_t;
643#define PLAYBACK_TYPE_SIZE 1U
644
648typedef struct {
649 playback_type_t pb_ty;
650 uint8_t nr_of_angles;
651 uint16_t nr_of_ptts;
652 uint16_t parental_id;
653 uint8_t title_set_nr;
654 uint8_t vts_ttn;
655 uint32_t title_set_sector;
656} ATTRIBUTE_PACKED title_info_t;
657#define TITLE_INFO_SIZE 12U
658
662typedef struct {
663 uint16_t nr_of_srpts;
664 uint16_t zero_1;
665 uint32_t last_byte;
666 title_info_t *title;
667} ATTRIBUTE_PACKED tt_srpt_t;
668#define TT_SRPT_SIZE 8U
669
670
675#define PTL_MAIT_NUM_LEVEL 8
676typedef uint16_t pf_level_t[PTL_MAIT_NUM_LEVEL];
677
681typedef struct {
682 uint16_t country_code;
683 uint16_t zero_1;
684 uint16_t pf_ptl_mai_start_byte;
685 uint16_t zero_2;
686 pf_level_t *pf_ptl_mai; /* table of (nr_of_vtss + 1), video_ts is first */
687} ATTRIBUTE_PACKED ptl_mait_country_t;
688#define PTL_MAIT_COUNTRY_SIZE 8U
689
693typedef struct {
694 uint16_t nr_of_countries;
695 uint16_t nr_of_vtss;
696 uint32_t last_byte;
697 ptl_mait_country_t *countries;
698} ATTRIBUTE_PACKED ptl_mait_t;
699#define PTL_MAIT_SIZE 8U
700
704typedef struct {
705 uint32_t last_byte;
706 uint32_t vts_cat;
707
708 video_attr_t vtsm_vobs_attr;
709 uint8_t zero_1;
710 uint8_t nr_of_vtsm_audio_streams; /* should be 0 or 1 */
711 audio_attr_t vtsm_audio_attr;
712 audio_attr_t zero_2[7];
713 uint8_t zero_3[16];
714 uint8_t zero_4;
715 uint8_t nr_of_vtsm_subp_streams; /* should be 0 or 1 */
716 subp_attr_t vtsm_subp_attr;
717 subp_attr_t zero_5[27];
718
719 uint8_t zero_6[2];
720
721 video_attr_t vtstt_vobs_video_attr;
722 uint8_t zero_7;
723 uint8_t nr_of_vtstt_audio_streams;
724 audio_attr_t vtstt_audio_attr[8];
725 uint8_t zero_8[16];
726 uint8_t zero_9;
727 uint8_t nr_of_vtstt_subp_streams;
728 subp_attr_t vtstt_subp_attr[32];
729} ATTRIBUTE_PACKED vts_attributes_t;
730#define VTS_ATTRIBUTES_SIZE 542U
731#define VTS_ATTRIBUTES_MIN_SIZE 356U
732
736typedef struct {
737 uint16_t nr_of_vtss;
738 uint16_t zero_1;
739 uint32_t last_byte;
740 vts_attributes_t *vts;
741 uint32_t *vts_atrt_offsets; /* offsets table for each vts_attributes */
742} ATTRIBUTE_PACKED vts_atrt_t;
743#define VTS_ATRT_SIZE 8U
744
748typedef struct {
749 uint32_t last_byte; /* offsets are relative here */
750 uint16_t offsets[100]; /* == nr_of_srpts + 1 (first is disc title) */
751#if 0
752 uint16_t unknown; /* 0x48 ?? 0x48 words (16bit) info following */
753 uint16_t zero_1;
754
755 uint8_t type_of_info; /* ?? 01 == disc, 02 == Title, 04 == Title part */
756 uint8_t unknown1;
757 uint8_t unknown2;
758 uint8_t unknown3;
759 uint8_t unknown4; /* ?? always 0x30 language?, text format? */
760 uint8_t unknown5;
761 uint16_t offset; /* from first */
762
763 char text[12]; /* ended by 0x09 */
764#endif
765} ATTRIBUTE_PACKED txtdt_t;
766#define TXTDT_SIZE 204U
767
771typedef struct {
772 uint16_t lang_code;
773 uint8_t zero_1;
774 uint8_t char_set; /* 0x00 reserved Unicode, 0x01 ISO 646, 0x10 JIS Roman & JIS Kanji, 0x11 ISO 8859-1, 0x12 Shift JIS Kanji */
775 uint32_t txtdt_start_byte; /* prt, rel start of vmg_txtdt_mgi */
776 txtdt_t *txtdt;
777} ATTRIBUTE_PACKED txtdt_lu_t;
778#define TXTDT_LU_SIZE 8U
779
783typedef struct {
784 char disc_name[12];
785 uint16_t unknown1;
786 uint16_t nr_of_language_units;
787 uint32_t last_byte;
788 txtdt_lu_t *lu;
789} ATTRIBUTE_PACKED txtdt_mgi_t;
790#define TXTDT_MGI_SIZE 20U
791
792
798
802typedef struct {
803 char vts_identifier[12];
804 uint32_t vts_last_sector;
805 uint8_t zero_1[12];
806 uint32_t vtsi_last_sector;
807 uint8_t zero_2;
808 uint8_t specification_version;
809 uint32_t vts_category;
810 uint16_t zero_3;
811 uint16_t zero_4;
812 uint8_t zero_5;
813 uint8_t zero_6[19];
814 uint16_t zero_7;
815 uint8_t zero_8[32];
816 uint64_t zero_9;
817 uint8_t zero_10[24];
818 uint32_t vtsi_last_byte;
819 uint32_t zero_11;
820 uint8_t zero_12[56];
821 uint32_t vtsm_vobs; /* sector */
822 uint32_t vtstt_vobs; /* sector */
823 uint32_t vts_ptt_srpt; /* sector */
824 uint32_t vts_pgcit; /* sector */
825 uint32_t vtsm_pgci_ut; /* sector */
826 uint32_t vts_tmapt; /* sector */
827 uint32_t vtsm_c_adt; /* sector */
828 uint32_t vtsm_vobu_admap; /* sector */
829 uint32_t vts_c_adt; /* sector */
830 uint32_t vts_vobu_admap; /* sector */
831 uint8_t zero_13[24];
832
833 video_attr_t vtsm_video_attr;
834 uint8_t zero_14;
835 uint8_t nr_of_vtsm_audio_streams; /* should be 0 or 1 */
836 audio_attr_t vtsm_audio_attr;
837 audio_attr_t zero_15[7];
838 uint8_t zero_16[17];
839 uint8_t nr_of_vtsm_subp_streams; /* should be 0 or 1 */
840 subp_attr_t vtsm_subp_attr;
841 subp_attr_t zero_17[27];
842 uint8_t zero_18[2];
843
844 video_attr_t vts_video_attr;
845 uint8_t zero_19;
846 uint8_t nr_of_vts_audio_streams;
847 audio_attr_t vts_audio_attr[8];
848 uint8_t zero_20[17];
849 uint8_t nr_of_vts_subp_streams;
850 subp_attr_t vts_subp_attr[32];
851 uint16_t zero_21;
852 multichannel_ext_t vts_mu_audio_attr[8];
853 /* XXX: how much 'padding' here, if any? */
854} ATTRIBUTE_PACKED vtsi_mat_t;
855#define VTSI_MAT_SIZE 984U
856
857
858typedef struct {
859 /* 0x0000 for lpcm or 0x0100 for mlp, DTS seems to be 0x0500 and has different fields*/
860 uint8_t encoding;
861 uint8_t unknown1;
862 /* for stereo 0f 16 bit, 1f 20 bit, 2f 24 bit*/
863 /* f is a placeholder for the nibbles that is used for channel groups*/
864 /* otherwise if its 5.1 channels each nibble represents a channel group (G1, G2),*/
865 uint8_t bitrate;
866 /* 8f 44khz, 0f 48khz, 1f 96khz, 2f 192khz*/
867 /* otherwise if its 5.1 channels each nibble represents a channel group (G1, G2)*/
868 uint8_t sampling_frequency;
869 /* 00 1 channel, 01 2 channels, 11 5.1 channels*/
870 uint8_t nr_channels;
871 uint8_t unknown2;
872 uint8_t zero[10];
873} ATTRIBUTE_PACKED atsi_record_t;
874#define ATSI_RECORD_SIZE 16U
875
881
885#define ATSI_RECORD_MAX_SIZE 8
886#define DOWNMIX_COEFF_MAX_SIZE 16
887
888typedef struct {
889 char ats_identifier[12];
890 uint32_t ats_last_sector; /* last sector of ATS_XX_0.BUP*/
891 uint8_t zero_1[12];
892 uint32_t atsi_last_sector; /* last sector of ATS_XX_0.IFO*/
893 uint16_t specification_version; /* always 0x0012 */
894 uint32_t unknown_1;
895 uint8_t zero_2[90];
896 uint32_t atsi_last_byte; /* last byte of sector 0, not the end of the file */
897 uint8_t zero_3[60];
898 uint32_t vtsm_vobs; /* may be zeros */
899 uint32_t atst_aobs; /* atst or vtst */
900 uint32_t vts_ptt_srpt; /* may be zeros */
901 uint32_t ats_pgci_ut; /* sector */
902 uint32_t vtsm_pgci_ut; /* may be zeros */
903 uint32_t vts_tmapt; /* sector */
904 uint32_t vtsm_c_adt; /* sector */
905 uint32_t vtsm_vobu_admap; /* sector */
906 uint32_t vts_c_adt; /* sector */
907 uint32_t vts_vobu_admap; /* sector */
908 uint8_t zero_4[24];
909 /* the majority, or even all of these entries may be zero*/
910 atsi_record_t atsi_record[ATSI_RECORD_MAX_SIZE];
911 downmix_coeff_t downmix_coefficients[DOWNMIX_COEFF_MAX_SIZE];
912} ATTRIBUTE_PACKED atsi_mat_t;
913#define ATSI_MAT_SIZE 640U
914
915typedef struct {
916 uint8_t srp_index; /* 1-based, top bit set marks the primary entry and clear the secondary */
917 uint8_t srp_flags; /* varies per entry, purpose not established */
918 uint8_t audio_encode_mode; /* either 0x00, 0x01 or 0x05, meaning not confirmed */
919 uint8_t reserved; /* always 0x00 */
920 uint32_t offset_record_table; /* byte offset of this title's record from the start of the title table */
921} ATTRIBUTE_PACKED atsi_title_index_t;
922#define ATSI_TITLE_INDEX_SIZE 8U
923
924/* one per audio program in the title */
925typedef struct {
926 uint8_t prog_alloc_flags; /* top bit set on the first program of the title */
927 uint8_t prog_time_attr_flags; /* either 0x00, 0x10 or 0x30, meaning not confirmed */
928 uint16_t reserved_1; /* always 0x0000 */
929 uint8_t track_number_in_title; /* the cell this program starts on, 1-based */
930 uint8_t unknown_3; /* always 0x00 */
931 uint32_t first_pts_of_track; /* start PTS of the program's first cell, not always a title-relative timeline */
932 uint32_t length_pts_of_track; /* length of the program in PTS, the programs sum to length_pts */
933 uint8_t zero[6]; /* will be 0x00 */
934} ATTRIBUTE_PACKED atsi_track_timestamp_t;
935#define ATSI_TRACK_TIMESTAMP_SIZE 20U
936
937/* this will come after all of the track timstamps, a set of 12byte sector pointer records. One for each track*/
938typedef struct {
939 uint8_t cell_index; /* 1-based, the first cell of a program is 0x01 */
940 uint8_t cell_type; /* 0x00 for an audio cell, other types not seen */
941 uint16_t reserved; /* always 0x0000 */
942 uint32_t start_sector; /* first sector, relative to the first AOB file */
943 uint32_t end_sector; /* last sector of the cell, relative to the first AOB file */
944} ATTRIBUTE_PACKED atsi_track_pointer_t;
945#define ATSI_TRACK_POINTER_SIZE 12U
946
953typedef struct {
954 uint8_t asvu_n; /* 1-based ASVU number holding this program's stills, several programs may share one */
956 uint8_t order : 2; /* only 0 (sequential) seen */
957 uint8_t timing : 2; /* 0 timed slideshow, 1 user browsable */
958 uint8_t zero : 4;
959 } dmod;
960 uint16_t start_value; /* first byte of this entry */
961 uint16_t end_value; /* last byte of this entry */
962} ATTRIBUTE_PACKED ats_pg_asv_pbi_srp_t;
963#define ATS_PG_ASV_PBI_SRP_SIZE 6U
964
971typedef struct {
972 uint8_t asv_number; /* the still's number within its unit, restarting at 1 each unit */
973 uint8_t fosl_btnn; /* probably the initial button number, only 0x00 seen */
974 uint8_t unknown_a; /* 0 in slideshow mode, a small often sequential value in browsable mode, maybe a menu page marker */
975 uint8_t track_nr; /* on a shared slideshow, which track the still belongs to, unused when each track has its own stills */
976 uint32_t display_timing; /* when the still is shown, an MPEG PTS, 0 in browsable mode */
977 uint8_t start_transition_mode; /* probably a transition effect, only 0x00 seen */
978 uint8_t termination_transition_mode; /* probably a transition effect, only 0x00 seen */
979} ATTRIBUTE_PACKED asv_dlist_t;
980#define ASV_DLIST_SIZE 10U
981
982typedef struct {
983 /* the address field positions below hold for the common layout, some discs
984 * arrange them differently */
985 uint16_t header_flags; /* only 0x0000 seen */
986 uint8_t nr_tracks; /* number of audio programs in this title */
987 uint8_t nr_pointer_records; /* number of cell records */
988 uint32_t length_pts; /* total play time of the title, MPEG PTS */
989 uint16_t reserved_1; /* always 0x0000 */
990 uint16_t ats_pgit_sa; /* always 0x0010, the low 12 bits look like a byte offset but this is untested */
991 uint16_t start_sector_pointers_table; /* byte offset of the cell info table, from title record start */
992 uint16_t ats_asv_pbit_sa; /* byte offset of the still video table, 0x0000 when the title has no stills */
993 atsi_track_timestamp_t *atsi_track_timestamp_rows; /*length determined by nr_tracks*/
994 atsi_track_pointer_t *atsi_track_pointer_rows;
995
996 /* these entries only exist when theres an ASVS */
997 ats_pg_asv_pbi_srp_t *ats_pg_asv_pbi_srp; /* one per audio program */
998 asv_dlist_t *dlist; /* runs up to the largest end_value in the entries above */
999} ATTRIBUTE_PACKED atsi_title_record_t;
1000#define ATSI_TITLE_ROW_TABLE_SIZE 16U
1001
1002typedef struct {
1003 uint16_t nr_titles;
1004 uint16_t zero_1;
1005 uint32_t last_byte_address;
1006 atsi_title_index_t *atsi_index_rows; /* length determined by nr_titles*/
1007 atsi_title_record_t *atsi_title_row_tables; /* length determined by nr_titles*/
1008} ATTRIBUTE_PACKED atsi_title_table_t;
1009#define ATSI_TITLE_TABLE_SIZE 8U
1010
1016
1027
1028/* general information for one Audio Still Video Unit */
1029typedef struct {
1030 uint8_t p_vob_ns; /* number of still pictures in this unit */
1031 uint8_t unknown_1;
1032 uint16_t start_p_vob_number; /* number of this unit's first still picture, 1-based */
1033 uint16_t zero_1;
1034 uint16_t ref_start_sector; /* base sector the unit's relative pointers count from */
1035} ATTRIBUTE_PACKED asvu_gi_t;
1036#define ASVU_GI_SIZE 8U
1037#define ASVU_GI_MAX_SIZE 99U
1038
1039/* search pointer to one still picture, see the addressing note above */
1040typedef uint16_t asv_srpt_t;
1041#define ASV_SRPT_SIZE 2U
1042
1046typedef struct {
1047 char asvs_identifier[12]; /* DVDAUDIOASVS */
1048 uint16_t asvs_nr_of_asvus; /* number of still video units in asvu_gi */
1049 uint16_t specification_version; /* always 0x0012 */
1050 uint16_t zero_1;
1051 uint16_t asvu_atr; /* unit attributes, only 0x0002 seen */
1052 uint16_t zero_2;
1053 uint16_t p_vobs_ea; /* end of the still picture area, in sectors */
1054 uint32_t p_vobs_sp_plt[16]; /* sub-picture palette, 16 colours, default 0x00108080 */
1055 uint8_t unknown_2[8]; /* trailing 8 bytes, usually more palette words */
1056 asvu_gi_t asvu_gi[ASVU_GI_MAX_SIZE]; /* size determined by asvs_nr_of_asvus */
1057 asv_srpt_t *asv_srpt; /* length is the sum of p_vob_ns over asvu_gi */
1058} ATTRIBUTE_PACKED asvs_mat_t;
1059#define ASVS_MAT_SIZE 888U
1060
1064typedef struct {
1065 uint16_t pgcn;
1066 uint16_t pgn;
1067} ATTRIBUTE_PACKED ptt_info_t;
1068#define PTT_INFO_SIZE 4U
1069
1073typedef struct {
1074 uint16_t nr_of_ptts;
1075 ptt_info_t *ptt;
1076} ATTRIBUTE_PACKED ttu_t;
1077#define TTU_SIZE 2U
1078
1082typedef struct {
1083 uint16_t nr_of_srpts;
1084 uint16_t zero_1;
1085 uint32_t last_byte;
1086 ttu_t *title;
1087 uint32_t *ttu_offset; /* offset table for each ttu */
1088} ATTRIBUTE_PACKED vts_ptt_srpt_t;
1089#define VTS_PTT_SRPT_SIZE 8U
1090
1091
1095/* Should this be bit field at all or just the uint32_t? */
1096typedef uint32_t map_ent_t;
1097
1101typedef struct {
1102 uint8_t tmu; /* Time unit, in seconds */
1103 uint8_t zero_1;
1104 uint16_t nr_of_entries;
1105 map_ent_t *map_ent;
1106} ATTRIBUTE_PACKED vts_tmap_t;
1107#define VTS_TMAP_SIZE 4U
1108
1112typedef struct {
1113 uint16_t nr_of_tmaps;
1114 uint16_t zero_1;
1115 uint32_t last_byte;
1116 vts_tmap_t *tmap;
1117 uint32_t *tmap_offset; /* offset table for each tmap */
1118} ATTRIBUTE_PACKED vts_tmapt_t;
1119#define VTS_TMAPT_SIZE 8U
1120
1127
1128typedef struct {
1129 uint8_t supported; /* Encrypted Title Key Status */
1130 uint8_t title_key[8];/* This needs to be decrypted using media key */
1131} ATTRIBUTE_PACKED cprm_info_t;
1132#define CPRM_INFO_SIZE 9U
1133
1134typedef struct {
1135 /* Suffix numbers are decimal offsets */
1136 /* 0 */
1137 char id[12];
1138 uint32_t vmg_ea; /* end address */
1139 uint8_t zero_16[12];
1140 uint32_t vmgi_ea; /* includes playlist info after this structure */
1141 uint16_t version; /* specification version */
1142 /* 34 */ /* Different from DVD-Video from here */
1143 uint8_t zero_34[30];
1144 uint8_t tm_zone; /* time zone */
1145 uint16_t still_tm; /* still time for still pictures */
1146 uint8_t txt_encoding; /* as per VideoTextDataUsage.pdf */
1147 uint8_t data_68[30];
1148 /* 98 */
1149 char disc_info1[64]; /* format name, or copy of disc_info2. */
1150 char disc_info2[64]; /* format name, time or user label.. */
1151 uint8_t zero_226[30];
1152 /* 256 */
1153 uint32_t org_pgci_sa; /* original program chain start address */
1154 uint32_t org_pgci_ea; /* end address for the org_pgci */
1155 uint8_t unknown_264[7];
1156 cprm_info_t cprm_info;
1157 uint8_t zero_280[24];
1158 /* 304 */
1159 uint32_t ud_pgcit_sa; /* user defined program chain information table */
1160 uint32_t info_308_sa; /* ? start address */
1161 uint32_t info_312_sa;
1162 uint32_t info_316_sa; /* ? start address */
1163 uint8_t zero_320[32];
1164 uint32_t txtdt_mg_sa; /* extra attributes for programs (chan id etc.) */
1165 uint32_t mnfit_sa; /* manufacturer information table */
1166 uint8_t zero_360[152];
1167} ATTRIBUTE_PACKED rtav_vmgi_t;
1168#define RTAV_VMGI_SIZE 512U
1169
1170typedef struct {
1171 uint8_t audio_attr[3];
1172} ATTRIBUTE_PACKED audio_attr_vr_t;
1173
1174typedef struct {
1175 uint8_t pgtm[5];
1176} ATTRIBUTE_PACKED pgtm_t;
1177
1178/* used throughout the program for timestamps */
1179typedef struct {
1180 uint32_t ptm;
1181 uint16_t ptm_extra; /* extra to DSI pkts */
1182} ATTRIBUTE_PACKED ptm_t;
1183
1184typedef struct {
1185 uint8_t data[12];
1186} ATTRIBUTE_PACKED adj_vob_t;
1187#define ADJ_VOB_SIZE 12U
1188
1189typedef struct {
1190 uint16_t vobu_entn; /* entry vobu */
1191 uint8_t tm_diff; /* time difference */
1192 uint32_t vobu_adr; /* time difference */
1193} ATTRIBUTE_PACKED time_info_t;
1194#define TIME_INFO_SIZE 7U
1195
1196typedef struct {
1197 uint8_t data1;
1198 /* only 14 bits are used for size,
1199 * but use full 16 for easy access. */
1200 uint16_t vobu_size;
1201} ATTRIBUTE_PACKED vobu_info_t;
1202#define VOBU_INFO_SIZE 3U
1203
1204typedef struct {
1205 uint16_t vob_attr;
1206 pgtm_t vob_timestamp;
1207 uint8_t data1;
1208 uint8_t vob_format_id;
1209 ptm_t vob_v_s_ptm;
1210 ptm_t vob_v_e_ptm;
1211} ATTRIBUTE_PACKED vvob_t; /* Virtual VOB */
1212#define VVOB_SIZE 21U
1213
1214typedef struct {
1215 uint16_t nr_of_time_info;
1216 uint16_t nr_of_vobu_info;
1217 uint16_t time_offset;
1218 uint32_t vob_offset;
1219
1220 time_info_t* time_infos;
1221 vobu_info_t* vobu_infos;
1222} ATTRIBUTE_PACKED vobu_map_t;
1223#define VOBU_MAP_SIZE 10U
1224
1225/* This struct can not be packed, since adj_info may be skipped */
1226typedef struct {
1227 vvob_t header; /* The 21-byte header */
1228
1229 /* Always allocated. Contains valid data ONLY if (header.vob_attr & 0x80) */
1230 /* optional */
1231 adj_vob_t adj_info; /* The Optional ADJ block */
1232 /* optional */
1233
1234 vobu_map_t map; /* The Time Map */
1235} pgi_t;
1236
1237typedef struct {
1238 uint16_t video_attr;
1239 uint8_t nr_of_audio_streams;
1240 uint8_t data1;
1241 audio_attr_vr_t audio_attr0;
1242 audio_attr_vr_t audio_attr1;
1243 uint8_t data2[50];
1244} ATTRIBUTE_PACKED vob_format_t;
1245#define VOB_FORMAT_SIZE 60U
1246
1247/* codec settings, done automatically by demuxer */
1248typedef struct {
1249 uint16_t zero1;
1250 uint8_t nr_of_pgi;
1251 uint8_t nr_of_vob_formats;
1252 uint32_t len_org_pgci; /* length of PGCI + PGC_GI */
1253
1254 vob_format_t* vob_formats;
1255} ATTRIBUTE_PACKED pgci_t; /* Program Info Table */
1256#define PGCI_SIZE 8U
1257
1258/* this defines individual video recordings (clips, programs) */
1259typedef struct {
1260 uint16_t nr_of_programs;
1261 uint32_t* program_offsets; /* vobu start addresses */
1262 pgi_t* pgi;
1263} ATTRIBUTE_PACKED pgc_gi_t; /* program locations table */
1264#define PGC_GI_SIZE 2U
1265
1266typedef struct {
1267 uint8_t data1;
1268 uint8_t data2;
1269 uint16_t nr_of_programs; /* Num programs in program set */
1270 char label[64]; /* ASCII. Might not be NUL terminated */
1271 char title[64]; /* Could be same as label, NUL, or another charset */
1272 uint16_t prog_set_id; /* On LG V1.1 discs this is program set ID */
1273 uint16_t first_prog_id; /* ID of first program in this program set */
1274 char data3[6];
1275} ATTRIBUTE_PACKED ud_pgci_t;
1276#define UD_PGCI_SIZE 142U
1277
1278typedef struct {
1279 uint8_t ep_ty; /* type */
1280 ptm_t ep_ptm; /* entry point time pts */
1281} ATTRIBUTE_PACKED m_c_epi_t;
1282#define M_C_EPI_SIZE 7U
1283
1284typedef struct {
1285 uint8_t type;
1286 uint8_t reserved;
1287 union {
1288 struct {
1289 uint8_t group_id;
1290 uint8_t start_image;
1291 } still_id;
1292 uint16_t m_vobi_srpn;
1293 };
1294 uint8_t end_image; /* will be zero if type is movie cell */
1295 uint8_t c_epi_n; /* used to allocate m_c_epi */
1296 ptm_t c_v_s_ptm;
1297 ptm_t c_v_e_ptm;
1298 m_c_epi_t* m_c_epi; /* movie cell entry points. seekable chapters */
1299} ATTRIBUTE_PACKED m_c_gi_t;
1300#define M_C_GI_SIZE 18U
1301
1302#define MOVIE_CELL_TYPE 0
1303#define STILL_CELL_TYPE 2
1304
1305/* this is like a playlist menu, it defines titles (groups of clips) */
1306typedef struct {
1307 uint8_t data1;
1308 uint8_t nr_of_pgci;
1309 uint16_t total_nr_of_programs; /* Num programs on disc */
1310 ud_pgci_t* ud_pgci_items;
1311 uint32_t* ci_offsets;
1312 m_c_gi_t* m_c_gi;
1313} ATTRIBUTE_PACKED ud_pgcit_t; /* global info for Program Set*/
1314#define UD_PGCIT_SIZE 4U
1315
1316#define CI_OFFSET_SIZE 4U
1317
1318#if PRAGMA_PACK
1319#pragma pack()
1320#endif
1321
1322
1329
1330typedef enum{
1331 IFO_UNKNOWN,
1332 IFO_VIDEO,
1333 IFO_AUDIO,
1334 IFO_VIDEO_RECORDING
1335} ifo_format_t;
1336
1337/* format type will be used in order to reduce ammount of code refactoring, hopefully add some
1338 * detection mechanism later as well.
1339 * */
1340typedef struct {
1341
1342
1343 union{
1344 struct{
1345 /* VMGI */
1346 vmgi_mat_t *vmgi_mat;
1347 tt_srpt_t *tt_srpt;
1348 pgc_t *first_play_pgc;
1349 ptl_mait_t *ptl_mait;
1350 vts_atrt_t *vts_atrt;
1351 txtdt_mgi_t *txtdt_mgi;
1352
1353 /* Common */
1354 pgci_ut_t *pgci_ut;
1355 c_adt_t *menu_c_adt;
1356 vobu_admap_t *menu_vobu_admap;
1357
1358 /* VTSI */
1359 vtsi_mat_t *vtsi_mat;
1360 vts_ptt_srpt_t *vts_ptt_srpt;
1361 pgcit_t *vts_pgcit;
1362 vts_tmapt_t *vts_tmapt;
1363 c_adt_t *vts_c_adt;
1364 vobu_admap_t *vts_vobu_admap;
1365 };
1366
1367 struct{
1368 /* SAMG */
1369 samg_mat_t *samg_mat;
1370
1371 /* AMGI */
1372 amgi_mat_t *amgi_mat;
1373 tracks_info_table_t *info_table_first_sector;
1374 tracks_info_table_t *info_table_second_sector;
1375
1376 /* ATSI */
1377 atsi_mat_t *atsi_mat;
1378 atsi_title_table_t *atsi_title_table;
1379
1380 /* ASVS */
1381 asvs_mat_t *asvs_mat;
1382 };
1383
1384 struct{
1385 /* VMGI_MAT for DVD-VR */
1386 rtav_vmgi_t *rtav_vmgi;
1387
1388 /* these two together make up the org_pgci, describe the VRO file's contents */
1389 pgci_t *pgci; /* Program cell information table */
1390 pgc_gi_t *pgc_gi; /* Program cell general information table */
1391
1392 /* the user defined pgci */
1393 ud_pgcit_t *ud_pgcit; /* titles, labels for recordings */
1394
1395 };
1396
1397 };
1398
1399 ifo_format_t ifo_format;
1400
1401} ifo_handle_t;
1402
1403#endif /* LIBDVDREAD_IFO_TYPES_H */
Definition ifo_types.h:955
unsigned char zero1
Definition ifo_types.h:149
uint8_t fosl_btnn
Definition ifo_types.h:973
uint8_t still_time
Definition ifo_types.h:253
uint8_t code_extension
Definition ifo_types.h:125
unsigned char zero3
Definition ifo_types.h:155
unsigned char zero4
Definition ifo_types.h:161
unsigned char zero2
Definition ifo_types.h:152
unsigned char restricted
Definition ifo_types.h:251
unsigned char playback_mode
Definition ifo_types.h:250
Definition ifo_types.h:1340
Definition ifo_types.h:1226