~ubuntu-branches/debian/sid/mplayer/sid

« back to all changes in this revision

Viewing changes to dvdread/ifo_print.c

  • Committer: Bazaar Package Importer
  • Author(s): A Mennucc1
  • Date: 2009-03-23 10:05:45 UTC
  • mfrom: (4.1.4 sid)
  • Revision ID: james.westby@ubuntu.com-20090323100545-x8h79obawnnte7kk
Tags: 1.0~rc2+svn20090303-5
debian/control : move docbook-xml,docbook-xsl,xsltproc from 
Build-Depends-Indep to Build-Depends, since they are needed to run
configure

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
 
/* 
3
 
 * Copyright (C) 2000, 2001, 2002, 2003
4
 
 *               Bj�rn Englund <d4bjorn@dtek.chalmers.se>, 
5
 
 *               H�kan Hjort <d95hjort@dtek.chalmers.se>
6
 
 *
7
 
 * Modified for use with MPlayer, changes contained in libdvdread_changes.diff.
8
 
 * detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
9
 
 * $Id: ifo_print.c 24070 2007-08-15 11:57:30Z diego $
10
 
 *
11
 
 * This program is free software; you can redistribute it and/or modify
12
 
 * it under the terms of the GNU General Public License as published by
13
 
 * the Free Software Foundation; either version 2 of the License, or
14
 
 * (at your option) any later version.
15
 
 *
16
 
 * This program is distributed in the hope that it will be useful,
17
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 
 * GNU General Public License for more details.
20
 
 *
21
 
 * You should have received a copy of the GNU General Public License
22
 
 * along with this program; if not, write to the Free Software
23
 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
 
 */
25
 
 
26
 
#include "config.h"
27
 
 
28
 
#include <stdio.h>
29
 
#include <stdlib.h>
30
 
#include <unistd.h>
31
 
#include <string.h>
32
 
#include <ctype.h>
33
 
 
34
 
#if defined(HAVE_INTTYPES_H)
35
 
#include <inttypes.h>
36
 
#elif defined(HAVE_STDINT_H)
37
 
#include <stdint.h>
38
 
#endif
39
 
 
40
 
#include "ifo_types.h"
41
 
#include "ifo_read.h"
42
 
#include "ifo_print.h"
43
 
#include "cmd_print.h"
44
 
#include "dvdread_internal.h"
45
 
 
46
 
/* Put this in some other file / package?  It's used in nav_print too. */
47
 
static void ifoPrint_time(dvd_time_t *dtime) {
48
 
  const char *rate;
49
 
  CHECK_VALUE((dtime->hour>>4) < 0xa && (dtime->hour&0xf) < 0xa);
50
 
  CHECK_VALUE((dtime->minute>>4) < 0x7 && (dtime->minute&0xf) < 0xa);
51
 
  CHECK_VALUE((dtime->second>>4) < 0x7 && (dtime->second&0xf) < 0xa);
52
 
  CHECK_VALUE((dtime->frame_u&0xf) < 0xa);
53
 
  
54
 
  printf("%02x:%02x:%02x.%02x", 
55
 
         dtime->hour,
56
 
         dtime->minute,
57
 
         dtime->second,
58
 
         dtime->frame_u & 0x3f);
59
 
  switch((dtime->frame_u & 0xc0) >> 6) {
60
 
  case 1:
61
 
    rate = "25.00";
62
 
    break;
63
 
  case 3:
64
 
    rate = "29.97";
65
 
    break;
66
 
  default:
67
 
    if(dtime->hour == 0 && dtime->minute == 0 
68
 
       && dtime->second == 0 && dtime->frame_u == 0)
69
 
      rate = "no";
70
 
    else
71
 
      rate = "(please send a bug report)";
72
 
    break;
73
 
  } 
74
 
  printf(" @ %s fps", rate);
75
 
}
76
 
 
77
 
static void ifoPrint_video_attributes(video_attr_t *attr) {
78
 
  
79
 
  /* The following test is shorter but not correct ISO C,
80
 
     memcmp(attr,my_friendly_zeros, sizeof(video_attr_t)) */
81
 
  if(attr->mpeg_version == 0 
82
 
     && attr->video_format == 0 
83
 
     && attr->display_aspect_ratio == 0 
84
 
     && attr->permitted_df == 0 
85
 
     && attr->unknown1 == 0 
86
 
     && attr->line21_cc_1 == 0 
87
 
     && attr->line21_cc_2 == 0 
88
 
     && attr->bit_rate == 0 
89
 
     && attr->video_format == 0 
90
 
     && attr->letterboxed == 0 
91
 
     && attr->film_mode == 0) {
92
 
    printf("-- Unspecified --");
93
 
    return;
94
 
  }
95
 
  
96
 
  switch(attr->mpeg_version) {
97
 
  case 0:
98
 
    printf("mpeg1 ");
99
 
    break;
100
 
  case 1:
101
 
    printf("mpeg2 ");
102
 
    break;
103
 
  default:
104
 
    printf("(please send a bug report) ");
105
 
  }
106
 
  
107
 
  switch(attr->video_format) {
108
 
  case 0:
109
 
    printf("ntsc ");
110
 
    break;
111
 
  case 1:
112
 
    printf("pal ");
113
 
    break;
114
 
  default:
115
 
    printf("(please send a bug report) ");
116
 
  }
117
 
  
118
 
  switch(attr->display_aspect_ratio) {
119
 
  case 0:
120
 
    printf("4:3 ");
121
 
    break;
122
 
  case 3:
123
 
    printf("16:9 ");
124
 
    break;
125
 
  default:
126
 
    printf("(please send a bug report) ");
127
 
  }
128
 
  
129
 
  // Wide is allways allowed..!!!
130
 
  switch(attr->permitted_df) {
131
 
  case 0:
132
 
    printf("pan&scan+letterboxed ");
133
 
    break;
134
 
  case 1:
135
 
    printf("only pan&scan "); //??
136
 
    break;
137
 
  case 2:
138
 
    printf("only letterboxed ");
139
 
    break;
140
 
  case 3:
141
 
    // not specified
142
 
    break;
143
 
  default:
144
 
    printf("(please send a bug report)");
145
 
  }
146
 
  
147
 
  printf("U%x ", attr->unknown1);
148
 
  CHECK_VALUE(!attr->unknown1);
149
 
  
150
 
  if(attr->line21_cc_1 || attr->line21_cc_2) {
151
 
    printf("NTSC CC ");
152
 
    if(attr->line21_cc_1)
153
 
      printf("1 ");
154
 
    if(attr->line21_cc_2)
155
 
      printf("2 ");
156
 
  }
157
 
 
158
 
  switch(attr->bit_rate) {
159
 
  case 0:
160
 
    printf("Variable Bit Rate ");
161
 
    break;
162
 
  case 1:
163
 
    printf("Constant Bit Rate ");
164
 
    break;
165
 
  default:
166
 
    printf("(please send a bug report)");
167
 
  }
168
 
  
169
 
  {
170
 
    int height = 480;
171
 
    if(attr->video_format != 0) 
172
 
      height = 576;
173
 
    switch(attr->picture_size) {
174
 
    case 0:
175
 
      printf("720x%d ", height);
176
 
      break;
177
 
    case 1:
178
 
      printf("704x%d ", height);
179
 
      break;
180
 
    case 2:
181
 
      printf("352x%d ", height);
182
 
      break;
183
 
    case 3:
184
 
      printf("352x%d ", height/2);
185
 
      break;      
186
 
    default:
187
 
      printf("(please send a bug report) ");
188
 
    }
189
 
  }
190
 
 
191
 
  if(attr->letterboxed) {
192
 
    printf("source letterboxed ");
193
 
  }
194
 
  
195
 
  if(attr->film_mode) {
196
 
    printf("film");
197
 
  } else {
198
 
    printf("video"); //camera
199
 
  }
200
 
}
201
 
 
202
 
