Mercurial > libdvdread4.hg
annotate dvdread/ifo_types.h @ 77:7299649d578f src
Remove erroneous free().
The address operator is wrong and the memory actually meant
to be freed has already been freed by ifoFree_PGC() anyway.
author | ib |
---|---|
date | Wed, 12 Dec 2012 14:21:16 +0000 |
parents | 8e12b8e01713 |
children |
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; | |
75 | 304 int ref_count; |
3 | 305 } ATTRIBUTE_PACKED pgc_t; |
306 #define PGC_SIZE 236U | |
307 | |
308 /** | |
309 * Program Chain Information Search Pointer. | |
310 */ | |
311 typedef struct { | |
312 uint8_t entry_id; | |
313 unsigned int block_mode : 2; | |
314 unsigned int block_type : 2; | |
315 unsigned int unknown1 : 4; | |
316 uint16_t ptl_id_mask; | |
317 uint32_t pgc_start_byte; | |
318 pgc_t *pgc; | |
319 } ATTRIBUTE_PACKED pgci_srp_t; | |
320 #define PGCI_SRP_SIZE 8U | |
321 | |
322 /** | |
323 * Program Chain Information Table. | |
324 */ | |
325 typedef struct { | |
326 uint16_t nr_of_pgci_srp; | |
327 uint16_t zero_1; | |
328 uint32_t last_byte; | |
329 pgci_srp_t *pgci_srp; | |
75 | 330 int ref_count; |
3 | 331 } ATTRIBUTE_PACKED pgcit_t; |
332 #define PGCIT_SIZE 8U | |
333 | |
334 /** | |
335 * Menu PGCI Language Unit. | |
336 */ | |
337 typedef struct { | |
338 uint16_t lang_code; | |
339 uint8_t lang_extension; | |
340 uint8_t exists; | |
341 uint32_t lang_start_byte; | |
342 pgcit_t *pgcit; | |
343 } ATTRIBUTE_PACKED pgci_lu_t; | |
344 #define PGCI_LU_SIZE 8U | |
345 | |
346 /** | |
347 * Menu PGCI Unit Table. | |
348 */ | |
349 typedef struct { | |
350 uint16_t nr_of_lus; | |
351 uint16_t zero_1; | |
352 uint32_t last_byte; | |
353 pgci_lu_t *lu; | |
354 } ATTRIBUTE_PACKED pgci_ut_t; | |
355 #define PGCI_UT_SIZE 8U | |
356 | |
357 /** | |
358 * Cell Address Information. | |
359 */ | |
360 typedef struct { | |
361 uint16_t vob_id; | |
362 uint8_t cell_id; | |
363 uint8_t zero_1; | |
364 uint32_t start_sector; | |
365 uint32_t last_sector; | |
366 } ATTRIBUTE_PACKED cell_adr_t; | |
367 | |
368 /** | |
369 * Cell Address Table. | |
370 */ | |
371 typedef struct { | |
372 uint16_t nr_of_vobs; /* VOBs */ | |
373 uint16_t zero_1; | |
374 uint32_t last_byte; | |
375 cell_adr_t *cell_adr_table; /* No explicit size given. */ | |
376 } ATTRIBUTE_PACKED c_adt_t; | |
377 #define C_ADT_SIZE 8U | |
378 | |
379 /** | |
380 * VOBU Address Map. | |
381 */ | |
382 typedef struct { | |
383 uint32_t last_byte; | |
384 uint32_t *vobu_start_sectors; | |
385 } ATTRIBUTE_PACKED vobu_admap_t; | |
386 #define VOBU_ADMAP_SIZE 4U | |
387 | |
388 | |
389 | |
390 | |
391 /** | |
392 * VMGI | |
393 * | |
394 * The following structures relate to the Video Manager. | |
395 */ | |
396 | |
397 /** | |
398 * Video Manager Information Management Table. | |
399 */ | |
400 typedef struct { | |
401 char vmg_identifier[12]; | |
402 uint32_t vmg_last_sector; | |
403 uint8_t zero_1[12]; | |
404 uint32_t vmgi_last_sector; | |
405 uint8_t zero_2; | |
406 uint8_t specification_version; | |
407 uint32_t vmg_category; | |
408 uint16_t vmg_nr_of_volumes; | |
409 uint16_t vmg_this_volume_nr; | |
410 uint8_t disc_side; | |
411 uint8_t zero_3[19]; | |
412 uint16_t vmg_nr_of_title_sets; /* Number of VTSs. */ | |
413 char provider_identifier[32]; | |
414 uint64_t vmg_pos_code; | |
415 uint8_t zero_4[24]; | |
416 uint32_t vmgi_last_byte; | |
417 uint32_t first_play_pgc; | |
418 uint8_t zero_5[56]; | |
419 uint32_t vmgm_vobs; /* sector */ | |
420 uint32_t tt_srpt; /* sector */ | |
421 uint32_t vmgm_pgci_ut; /* sector */ | |
422 uint32_t ptl_mait; /* sector */ | |
423 uint32_t vts_atrt; /* sector */ | |
424 uint32_t txtdt_mgi; /* sector */ | |
425 uint32_t vmgm_c_adt; /* sector */ | |
426 uint32_t vmgm_vobu_admap; /* sector */ | |
427 uint8_t zero_6[32]; | |
20 | 428 |
3 | 429 video_attr_t vmgm_video_attr; |
430 uint8_t zero_7; | |
431 uint8_t nr_of_vmgm_audio_streams; /* should be 0 or 1 */ | |
432 audio_attr_t vmgm_audio_attr; | |
433 audio_attr_t zero_8[7]; | |
434 uint8_t zero_9[17]; | |
435 uint8_t nr_of_vmgm_subp_streams; /* should be 0 or 1 */ | |
436 subp_attr_t vmgm_subp_attr; | |
437 subp_attr_t zero_10[27]; /* XXX: how much 'padding' here? */ | |
438 } ATTRIBUTE_PACKED vmgi_mat_t; | |
439 | |
440 typedef struct { | |
441 unsigned int zero_1 : 1; | |
442 unsigned int multi_or_random_pgc_title : 1; /* 0: one sequential pgc title */ | |
443 unsigned int jlc_exists_in_cell_cmd : 1; | |
444 unsigned int jlc_exists_in_prepost_cmd : 1; | |
445 unsigned int jlc_exists_in_button_cmd : 1; | |
446 unsigned int jlc_exists_in_tt_dom : 1; | |
447 unsigned int chapter_search_or_play : 1; /* UOP 1 */ | |
448 unsigned int title_or_time_play : 1; /* UOP 0 */ | |
449 } ATTRIBUTE_PACKED playback_type_t; | |
450 | |
451 /** | |
452 * Title Information. | |
453 */ | |
454 typedef struct { | |
455 playback_type_t pb_ty; | |
456 uint8_t nr_of_angles; | |
457 uint16_t nr_of_ptts; | |
458 uint16_t parental_id; | |
459 uint8_t title_set_nr; | |
460 uint8_t vts_ttn; | |
461 uint32_t title_set_sector; | |
462 } ATTRIBUTE_PACKED title_info_t; | |
463 | |
464 /** | |
465 * PartOfTitle Search Pointer Table. | |
466 */ | |
467 typedef struct { | |
468 uint16_t nr_of_srpts; | |
469 uint16_t zero_1; | |
470 uint32_t last_byte; | |
471 title_info_t *title; | |
472 } ATTRIBUTE_PACKED tt_srpt_t; | |
473 #define TT_SRPT_SIZE 8U | |
474 | |
475 | |
476 /** | |
477 * Parental Management Information Unit Table. | |
478 * Level 1 (US: G), ..., 7 (US: NC-17), 8 | |
479 */ | |
64 | 480 #define PTL_MAIT_NUM_LEVEL 8 |
481 typedef uint16_t pf_level_t[PTL_MAIT_NUM_LEVEL]; | |
3 | 482 |
483 /** | |
484 * Parental Management Information Unit Table. | |
485 */ | |
486 typedef struct { | |
487 uint16_t country_code; | |
488 uint16_t zero_1; | |
489 uint16_t pf_ptl_mai_start_byte; | |
490 uint16_t zero_2; | |
491 pf_level_t *pf_ptl_mai; /* table of (nr_of_vtss + 1), video_ts is first */ | |
492 } ATTRIBUTE_PACKED ptl_mait_country_t; | |
493 #define PTL_MAIT_COUNTRY_SIZE 8U | |
494 | |
495 /** | |
496 * Parental Management Information Table. | |
497 */ | |
498 typedef struct { | |
499 uint16_t nr_of_countries; | |
500 uint16_t nr_of_vtss; | |
501 uint32_t last_byte; | |
502 ptl_mait_country_t *countries; | |
503 } ATTRIBUTE_PACKED ptl_mait_t; | |
504 #define PTL_MAIT_SIZE 8U | |
505 | |
506 /** | |
507 * Video Title Set Attributes. | |
508 */ | |
509 typedef struct { | |
510 uint32_t last_byte; | |
511 uint32_t vts_cat; | |
20 | 512 |
3 | 513 video_attr_t vtsm_vobs_attr; |
514 uint8_t zero_1; | |
515 uint8_t nr_of_vtsm_audio_streams; /* should be 0 or 1 */ | |
516 audio_attr_t vtsm_audio_attr; | |
20 | 517 audio_attr_t zero_2[7]; |
3 | 518 uint8_t zero_3[16]; |
519 uint8_t zero_4; | |
520 uint8_t nr_of_vtsm_subp_streams; /* should be 0 or 1 */ | |
521 subp_attr_t vtsm_subp_attr; | |
522 subp_attr_t zero_5[27]; | |
20 | 523 |
3 | 524 uint8_t zero_6[2]; |
20 | 525 |
3 | 526 video_attr_t vtstt_vobs_video_attr; |
527 uint8_t zero_7; | |
528 uint8_t nr_of_vtstt_audio_streams; | |
529 audio_attr_t vtstt_audio_attr[8]; | |
530 uint8_t zero_8[16]; | |
531 uint8_t zero_9; | |
532 uint8_t nr_of_vtstt_subp_streams; | |
533 subp_attr_t vtstt_subp_attr[32]; | |
534 } ATTRIBUTE_PACKED vts_attributes_t; | |
535 #define VTS_ATTRIBUTES_SIZE 542U | |
536 #define VTS_ATTRIBUTES_MIN_SIZE 356U | |
537 | |
538 /** | |
539 * Video Title Set Attribute Table. | |
540 */ | |
541 typedef struct { | |
542 uint16_t nr_of_vtss; | |
543 uint16_t zero_1; | |
544 uint32_t last_byte; | |
545 vts_attributes_t *vts; | |
546 uint32_t *vts_atrt_offsets; /* offsets table for each vts_attributes */ | |
547 } ATTRIBUTE_PACKED vts_atrt_t; | |
548 #define VTS_ATRT_SIZE 8U | |
549 | |
550 /** | |
551 * Text Data. (Incomplete) | |
552 */ | |
553 typedef struct { | |
554 uint32_t last_byte; /* offsets are relative here */ | |
555 uint16_t offsets[100]; /* == nr_of_srpts + 1 (first is disc title) */ | |
20 | 556 #if 0 |
3 | 557 uint16_t unknown; /* 0x48 ?? 0x48 words (16bit) info following */ |
558 uint16_t zero_1; | |
20 | 559 |
3 | 560 uint8_t type_of_info; /* ?? 01 == disc, 02 == Title, 04 == Title part */ |
561 uint8_t unknown1; | |
562 uint8_t unknown2; | |
563 uint8_t unknown3; | |
564 uint8_t unknown4; /* ?? allways 0x30 language?, text format? */ | |
565 uint8_t unknown5; | |
566 uint16_t offset; /* from first */ | |
20 | 567 |
3 | 568 char text[12]; /* ended by 0x09 */ |
569 #endif | |
570 } ATTRIBUTE_PACKED txtdt_t; | |
571 | |
572 /** | |
573 * Text Data Language Unit. (Incomplete) | |
20 | 574 */ |
3 | 575 typedef struct { |
576 uint16_t lang_code; | |
577 uint16_t unknown; /* 0x0001, title 1? disc 1? side 1? */ | |
578 uint32_t txtdt_start_byte; /* prt, rel start of vmg_txtdt_mgi */ | |
579 txtdt_t *txtdt; | |
580 } ATTRIBUTE_PACKED txtdt_lu_t; | |
581 #define TXTDT_LU_SIZE 8U | |
582 | |
583 /** | |
584 * Text Data Manager Information. (Incomplete) | |
585 */ | |
586 typedef struct { | |
587 char disc_name[14]; /* how many bytes?? */ | |
588 uint16_t nr_of_language_units; /* 32bit?? */ | |
589 uint32_t last_byte; | |
590 txtdt_lu_t *lu; | |
591 } ATTRIBUTE_PACKED txtdt_mgi_t; | |
592 #define TXTDT_MGI_SIZE 20U | |
593 | |
594 | |
595 /** | |
596 * VTS | |
597 * | |
598 * Structures relating to the Video Title Set (VTS). | |
599 */ | |
600 | |
601 /** | |
602 * Video Title Set Information Management Table. | |
603 */ | |
604 typedef struct { | |
605 char vts_identifier[12]; | |
606 uint32_t vts_last_sector; | |
607 uint8_t zero_1[12]; | |
608 uint32_t vtsi_last_sector; | |
609 uint8_t zero_2; | |
610 uint8_t specification_version; | |
611 uint32_t vts_category; | |
612 uint16_t zero_3; | |
613 uint16_t zero_4; | |
614 uint8_t zero_5; | |
615 uint8_t zero_6[19]; | |
616 uint16_t zero_7; | |
617 uint8_t zero_8[32]; | |
618 uint64_t zero_9; | |
619 uint8_t zero_10[24]; | |
620 uint32_t vtsi_last_byte; | |
621 uint32_t zero_11; | |
622 uint8_t zero_12[56]; | |
623 uint32_t vtsm_vobs; /* sector */ | |
624 uint32_t vtstt_vobs; /* sector */ | |
625 uint32_t vts_ptt_srpt; /* sector */ | |
626 uint32_t vts_pgcit; /* sector */ | |
627 uint32_t vtsm_pgci_ut; /* sector */ | |
628 uint32_t vts_tmapt; /* sector */ | |
629 uint32_t vtsm_c_adt; /* sector */ | |
630 uint32_t vtsm_vobu_admap; /* sector */ | |
631 uint32_t vts_c_adt; /* sector */ | |
632 uint32_t vts_vobu_admap; /* sector */ | |
633 uint8_t zero_13[24]; | |
20 | 634 |
3 | 635 video_attr_t vtsm_video_attr; |
636 uint8_t zero_14; | |
637 uint8_t nr_of_vtsm_audio_streams; /* should be 0 or 1 */ | |
638 audio_attr_t vtsm_audio_attr; | |
639 audio_attr_t zero_15[7]; | |
640 uint8_t zero_16[17]; | |
641 uint8_t nr_of_vtsm_subp_streams; /* should be 0 or 1 */ | |
642 subp_attr_t vtsm_subp_attr; | |
643 subp_attr_t zero_17[27]; | |
644 uint8_t zero_18[2]; | |
20 | 645 |
3 | 646 video_attr_t vts_video_attr; |
647 uint8_t zero_19; | |
648 uint8_t nr_of_vts_audio_streams; | |
649 audio_attr_t vts_audio_attr[8]; | |
650 uint8_t zero_20[17]; | |
651 uint8_t nr_of_vts_subp_streams; | |
652 subp_attr_t vts_subp_attr[32]; | |
653 uint16_t zero_21; | |
654 multichannel_ext_t vts_mu_audio_attr[8]; | |
655 /* XXX: how much 'padding' here, if any? */ | |
656 } ATTRIBUTE_PACKED vtsi_mat_t; | |
657 | |
658 /** | |
659 * PartOfTitle Unit Information. | |
660 */ | |
661 typedef struct { | |
662 uint16_t pgcn; | |
663 uint16_t pgn; | |
664 } ATTRIBUTE_PACKED ptt_info_t; | |
665 | |
666 /** | |
667 * PartOfTitle Information. | |
668 */ | |
669 typedef struct { | |
670 uint16_t nr_of_ptts; | |
671 ptt_info_t *ptt; | |
672 } ATTRIBUTE_PACKED ttu_t; | |
673 | |
674 /** | |
675 * PartOfTitle Search Pointer Table. | |
676 */ | |
677 typedef struct { | |
678 uint16_t nr_of_srpts; | |
679 uint16_t zero_1; | |
680 uint32_t last_byte; | |
681 ttu_t *title; | |
682 uint32_t *ttu_offset; /* offset table for each ttu */ | |
683 } ATTRIBUTE_PACKED vts_ptt_srpt_t; | |
684 #define VTS_PTT_SRPT_SIZE 8U | |
685 | |
686 | |
687 /** | |
688 * Time Map Entry. | |
689 */ | |
690 /* Should this be bit field at all or just the uint32_t? */ | |
691 typedef uint32_t map_ent_t; | |
692 | |
693 /** | |
694 * Time Map. | |
695 */ | |
696 typedef struct { | |
697 uint8_t tmu; /* Time unit, in seconds */ | |
698 uint8_t zero_1; | |
699 uint16_t nr_of_entries; | |
700 map_ent_t *map_ent; | |
701 } ATTRIBUTE_PACKED vts_tmap_t; | |
702 #define VTS_TMAP_SIZE 4U | |
703 | |
704 /** | |
705 * Time Map Table. | |
706 */ | |
707 typedef struct { | |
708 uint16_t nr_of_tmaps; | |
709 uint16_t zero_1; | |
710 uint32_t last_byte; | |
711 vts_tmap_t *tmap; | |
712 uint32_t *tmap_offset; /* offset table for each tmap */ | |
713 } ATTRIBUTE_PACKED vts_tmapt_t; | |
714 #define VTS_TMAPT_SIZE 8U | |
715 | |
716 | |
717 #if PRAGMA_PACK | |
718 #pragma pack() | |
719 #endif | |
720 | |
721 | |
722 /** | |
723 * The following structure defines an IFO file. The structure is divided into | |
724 * two parts, the VMGI, or Video Manager Information, which is read from the | |
725 * VIDEO_TS.[IFO,BUP] file, and the VTSI, or Video Title Set Information, which | |
726 * is read in from the VTS_XX_0.[IFO,BUP] files. | |
727 */ | |
728 typedef struct { | |
729 dvd_file_t *file; | |
20 | 730 |
3 | 731 /* VMGI */ |
732 vmgi_mat_t *vmgi_mat; | |
733 tt_srpt_t *tt_srpt; | |
20 | 734 pgc_t *first_play_pgc; |
3 | 735 ptl_mait_t *ptl_mait; |
736 vts_atrt_t *vts_atrt; | |
737 txtdt_mgi_t *txtdt_mgi; | |
20 | 738 |
3 | 739 /* Common */ |
740 pgci_ut_t *pgci_ut; | |
741 c_adt_t *menu_c_adt; | |
742 vobu_admap_t *menu_vobu_admap; | |
20 | 743 |
3 | 744 /* VTSI */ |
745 vtsi_mat_t *vtsi_mat; | |
746 vts_ptt_srpt_t *vts_ptt_srpt; | |
747 pgcit_t *vts_pgcit; | |
748 vts_tmapt_t *vts_tmapt; | |
749 c_adt_t *vts_c_adt; | |
750 vobu_admap_t *vts_vobu_admap; | |
751 } ifo_handle_t; | |
752 | |
23 | 753 #endif /* LIBDVDREAD_IFO_TYPES_H */ |