]> git.sesse.net Git - vlc/blob - plugins/dvd/dvd_ifo.h
-changes in gnome interface
[vlc] / plugins / dvd / dvd_ifo.h
1 /*****************************************************************************
2  * dvd_ifo.h: Structures for ifo parsing
3  *****************************************************************************
4  * Copyright (C) 1999-2001 VideoLAN
5  * $Id: dvd_ifo.h,v 1.11 2001/04/08 07:24:47 stef Exp $
6  *
7  * Author: Stéphane Borel <stef@via.ecp.fr>
8  *
9  * based on:
10  *  - libifo by Thomas Mirlacher <dent@cosy.sbg.ac.at>
11  *  - IFO structure documentation by Thomas Mirlacher, Björn Englund,
12  *  Håkan Hjort
13  * 
14  * This program is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 of the License, or
17  * (at your option) any later version.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software
26  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
27  *****************************************************************************/
28
29 /*****************************************************************************
30  * Common structures for Video Management and Video Title sets
31  *****************************************************************************/
32
33 /*
34  * Program Chain structures
35  */
36 typedef struct ifo_video_s
37 {
38     u8      i_compression         ;// 2;
39     u8      i_system              ;// 2;
40     u8      i_ratio               ;// 2;
41     u8      i_perm_displ          ;// 2;
42
43     u8      i_line21_1            ;// 1;
44     u8      i_line21_2            ;// 1;
45     u8      i_source_res          ;// 2;
46     u8      i_letterboxed         ;// 1;
47     u8      i_mode                ;// 1;
48 } ifo_video_t;
49
50 /* Audio type information */
51 typedef struct ifo_audio_s
52 {
53     u8      i_coding_mode         ;// 3;
54     u8      i_multichannel_extension  ;// 1;
55     u8      i_type                ;// 2;
56     u8      i_appl_mode           ;// 2;
57
58     u8      i_quantization        ;// 2;
59     u8      i_sample_freq         ;// 2;
60     u8      i_test                ;// 1;
61     u8      i_num_channels        ;// 3;
62     u16     i_lang_code           ;// 16;   // <char> description
63     u8      i_foo                 ;// 8;    // 0x00000000 ?
64     u8      i_caption             ;// 8;
65     u8      i_bar                 ;// 8;    // 0x00000000 ?
66 } ifo_audio_t;
67
68 typedef struct ifo_spu_t
69 {
70     u16     i_prefix              ;// 16;   // 0x0100 ?
71     u16     i_lang_code           ;// 16;   // <char> description
72     u8      i_foo                 ;// 8;    // dont know
73     u8      i_caption             ;// 8;    // 0x00 ?
74 } ifo_spu_t;
75
76
77
78 /* Ifo vitual machine Commands */
79 typedef struct command_desc_s
80 {
81     u8              i_type      :3;
82     u8              i_direct    :1;
83     u8              i_cmd       :4;
84     u8              i_dir_cmp   :1;
85     u8              i_cmp       :3;
86     u8              i_sub_cmd   :4;
87     union
88     {
89         u8          pi_8[6];
90         u16         pi_16[3];
91     } data;
92 } command_desc_t;
93
94 /* Program Chain Command Table
95   - start at i_pgc_com_tab_sbyte */
96 typedef struct command_s
97 {
98     u16             i_pre_command_nb;               // 2 bytes
99     u16             i_post_command_nb;              // 2 bytes
100     u16             i_cell_command_nb;              // 2 bytes
101 //    char[2]         ???
102     command_desc_t* p_pre_command;                  // i_pre_com_nb * 8 bytes
103     command_desc_t* p_post_command;                 // i_post_com_nb * 8 bytes
104     command_desc_t* p_cell_command;                 // i_cell_com_nb * 8 bytes
105 } command_t;
106
107 /* Program Chain Map Table
108  * - start at "i_pgc_prg_map_sbyte" */
109 typedef struct chapter_map_s
110 {
111     u8*             pi_start_cell;              // i_prg_nb * 1 byte 
112 } chapter_map_t;
113
114 /* Cell Playback Information Table
115  * we have a pointer to such a structure for each cell  
116  * - first start at "i_cell_play_inf_sbyte" */
117 typedef struct cell_play_s
118 {
119     /* This information concerns the currently selected cell */
120     u16             i_category;                      // 2 bytes
121     u8              i_still_time;               // 1 byte; in seconds; ff=inf
122     u8              i_command_nb;                   // 1 byte; 0 = no com
123     u32             i_play_time;                // 4 bytes
124     u32             i_start_sector;             // 4 bytes
125     u32             i_first_ilvu_vobu_esector;  // 4 bytes; ???
126     u32             i_last_vobu_start_sector;            // 4 bytes
127     u32             i_end_sector;                  // 4 bytes
128 } cell_play_t;
129
130 /* Cell Position Information Table
131  * we have a pointer to such a structure for each cell 
132  * - first start at "i_cell_pos_inf_sbyte" */
133 typedef struct cell_pos_s
134 {
135     /* This information concerns the currently selected cell */
136     u16             i_vob_id;                   // 2 bytes
137 //    char            ???
138     u8              i_cell_id;                  // 1 byte
139 } cell_pos_t;
140
141 /* Main structure for Program Chain
142  * - start at i_fp_pgc_sbyte
143  * - or at i_vmgm_pgci_sbyte in vmgm_pgci_srp_t */
144 typedef struct title_s
145 {
146     /* Global features of program chain */
147 //    char[2]         ???
148     u8              i_chapter_nb;                   // 1 byte
149     u8              i_cell_nb;                  // 1 byte
150     u32             i_play_time;                // 4 bytes
151     u32             i_prohibited_user_op;       // 4 bytes
152     u16             pi_audio_status[8];         // 8*2 bytes
153     u32             pi_subpic_status[32];       // 32*4 bytes
154     u16             i_next_title_num;              // 2 bytes
155     u16             i_prev_title_num;              // 2 bytes
156     u16             i_go_up_title_num;              // 2 bytes
157     u8              i_still_time;               // 1 byte ; in seconds
158     u8              i_play_mode;                // 1 byte
159     /* In video_ts.ifo, the 3 significant bytes of each color are
160      * preceded by 1 unsignificant byte */
161     u32             pi_yuv_color[16];           // 16*3 bytes
162     /* Here come the start bytes of the following structures */
163     u16             i_command_start_byte;            // 2 bytes
164     u16             i_chapter_map_start_byte;            // 2 bytes
165     u16             i_cell_play_start_byte;      // 2 bytes
166     u16             i_cell_pos_start_byte;       // 2 bytes
167     /* Predefined structures */
168     command_t       command;
169     chapter_map_t   chapter_map;
170     cell_play_t*    p_cell_play;           // i_cell_nb * 24 bytes
171     cell_pos_t*     p_cell_pos;             // i_cell_nb * 4 bytes
172 } title_t;
173
174 /*
175  * Menu PGCI Unit Table
176  */
177
178 /* Menu PGCI Language unit Descriptor */
179 typedef struct unit_s
180 {
181     char            ps_lang_code[2];            // 2 bytes (ISO-xx)
182 //    char            ???
183     u8              i_existence_mask;           // 1 byte
184     u32             i_unit_inf_start_byte;                 // 4 bytes
185 } unit_t;
186
187 typedef struct unit_title_s
188 {
189     u8              i_category_mask;             // 1 byte
190     u8              i_category;                  // 1 byte
191     u16             i_parental_mask;                 // 2 bytes
192     u32             i_title_start_byte;               // 4 bytes
193     title_t         title;
194 } unit_title_t;
195
196 /* Menu PGCI Language Unit Table 
197  * - start at i_lu_sbyte */
198 typedef struct unit_inf_s
199 {
200     u16             i_title_nb;                   // 2 bytes
201 //    char[2]         ???
202     u32             i_end_byte;                 // 4 bytes
203     unit_title_t *  p_title;                      // i_srp_nb * 8 bytes
204 } unit_inf_t;
205
206 /* Main Struct for Menu PGCI
207  * - start at i_*_pgci_ut_ssector */
208 typedef struct title_unit_s
209 {
210     u16             i_unit_nb;                    // 2 bytes; ???
211 //    char[2]         ???
212     u32             i_end_byte;                    // 4 bytes
213     unit_t*         p_unit;                       // i_lu_nb * 8 bytes
214     unit_inf_t*     p_unit_inf;                 // i_lu_nb * 8 bytes
215 } title_unit_t;
216
217 /*
218  * Cell Adress Table Information
219  */
220 typedef struct cell_map_s
221 {
222     u16             i_vob_id;                   // 2 bytes
223     u8              i_cell_id;                  // 1 byte
224 //    char            ???
225     u32             i_start_sector;                  // 4 bytes
226     u32             i_end_sector;                  // 4 bytes
227 } cell_map_t;
228
229 typedef struct cell_inf_s
230 {
231     u16             i_vob_nb;                   // 2 bytes
232 //    char[2]         ???
233     u32             i_end_byte;                    // 4 bytes
234     u16             i_cell_nb;                  // not in ifo; computed
235                                                 // with e_byte
236     cell_map_t*     p_cell_map;
237 } cell_inf_t;
238
239
240 /*
241  * VOBU Adress Map Table
242  */
243 typedef struct vobu_map_s
244 {
245     u32             i_end_byte;                    // 4 bytes
246     u32*            pi_vobu_start_sector;            // (nb of vobu) * 4 bytes
247 } vobu_map_t;
248
249 /*****************************************************************************
250  * Structures for Video Management (cf video_ts.ifo)
251  *****************************************************************************/
252
253 /* 
254  * Video Manager Information Management Table
255  */ 
256 typedef struct manager_inf_s
257 {
258     char            psz_id[13];                 // 12 bytes (DVDVIDEO-VMG)
259     u32             i_vmg_end_sector;                  // 4 bytes
260 //    char[12]        ???
261     u32             i_vmg_inf_end_sector;                // 4 bytes
262 //    char            ???
263     u8              i_spec_ver;                 // 1 byte
264     u32             i_cat;                      // 4 bytes
265     u16             i_volume_nb;                   // 2 bytes
266     u16             i_volume;                      // 2 bytes
267     u8              i_disc_side;                // 1 bytes
268 //    char[20]        ???
269     u16             i_title_set_nb;                   // 2 bytes
270     char            ps_provider_id[32];         // 32 bytes
271     u64             i_pos_code;                 // 8 bytes
272 //    char[24]        ???
273     u32             i_vmg_inf_end_byte;              // 4 bytes
274     u32             i_first_play_title_start_byte;             // 4 bytes
275 //    char[56]        ???
276     u32             i_vob_start_sector;             // 4 bytes
277     u32             i_title_inf_start_sector;         // 4 bytes
278     u32             i_title_unit_start_sector;          // 4 bytes
279     u32             i_parental_inf_start_sector;         // 4 bytes
280     u32             i_vts_inf_start_sector;         // 4 bytes
281     u32             i_text_data_start_sector;         // 4 bytes
282     u32             i_cell_inf_start_sector;            // 4 bytes
283     u32             i_vobu_map_start_sector;       // 4 bytes
284 //    char[2]         ???
285     ifo_video_t     video_attr;                 // 2 bytes
286 //    char            ???
287     u8              i_audio_nb;                 // 1 byte
288     ifo_audio_t     p_audio_attr[8];            // i_vmgm_audio_nb * 8 bytes
289 //    char[16]        ???
290     u8              i_spu_nb;                // 1 byte
291     ifo_spu_t       p_spu_attr[32];          // i_subpic_nb * 6 bytes
292 } manager_inf_t;
293
294
295 /* 
296  * Part Of Title Search Pointer Table Information
297  */
298
299 /* Title sets structure
300  * we have a pointer to this structure for each tts */
301 typedef struct title_attr_s
302 {
303     u8              i_play_type;                // 1 byte
304     u8              i_angle_nb;                 // 1 byte
305     u16             i_chapter_nb;                  // 2 bytes; Chapters/PGs
306     u16             i_parental_id;              // 2 bytes
307     u8              i_title_set_num;            // 1 byte (VTS#)
308     u8              i_title_num;                 // 1 byte ???
309     u32             i_start_sector;              // 4 bytes
310 } title_attr_t;
311
312 /* Main struct for tts
313  * - start at "i_vmg_ptt_srpt_ssector" */
314 typedef struct title_inf_s
315 {
316     u16             i_title_nb;                   // 2 bytes
317 //    char[2]         ???
318     u32             i_end_byte;                    // 4 bytes
319     title_attr_t *  p_attr;                     // i_ttu_nb * 12 bytes
320 } title_inf_t;
321
322 /*
323  * Parental Management Information Table
324  */
325 typedef struct parental_desc_s
326 {
327     char            ps_country_code[2];         // 2 bytes
328 //    char[2]         ???
329     u16             i_parental_mask_start_byte;            // 2 bytes
330 //    char[2]         ???
331 } parental_desc_t;
332
333 typedef struct parental_mask_s
334 {
335     u16*            ppi_mask[8];            // (i_vts_nb +1) * 8 * 2 bytes
336 } parental_mask_t;
337
338 /* Main struct for parental management
339  * - start at i_vmg_ptl_mait_ssector */
340 typedef struct parental_inf_s
341 {
342     u16             i_country_nb;               // 2 bytes
343     u16             i_vts_nb;                   // 2 bytes
344     u32             i_end_byte;                    // 4 bytes
345     parental_desc_t* p_parental_desc;             // i_country_nb * 8 bytes
346     parental_mask_t* p_parental_mask;        // i_country_nb * sizeof(vmg_ptl_mask_t)
347 } parental_inf_t;
348
349 /*
350  * Video Title Set Attribute Table
351  */
352
353 /* Attribute structure : one for each vts
354  * - start at pi_atrt_sbyte */
355 typedef struct vts_attr_s
356 {
357     u32             i_end_byte;                    // 4 bytes
358     u32             i_cat_app_type;             // 4 bytes
359     ifo_video_t     vts_menu_video_attr;          // 2 bytes
360 //    char            ???
361     u8              i_vts_menu_audio_nb;            // 1 byte
362     ifo_audio_t     p_vts_menu_audio_attr[8];       // 8 * 8 bytes
363 //    char[17]        ???
364     u8              i_vts_menu_spu_nb;           // 1 byte
365     ifo_spu_t       p_vts_menu_spu_attr[28];     // i_vtsm_subpic_nb * 6 bytes
366 //    char[2]         ???
367     ifo_video_t     vts_title_video_attr;         // 2 bytes
368 //    char            ???
369     u8              i_vts_title_audio_nb;           // 1 byte
370     ifo_audio_t     p_vts_title_audio_attr[8];      // 8 * 8 bytes
371 //    char[17]        ???
372     u8              i_vts_title_spu_nb;          // 1 byte
373     ifo_spu_t       p_vts_title_spu_attr[28];    // i_vtstt_subpic_nb * 6 bytes
374 } vts_attr_t;
375
376 /* Main struct for vts attributes
377  * - start at i_vmg_vts_atrt_ssector */
378 typedef struct vts_inf_s
379 {
380     u16             i_vts_nb;                   // 2 bytes
381 //    char[2]         ???
382     u32             i_end_byte;                    // 4 bytes
383     u32*            pi_vts_attr_start_byte;          // i_vts_nb * 4 bytes
384     vts_attr_t*     p_vts_attr;
385 } vts_inf_t;
386
387 /* 
388  * Global Structure for Video Manager
389  */
390 typedef struct vmg_s 
391 {
392     manager_inf_t       manager_inf;
393     title_t             title;
394     title_inf_t         title_inf;
395     title_unit_t        title_unit;
396     parental_inf_t      parental_inf;
397     vts_inf_t           vts_inf;
398     cell_inf_t          cell_inf;
399     vobu_map_t          vobu_map;
400 } vmg_t;
401
402 /*****************************************************************************
403  * Structures for Video Title Sets (cf vts_*.ifo)
404  ****************************************************************************/
405
406 /* 
407  * Video Title Sets Information Management Table
408  */ 
409 typedef struct vts_manager_s
410 {
411     char            psz_id[13];                 // 12 bytes (DVDVIDEO-VTS)
412     u32             i_end_sector;                  // 4 bytes
413 //    char[12]        ???
414     u32             i_inf_end_sector;                // 4 bytes
415 //    char            ???
416     u8              i_spec_ver;                 // 1 byte
417     u32             i_cat;                      // 4 bytes
418 //    char[90]        ???
419     u32             i_inf_end_byte;                // 4 bytes
420 //    char[60]        ???
421     u32             i_menu_vob_start_sector;           // 4 bytes
422     u32             i_title_vob_start_sector;          // 4 bytes
423     u32             i_title_inf_start_sector;         // 4 bytes
424     u32             i_title_unit_start_sector;            // 4 bytes
425     u32             i_menu_unit_start_sector;        // 4 bytes
426     u32             i_time_inf_start_sector;          // 4 bytes
427     u32             i_menu_cell_inf_start_sector;          // 4 bytes
428     u32             i_menu_vobu_map_start_sector;     // 4 bytes
429     u32             i_cell_inf_start_sector;            // 4 bytes
430     u32             i_vobu_map_start_sector;       // 4 bytes
431 //    char[24]        ???
432     ifo_video_t     menu_video_attr;               // 2 bytes
433 //    char            ???
434     u8              i_menu_audio_nb;               // 1 byte
435     ifo_audio_t     p_menu_audio_attr[8];          // i_vmgm_audio_nb * 8 bytes
436 //    char[16]        ???
437     u8              i_menu_spu_nb;              // 1 byte
438     ifo_spu_t       p_menu_spu_attr[32];        // i_subpic_nb * 6 bytes
439                                                 // !!! only 28 subpics ???
440 //    char[2]         ???
441     ifo_video_t     video_attr;                 // 2 bytes
442 //    char            ???
443     u8              i_audio_nb;                 // 1 byte
444     ifo_audio_t     p_audio_attr[8];            // i_vmgm_audio_nb * 8 bytes
445 //    char[16]        ???
446     u8              i_spu_nb;                // 1 byte
447     ifo_spu_t       p_spu_attr[32];          // i_subpic_nb * 6 bytes
448 } vts_manager_t;
449
450 /* 
451  * Part Of Title Search Pointer Table Information
452  */
453
454 /* Title sets structure
455  * we have a pointer to this structure for each tts */
456 typedef struct title_start_s
457 {
458     u16             i_program_chain_num;                   // 2 bytes; Chapters/PGs
459     u16             i_program_num;                   // 2 bytes
460 } title_start_t;
461
462 /* Main struct for tts
463  * - start at "i_vts_ptt_srpt_ssector" */
464 typedef struct vts_title_s
465 {
466     u16             i_title_nb;                   // 2 bytes
467 //    char[2]         ???
468     u32             i_end_byte;                    // 4 bytes
469     u32*            pi_start_byte;
470     title_start_t * p_title_start;                      // i_ttu_nb * 4 bytes
471 } vts_title_t;
472
473 /*
474  * Time Map table information
475  */
476
477 /* Time Map structure */
478 typedef struct time_map_s
479 {
480     u8              i_time_unit;                // 1 byte
481 //    char            ???
482     u16             i_entry_nb;                 // 2 bytes
483     u32*            pi_sector;                  // i_entry_nb * 4 bytes
484 } time_map_t;
485
486 /* Main structure for tmap_ti
487  * - start at "i_tmap_ti_ssector" */
488 typedef struct time_inf_s
489 {
490     u16             i_nb;                       // 2 bytes
491 //    char[2]         ???
492     u32             i_end_byte;                    // 4 bytes
493     u32*            pi_start_byte;                   // i_tmap_nb * 4 bytes
494     time_map_t*     p_time_map;
495 } time_inf_t;
496
497 /*
498  * Video Title Set 
499  */
500 typedef struct vts_s
501 {
502     boolean_t       b_initialized;
503     off_t           i_pos;
504     vts_manager_t   manager_inf;
505     vts_title_t     title_inf;
506     title_unit_t    menu_unit;
507     unit_inf_t      title_unit;
508     time_inf_t      time_inf;
509     cell_inf_t      menu_cell_inf;
510     vobu_map_t      menu_vobu_map;
511     cell_inf_t      cell_inf;
512     vobu_map_t      vobu_map;
513 } vts_t;
514
515 /*
516  *  Global Ifo Structure
517  */
518 typedef struct ifo_s
519 {
520     int             i_fd;           /* File descriptor for the device */
521     off_t           i_off;          /* Offset to video_ts.ifo on the device */
522     off_t           i_pos;          /* Position of stream pointer */
523     boolean_t       b_error;        /* Error Management */
524     vmg_t           vmg;            /* Structure described in video_ts */
525     int             i_title;        /* Current title number */
526     vts_t           vts;            /* Vts ifo for current title set */
527 } ifo_t;
528