static void ifoPrint_audio_attributes(audio_attr_t *attr) {
203
 
  
204
 
  if(attr->audio_format == 0
205
 
     && attr->multichannel_extension == 0
206
 
     && attr->lang_type == 0
207
 
     && attr->application_mode == 0
208
 
     && attr->quantization == 0
209
 
     && attr->sample_frequency == 0
210
 
     && attr->channels == 0
211
 
     && attr->lang_code == 0
212
 
     && attr->lang_extension == 0
213
 
     && attr->code_extension == 0
214
 
     && attr->unknown3 == 0
215
 
     && attr->unknown1 == 0) {
216
 
    printf("-- Unspecified --");
217
 
    return;
218
 
  }
219
 
  
220
 
  switch(attr->audio_format) {
221
 
  case 0:
222
 
    printf("ac3 ");
223
 
    break;
224
 
  case 1:
225
 
    printf("(please send a bug report) ");
226
 
    break;
227
 
  case 2:
228
 
    printf("mpeg1 ");
229
 
    break;
230
 
  case 3:
231
 
    printf("mpeg2ext ");
232
 
    break;
233
 
  case 4:
234
 
    printf("lpcm ");
235
 
    break;
236
 
  case 5:
237
 
    printf("(please send a bug report) ");
238
 
    break;
239
 
  case 6:
240
 
    printf("dts ");
241
 
    break;
242
 
  default:
243
 
    printf("(please send a bug report) ");
244
 
  }
245
 
  
246
 
  if(attr->multichannel_extension)
247
 
    printf("multichannel_extension ");
248
 
  
249
 
  switch(attr->lang_type) {
250
 
  case 0:
251
 
    // not specified
252
 
    CHECK_VALUE(attr->lang_code == 0 || attr->lang_code == 0xffff);
253
 
    break;
254
 
  case 1:
255
 
    printf("%c%c (%c) ", attr->lang_code>>8, attr->lang_code & 0xff,
256
 
           attr->lang_extension ? attr->lang_extension : ' ');
257
 
    if(attr->lang_extension) {
258
 
      printf("(please send a bug report) lang_extension != 0");
259
 
    }
260
 
    break;
261
 
  default:
262
 
    printf("(please send a bug report) ");
263
 
  }
264
 
 
265
 
  switch(attr->application_mode) {
266
 
  case 0:
267
 
    // not specified
268
 
    break;
269
 
  case 1:
270
 
    printf("karaoke mode ");
271
 
    break;
272
 
  case 2:
273
 
    printf("surround sound mode ");
274
 
    break;
275
 
  default:
276
 
    printf("(please send a bug report) ");
277
 
  }
278
 
  
279
 
  switch(attr->audio_format) {
280
 
  case 0: //ac3
281
 
    if(attr->quantization != 3) {
282
 
      printf("(please send a bug report) ac3 quant/drc not 3 (%d)",
283
 
             attr->quantization);
284
 
    }
285
 
    break;
286
 
  case 2: //mpeg 1 or mpeg 2 without extension stream
287
 
  case 3: //mpeg 2 with extension stream
288
 
    switch(attr->quantization) {
289
 
    case 0: //no drc
290
 
      printf("no drc ");
291
 
      break;
292
 
    case 1:
293
 
      printf("drc ");
294
 
      break;
295
 
    default:
296
 
      printf("(please send a bug report) mpeg reserved quant/drc  (%d)",
297
 
             attr->quantization);
298
 
      break;
299
 
    }
300
 
    break;
301
 
  case 4:
302
 
    switch(attr->quantization) {
303
 
    case 0:
304
 
      printf("16bit ");
305
 
      break;
306
 
    case 1:
307
 
      printf("20bit ");
308
 
      break;
309
 
    case 2:
310
 
      printf("24bit ");
311
 
      break;
312
 
    case 3:
313
 
      printf("(please send a bug report) lpcm reserved quant/drc  (%d)",
314
 
             attr->quantization);
315
 
      break;
316
 
    }
317
 
    break;
318
 
  case 6: //dts
319
 
    if(attr->quantization != 3) {
320
 
      printf("(please send a bug report) dts quant/drc not 3 (%d)",
321
 
             attr->quantization);
322
 
    }
323
 
    break;
324
 
  default:
325
 
    break;
326
 
  }
327
 
 
328
 
  switch(attr->sample_frequency) {
329
 
  case 0:
330
 
    printf("48kHz ");
331
 
    break;
332
 
  case 1:
333
 
    printf("96kHz ");
334
 
    break;
335
 
  default:
336
 
    printf("sample_frequency %i (please send a bug report) ", 
337
 
           attr->sample_frequency);
338
 
  }
339
 
  
340
 
  printf("%dCh ", attr->channels + 1);
341
 
  
342
 
  switch(attr->code_extension) {
343
 
  case 0:
344
 
    printf("Not specified ");
345
 
    break;
346
 
  case 1: // Normal audio
347
 
    printf("Normal Caption ");
348
 
    break;
349
 
  case 2: // visually imparied
350
 
    printf("Audio for visually impaired ");
351
 
    break;
352
 
  case 3: // Directors 1
353
 
    printf("Director's comments 1 ");
354
 
    break;
355
 
  case 4: // Directors 2
356
 
    printf("Director's comments 2 ");
357
 
    break;
358
 
    //case 4: // Music score ?    
359
 
  default:
360
 
    printf("(please send a bug report) ");
361
 
  }
362
 
    
363
 
  printf("%d ", attr->unknown3);
364
 
  if(attr->application_mode == 1) {
365
 
    printf("ca=%d ", attr->app_info.karaoke.channel_assignment);
366
 
    printf("%d ", attr->app_info.karaoke.version);
367
 
    if(attr->app_info.karaoke.mc_intro) 
368
 
      printf("mc intro ");
369
 
    printf("%s ", attr->app_info.karaoke.mode ? "duet" : "solo");
370
 
    printf("%d ", attr->app_info.karaoke.unknown4);
371
 
  }
372
 
  if(attr->application_mode == 2) {
373
 
    if(attr->app_info.surround.dolby_encoded) {
374
 
      printf("dolby surround ");
375
 
    }
376
 
    printf("%d ", attr->app_info.surround.unknown5);
377
 
    printf("%d ", attr->app_info.surround.unknown6);
378
 
  }    
379
 
}
380
 
 
381
 
