Mercurial > libdvdread4.hg
annotate dvdread/ifo_types.h @ 75:8e12b8e01713 src
Accommodate duplicate language units and pgcs.
Many dvd's are showing up that have titles that have numerous repeated
language unit tables and pgc's. The new release "Up" is an example. I
believe "Dark Knight" also exhibits this. When scanning such discs
with lsdvd (and other programs that scan all titles), libdvdread will
consume many GB of data for these repeated elements and gets very slow
(e.g hours to read all titles) on OS X due to reading the duplicate
data from uncached raw devices.
This patch detects duplicates and reference counts pgc's and pgcit's.
When a duplicate is detected, a reference count is incremented instead
of allocating new memory and re-reading the data.
Patch by John Stebbins.
author | rathann |
---|---|
date | Sun, 09 Dec 2012 21:07:59 +0000 |
parents | 70c34d162e6e |
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 */ |