static void ifoPrint_subp_attributes(subp_attr_t *attr) {
382
 
  
383
 
  if(attr->type == 0
384
 
     && attr->code_mode == 0
385
 
     && attr->lang_code == 0
386
 
     && attr->lang_extension == 0
387
 
     && attr->zero1 == 0
388
 
     && attr->zero2 == 0
389
 
     && attr->code_extension == 0) {
390
 
    printf("-- Unspecified --");
391
 
    return;
392
 
  }
393
 
  
394
 
  switch(attr->code_mode) {
395
 
  case 0:
396
 
    printf("Coding Mode RLE ");
397
 
    break;
398
 
  case 1:
399
 
    printf("Coding Mode Extended ");
400
 
    break;
401
 
  default:
402
 
    printf("(please send a bug report) ");
403
 
  }    
404
 
 
405
 
  if(attr->type == 1) {
406
 
    if(isalpha((int)(attr->lang_code >> 8))
407
 
       && isalpha((int)(attr->lang_code & 0xff))) {
408
 
      printf("%c%c ", attr->lang_code >> 8, attr->lang_code & 0xff);
409
 
    } else {
410
 
      printf("%02x%02x ", attr->lang_code >> 8, attr->lang_code & 0xff);
411
 
    }
412
 
  } else {
413
 
    printf("lang not specified ");
414
 
  }
415
 
  
416
 
  printf("%d ", attr->zero1);
417
 
  printf("%d ", attr->zero2);
418
 
  printf("%d ", attr->lang_extension);
419
 
  
420
 
  switch(attr->code_extension) {
421
 
  case 0:
422
 
    printf("Not specified ");
423
 
    break;
424
 
  case 1:
425
 
    printf("Caption with normal size character ");
426
 
    break;
427
 
  case 2:
428
 
    printf("Caption with bigger size character ");
429
 
    break;
430
 
  case 3: 
431
 
    printf("Caption for children ");
432
 
    break;
433
 
  case 4:
434
 
    printf("reserved ");
435
 
    break;
436
 
  case 5:
437
 
    printf("Closed Caption with normal size character ");
438
 
    break;
439
 
  case 6:
440
 
    printf("Closed Caption with bigger size character ");
441
 
    break;
442
 
  case 7:
443
 
    printf("Closed Caption for children ");
444
 
    break;
445
 
  case 8:
446
 
    printf("reserved ");
447
 
    break;
448
 
  case 9:
449
 
    printf("Forced Caption");
450
 
    break;
451
 
  case 10:
452
 
    printf("reserved ");
453
 
    break;
454
 
  case 11:
455
 
    printf("reserved ");
456
 
    break;
457
 
  case 12:
458
 
    printf("reserved ");
459
 
    break;
460
 
  case 13:
461
 
    printf("Director's comments with normal size character ");
462
 
    break;
463
 
  case 14:
464
 
    printf("Director's comments with bigger size character ");
465
 
    break;
466
 
  case 15:
467
 
    printf("Director's comments for children ");
468
 
    break;
469
 
  default:
470
 
    printf("(please send a bug report) ");
471
 
  }
472
 
 
473
 
}
474
 
 
475
 
 
476
 
static void ifoPrint_USER_OPS(user_ops_t *user_ops) {
477
 
  uint32_t uops;
478
 
  unsigned char *ptr = (unsigned char *)user_ops;
479
 
  
480
 
  uops  = (*ptr++ << 24);
481
 
  uops |= (*ptr++ << 16);
482
 
  uops |= (*ptr++ << 8);
483
 
  uops |= (*ptr++);
484
 
  
485
 
  if(uops == 0) {
486
 
    printf("None\n");
487
 
  } else if(uops == 0x01ffffff) {
488
 
    printf("All\n");
489
 
  } else {
490
 
    if(user_ops->title_or_time_play)
491
 
      printf("Title or Time Play, ");
492
 
    if(user_ops->chapter_search_or_play)
493
 
      printf("Chapter Search or Play, ");
494
 
    if(user_ops->title_play)
495
 
      printf("Title Play, ");
496
 
    if(user_ops->stop)
497
 
      printf("Stop, ");
498
 
    if(user_ops->go_up)
499
 
      printf("Go Up, ");
500
 
    if(user_ops->time_or_chapter_search)
501
 
      printf("Time or Chapter Search, ");
502
 
    if(user_ops->prev_or_top_pg_search)
503
 
      printf("Prev or Top PG Search, ");
504
 
    if(user_ops->next_pg_search)
505
 
      printf("Next PG Search, ");
506
 
    if(user_ops->forward_scan)
507
 
      printf("Forward Scan, ");
508
 
    if(user_ops->backward_scan)
509
 
      printf("Backward Scan, ");
510
 
    if(user_ops->title_menu_call)
511
 
      printf("Title Menu Call, ");
512
 
    if(user_ops->root_menu_call)
513
 
      printf("Root Menu Call, ");
514
 
    if(user_ops->subpic_menu_call)
515
 
      printf("SubPic Menu Call, ");
516
 
    if(user_ops->audio_menu_call)
517
 
      printf("Audio Menu Call, ");
518
 
    if(user_ops->angle_menu_call)
519
 
      printf("Angle Menu Call, ");
520
 
    if(user_ops->chapter_menu_call)
521
 
      printf("Chapter Menu Call, ");
522
 
    if(user_ops->resume)
523
 
      printf("Resume, ");
524
 
    if(user_ops->button_select_or_activate)
525
 
      printf("Button Select or Activate, ");
526
 
    if(user_ops->still_off)
527
 
      printf("Still Off, ");
528
 
    if(user_ops->pause_on)
529
 
      printf("Pause On, ");
530
 
    if(user_ops->audio_stream_change)
531
 
      printf("Audio Stream Change, ");
532
 
    if(user_ops->subpic_stream_change)
533
 
      printf("SubPic Stream Change, ");
534
 
    if(user_ops->angle_change)
535
 
      printf("Angle Change, ");
536
 
    if(user_ops->karaoke_audio_pres_mode_change)
537
 
      printf("Karaoke Audio Pres Mode Change, ");
538
 
    if(user_ops->video_pres_mode_change)
539
 
      printf("Video Pres Mode Change, ");
540
 
    printf("\n");
541
 
  }
542
 
}
543
 
 
544
 
 
545
 
void ifoPrint_VMGI_MAT(vmgi_mat_t *vmgi_mat) {
546
 
  
547
 
  printf("VMG Identifier: %.12s\n", vmgi_mat->vmg_identifier);
548
 
  printf("Last Sector of VMG: %08x\n", vmgi_mat->vmg_last_sector);
549
 
  printf("Last Sector of VMGI: %08x\n", vmgi_mat->vmgi_last_sector);
550
 
  printf("Specification version number: %01x.%01x\n", 
551
 
         vmgi_mat->specification_version >> 4, 
552
 
         vmgi_mat->specification_version & 0xf);
553
 
  /* Byte 2 of 'VMG Category' (00xx0000) is the Region Code */
554
 
  printf("VMG Category: %08x\n", vmgi_mat->vmg_category);
555
 
  printf("VMG Number of Volumes: %i\n", vmgi_mat->vmg_nr_of_volumes);
556
 
  printf("VMG This Volume: %i\n", vmgi_mat->vmg_this_volume_nr);
557
 
  printf("Disc side %i\n", vmgi_mat->disc_side);
558
 
  printf("VMG Number of Title Sets %i\n", vmgi_mat->vmg_nr_of_title_sets);
559
 
  printf("Provider ID: %.32s\n", vmgi_mat->provider_identifier);
560
 
  printf("VMG POS Code: %08x", (uint32_t)(vmgi_mat->vmg_pos_code >> 32));
561
 
  printf("%08x\n", (uint32_t)vmgi_mat->vmg_pos_code);
562
 
  printf("End byte of VMGI_MAT: %08x\n", vmgi_mat->vmgi_last_byte);
563
 
  printf("Start byte of First Play PGC FP PGC: %08x\n", 
564
 
         vmgi_mat->first_play_pgc);
565
 
  printf("Start sector of VMGM_VOBS: %08x\n", vmgi_mat->vmgm_vobs);
566
 
  printf("Start sector of TT_SRPT: %08x\n", vmgi_mat->tt_srpt);
567
 
  printf("Start sector of VMGM_PGCI_UT: %08x\n", vmgi_mat->vmgm_pgci_ut);
568
 
  printf("Start sector of PTL_MAIT: %08x\n", vmgi_mat->ptl_mait);
569
 
  printf("Start sector of VTS_ATRT: %08x\n", vmgi_mat->vts_atrt);
570
 
  printf("Start sector of TXTDT_MG: %08x\n", vmgi_mat->txtdt_mgi);
571
 
  printf("Start sector of VMGM_C_ADT: %08x\n", vmgi_mat->vmgm_c_adt);
572
 
  printf("Start sector of VMGM_VOBU_ADMAP: %08x\n", 
573
 
         vmgi_mat->vmgm_vobu_admap);
574
 
  printf("Video attributes of VMGM_VOBS: ");
575
 
  ifoPrint_video_attributes(&vmgi_mat->vmgm_video_attr);
576
 
  printf("\n");
577
 
  printf("VMGM Number of Audio attributes: %i\n", 
578
 
         vmgi_mat->nr_of_vmgm_audio_streams);
579
 
  if(vmgi_mat->nr_of_vmgm_audio_streams > 0) {
580
 
    printf("\tstream %i status: ", 1);
581
 
    ifoPrint_audio_attributes(&vmgi_mat->vmgm_audio_attr);
582
 
    printf("\n");
583
 
  }
584
 
  printf("VMGM Number of Sub-picture attributes: %i\n", 
585
 
         vmgi_mat->nr_of_vmgm_subp_streams);
586
 
  if(vmgi_mat->nr_of_vmgm_subp_streams > 0) {
587
 
    printf("\tstream %2i status: ", 1);
588
 
    ifoPrint_subp_attributes(&vmgi_mat->vmgm_subp_attr);
589
 
    printf("\n");
590
 
  }
591
 
}
592
 
 
593
 
 
594
 
void ifoPrint_VTSI_MAT(vtsi_mat_t *vtsi_mat) {
595
 
  int i;
596
 
 
597
 
  printf("VTS Identifier: %.12s\n", vtsi_mat->vts_identifier);
598
 
  printf("Last Sector of VTS: %08x\n", vtsi_mat->vts_last_sector);
599
 
  printf("Last Sector of VTSI: %08x\n", vtsi_mat->vtsi_last_sector);
600
 
  printf("Specification version number: %01x.%01x\n", 
601
 
         vtsi_mat->specification_version>>4, 
602
 
         vtsi_mat->specification_version&0xf);
603
 
  printf("VTS Category: %08x\n", vtsi_mat->vts_category);
604
 
  printf("End byte of VTSI_MAT: %08x\n", vtsi_mat->vtsi_last_byte);
605
 
  printf("Start sector of VTSM_VOBS:  %08x\n", vtsi_mat->vtsm_vobs);
606
 
  printf("Start sector of VTSTT_VOBS: %08x\n", vtsi_mat->vtstt_vobs);
607
 
  printf("Start sector of VTS_PTT_SRPT: %08x\n", vtsi_mat->vts_ptt_srpt);
608
 
  printf("Start sector of VTS_PGCIT:    %08x\n", vtsi_mat->vts_pgcit);
609
 
  printf("Start sector of VTSM_PGCI_UT: %08x\n", vtsi_mat->vtsm_pgci_ut);
610
 
  printf("Start sector of VTS_TMAPT:    %08x\n", vtsi_mat->vts_tmapt);
611
 
  printf("Start sector of VTSM_C_ADT:      %08x\n", vtsi_mat->vtsm_c_adt);
612
 
  printf("Start sector of VTSM_VOBU_ADMAP: %08x\n",vtsi_mat->vtsm_vobu_admap);
613
 
  printf("Start sector of VTS_C_ADT:       %08x\n", vtsi_mat->vts_c_adt);
614
 
  printf("Start sector of VTS_VOBU_ADMAP:  %08x\n", vtsi_mat->vts_vobu_admap);
615
 
 
616
 
  printf("Video attributes of VTSM_VOBS: ");
617
 
  ifoPrint_video_attributes(&vtsi_mat->vtsm_video_attr);
618
 
  printf("\n");
619
 
  
620
 
  printf("VTSM Number of Audio attributes: %i\n", 
621
 
         vtsi_mat->nr_of_vtsm_audio_streams);
622
 
  if(vtsi_mat->nr_of_vtsm_audio_streams > 0) {
623
 
    printf("\tstream %i status: ", 1);
624
 
    ifoPrint_audio_attributes(&vtsi_mat->vtsm_audio_attr);
625
 
    printf("\n");
626
 
  }
627
 
  
628
 
  printf("VTSM Number of Sub-picture attributes: %i\n", 
629
 
         vtsi_mat->nr_of_vtsm_subp_streams);
630
 
  if(vtsi_mat->nr_of_vtsm_subp_streams > 0) {
631
 
    printf("\tstream %2i status: ", 1);
632
 
    ifoPrint_subp_attributes(&vtsi_mat->vtsm_subp_attr);
633
 
    printf("\n");
634
 
  }
635
 
  
636
 
  printf("Video attributes of VTS_VOBS: ");
637
 
  ifoPrint_video_attributes(&vtsi_mat->vts_video_attr);
638
 
  printf("\n");
639
 
  
640
 
  printf("VTS Number of Audio attributes: %i\n", 
641
 
         vtsi_mat->nr_of_vts_audio_streams);
642
 
  for(i = 0; i < vtsi_mat->nr_of_vts_audio_streams; i++) {
643
 
    printf("\tstream %i status: ", i);
644
 
    ifoPrint_audio_attributes(&vtsi_mat->vts_audio_attr[i]);
645
 
    printf("\n");
646
 
  }
647
 
  
648
 
  printf("VTS Number of Subpicture attributes: %i\n", 
649
 
         vtsi_mat->nr_of_vts_subp_streams);
650
 
  for(i = 0; i < vtsi_mat->nr_of_vts_subp_streams; i++) {
651
 
    printf("\tstream %2i status: ", i);
652
 
    ifoPrint_subp_attributes(&vtsi_mat->vts_subp_attr[i]);
653
 
    printf("\n");
654
 
  }
655
 
  
656
 
  /* FIXME:  Add printing of MultiChannel Extension */
657
 
}
658
 
 
659
 
 
660
 
static void ifoPrint_PGC_COMMAND_TBL(pgc_command_tbl_t *cmd_tbl) {
661
 
  int i;
662
 
  
663
 
  if(cmd_tbl == NULL) {
664
 
    printf("No Command table present\n");
665
 
    return;
666
 
  }
667
 
  
668
 
  printf("Number of Pre commands: %i\n", cmd_tbl->nr_of_pre);
669
 
  for(i = 0; i < cmd_tbl->nr_of_pre; i++) {
670
 
    cmdPrint_CMD(i, &cmd_tbl->pre_cmds[i]);
671
 
  }
672
 
 
673
 
  printf("Number of Post commands: %i\n", cmd_tbl->nr_of_post);
674
 
  for(i = 0; i < cmd_tbl->nr_of_post; i++) {
675
 
    cmdPrint_CMD(i, &cmd_tbl->post_cmds[i]);
676
 
  }
677
 
 
678
 
  printf("Number of Cell commands: %i\n", cmd_tbl->nr_of_cell);
679
 
  for(i = 0; i < cmd_tbl->nr_of_cell; i++) {
680
 
    cmdPrint_CMD(i, &cmd_tbl->cell_cmds[i]);
681
 
  }
682
 
}
683
 
 
684
 
 
685
 
static void ifoPrint_PGC_PROGRAM_MAP(pgc_program_map_t *program_map, int nr) {
686
 
  int i;
687
 
  
688
 
  if(program_map == NULL) {
689
 
    printf("No Program map present\n");
690
 
    return;
691
 
  }
692
 
  
693
 
  for(i = 0; i < nr; i++) {
694
 
    printf("Program %3i Entry Cell: %3i\n", i + 1, program_map[i]);
695
 
  }
696
 
}
697
 
 
698
 
 
699
 
static void ifoPrint_CELL_PLAYBACK(cell_playback_t *cell_playback, int nr) {
700
 
  int i;
701
 
  
702
 
  if(cell_playback == NULL) {
703
 
    printf("No Cell Playback info present\n");
704
 
    return;
705
 
  }
706
 
  
707
 
  for(i=0;i<nr;i++) {
708
 
    printf("Cell: %3i ", i + 1);
709
 
 
710
 
    ifoPrint_time(&cell_playback[i].playback_time);
711
 
    printf("\t");
712
 
 
713
 
    if(cell_playback[i].block_mode || cell_playback[i].block_type) {
714
 
      const char *s;
715
 
      switch(cell_playback[i].block_mode) {
716
 
      case 0:
717
 
        s = "not a"; break;
718
 
      case 1:
719
 
        s = "the first"; break;
720
 
      case 2:
721
 
      default:
722
 
        s = ""; break;
723
 
      case 3:
724
 
        s = "last"; break;
725
 
      }
726
 
      printf("%s cell in the block ", s);
727
 
      
728
 
      switch(cell_playback[i].block_type) {
729
 
      case 0:
730
 
        printf("not part of the block ");
731
 
        break;
732
 
      case 1:
733
 
        printf("angle block ");
734
 
        break;
735
 
      case 2:
736
 
      case 3:
737
 
        printf("(send bug repport) ");
738
 
        break;
739
 
      }
740
 
    }
741
 
    if(cell_playback[i].seamless_play)
742
 
      printf("presented seamlessly ");
743
 
    if(cell_playback[i].interleaved)
744
 
      printf("cell is interleaved ");
745
 
    if(cell_playback[i].stc_discontinuity)
746
 
      printf("STC_discontinuty ");
747
 
    if(cell_playback[i].seamless_angle)
748
 
      printf("only seamless angle ");
749
 
    if(cell_playback[i].restricted)
750
 
      printf("restricted cell ");
751
 
    
752
 
    if(cell_playback[i].still_time)
753
 
      printf("still time %d ", cell_playback[i].still_time);
754
 
    if(cell_playback[i].cell_cmd_nr)
755
 
      printf("cell command %d", cell_playback[i].cell_cmd_nr);
756
 
    
757
 
    printf("\n\tStart sector: %08x\tFirst ILVU end  sector: %08x\n", 
758
 
           cell_playback[i].first_sector, 
759
 
           cell_playback[i].first_ilvu_end_sector);
760
 
    printf("\tEnd   sector: %08x\tLast VOBU start sector: %08x\n", 
761
 
           cell_playback[i].last_sector, 
762
 
           cell_playback[i].last_vobu_start_sector);
763
 
  }
764
 
}
765
 
 
766
 
static void ifoPrint_CELL_POSITION(cell_position_t *cell_position, int nr) {
767
 
  int i;
768
 
  
769
 
  if(cell_position == NULL) {
770
 
    printf("No Cell Position info present\n");
771
 
    return;
772
 
  }
773
 
  
774
 
  for(i=0;i<nr;i++) {
775
 
    printf("Cell: %3i has VOB ID: %3i, Cell ID: %3i\n", i + 1, 
776
 
           cell_position[i].vob_id_nr, cell_position[i].cell_nr);
777
 
  }
778
 
}
779
 
 
780
 
 
781
 
void ifoPrint_PGC(pgc_t *pgc) {
782
 
  int i;
783
 
  
784
 
  if(pgc == NULL) {
785
 
    printf("Error: No PGC present\n");
786
 
    return;
787
 
  }
788
 
 
789
 
  printf("Number of Programs: %i\n", pgc->nr_of_programs);
790
 
  printf("Number of Cells: %i\n", pgc->nr_of_cells);
791
 
  /* Check that time is 0:0:0:0 also if nr_of_programs==0 */
792
 
  printf("Playback time: ");
793
 
  ifoPrint_time(&pgc->playback_time); printf("\n");
794
 
 
795
 
  /* If no programs/no time then does this mean anything? */
796
 
  printf("Prohibited user operations: ");
797
 
  ifoPrint_USER_OPS(&pgc->prohibited_ops);
798
 
  
799
 
  for(i = 0; i < 8; i++) {
800
 
    if(pgc->audio_control[i].present) { /* The 'is present' bit */
801
 
      printf("Audio stream %i control: %04x\n", 
802
 
             i, pgc->audio_control[i]);
803
 
    }
804
 
  }
805
 
  
806
 
  for(i = 0; i < 32; i++) {
807
 
    if(pgc->subp_control[i].present) { /* The 'is present' bit */
808
 
      printf("Subpicture stream %2i control: %08x\n", 
809
 
             i, pgc->subp_control[i]);
810
 
    }
811
 
  }
812
 
  
813
 
  printf("Next PGC number: %i\n", pgc->next_pgc_nr);
814
 
  printf("Prev PGC number: %i\n", pgc->prev_pgc_nr);
815
 
  printf("GoUp PGC number: %i\n", pgc->goup_pgc_nr);
816
 
  if(pgc->nr_of_programs != 0) {
817
 
    printf("Still time: %i seconds (255=inf)\n", pgc->still_time);
818
 
    if(pgc->pg_playback_mode == 0)
819
 
      printf("PG Playback mode: Sequential\n");
820
 
    else if(!(pgc->pg_playback_mode & 0x80))
821
 
      printf("PG Playback mode: Random %i\n", pgc->pg_playback_mode);
822
 
    else
823
 
      printf("PG Playback mode: Shuffle %i\n", pgc->pg_playback_mode & 0x7f );
824
 
  }
825
 
  
826
 
  if(pgc->nr_of_programs != 0) {
827
 
    for(i = 0; i < 16; i++) {
828
 
      printf("Color %2i: %08x\n", i, pgc->palette[i]);
829
 
    }
830
 
  }
831
 
  
832
 
  /* Memmory offsets to div. tables. */
833
 
  ifoPrint_PGC_COMMAND_TBL(pgc->command_tbl);
834
 
  ifoPrint_PGC_PROGRAM_MAP(pgc->program_map, pgc->nr_of_programs);
835
 
  ifoPrint_CELL_PLAYBACK(pgc->cell_playback, pgc->nr_of_cells);
836
 
  ifoPrint_CELL_POSITION(pgc->cell_position, pgc->nr_of_cells);
837
 
}
838
 
 
839
 
 
840
 
void ifoPrint_TT_SRPT(tt_srpt_t *tt_srpt) {
841
 
  int i;
842
 
  
843
 
  printf("Number of TitleTrack search pointers: %i\n",
844
 
         tt_srpt->nr_of_srpts);
845
 
  for(i=0;i<tt_srpt->nr_of_srpts;i++) {
846
 
    printf("Title Track index %i\n", i + 1);
847
 
    printf("\tTitle set number (VTS): %i", 
848
 
           tt_srpt->title[i].title_set_nr);
849
 
    printf("\tVTS_TTN: %i\n", tt_srpt->title[i].vts_ttn);
850
 
    printf("\tNumber of PTTs: %i\n", tt_srpt->title[i].nr_of_ptts);
851
 
    printf("\tNumber of angles: %i\n", 
852
 
           tt_srpt->title[i].nr_of_angles);
853
 
    printf("\tTitle playback type: %s%s%s%s%s%s%s\n",
854
 
           tt_srpt->title[i].pb_ty.multi_or_random_pgc_title ? 
855
 
           " One Random PGC Title or Multi PGC Title" : 
856
 
           " One Sequential PGC Title",
857
 
           tt_srpt->title[i].pb_ty.jlc_exists_in_cell_cmd ?
858
 
           "" : ", No Link/Jump/Call exists in Cell command",
859
 
           tt_srpt->title[i].pb_ty.jlc_exists_in_prepost_cmd ?
860
 
           "" : ", No Link/Jump/Call exists in Pre- and/or Post-command",
861
 
           tt_srpt->title[i].pb_ty.jlc_exists_in_button_cmd ?
862
 
           "" : ", No Link/Jump/Call exists in Button command",
863
 
           tt_srpt->title[i].pb_ty.jlc_exists_in_tt_dom ?
864
 
           "" : ", No Link/Jump/Call exists in TT_DOM",
865
 
           tt_srpt->title[i].pb_ty.chapter_search_or_play ?
866
 
           ", UOP1 (TT_Play and PTT_Search) prohibited" : "",
867
 
           tt_srpt->title[i].pb_ty.title_or_time_play ?
868
 
           ", UOP0 (Time_Play and Time_Search) prohibited" : ""
869
 
           );    
870
 
    printf("\tParental ID field: %04x\n",
871
 
           tt_srpt->title[i].parental_id);
872
 
    printf("\tTitle set starting sector %08x\n", 
873
 
           tt_srpt->title[i].title_set_sector);
874
 
  }
875
 
}
876
 
 
877
 
 
878
 
void ifoPrint_VTS_PTT_SRPT(vts_ptt_srpt_t *vts_ptt_srpt) {
879
 
  int i, j;
880
 
  printf(" nr_of_srpts %i last byte %i\n", 
881
 
         vts_ptt_srpt->nr_of_srpts, 
882
 
         vts_ptt_srpt->last_byte);
883
 
  for(i=0;i<vts_ptt_srpt->nr_of_srpts;i++) {
884
 
    printf("\nVTS_PTT number %d has a offset %d relative to VTS_PTT_SRPT\n", 
885
 
           i + 1, vts_ptt_srpt->ttu_offset[i]);
886
 
    for(j=0;j<vts_ptt_srpt->title[i].nr_of_ptts;j++) {
887
 
      printf("VTS_PTT_SRPT - Title %3i part %3i: PGC: %3i PG: %3i\n",
888
 
             i + 1, j + 1, 
889
 
             vts_ptt_srpt->title[i].ptt[j].pgcn,
890
 
             vts_ptt_srpt->title[i].ptt[j].pgn );
891
 
    }
892
 
  }
893
 
}
894
 
 
895
 
 
896
 
void ifoPrint_PTL_MAIT(ptl_mait_t *ptl_mait) {
897
 
  int i, level, vts;
898
 
  
899
 
  printf("Number of Countries: %i\n", ptl_mait->nr_of_countries);
900
 
  printf("Number of VTSs: %i\n", ptl_mait->nr_of_vtss);
901
 
  printf("Last byte: %i\n", ptl_mait->last_byte);
902
 
  
903
 
  for(i = 0; i < ptl_mait->nr_of_countries; i++) {
904
 
    
905
 
    printf("Start byte: %i\n", ptl_mait->countries[i].pf_ptl_mai_start_byte);
906
 
    printf("Parental Masks for country: %c%c\n",
907
 
           ptl_mait->countries[i].country_code >> 8,
908
 
           ptl_mait->countries[i].country_code & 0xff);
909
 
    
910
 
    for(vts = 0; vts <= ptl_mait->nr_of_vtss; vts++) {
911
 
      if( vts == 0 ) {
912
 
        printf("VMG    "); 
913
 
      } else {
914
 
        printf("VTS %2d ", vts);
915
 
      }
916
 
      for(level = 0; level < 8; level++) {
917
 
        printf("%d: %04x  ", level,
918
 
               ptl_mait->countries[i].pf_ptl_mai[vts][level] );
919
 
      }
920
 
      printf("\n");
921
 
    }
922
 
  }
923
 
}
924
 
 
925
 
void ifoPrint_VTS_TMAPT(vts_tmapt_t *vts_tmapt) {
926
 
  unsigned int timeunit;
927
 
  int i, j;
928
 
  
929
 
  printf("Number of VTS_TMAPS: %i\n", vts_tmapt->nr_of_tmaps);
930
 
  printf("Last byte: %i\n", vts_tmapt->last_byte);
931
 
 
932
 
  for(i = 0; i < vts_tmapt->nr_of_tmaps; i++) {
933
 
    printf("TMAP %i\n", i + 1);
934
 
    printf("  offset %d relative to VTS_TMAPTI\n", vts_tmapt->tmap_offset[i]);
935
 
    printf("  Time unit (seconds): %i\n", vts_tmapt->tmap[i].tmu);
936
 
    printf("  Number of entries: %i\n", vts_tmapt->tmap[i].nr_of_entries);
937
 
    timeunit = vts_tmapt->tmap[i].tmu;
938
 
    for(j = 0; j < vts_tmapt->tmap[i].nr_of_entries; j++) {
939
 
      unsigned int ac_time = timeunit * (j + 1);
940
 
      printf("Time: %2i:%02i:%02i  VOBU Sector: 0x%08x %s\n", 
941
 
             ac_time / (60 * 60), (ac_time / 60) % 60, ac_time % 60,
942
 
             vts_tmapt->tmap[i].map_ent[j] & 0x7fffffff,
943
 
             (vts_tmapt->tmap[i].map_ent[j] >> 31) ? "discontinuity" : "");
944
 
    }
945
 
  }
946
 
}
947
 
 
948
 
void ifoPrint_C_ADT(c_adt_t *c_adt) {
949
 
  int i, entries;
950
 
  
951
 
  printf("Number of VOBs in this VOBS: %i\n", c_adt->nr_of_vobs);
952
 
  //entries = c_adt->nr_of_vobs;
953
 
  entries = (c_adt->last_byte + 1 - C_ADT_SIZE)/sizeof(cell_adr_t);
954
 
  
955
 
  for(i = 0; i < entries; i++) {
956
 
    printf("VOB ID: %3i, Cell ID: %3i   ", 
957
 
           c_adt->cell_adr_table[i].vob_id, c_adt->cell_adr_table[i].cell_id);
958
 
    printf("Sector (first): 0x%08x   (last): 0x%08x\n",
959
 
           c_adt->cell_adr_table[i].start_sector, 
960
 
           c_adt->cell_adr_table[i].last_sector);
961
 
  }
962
 
}
963
 
 
964
 
 
965
 
void ifoPrint_VOBU_ADMAP(vobu_admap_t *vobu_admap) {
966
 
  int i, entries;
967
 
  
968
 
  entries = (vobu_admap->last_byte + 1 - VOBU_ADMAP_SIZE)/4;
969
 
  for(i = 0; i < entries; i++) {
970
 
    printf("VOBU %5i  First sector: 0x%08x\n", i + 1,
971
 
           vobu_admap->vobu_start_sectors[i]);
972
 
  }
973
 
}
974
 
 
975
 
 
976
 
void ifoPrint_PGCIT(pgcit_t *pgcit) {
977
 
  int i;
978
 
  
979
 
  for(i = 0; i < pgcit->nr_of_pgci_srp; i++) {
980
 
    printf("\nProgram (PGC): %3i\t", i + 1);
981
 
    printf("PGC Category: Entry id 0x%02x, ", pgcit->pgci_srp[i].entry_id);
982
 
    printf("Parental ID mask 0x%04x\n", pgcit->pgci_srp[i].ptl_id_mask);
983
 
    ifoPrint_PGC(pgcit->pgci_srp[i].pgc);
984
 
  }
985
 
}
986
 
 
987
 
 
988
 
void ifoPrint_PGCI_UT(pgci_ut_t *pgci_ut) {
989
 
  int i;
990
 
  
991
 
  printf("Number of Menu Language Units (PGCI_LU): %3i\n", pgci_ut->nr_of_lus);
992
 
  for(i = 0; i < pgci_ut->nr_of_lus; i++) {
993
 
    printf("\nMenu Language Code: %c%c (%c)\n",
994
 
           pgci_ut->lu[i].lang_code >> 8,
995
 
           pgci_ut->lu[i].lang_code & 0xff,
996
 
           pgci_ut->lu[i].lang_extension ? pgci_ut->lu[i].lang_extension :' ');
997
 
    printf("Menu Existence: %02x\n", pgci_ut->lu[i].exists);
998
 
    ifoPrint_PGCIT(pgci_ut->lu[i].pgcit);
999
 
  }
1000
 
}
1001
 
 
1002
 
 
1003
 
static void ifoPrint_VTS_ATTRIBUTES(vts_attributes_t *vts_attributes) {
1004
 
  int i;
1005
 
  
1006
 
  printf("VTS_CAT Application type: %08x\n", vts_attributes->vts_cat);
1007
 
 
1008
 
  printf("Video attributes of VTSM_VOBS: ");
1009
 
  ifoPrint_video_attributes(&vts_attributes->vtsm_vobs_attr);
1010
 
  printf("\n");
1011
 
  printf("Number of Audio streams: %i\n", 
1012
 
         vts_attributes->nr_of_vtsm_audio_streams);
1013
 
  if(vts_attributes->nr_of_vtsm_audio_streams > 0) {
1014
 
    printf("\tstream %i attributes: ", 1);
1015
 
    ifoPrint_audio_attributes(&vts_attributes->vtsm_audio_attr);
1016
 
    printf("\n");
1017
 
  }
1018
 
  printf("Number of Subpicture streams: %i\n", 
1019
 
         vts_attributes->nr_of_vtsm_subp_streams);
1020
 
  if(vts_attributes->nr_of_vtsm_subp_streams > 0) {
1021
 
    printf("\tstream %2i attributes: ", 1);
1022
 
    ifoPrint_subp_attributes(&vts_attributes->vtsm_subp_attr);
1023
 
    printf("\n");
1024
 
  }
1025
 
   
1026
 
  printf("Video attributes of VTSTT_VOBS: ");
1027
 
  ifoPrint_video_attributes(&vts_attributes->vtstt_vobs_video_attr);
1028
 
  printf("\n");
1029
 
  printf("Number of Audio streams: %i\n", 
1030
 
         vts_attributes->nr_of_vtstt_audio_streams);
1031
 
  for(i = 0; i < vts_attributes->nr_of_vtstt_audio_streams; i++) {
1032
 
    printf("\tstream %i attributes: ", i);
1033
 
    ifoPrint_audio_attributes(&vts_attributes->vtstt_audio_attr[i]);
1034
 
    printf("\n");
1035
 
  }
1036
 
  
1037
 
  printf("Number of Subpicture streams: %i\n", 
1038
 
         vts_attributes->nr_of_vtstt_subp_streams);
1039
 
  for(i = 0; i < vts_attributes->nr_of_vtstt_subp_streams; i++) {
1040
 
    printf("\tstream %2i attributes: ", i);    
1041
 
    ifoPrint_subp_attributes(&vts_attributes->vtstt_subp_attr[i]);
1042
 
    printf("\n");
1043
 
  }
1044
 
}
1045
 
 
1046
 
 
1047
 
void ifoPrint_VTS_ATRT(vts_atrt_t *vts_atrt) {
1048
 
  int i;
1049
 
  
1050
 
  printf("Number of Video Title Sets: %3i\n", vts_atrt->nr_of_vtss);
1051
 
  for(i = 0; i < vts_atrt->nr_of_vtss; i++) {
1052
 
    printf("\nVideo Title Set %i\n", i + 1);
1053
 
    printf("  offset %d relative to VMG_VTS_ATRT\n", 
1054
 
           vts_atrt->vts_atrt_offsets[i]);
1055
 
    ifoPrint_VTS_ATTRIBUTES(&vts_atrt->vts[i]);
1056
 
  }
1057
 
}
1058
 
 
1059
 
 
1060
 
void ifoPrint(dvd_reader_t *dvd, int title) {
1061
 
  ifo_handle_t *ifohandle;
1062
 
 
1063
 
  ifohandle = ifoOpen(dvd, title);
1064
 
  if(!ifohandle) {
1065
 
    if(dvdread_verbose(dvd) >= 0) {
1066
 
      fprintf(stderr, "Can't open info file for title %d\n", title);
1067
 
    }
1068
 
    return;
1069
 
  }
1070
 
  
1071
 
  
1072
 
  if(ifohandle->vmgi_mat) {
1073
 
 
1074
 
    printf("VMG top level\n-------------\n");
1075
 
    ifoPrint_VMGI_MAT(ifohandle->vmgi_mat);
1076
 
 
1077
 
    printf("\nFirst Play PGC\n--------------\n");
1078
 
    if(ifohandle->first_play_pgc) {
1079
 
      ifoPrint_PGC(ifohandle->first_play_pgc);
1080
 
    } else {
1081
 
      printf("No First Play PGC present\n");
1082
 
    }
1083
 
 
1084
 
    printf("\nTitle Track search pointer table\n");
1085
 
    printf(  "------------------------------------------------\n");
1086
 
    ifoPrint_TT_SRPT(ifohandle->tt_srpt);
1087
 
 
1088
 
    printf("\nMenu PGCI Unit table\n");
1089
 
    printf(  "--------------------\n");
1090
 
    if(ifohandle->pgci_ut) {
1091
 
      ifoPrint_PGCI_UT(ifohandle->pgci_ut);
1092
 
    } else {
1093
 
      printf("No PGCI Unit table present\n");
1094
 
    }
1095
 
 
1096
 
    printf("\nParental Manegment Information table\n");
1097
 
    printf(  "------------------------------------\n");
1098
 
    if(ifohandle->ptl_mait) {
1099
 
      ifoPrint_PTL_MAIT(ifohandle->ptl_mait);
1100
 
    } else {
1101
 
      printf("No Parental Management Information present\n");
1102
 
    }
1103
 
 
1104
 
    printf("\nVideo Title Set Attribute Table\n");
1105
 
    printf(  "-------------------------------\n");
1106
 
    ifoPrint_VTS_ATRT(ifohandle->vts_atrt);
1107
 
    
1108
 
    printf("\nText Data Manager Information\n");
1109
 
    printf(  "-----------------------------\n");
1110
 
    if(ifohandle->txtdt_mgi) {
1111
 
      //ifoPrint_TXTDT_MGI(&(vmgi->txtdt_mgi));
1112
 
    } else {
1113
 
      printf("No Text Data Manager Information present\n");
1114
 
    }
1115
 
 
1116
 
    printf("\nMenu Cell Adress table\n");
1117
 
    printf(  "-----------------\n");
1118
 
    if(ifohandle->menu_c_adt) {
1119
 
      ifoPrint_C_ADT(ifohandle->menu_c_adt);
1120
 
    } else {
1121
 
      printf("No Menu Cell Adress table present\n");
1122
 
    }
1123
 
 
1124
 
    printf("\nVideo Manager Menu VOBU address map\n");
1125
 
    printf(  "-----------------\n");
1126
 
    if(ifohandle->menu_vobu_admap) {
1127
 
      ifoPrint_VOBU_ADMAP(ifohandle->menu_vobu_admap);
1128
 
    } else {
1129
 
      printf("No Menu VOBU address map present\n");   
1130
 
    }
1131
 
  }
1132
 
 
1133
 
 
1134
 
  if(ifohandle->vtsi_mat) {
1135
 
 
1136
 
    printf("VTS top level\n-------------\n");
1137
 
    ifoPrint_VTSI_MAT(ifohandle->vtsi_mat);
1138
 
 
1139
 
    printf("\nPart of Title Track search pointer table\n");
1140
 
    printf(  "----------------------------------------------\n");
1141
 
    ifoPrint_VTS_PTT_SRPT(ifohandle->vts_ptt_srpt);
1142
 
 
1143
 
    printf("\nPGCI Unit table\n");
1144
 
    printf(  "--------------------\n");
1145
 
    ifoPrint_PGCIT(ifohandle->vts_pgcit);
1146
 
 
1147
 
    printf("\nMenu PGCI Unit table\n");
1148
 
    printf(  "--------------------\n");
1149
 
    if(ifohandle->pgci_ut) {
1150
 
      ifoPrint_PGCI_UT(ifohandle->pgci_ut);
1151
 
    } else {
1152
 
      printf("No Menu PGCI Unit table present\n");
1153
 
    }
1154
 
    
1155
 
    printf("\nTime Search table\n");
1156
 
    printf(  "-----------------\n");
1157
 
    if(ifohandle->vts_tmapt) {
1158
 
      ifoPrint_VTS_TMAPT(ifohandle->vts_tmapt);
1159
 
    } else {
1160
 
      printf("No Time Search table present\n");
1161
 
    }
1162
 
 
1163
 
    printf("\nMenu Cell Adress table\n");
1164
 
    printf(  "-----------------\n");
1165
 
    if(ifohandle->menu_c_adt) {
1166
 
      ifoPrint_C_ADT(ifohandle->menu_c_adt);
1167
 
    } else {
1168
 
      printf("No Cell Adress table present\n");
1169
 
    }
1170
 
 
1171
 
    printf("\nVideo Title Set Menu VOBU address map\n");
1172
 
    printf(  "-----------------\n");
1173
 
    if(ifohandle->menu_vobu_admap) {
1174
 
      ifoPrint_VOBU_ADMAP(ifohandle->menu_vobu_admap);
1175
 
    } else {
1176
 
      printf("No Menu VOBU address map present\n");
1177
 
    }
1178
 
 
1179
 
    printf("\nCell Adress table\n");
1180
 
    printf(  "-----------------\n");
1181
 
    ifoPrint_C_ADT(ifohandle->vts_c_adt);
1182
 
 
1183
 
    printf("\nVideo Title Set VOBU address map\n");
1184
 
    printf(  "-----------------\n");
1185
 
    ifoPrint_VOBU_ADMAP(ifohandle->vts_vobu_admap);
1186
 
  } 
1187
 
 
1188
 
  ifoClose(ifohandle);
1189
 
}
1190