annotate ifo_read.c @ 76:677e09255a1c src

This patch fixes a segmentation fault hit when reading the DVD 'The Express'. It prevents a read/write beyond end of an array due to using a length value taken from the DVD, which can exceed the allocated size. https://bugs.launchpad.net/ubuntu/+source/libdvdread/+bug/894170 The patch was originally written by rickyrockrat (sorry, I don't have his email address) for 4.1.3. I got the DVD and reproduced the segfault using 4.2.0 and verified the patch stops the segfault from happening. We're not confident this is the best fix though, so are posting it here for review. Signed-off-by: Bryce Harrington <bryce@canonical.com>
author rathann
date Sun, 09 Dec 2012 22:03:38 +0000
parents 8e12b8e01713
children 7299649d578f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1 /*
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2 * Copyright (C) 2000, 2001, 2002, 2003
22
447c5319a522 Convert all ISO8859-1 sequences to proper UTF-8.
diego
parents: 21
diff changeset
3 * Björn Englund <d4bjorn@dtek.chalmers.se>,
447c5319a522 Convert all ISO8859-1 sequences to proper UTF-8.
diego
parents: 21
diff changeset
4 * Håkan Hjort <d95hjort@dtek.chalmers.se>
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
5 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
6 * This file is part of libdvdread.
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
7 *
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
8 * libdvdread is free software; you can redistribute it and/or modify
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
11 * (at your option) any later version.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
12 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
13 * libdvdread is distributed in the hope that it will be useful,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
16 * GNU General Public License for more details.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
17 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
18 * 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
19 * 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
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
21 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
22
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
23 #include "config.h"
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
24
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
25 #include <stdio.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
26 #include <stdlib.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
27 #include <inttypes.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
28 #include <string.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
29
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
30 #include "bswap.h"
33
c743d79f187b Move installed headers into dvdread directory to make them easier to
reimar
parents: 27
diff changeset
31 #include "dvdread/ifo_types.h"
c743d79f187b Move installed headers into dvdread directory to make them easier to
reimar
parents: 27
diff changeset
32 #include "dvdread/ifo_read.h"
c743d79f187b Move installed headers into dvdread directory to make them easier to
reimar
parents: 27
diff changeset
33 #include "dvdread/dvd_reader.h"
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
34 #include "dvdread_internal.h"
33
c743d79f187b Move installed headers into dvdread directory to make them easier to
reimar
parents: 27
diff changeset
35 #include "dvdread/bitreader.h"
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
36
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
37 #ifndef DVD_BLOCK_LEN
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
38 #define DVD_BLOCK_LEN 2048
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
39 #endif
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
40
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
41 #ifndef NDEBUG
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
42 #define CHECK_ZERO0(arg) \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
43 if(arg != 0) { \
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
44 fprintf(stderr, "*** Zero check failed in %s:%i\n for %s = 0x%x\n", \
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
45 __FILE__, __LINE__, # arg, arg); \
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
46 }
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
47 #define CHECK_ZERO(arg) \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
48 if(memcmp(my_friendly_zeros, &arg, sizeof(arg))) { \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
49 unsigned int i_CZ; \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
50 fprintf(stderr, "*** Zero check failed in %s:%i\n for %s = 0x", \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
51 __FILE__, __LINE__, # arg ); \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
52 for(i_CZ = 0; i_CZ < sizeof(arg); i_CZ++) \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
53 fprintf(stderr, "%02x", *((uint8_t *)&arg + i_CZ)); \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
54 fprintf(stderr, "\n"); \
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
55 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
56 static const uint8_t my_friendly_zeros[2048];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
57 #else
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
58 #define CHECK_ZERO0(arg) (void)(arg)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
59 #define CHECK_ZERO(arg) (void)(arg)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
60 #endif
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
61
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
62
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
63 /* Prototypes for internal functions */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
64 static int ifoRead_VMG(ifo_handle_t *ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
65 static int ifoRead_VTS(ifo_handle_t *ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
66 static int ifoRead_PGC(ifo_handle_t *ifofile, pgc_t *pgc, unsigned int offset);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
67 static int ifoRead_PGC_COMMAND_TBL(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
68 pgc_command_tbl_t *cmd_tbl,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
69 unsigned int offset);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
70 static int ifoRead_PGC_PROGRAM_MAP(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
71 pgc_program_map_t *program_map,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
72 unsigned int nr, unsigned int offset);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
73 static int ifoRead_CELL_PLAYBACK_TBL(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
74 cell_playback_t *cell_playback,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
75 unsigned int nr, unsigned int offset);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
76 static int ifoRead_CELL_POSITION_TBL(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
77 cell_position_t *cell_position,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
78 unsigned int nr, unsigned int offset);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
79 static int ifoRead_VTS_ATTRIBUTES(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
80 vts_attributes_t *vts_attributes,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
81 unsigned int offset);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
82 static int ifoRead_C_ADT_internal(ifo_handle_t *ifofile, c_adt_t *c_adt,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
83 unsigned int sector);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
84 static int ifoRead_VOBU_ADMAP_internal(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
85 vobu_admap_t *vobu_admap,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
86 unsigned int sector);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
87 static int ifoRead_PGCIT_internal(ifo_handle_t *ifofile, pgcit_t *pgcit,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
88 unsigned int offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
89
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
90 static void ifoFree_PGC(pgc_t **pgc);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
91 static void ifoFree_PGC_COMMAND_TBL(pgc_command_tbl_t *cmd_tbl);
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
92 static void ifoFree_PGCIT_internal(pgcit_t **pgcit);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
93
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
94 static inline int DVDFileSeekForce_( dvd_file_t *dvd_file, uint32_t offset, int force_size ) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
95 return (DVDFileSeekForce(dvd_file, (int)offset, force_size) == (int)offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
96 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
97
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
98 static inline int DVDFileSeek_( dvd_file_t *dvd_file, uint32_t offset ) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
99 return (DVDFileSeek(dvd_file, (int)offset) == (int)offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
100 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
101
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
102 static void read_video_attr(video_attr_t *va) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
103 getbits_state_t state;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
104 uint8_t buf[sizeof(video_attr_t)];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
105
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
106 memcpy(buf, va, sizeof(video_attr_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
107 if (!dvdread_getbits_init(&state, buf)) abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
108 va->mpeg_version = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
109 va->video_format = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
110 va->display_aspect_ratio = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
111 va->permitted_df = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
112 va->line21_cc_1 = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
113 va->line21_cc_2 = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
114 va->unknown1 = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
115 va->bit_rate = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
116 va->picture_size = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
117 va->letterboxed = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
118 va->film_mode = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
119 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
120
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
121 static void read_audio_attr(audio_attr_t *aa) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
122 getbits_state_t state;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
123 uint8_t buf[sizeof(audio_attr_t)];
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
124
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
125 memcpy(buf, aa, sizeof(audio_attr_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
126 if (!dvdread_getbits_init(&state, buf)) abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
127 aa->audio_format = dvdread_getbits(&state, 3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
128 aa->multichannel_extension = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
129 aa->lang_type = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
130 aa->application_mode = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
131 aa->quantization = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
132 aa->sample_frequency = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
133 aa->unknown1 = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
134 aa->channels = dvdread_getbits(&state, 3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
135 aa->lang_code = dvdread_getbits(&state, 16);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
136 aa->lang_extension = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
137 aa->code_extension = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
138 aa->unknown3 = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
139 aa->app_info.karaoke.unknown4 = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
140 aa->app_info.karaoke.channel_assignment = dvdread_getbits(&state, 3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
141 aa->app_info.karaoke.version = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
142 aa->app_info.karaoke.mc_intro = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
143 aa->app_info.karaoke.mode = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
144 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
145
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
146 static void read_multichannel_ext(multichannel_ext_t *me) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
147 getbits_state_t state;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
148 uint8_t buf[sizeof(multichannel_ext_t)];
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
149
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
150 memcpy(buf, me, sizeof(multichannel_ext_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
151 if (!dvdread_getbits_init(&state, buf)) abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
152 me->zero1 = dvdread_getbits(&state, 7);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
153 me->ach0_gme = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
154 me->zero2 = dvdread_getbits(&state, 7);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
155 me->ach1_gme = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
156 me->zero3 = dvdread_getbits(&state, 4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
157 me->ach2_gv1e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
158 me->ach2_gv2e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
159 me->ach2_gm1e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
160 me->ach2_gm2e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
161 me->zero4 = dvdread_getbits(&state, 4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
162 me->ach3_gv1e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
163 me->ach3_gv2e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
164 me->ach3_gmAe = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
165 me->ach3_se2e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
166 me->zero5 = dvdread_getbits(&state, 4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
167 me->ach4_gv1e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
168 me->ach4_gv2e = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
169 me->ach4_gmBe = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
170 me->ach4_seBe = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
171 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
172
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
173 static void read_subp_attr(subp_attr_t *sa) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
174 getbits_state_t state;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
175 uint8_t buf[sizeof(subp_attr_t)];
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
176
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
177 memcpy(buf, sa, sizeof(subp_attr_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
178 if (!dvdread_getbits_init(&state, buf)) abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
179 sa->code_mode = dvdread_getbits(&state, 3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
180 sa->zero1 = dvdread_getbits(&state, 3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
181 sa->type = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
182 sa->zero2 = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
183 sa->lang_code = dvdread_getbits(&state, 16);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
184 sa->lang_extension = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
185 sa->code_extension = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
186 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
187
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
188 static void read_user_ops(user_ops_t *uo) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
189 getbits_state_t state;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
190 uint8_t buf[sizeof(user_ops_t)];
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
191
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
192 memcpy(buf, uo, sizeof(user_ops_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
193 if (!dvdread_getbits_init(&state, buf)) abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
194 uo->zero = dvdread_getbits(&state, 7);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
195 uo->video_pres_mode_change = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
196 uo->karaoke_audio_pres_mode_change = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
197 uo->angle_change = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
198 uo->subpic_stream_change = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
199 uo->audio_stream_change = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
200 uo->pause_on = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
201 uo->still_off = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
202 uo->button_select_or_activate = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
203 uo->resume = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
204 uo->chapter_menu_call = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
205 uo->angle_menu_call = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
206 uo->audio_menu_call = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
207 uo->subpic_menu_call = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
208 uo->root_menu_call = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
209 uo->title_menu_call = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
210 uo->backward_scan = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
211 uo->forward_scan = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
212 uo->next_pg_search = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
213 uo->prev_or_top_pg_search = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
214 uo->time_or_chapter_search = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
215 uo->go_up = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
216 uo->stop = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
217 uo->title_play = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
218 uo->chapter_search_or_play = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
219 uo->title_or_time_play = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
220 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
221
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
222 static void read_pgci_srp(pgci_srp_t *ps) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
223 getbits_state_t state;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
224 uint8_t buf[sizeof(pgci_srp_t)];
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
225
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
226 memcpy(buf, ps, sizeof(pgci_srp_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
227 if (!dvdread_getbits_init(&state, buf)) abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
228 ps->entry_id = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
229 ps->block_mode = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
230 ps->block_type = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
231 ps->unknown1 = dvdread_getbits(&state, 4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
232 ps->ptl_id_mask = dvdread_getbits(&state, 16);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
233 ps->pgc_start_byte = dvdread_getbits(&state, 32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
234 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
235
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
236 static void read_cell_playback(cell_playback_t *cp) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
237 getbits_state_t state;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
238 uint8_t buf[sizeof(cell_playback_t)];
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
239
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
240 memcpy(buf, cp, sizeof(cell_playback_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
241 if (!dvdread_getbits_init(&state, buf)) abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
242 cp->block_mode = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
243 cp->block_type = dvdread_getbits(&state, 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
244 cp->seamless_play = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
245 cp->interleaved = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
246 cp->stc_discontinuity = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
247 cp->seamless_angle = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
248 cp->playback_mode = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
249 cp->restricted = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
250 cp->unknown2 = dvdread_getbits(&state, 6);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
251 cp->still_time = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
252 cp->cell_cmd_nr = dvdread_getbits(&state, 8);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
253
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
254 cp->playback_time.hour = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
255 cp->playback_time.minute = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
256 cp->playback_time.second = dvdread_getbits(&state, 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
257 cp->playback_time.frame_u = dvdread_getbits(&state, 8);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
258
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
259 cp->first_sector = dvdread_getbits(&state, 32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
260 cp->first_ilvu_end_sector = dvdread_getbits(&state, 32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
261 cp->last_vobu_start_sector = dvdread_getbits(&state, 32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
262 cp->last_sector = dvdread_getbits(&state, 32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
263 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
264
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
265 static void read_playback_type(playback_type_t *pt) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
266 getbits_state_t state;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
267 uint8_t buf[sizeof(playback_type_t)];
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
268
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
269 memcpy(buf, pt, sizeof(playback_type_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
270 if (!dvdread_getbits_init(&state, buf)) abort();
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
271 pt->zero_1 = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
272 pt->multi_or_random_pgc_title = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
273 pt->jlc_exists_in_cell_cmd = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
274 pt->jlc_exists_in_prepost_cmd = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
275 pt->jlc_exists_in_button_cmd = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
276 pt->jlc_exists_in_tt_dom = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
277 pt->chapter_search_or_play = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
278 pt->title_or_time_play = dvdread_getbits(&state, 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
279 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
280
12
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
281 static void free_ptl_mait(ptl_mait_t* ptl_mait, int num_entries) {
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
282 int i;
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
283 for (i = 0; i < num_entries; i++)
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
284 free(ptl_mait->countries[i].pf_ptl_mai);
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
285
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
286 free(ptl_mait->countries);
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
287 free(ptl_mait);
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
288 }
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
289
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
290 ifo_handle_t *ifoOpen(dvd_reader_t *dvd, int title) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
291 ifo_handle_t *ifofile;
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
292 int bup_file_opened = 0;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
293 char ifo_filename[13];
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
294
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
295 ifofile = (ifo_handle_t *)malloc(sizeof(ifo_handle_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
296 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
297 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
298
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
299 memset(ifofile, 0, sizeof(ifo_handle_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
300
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
301 ifofile->file = DVDOpenFile(dvd, title, DVD_READ_INFO_FILE);
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
302 if(!ifofile->file) { /* Failed to open IFO, try to open BUP */
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
303 ifofile->file = DVDOpenFile(dvd, title, DVD_READ_INFO_BACKUP_FILE);
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
304 bup_file_opened = 1;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
305 }
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
306
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
307 if (title)
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
308 snprintf(ifo_filename, 12, "VTS_%02d_0.%s", title, bup_file_opened ? "BUP" : "IFO");
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
309 else
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
310 snprintf(ifo_filename, 12, "VIDEO_TS.%s", bup_file_opened ? "BUP" : "IFO");
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
311
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
312 ifo_filename[12] = '\0';
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
313
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
314 if(!ifofile->file) {
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
315 fprintf(stderr, "libdvdread: Can't open file %s.\n", ifo_filename);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
316 free(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
317 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
318 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
319
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
320 /* First check if this is a VMGI file. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
321 if(ifoRead_VMG(ifofile)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
322
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
323 /* These are both mandatory. */
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
324 if(!ifoRead_FP_PGC(ifofile) || !ifoRead_TT_SRPT(ifofile))
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
325 goto ifoOpen_try_bup;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
326
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
327 ifoRead_PGCI_UT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
328 ifoRead_PTL_MAIT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
329
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
330 /* This is also mandatory. */
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
331 if(!ifoRead_VTS_ATRT(ifofile))
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
332 goto ifoOpen_try_bup;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
333
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
334 ifoRead_TXTDT_MGI(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
335 ifoRead_C_ADT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
336 ifoRead_VOBU_ADMAP(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
337
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
338 return ifofile;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
339 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
340
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
341 if(ifoRead_VTS(ifofile)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
342
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
343 if(!ifoRead_VTS_PTT_SRPT(ifofile) || !ifoRead_PGCIT(ifofile))
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
344 goto ifoOpen_try_bup;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
345
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
346 ifoRead_PGCI_UT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
347 ifoRead_VTS_TMAPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
348 ifoRead_C_ADT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
349 ifoRead_VOBU_ADMAP(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
350
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
351 if(!ifoRead_TITLE_C_ADT(ifofile) || !ifoRead_TITLE_VOBU_ADMAP(ifofile))
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
352 goto ifoOpen_try_bup;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
353
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
354 return ifofile;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
355 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
356
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
357 ifoOpen_try_bup:
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
358 if (bup_file_opened)
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
359 goto ifoOpen_fail;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
360
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
361 /* Try BUP instead */
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
362 ifoClose(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
363
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
364 ifofile = (ifo_handle_t *)malloc(sizeof(ifo_handle_t));
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
365 if(!ifofile)
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
366 return NULL;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
367
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
368 memset(ifofile, 0, sizeof(ifo_handle_t));
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
369 ifofile->file = DVDOpenFile(dvd, title, DVD_READ_INFO_BACKUP_FILE);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
370
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
371 if (title)
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
372 snprintf(ifo_filename, 12, "VTS_%02d_0.BUP", title);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
373 else
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
374 strncpy(ifo_filename, "VIDEO_TS.BUP", 12);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
375
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
376 if (!ifofile->file) {
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
377 fprintf(stderr, "libdvdread: Can't open file %s.\n", ifo_filename);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
378 free(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
379 return NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
380 }
59
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
381 bup_file_opened = 1;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
382
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
383 /* First check if this is a VMGI file. */
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
384 if(ifoRead_VMG(ifofile)) {
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
385
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
386 /* These are both mandatory. */
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
387 if(!ifoRead_FP_PGC(ifofile) || !ifoRead_TT_SRPT(ifofile))
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
388 goto ifoOpen_fail;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
389
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
390 ifoRead_PGCI_UT(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
391 ifoRead_PTL_MAIT(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
392
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
393 /* This is also mandatory. */
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
394 if(!ifoRead_VTS_ATRT(ifofile))
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
395 goto ifoOpen_fail;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
396
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
397 ifoRead_TXTDT_MGI(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
398 ifoRead_C_ADT(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
399 ifoRead_VOBU_ADMAP(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
400
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
401 return ifofile;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
402 }
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
403
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
404 if(ifoRead_VTS(ifofile)) {
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
405
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
406 if(!ifoRead_VTS_PTT_SRPT(ifofile) || !ifoRead_PGCIT(ifofile))
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
407 goto ifoOpen_fail;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
408
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
409 ifoRead_PGCI_UT(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
410 ifoRead_VTS_TMAPT(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
411 ifoRead_C_ADT(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
412 ifoRead_VOBU_ADMAP(ifofile);
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
413
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
414 if(!ifoRead_TITLE_C_ADT(ifofile) || !ifoRead_TITLE_VOBU_ADMAP(ifofile))
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
415 goto ifoOpen_fail;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
416
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
417 return ifofile;
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
418 }
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
419
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
420 ifoOpen_fail:
bfefcc426154 Provide BUP file support for more issues.
erik
parents: 58
diff changeset
421 fprintf(stderr, "libdvdread: Invalid IFO for title %d (%s).\n", title, ifo_filename);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
422 ifoClose(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
423 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
424 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
425
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
426
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
427 ifo_handle_t *ifoOpenVMGI(dvd_reader_t *dvd) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
428 ifo_handle_t *ifofile;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
429
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
430 ifofile = (ifo_handle_t *)malloc(sizeof(ifo_handle_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
431 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
432 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
433
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
434 memset(ifofile, 0, sizeof(ifo_handle_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
435
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
436 ifofile->file = DVDOpenFile(dvd, 0, DVD_READ_INFO_FILE);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
437 if(!ifofile->file) /* Should really catch any error and try to fallback */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
438 ifofile->file = DVDOpenFile(dvd, 0, DVD_READ_INFO_BACKUP_FILE);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
439 if(!ifofile->file) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
440 fprintf(stderr, "libdvdread: Can't open file VIDEO_TS.IFO.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
441 free(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
442 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
443 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
444
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
445 if(ifoRead_VMG(ifofile))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
446 return ifofile;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
447
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
448 fprintf(stderr, "libdvdread,ifoOpenVMGI(): Invalid main menu IFO (VIDEO_TS.IFO).\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
449 ifoClose(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
450 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
451 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
452
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
453
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
454 ifo_handle_t *ifoOpenVTSI(dvd_reader_t *dvd, int title) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
455 ifo_handle_t *ifofile;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
456
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
457 ifofile = (ifo_handle_t *)malloc(sizeof(ifo_handle_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
458 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
459 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
460
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
461 memset(ifofile, 0, sizeof(ifo_handle_t));
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
462
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
463 if(title <= 0 || title > 99) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
464 fprintf(stderr, "libdvdread: ifoOpenVTSI invalid title (%d).\n", title);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
465 free(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
466 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
467 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
468
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
469 ifofile->file = DVDOpenFile(dvd, title, DVD_READ_INFO_FILE);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
470 if(!ifofile->file) /* Should really catch any error and try to fallback */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
471 ifofile->file = DVDOpenFile(dvd, title, DVD_READ_INFO_BACKUP_FILE);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
472 if(!ifofile->file) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
473 fprintf(stderr, "libdvdread: Can't open file VTS_%02d_0.IFO.\n", title);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
474 free(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
475 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
476 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
477
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
478 ifoRead_VTS(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
479 if(ifofile->vtsi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
480 return ifofile;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
481
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
482 fprintf(stderr, "libdvdread: Invalid IFO for title %d (VTS_%02d_0.IFO).\n",
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
483 title, title);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
484 ifoClose(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
485 return NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
486 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
487
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
488
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
489 void ifoClose(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
490 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
491 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
492
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
493 ifoFree_VOBU_ADMAP(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
494 ifoFree_TITLE_VOBU_ADMAP(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
495 ifoFree_C_ADT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
496 ifoFree_TITLE_C_ADT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
497 ifoFree_TXTDT_MGI(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
498 ifoFree_VTS_ATRT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
499 ifoFree_PTL_MAIT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
500 ifoFree_PGCI_UT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
501 ifoFree_TT_SRPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
502 ifoFree_FP_PGC(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
503 ifoFree_PGCIT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
504 ifoFree_VTS_PTT_SRPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
505 ifoFree_VTS_TMAPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
506
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
507 if(ifofile->vmgi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
508 free(ifofile->vmgi_mat);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
509
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
510 if(ifofile->vtsi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
511 free(ifofile->vtsi_mat);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
512
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
513 DVDCloseFile(ifofile->file);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
514 ifofile->file = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
515 free(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
516 ifofile = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
517 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
518
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
519
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
520 static int ifoRead_VMG(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
521 vmgi_mat_t *vmgi_mat;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
522
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
523 vmgi_mat = (vmgi_mat_t *)malloc(sizeof(vmgi_mat_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
524 if(!vmgi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
525 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
526
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
527 ifofile->vmgi_mat = vmgi_mat;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
528
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
529 if(!DVDFileSeek_(ifofile->file, 0)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
530 free(ifofile->vmgi_mat);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
531 ifofile->vmgi_mat = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
532 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
533 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
534
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
535 if(!DVDReadBytes(ifofile->file, vmgi_mat, sizeof(vmgi_mat_t))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
536 free(ifofile->vmgi_mat);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
537 ifofile->vmgi_mat = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
538 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
539 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
540
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
541 if(strncmp("DVDVIDEO-VMG", vmgi_mat->vmg_identifier, 12) != 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
542 free(ifofile->vmgi_mat);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
543 ifofile->vmgi_mat = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
544 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
545 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
546
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
547 B2N_32(vmgi_mat->vmg_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
548 B2N_32(vmgi_mat->vmgi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
549 B2N_32(vmgi_mat->vmg_category);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
550 B2N_16(vmgi_mat->vmg_nr_of_volumes);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
551 B2N_16(vmgi_mat->vmg_this_volume_nr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
552 B2N_16(vmgi_mat->vmg_nr_of_title_sets);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
553 B2N_64(vmgi_mat->vmg_pos_code);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
554 B2N_32(vmgi_mat->vmgi_last_byte);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
555 B2N_32(vmgi_mat->first_play_pgc);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
556 B2N_32(vmgi_mat->vmgm_vobs);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
557 B2N_32(vmgi_mat->tt_srpt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
558 B2N_32(vmgi_mat->vmgm_pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
559 B2N_32(vmgi_mat->ptl_mait);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
560 B2N_32(vmgi_mat->vts_atrt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
561 B2N_32(vmgi_mat->txtdt_mgi);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
562 B2N_32(vmgi_mat->vmgm_c_adt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
563 B2N_32(vmgi_mat->vmgm_vobu_admap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
564 read_video_attr(&vmgi_mat->vmgm_video_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
565 read_audio_attr(&vmgi_mat->vmgm_audio_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
566 read_subp_attr(&vmgi_mat->vmgm_subp_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
567
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
568
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
569 CHECK_ZERO(vmgi_mat->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
570 CHECK_ZERO(vmgi_mat->zero_2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
571 CHECK_ZERO(vmgi_mat->zero_3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
572 CHECK_ZERO(vmgi_mat->zero_4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
573 CHECK_ZERO(vmgi_mat->zero_5);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
574 CHECK_ZERO(vmgi_mat->zero_6);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
575 CHECK_ZERO(vmgi_mat->zero_7);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
576 CHECK_ZERO(vmgi_mat->zero_8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
577 CHECK_ZERO(vmgi_mat->zero_9);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
578 CHECK_ZERO(vmgi_mat->zero_10);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
579 CHECK_VALUE(vmgi_mat->vmg_last_sector != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
580 CHECK_VALUE(vmgi_mat->vmgi_last_sector != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
581 CHECK_VALUE(vmgi_mat->vmgi_last_sector * 2 <= vmgi_mat->vmg_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
582 CHECK_VALUE(vmgi_mat->vmgi_last_sector * 2 <= vmgi_mat->vmg_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
583 CHECK_VALUE(vmgi_mat->vmg_nr_of_volumes != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
584 CHECK_VALUE(vmgi_mat->vmg_this_volume_nr != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
585 CHECK_VALUE(vmgi_mat->vmg_this_volume_nr <= vmgi_mat->vmg_nr_of_volumes);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
586 CHECK_VALUE(vmgi_mat->disc_side == 1 || vmgi_mat->disc_side == 2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
587 CHECK_VALUE(vmgi_mat->vmg_nr_of_title_sets != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
588 CHECK_VALUE(vmgi_mat->vmgi_last_byte >= 341);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
589 CHECK_VALUE(vmgi_mat->vmgi_last_byte / DVD_BLOCK_LEN <=
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
590 vmgi_mat->vmgi_last_sector);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
591 /* It seems that first_play_pgc is optional. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
592 CHECK_VALUE(vmgi_mat->first_play_pgc < vmgi_mat->vmgi_last_byte);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
593 CHECK_VALUE(vmgi_mat->vmgm_vobs == 0 ||
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
594 (vmgi_mat->vmgm_vobs > vmgi_mat->vmgi_last_sector &&
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
595 vmgi_mat->vmgm_vobs < vmgi_mat->vmg_last_sector));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
596 CHECK_VALUE(vmgi_mat->tt_srpt <= vmgi_mat->vmgi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
597 CHECK_VALUE(vmgi_mat->vmgm_pgci_ut <= vmgi_mat->vmgi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
598 CHECK_VALUE(vmgi_mat->ptl_mait <= vmgi_mat->vmgi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
599 CHECK_VALUE(vmgi_mat->vts_atrt <= vmgi_mat->vmgi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
600 CHECK_VALUE(vmgi_mat->txtdt_mgi <= vmgi_mat->vmgi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
601 CHECK_VALUE(vmgi_mat->vmgm_c_adt <= vmgi_mat->vmgi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
602 CHECK_VALUE(vmgi_mat->vmgm_vobu_admap <= vmgi_mat->vmgi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
603
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
604 CHECK_VALUE(vmgi_mat->nr_of_vmgm_audio_streams <= 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
605 CHECK_VALUE(vmgi_mat->nr_of_vmgm_subp_streams <= 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
606
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
607 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
608 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
609
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
610
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
611 static int ifoRead_VTS(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
612 vtsi_mat_t *vtsi_mat;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
613 int i;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
614
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
615 vtsi_mat = (vtsi_mat_t *)malloc(sizeof(vtsi_mat_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
616 if(!vtsi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
617 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
618
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
619 ifofile->vtsi_mat = vtsi_mat;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
620
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
621 if(!DVDFileSeek_(ifofile->file, 0)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
622 free(ifofile->vtsi_mat);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
623 ifofile->vtsi_mat = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
624 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
625 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
626
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
627 if(!(DVDReadBytes(ifofile->file, vtsi_mat, sizeof(vtsi_mat_t)))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
628 free(ifofile->vtsi_mat);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
629 ifofile->vtsi_mat = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
630 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
631 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
632
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
633 if(strncmp("DVDVIDEO-VTS", vtsi_mat->vts_identifier, 12) != 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
634 free(ifofile->vtsi_mat);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
635 ifofile->vtsi_mat = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
636 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
637 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
638
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
639 read_video_attr(&vtsi_mat->vtsm_video_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
640 read_video_attr(&vtsi_mat->vts_video_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
641 read_audio_attr(&vtsi_mat->vtsm_audio_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
642 for(i=0; i<8; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
643 read_audio_attr(&vtsi_mat->vts_audio_attr[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
644 read_subp_attr(&vtsi_mat->vtsm_subp_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
645 for(i=0; i<32; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
646 read_subp_attr(&vtsi_mat->vts_subp_attr[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
647 B2N_32(vtsi_mat->vts_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
648 B2N_32(vtsi_mat->vtsi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
649 B2N_32(vtsi_mat->vts_category);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
650 B2N_32(vtsi_mat->vtsi_last_byte);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
651 B2N_32(vtsi_mat->vtsm_vobs);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
652 B2N_32(vtsi_mat->vtstt_vobs);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
653 B2N_32(vtsi_mat->vts_ptt_srpt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
654 B2N_32(vtsi_mat->vts_pgcit);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
655 B2N_32(vtsi_mat->vtsm_pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
656 B2N_32(vtsi_mat->vts_tmapt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
657 B2N_32(vtsi_mat->vtsm_c_adt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
658 B2N_32(vtsi_mat->vtsm_vobu_admap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
659 B2N_32(vtsi_mat->vts_c_adt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
660 B2N_32(vtsi_mat->vts_vobu_admap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
661
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
662
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
663 CHECK_ZERO(vtsi_mat->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
664 CHECK_ZERO(vtsi_mat->zero_2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
665 CHECK_ZERO(vtsi_mat->zero_3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
666 CHECK_ZERO(vtsi_mat->zero_4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
667 CHECK_ZERO(vtsi_mat->zero_5);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
668 CHECK_ZERO(vtsi_mat->zero_6);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
669 CHECK_ZERO(vtsi_mat->zero_7);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
670 CHECK_ZERO(vtsi_mat->zero_8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
671 CHECK_ZERO(vtsi_mat->zero_9);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
672 CHECK_ZERO(vtsi_mat->zero_10);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
673 CHECK_ZERO(vtsi_mat->zero_11);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
674 CHECK_ZERO(vtsi_mat->zero_12);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
675 CHECK_ZERO(vtsi_mat->zero_13);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
676 CHECK_ZERO(vtsi_mat->zero_14);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
677 CHECK_ZERO(vtsi_mat->zero_15);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
678 CHECK_ZERO(vtsi_mat->zero_16);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
679 CHECK_ZERO(vtsi_mat->zero_17);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
680 CHECK_ZERO(vtsi_mat->zero_18);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
681 CHECK_ZERO(vtsi_mat->zero_19);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
682 CHECK_ZERO(vtsi_mat->zero_20);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
683 CHECK_ZERO(vtsi_mat->zero_21);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
684 CHECK_VALUE(vtsi_mat->vtsi_last_sector*2 <= vtsi_mat->vts_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
685 CHECK_VALUE(vtsi_mat->vtsi_last_byte/DVD_BLOCK_LEN <= vtsi_mat->vtsi_last_sector);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
686 CHECK_VALUE(vtsi_mat->vtsm_vobs == 0 ||
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
687 (vtsi_mat->vtsm_vobs > vtsi_mat->vtsi_last_sector &&
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
688 vtsi_mat->vtsm_vobs < vtsi_mat->vts_last_sector));
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
689 CHECK_VALUE(vtsi_mat->vtstt_vobs == 0 ||
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
690 (vtsi_mat->vtstt_vobs > vtsi_mat->vtsi_last_sector &&
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
691 vtsi_mat->vtstt_vobs < vtsi_mat->vts_last_sector));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
692 CHECK_VALUE(vtsi_mat->vts_ptt_srpt <= vtsi_mat->vtsi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
693 CHECK_VALUE(vtsi_mat->vts_pgcit <= vtsi_mat->vtsi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
694 CHECK_VALUE(vtsi_mat->vtsm_pgci_ut <= vtsi_mat->vtsi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
695 CHECK_VALUE(vtsi_mat->vts_tmapt <= vtsi_mat->vtsi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
696 CHECK_VALUE(vtsi_mat->vtsm_c_adt <= vtsi_mat->vtsi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
697 CHECK_VALUE(vtsi_mat->vtsm_vobu_admap <= vtsi_mat->vtsi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
698 CHECK_VALUE(vtsi_mat->vts_c_adt <= vtsi_mat->vtsi_last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
699 CHECK_VALUE(vtsi_mat->vts_vobu_admap <= vtsi_mat->vtsi_last_sector);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
700
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
701 CHECK_VALUE(vtsi_mat->nr_of_vtsm_audio_streams <= 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
702 CHECK_VALUE(vtsi_mat->nr_of_vtsm_subp_streams <= 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
703
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
704 CHECK_VALUE(vtsi_mat->nr_of_vts_audio_streams <= 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
705 for(i = vtsi_mat->nr_of_vts_audio_streams; i < 8; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
706 CHECK_ZERO(vtsi_mat->vts_audio_attr[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
707
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
708 CHECK_VALUE(vtsi_mat->nr_of_vts_subp_streams <= 32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
709 for(i = vtsi_mat->nr_of_vts_subp_streams; i < 32; i++)
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
710 CHECK_ZERO(vtsi_mat->vts_subp_attr[i]);
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
711
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
712 for(i = 0; i < 8; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
713 read_multichannel_ext(&vtsi_mat->vts_mu_audio_attr[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
714 CHECK_ZERO0(vtsi_mat->vts_mu_audio_attr[i].zero1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
715 CHECK_ZERO0(vtsi_mat->vts_mu_audio_attr[i].zero2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
716 CHECK_ZERO0(vtsi_mat->vts_mu_audio_attr[i].zero3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
717 CHECK_ZERO0(vtsi_mat->vts_mu_audio_attr[i].zero4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
718 CHECK_ZERO0(vtsi_mat->vts_mu_audio_attr[i].zero5);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
719 CHECK_ZERO(vtsi_mat->vts_mu_audio_attr[i].zero6);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
720 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
721
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
722 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
723 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
724
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
725
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
726 static int ifoRead_PGC_COMMAND_TBL(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
727 pgc_command_tbl_t *cmd_tbl,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
728 unsigned int offset) {
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
729
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
730 memset(cmd_tbl, 0, sizeof(pgc_command_tbl_t));
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
731
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
732 if(!DVDFileSeek_(ifofile->file, offset))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
733 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
734
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
735 if(!(DVDReadBytes(ifofile->file, cmd_tbl, PGC_COMMAND_TBL_SIZE)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
736 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
737
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
738 B2N_16(cmd_tbl->nr_of_pre);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
739 B2N_16(cmd_tbl->nr_of_post);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
740 B2N_16(cmd_tbl->nr_of_cell);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
741
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
742 CHECK_VALUE(cmd_tbl->nr_of_pre + cmd_tbl->nr_of_post + cmd_tbl->nr_of_cell<= 255);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
743
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
744 if(cmd_tbl->nr_of_pre != 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
745 unsigned int pre_cmds_size = cmd_tbl->nr_of_pre * COMMAND_DATA_SIZE;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
746 cmd_tbl->pre_cmds = (vm_cmd_t *)malloc(pre_cmds_size);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
747 if(!cmd_tbl->pre_cmds)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
748 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
749
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
750 if(!(DVDReadBytes(ifofile->file, cmd_tbl->pre_cmds, pre_cmds_size))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
751 free(cmd_tbl->pre_cmds);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
752 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
753 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
754 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
755
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
756 if(cmd_tbl->nr_of_post != 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
757 unsigned int post_cmds_size = cmd_tbl->nr_of_post * COMMAND_DATA_SIZE;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
758 cmd_tbl->post_cmds = (vm_cmd_t *)malloc(post_cmds_size);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
759 if(!cmd_tbl->post_cmds) {
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
760 if(cmd_tbl->pre_cmds)
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
761 free(cmd_tbl->pre_cmds);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
762 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
763 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
764 if(!(DVDReadBytes(ifofile->file, cmd_tbl->post_cmds, post_cmds_size))) {
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
765 if(cmd_tbl->pre_cmds)
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
766 free(cmd_tbl->pre_cmds);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
767 free(cmd_tbl->post_cmds);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
768 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
769 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
770 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
771
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
772 if(cmd_tbl->nr_of_cell != 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
773 unsigned int cell_cmds_size = cmd_tbl->nr_of_cell * COMMAND_DATA_SIZE;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
774 cmd_tbl->cell_cmds = (vm_cmd_t *)malloc(cell_cmds_size);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
775 if(!cmd_tbl->cell_cmds) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
776 if(cmd_tbl->pre_cmds)
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
777 free(cmd_tbl->pre_cmds);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
778 if(cmd_tbl->post_cmds)
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
779 free(cmd_tbl->post_cmds);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
780 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
781 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
782 if(!(DVDReadBytes(ifofile->file, cmd_tbl->cell_cmds, cell_cmds_size))) {
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
783 if(cmd_tbl->pre_cmds)
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
784 free(cmd_tbl->pre_cmds);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
785 if(cmd_tbl->post_cmds)
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
786 free(cmd_tbl->post_cmds);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
787 free(cmd_tbl->cell_cmds);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
788 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
789 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
790 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
791
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
792 /*
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
793 * Make a run over all the commands and see that we can interpret them all?
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
794 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
795 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
796 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
797
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
798
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
799 static void ifoFree_PGC_COMMAND_TBL(pgc_command_tbl_t *cmd_tbl) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
800 if(cmd_tbl) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
801 if(cmd_tbl->nr_of_pre && cmd_tbl->pre_cmds)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
802 free(cmd_tbl->pre_cmds);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
803 if(cmd_tbl->nr_of_post && cmd_tbl->post_cmds)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
804 free(cmd_tbl->post_cmds);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
805 if(cmd_tbl->nr_of_cell && cmd_tbl->cell_cmds)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
806 free(cmd_tbl->cell_cmds);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
807 free(cmd_tbl);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
808 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
809 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
810
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
811 static int ifoRead_PGC_PROGRAM_MAP(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
812 pgc_program_map_t *program_map,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
813 unsigned int nr, unsigned int offset) {
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
814 unsigned int size = nr * sizeof(pgc_program_map_t);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
815
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
816 if(!DVDFileSeek_(ifofile->file, offset))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
817 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
818
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
819 if(!(DVDReadBytes(ifofile->file, program_map, size)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
820 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
821
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
822 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
823 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
824
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
825 static int ifoRead_CELL_PLAYBACK_TBL(ifo_handle_t *ifofile,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
826 cell_playback_t *cell_playback,
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
827 unsigned int nr, unsigned int offset) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
828 unsigned int i;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
829 unsigned int size = nr * sizeof(cell_playback_t);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
830
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
831 if(!DVDFileSeek_(ifofile->file, offset))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
832 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
833
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
834 if(!(DVDReadBytes(ifofile->file, cell_playback, size)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
835 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
836
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
837 for(i = 0; i < nr; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
838 read_cell_playback(&cell_playback[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
839 /* Changed < to <= because this was false in the movie 'Pi'. */
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
840 CHECK_VALUE(cell_playback[i].last_vobu_start_sector <=
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
841 cell_playback[i].last_sector);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
842 CHECK_VALUE(cell_playback[i].first_sector <=
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
843 cell_playback[i].last_vobu_start_sector);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
844 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
845
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
846 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
847 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
848
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
849
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
850 static int ifoRead_CELL_POSITION_TBL(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
851 cell_position_t *cell_position,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
852 unsigned int nr, unsigned int offset) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
853 unsigned int i;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
854 unsigned int size = nr * sizeof(cell_position_t);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
855
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
856 if(!DVDFileSeek_(ifofile->file, offset))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
857 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
858
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
859 if(!(DVDReadBytes(ifofile->file, cell_position, size)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
860 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
861
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
862 for(i = 0; i < nr; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
863 B2N_16(cell_position[i].vob_id_nr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
864 CHECK_ZERO(cell_position[i].zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
865 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
866
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
867 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
868 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
869
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
870 static int ifoRead_PGC(ifo_handle_t *ifofile, pgc_t *pgc, unsigned int offset) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
871 unsigned int i;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
872
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
873 if(!DVDFileSeek_(ifofile->file, offset))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
874 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
875
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
876 if(!(DVDReadBytes(ifofile->file, pgc, PGC_SIZE)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
877 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
878
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
879 read_user_ops(&pgc->prohibited_ops);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
880 B2N_16(pgc->next_pgc_nr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
881 B2N_16(pgc->prev_pgc_nr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
882 B2N_16(pgc->goup_pgc_nr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
883 B2N_16(pgc->command_tbl_offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
884 B2N_16(pgc->program_map_offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
885 B2N_16(pgc->cell_playback_offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
886 B2N_16(pgc->cell_position_offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
887
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
888 for(i = 0; i < 8; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
889 B2N_16(pgc->audio_control[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
890 for(i = 0; i < 32; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
891 B2N_32(pgc->subp_control[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
892 for(i = 0; i < 16; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
893 B2N_32(pgc->palette[i]);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
894
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
895 CHECK_ZERO(pgc->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
896 CHECK_VALUE(pgc->nr_of_programs <= pgc->nr_of_cells);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
897
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
898 /* verify time (look at print_time) */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
899 for(i = 0; i < 8; i++)
43
6177a05fa534 Use parens to make the 'is present' mask explicit
erik
parents: 33
diff changeset
900 if(!(pgc->audio_control[i] & 0x8000)) /* The 'is present' bit */
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
901 CHECK_ZERO(pgc->audio_control[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
902 for(i = 0; i < 32; i++)
43
6177a05fa534 Use parens to make the 'is present' mask explicit
erik
parents: 33
diff changeset
903 if(!(pgc->subp_control[i] & 0x80000000)) /* The 'is present' bit */
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
904 CHECK_ZERO(pgc->subp_control[i]);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
905
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
906 /* Check that time is 0:0:0:0 also if nr_of_programs == 0 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
907 if(pgc->nr_of_programs == 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
908 CHECK_ZERO(pgc->still_time);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
909 CHECK_ZERO(pgc->pg_playback_mode); /* ?? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
910 CHECK_VALUE(pgc->program_map_offset == 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
911 CHECK_VALUE(pgc->cell_playback_offset == 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
912 CHECK_VALUE(pgc->cell_position_offset == 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
913 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
914 CHECK_VALUE(pgc->program_map_offset != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
915 CHECK_VALUE(pgc->cell_playback_offset != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
916 CHECK_VALUE(pgc->cell_position_offset != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
917 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
918
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
919 if(pgc->command_tbl_offset != 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
920 pgc->command_tbl = malloc(sizeof(pgc_command_tbl_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
921 if(!pgc->command_tbl)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
922 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
923
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
924 if(!ifoRead_PGC_COMMAND_TBL(ifofile, pgc->command_tbl,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
925 offset + pgc->command_tbl_offset)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
926 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
927 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
928 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
929 pgc->command_tbl = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
930 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
931
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
932 if(pgc->program_map_offset != 0 && pgc->nr_of_programs>0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
933 pgc->program_map = malloc(pgc->nr_of_programs * sizeof(pgc_program_map_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
934 if(!pgc->program_map) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
935 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
936 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
937 if(!ifoRead_PGC_PROGRAM_MAP(ifofile, pgc->program_map,pgc->nr_of_programs,
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
938 offset + pgc->program_map_offset)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
939 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
940 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
941 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
942 pgc->program_map = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
943 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
944
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
945 if(pgc->cell_playback_offset != 0 && pgc->nr_of_cells>0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
946 pgc->cell_playback = malloc(pgc->nr_of_cells * sizeof(cell_playback_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
947 if(!pgc->cell_playback) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
948 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
949 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
950 if(!ifoRead_CELL_PLAYBACK_TBL(ifofile, pgc->cell_playback,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
951 pgc->nr_of_cells,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
952 offset + pgc->cell_playback_offset)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
953 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
954 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
955 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
956 pgc->cell_playback = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
957 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
958
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
959 if(pgc->cell_position_offset != 0 && pgc->nr_of_cells>0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
960 pgc->cell_position = malloc(pgc->nr_of_cells * sizeof(cell_position_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
961 if(!pgc->cell_position) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
962 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
963 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
964 if(!ifoRead_CELL_POSITION_TBL(ifofile, pgc->cell_position,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
965 pgc->nr_of_cells,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
966 offset + pgc->cell_position_offset)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
967 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
968 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
969 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
970 pgc->cell_position = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
971 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
972
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
973 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
974 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
975
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
976 int ifoRead_FP_PGC(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
977
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
978 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
979 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
980
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
981 if(!ifofile->vmgi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
982 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
983
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
984 /* It seems that first_play_pgc is optional after all. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
985 ifofile->first_play_pgc = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
986 if(ifofile->vmgi_mat->first_play_pgc == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
987 return 1;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
988
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
989 ifofile->first_play_pgc = (pgc_t *)calloc(1, sizeof(pgc_t));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
990 if(!ifofile->first_play_pgc)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
991 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
992
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
993 ifofile->first_play_pgc->ref_count = 1;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
994 if(!ifoRead_PGC(ifofile, ifofile->first_play_pgc,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
995 ifofile->vmgi_mat->first_play_pgc)) {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
996 ifoFree_PGC(&ifofile->first_play_pgc);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
997 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
998 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
999
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1000 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1001 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1002
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1003 static void ifoFree_PGC(pgc_t **pgc) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1004 if(pgc && *pgc && (--(*pgc)->ref_count) <= 0) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1005 ifoFree_PGC_COMMAND_TBL((*pgc)->command_tbl);
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1006 if((*pgc)->program_map)
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1007 free((*pgc)->program_map);
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1008 if((*pgc)->cell_playback)
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1009 free((*pgc)->cell_playback);
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1010 if((*pgc)->cell_position)
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1011 free((*pgc)->cell_position);
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1012 free(*pgc);
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1013 }
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1014 if (pgc) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1015 *pgc = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1016 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1017 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1018
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1019 void ifoFree_FP_PGC(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1020 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1021 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1022
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1023 if(ifofile->first_play_pgc) {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1024 ifoFree_PGC(&ifofile->first_play_pgc);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1025 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1026 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1027
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1028
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1029 int ifoRead_TT_SRPT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1030 tt_srpt_t *tt_srpt;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1031 int i, info_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1032
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1033 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1034 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1035
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1036 if(!ifofile->vmgi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1037 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1038
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1039 if(ifofile->vmgi_mat->tt_srpt == 0) /* mandatory */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1040 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1041
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1042 if(!DVDFileSeek_(ifofile->file, ifofile->vmgi_mat->tt_srpt * DVD_BLOCK_LEN))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1043 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1044
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1045 tt_srpt = (tt_srpt_t *)malloc(sizeof(tt_srpt_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1046 if(!tt_srpt)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1047 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1048
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1049 ifofile->tt_srpt = tt_srpt;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1050
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1051 if(!(DVDReadBytes(ifofile->file, tt_srpt, TT_SRPT_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1052 fprintf(stderr, "libdvdread: Unable to read read TT_SRPT.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1053 free(tt_srpt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1054 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1055 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1056
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1057 B2N_16(tt_srpt->nr_of_srpts);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1058 B2N_32(tt_srpt->last_byte);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1059
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1060 info_length = tt_srpt->last_byte + 1 - TT_SRPT_SIZE;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1061
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1062 tt_srpt->title = (title_info_t *)malloc(info_length);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1063 if(!tt_srpt->title) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1064 free(tt_srpt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1065 ifofile->tt_srpt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1066 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1067 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1068 if(!(DVDReadBytes(ifofile->file, tt_srpt->title, info_length))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1069 fprintf(stderr, "libdvdread: Unable to read read TT_SRPT.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1070 ifoFree_TT_SRPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1071 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1072 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1073
76
677e09255a1c This patch fixes a segmentation fault hit when reading the DVD 'The
rathann
parents: 75
diff changeset
1074 if(tt_srpt->nr_of_srpts>info_length/sizeof(title_info_t)){
677e09255a1c This patch fixes a segmentation fault hit when reading the DVD 'The
rathann
parents: 75
diff changeset
1075 fprintf(stderr,"libdvdread: data mismatch: info_length (%ld)!= nr_of_srpts (%d). Truncating.\n",
677e09255a1c This patch fixes a segmentation fault hit when reading the DVD 'The
rathann
parents: 75
diff changeset
1076 info_length/sizeof(title_info_t),tt_srpt->nr_of_srpts);
677e09255a1c This patch fixes a segmentation fault hit when reading the DVD 'The
rathann
parents: 75
diff changeset
1077 tt_srpt->nr_of_srpts=info_length/sizeof(title_info_t);
677e09255a1c This patch fixes a segmentation fault hit when reading the DVD 'The
rathann
parents: 75
diff changeset
1078 }
677e09255a1c This patch fixes a segmentation fault hit when reading the DVD 'The
rathann
parents: 75
diff changeset
1079
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1080 for(i = 0; i < tt_srpt->nr_of_srpts; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1081 B2N_16(tt_srpt->title[i].nr_of_ptts);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1082 B2N_16(tt_srpt->title[i].parental_id);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1083 B2N_32(tt_srpt->title[i].title_set_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1084 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1085
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1086
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1087 CHECK_ZERO(tt_srpt->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1088 CHECK_VALUE(tt_srpt->nr_of_srpts != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1089 CHECK_VALUE(tt_srpt->nr_of_srpts < 100); /* ?? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1090 CHECK_VALUE((int)tt_srpt->nr_of_srpts * sizeof(title_info_t) <= info_length);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1091
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1092 for(i = 0; i < tt_srpt->nr_of_srpts; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1093 read_playback_type(&tt_srpt->title[i].pb_ty);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1094 CHECK_VALUE(tt_srpt->title[i].pb_ty.zero_1 == 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1095 CHECK_VALUE(tt_srpt->title[i].nr_of_angles != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1096 CHECK_VALUE(tt_srpt->title[i].nr_of_angles < 10);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1097 /* CHECK_VALUE(tt_srpt->title[i].nr_of_ptts != 0); */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1098 /* XXX: this assertion breaks Ghostbusters: */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1099 CHECK_VALUE(tt_srpt->title[i].nr_of_ptts < 1000); /* ?? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1100 CHECK_VALUE(tt_srpt->title[i].title_set_nr != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1101 CHECK_VALUE(tt_srpt->title[i].title_set_nr < 100); /* ?? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1102 CHECK_VALUE(tt_srpt->title[i].vts_ttn != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1103 CHECK_VALUE(tt_srpt->title[i].vts_ttn < 100); /* ?? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1104 /* CHECK_VALUE(tt_srpt->title[i].title_set_sector != 0); */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1105 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1106
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1107 /* Make this a function */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1108 #if 0
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1109 if(memcmp((uint8_t *)tt_srpt->title +
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1110 tt_srpt->nr_of_srpts * sizeof(title_info_t),
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1111 my_friendly_zeros,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1112 info_length - tt_srpt->nr_of_srpts * sizeof(title_info_t))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1113 fprintf(stderr, "VMG_PTT_SRPT slack is != 0, ");
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1114 hexdump((uint8_t *)tt_srpt->title +
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1115 tt_srpt->nr_of_srpts * sizeof(title_info_t),
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1116 info_length - tt_srpt->nr_of_srpts * sizeof(title_info_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1117 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1118 #endif
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1119
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1120 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1121 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1122
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1123
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1124 void ifoFree_TT_SRPT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1125 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1126 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1127
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1128 if(ifofile->tt_srpt) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1129 free(ifofile->tt_srpt->title);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1130 free(ifofile->tt_srpt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1131 ifofile->tt_srpt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1132 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1133 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1134
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1135
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1136 int ifoRead_VTS_PTT_SRPT(ifo_handle_t *ifofile) {
68
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1137 vts_ptt_srpt_t *vts_ptt_srpt = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1138 int info_length, i, j;
67
8fab3ce417ed Clean up malloc calls
erik
parents: 65
diff changeset
1139 uint32_t *data = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1140
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1141 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1142 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1143
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1144 if(!ifofile->vtsi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1145 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1146
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1147 if(ifofile->vtsi_mat->vts_ptt_srpt == 0) /* mandatory */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1148 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1149
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1150 if(!DVDFileSeek_(ifofile->file,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1151 ifofile->vtsi_mat->vts_ptt_srpt * DVD_BLOCK_LEN))
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1152 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1153
67
8fab3ce417ed Clean up malloc calls
erik
parents: 65
diff changeset
1154 vts_ptt_srpt = malloc(sizeof(vts_ptt_srpt_t));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1155 if(!vts_ptt_srpt)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1156 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1157
71
df32da8e44b1 Make sure vts_ptt_srpt->title is freed
erik
parents: 70
diff changeset
1158 vts_ptt_srpt->title = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1159 ifofile->vts_ptt_srpt = vts_ptt_srpt;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1160
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1161 if(!(DVDReadBytes(ifofile->file, vts_ptt_srpt, VTS_PTT_SRPT_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1162 fprintf(stderr, "libdvdread: Unable to read PTT search table.\n");
68
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1163 goto fail;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1164 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1165
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1166 B2N_16(vts_ptt_srpt->nr_of_srpts);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1167 B2N_32(vts_ptt_srpt->last_byte);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1168
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1169 CHECK_ZERO(vts_ptt_srpt->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1170 CHECK_VALUE(vts_ptt_srpt->nr_of_srpts != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1171 CHECK_VALUE(vts_ptt_srpt->nr_of_srpts < 100); /* ?? */
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1172
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1173 info_length = vts_ptt_srpt->last_byte + 1 - VTS_PTT_SRPT_SIZE;
67
8fab3ce417ed Clean up malloc calls
erik
parents: 65
diff changeset
1174 data = malloc(info_length);
69
d35a5dd07b34 Conditional style change
erik
parents: 68
diff changeset
1175 if(!data)
68
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1176 goto fail;
69
d35a5dd07b34 Conditional style change
erik
parents: 68
diff changeset
1177
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1178 if(!(DVDReadBytes(ifofile->file, data, info_length))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1179 fprintf(stderr, "libdvdread: Unable to read PTT search table.\n");
68
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1180 goto fail;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1181 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1182
70
f6cd5131324d Fix crash when PTT is too short
erik
parents: 69
diff changeset
1183 if(vts_ptt_srpt->nr_of_srpts > info_length / sizeof(*data)) {
f6cd5131324d Fix crash when PTT is too short
erik
parents: 69
diff changeset
1184 fprintf(stderr, "libdvdread: PTT search table too small.\n");
f6cd5131324d Fix crash when PTT is too short
erik
parents: 69
diff changeset
1185 goto fail;
f6cd5131324d Fix crash when PTT is too short
erik
parents: 69
diff changeset
1186 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1187 for(i = 0; i < vts_ptt_srpt->nr_of_srpts; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1188 B2N_32(data[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1189 /* assert(data[i] + sizeof(ptt_info_t) <= vts_ptt_srpt->last_byte + 1);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1190 Magic Knight Rayearth Daybreak is mastered very strange and has
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1191 Titles with 0 PTTs. They all have a data[i] offsets beyond the end of
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1192 of the vts_ptt_srpt structure. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1193 CHECK_VALUE(data[i] + sizeof(ptt_info_t) <= vts_ptt_srpt->last_byte + 1 + 4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1194 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1195
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1196 vts_ptt_srpt->ttu_offset = data;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1197
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1198 vts_ptt_srpt->title = malloc(vts_ptt_srpt->nr_of_srpts * sizeof(ttu_t));
69
d35a5dd07b34 Conditional style change
erik
parents: 68
diff changeset
1199 if(!vts_ptt_srpt->title)
68
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1200 goto fail;
69
d35a5dd07b34 Conditional style change
erik
parents: 68
diff changeset
1201
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1202 for(i = 0; i < vts_ptt_srpt->nr_of_srpts; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1203 int n;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1204 if(i < vts_ptt_srpt->nr_of_srpts - 1)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1205 n = (data[i+1] - data[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1206 else
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1207 n = (vts_ptt_srpt->last_byte + 1 - data[i]);
69
d35a5dd07b34 Conditional style change
erik
parents: 68
diff changeset
1208
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1209 /* assert(n > 0 && (n % 4) == 0);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1210 Magic Knight Rayearth Daybreak is mastered very strange and has
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1211 Titles with 0 PTTs. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1212 if(n < 0) n = 0;
69
d35a5dd07b34 Conditional style change
erik
parents: 68
diff changeset
1213
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1214 CHECK_VALUE(n % 4 == 0);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1215
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1216 vts_ptt_srpt->title[i].nr_of_ptts = n / 4;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1217 vts_ptt_srpt->title[i].ptt = malloc(n * sizeof(ptt_info_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1218 if(!vts_ptt_srpt->title[i].ptt) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1219 for(n = 0; n < i; n++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1220 free(vts_ptt_srpt->title[n].ptt);
68
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1221
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1222 goto fail;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1223 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1224 for(j = 0; j < vts_ptt_srpt->title[i].nr_of_ptts; j++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1225 /* The assert placed here because of Magic Knight Rayearth Daybreak */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1226 CHECK_VALUE(data[i] + sizeof(ptt_info_t) <= vts_ptt_srpt->last_byte + 1);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1227 vts_ptt_srpt->title[i].ptt[j].pgcn
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1228 = *(uint16_t*)(((char *)data) + data[i] + 4*j - VTS_PTT_SRPT_SIZE);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1229 vts_ptt_srpt->title[i].ptt[j].pgn
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1230 = *(uint16_t*)(((char *)data) + data[i] + 4*j + 2 - VTS_PTT_SRPT_SIZE);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1231 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1232 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1233
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1234 for(i = 0; i < vts_ptt_srpt->nr_of_srpts; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1235 for(j = 0; j < vts_ptt_srpt->title[i].nr_of_ptts; j++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1236 B2N_16(vts_ptt_srpt->title[i].ptt[j].pgcn);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1237 B2N_16(vts_ptt_srpt->title[i].ptt[j].pgn);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1238 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1239 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1240
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1241 for(i = 0; i < vts_ptt_srpt->nr_of_srpts; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1242 CHECK_VALUE(vts_ptt_srpt->title[i].nr_of_ptts < 1000); /* ?? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1243 for(j = 0; j < vts_ptt_srpt->title[i].nr_of_ptts; j++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1244 CHECK_VALUE(vts_ptt_srpt->title[i].ptt[j].pgcn != 0 );
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1245 CHECK_VALUE(vts_ptt_srpt->title[i].ptt[j].pgcn < 1000); /* ?? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1246 CHECK_VALUE(vts_ptt_srpt->title[i].ptt[j].pgn != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1247 CHECK_VALUE(vts_ptt_srpt->title[i].ptt[j].pgn < 100); /* ?? */
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1248 if (vts_ptt_srpt->title[i].ptt[j].pgcn == 0 ||
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1249 vts_ptt_srpt->title[i].ptt[j].pgcn >= 1000 ||
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1250 vts_ptt_srpt->title[i].ptt[j].pgn == 0 ||
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1251 vts_ptt_srpt->title[i].ptt[j].pgn >= 100) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1252 return 0;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1253 }
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1254
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1255 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1256 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1257
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1258 return 1;
68
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1259
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1260 fail:
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1261 free(data);
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1262 ifofile->vts_ptt_srpt = 0;
71
df32da8e44b1 Make sure vts_ptt_srpt->title is freed
erik
parents: 70
diff changeset
1263 free(vts_ptt_srpt->title);
68
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1264 free(vts_ptt_srpt);
3748dde919dd Clean up error paths.
erik
parents: 67
diff changeset
1265 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1266 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1267
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1268
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1269 void ifoFree_VTS_PTT_SRPT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1270 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1271 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1272
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1273 if(ifofile->vts_ptt_srpt) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1274 int i;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1275 for(i = 0; i < ifofile->vts_ptt_srpt->nr_of_srpts; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1276 free(ifofile->vts_ptt_srpt->title[i].ptt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1277 free(ifofile->vts_ptt_srpt->ttu_offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1278 free(ifofile->vts_ptt_srpt->title);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1279 free(ifofile->vts_ptt_srpt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1280 ifofile->vts_ptt_srpt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1281 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1282 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1283
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1284
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1285 int ifoRead_PTL_MAIT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1286 ptl_mait_t *ptl_mait;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1287 int info_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1288 unsigned int i, j;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1289
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1290 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1291 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1292
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1293 if(!ifofile->vmgi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1294 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1295
74
133be2fe0eef Use NULL instead of 0 consistently.
erik
parents: 73
diff changeset
1296 if(ifofile->vmgi_mat->ptl_mait == NULL)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1297 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1298
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1299 if(!DVDFileSeek_(ifofile->file, ifofile->vmgi_mat->ptl_mait * DVD_BLOCK_LEN))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1300 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1301
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1302 ptl_mait = (ptl_mait_t *)malloc(sizeof(ptl_mait_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1303 if(!ptl_mait)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1304 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1305
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1306 ifofile->ptl_mait = ptl_mait;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1307
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1308 if(!(DVDReadBytes(ifofile->file, ptl_mait, PTL_MAIT_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1309 free(ptl_mait);
74
133be2fe0eef Use NULL instead of 0 consistently.
erik
parents: 73
diff changeset
1310 ifofile->ptl_mait = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1311 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1312 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1313
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1314 B2N_16(ptl_mait->nr_of_countries);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1315 B2N_16(ptl_mait->nr_of_vtss);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1316 B2N_32(ptl_mait->last_byte);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1317
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1318 CHECK_VALUE(ptl_mait->nr_of_countries != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1319 CHECK_VALUE(ptl_mait->nr_of_countries < 100); /* ?? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1320 CHECK_VALUE(ptl_mait->nr_of_vtss != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1321 CHECK_VALUE(ptl_mait->nr_of_vtss < 100); /* ?? */
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1322 CHECK_VALUE(ptl_mait->nr_of_countries * PTL_MAIT_COUNTRY_SIZE
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1323 <= ptl_mait->last_byte + 1 - PTL_MAIT_SIZE);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1324
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1325 info_length = ptl_mait->nr_of_countries * sizeof(ptl_mait_country_t);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1326 ptl_mait->countries = (ptl_mait_country_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1327 if(!ptl_mait->countries) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1328 free(ptl_mait);
74
133be2fe0eef Use NULL instead of 0 consistently.
erik
parents: 73
diff changeset
1329 ifofile->ptl_mait = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1330 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1331 }
63
46c05a214511 Inhibit double free of parental management information
erik
parents: 61
diff changeset
1332 for(i = 0; i < ptl_mait->nr_of_countries; i++) {
46c05a214511 Inhibit double free of parental management information
erik
parents: 61
diff changeset
1333 ptl_mait->countries[i].pf_ptl_mai = NULL;
46c05a214511 Inhibit double free of parental management information
erik
parents: 61
diff changeset
1334 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1335
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1336 for(i = 0; i < ptl_mait->nr_of_countries; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1337 if(!(DVDReadBytes(ifofile->file, &ptl_mait->countries[i], PTL_MAIT_COUNTRY_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1338 fprintf(stderr, "libdvdread: Unable to read PTL_MAIT.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1339 free(ptl_mait->countries);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1340 free(ptl_mait);
74
133be2fe0eef Use NULL instead of 0 consistently.
erik
parents: 73
diff changeset
1341 ifofile->ptl_mait = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1342 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1343 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1344 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1345
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1346 for(i = 0; i < ptl_mait->nr_of_countries; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1347 B2N_16(ptl_mait->countries[i].country_code);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1348 B2N_16(ptl_mait->countries[i].pf_ptl_mai_start_byte);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1349 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1350
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1351 for(i = 0; i < ptl_mait->nr_of_countries; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1352 CHECK_ZERO(ptl_mait->countries[i].zero_1);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1353 CHECK_ZERO(ptl_mait->countries[i].zero_2);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1354 CHECK_VALUE(ptl_mait->countries[i].pf_ptl_mai_start_byte
64
70c34d162e6e Replaces the hard-coded values
erik
parents: 63
diff changeset
1355 + sizeof(pf_level_t) * (ptl_mait->nr_of_vtss + 1) <= ptl_mait->last_byte + 1);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1356 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1357
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1358 for(i = 0; i < ptl_mait->nr_of_countries; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1359 uint16_t *pf_temp;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1360
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1361 if(!DVDFileSeek_(ifofile->file,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1362 ifofile->vmgi_mat->ptl_mait * DVD_BLOCK_LEN
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1363 + ptl_mait->countries[i].pf_ptl_mai_start_byte)) {
65
fb0ccb03eb7d Report which index failed reading
erik
parents: 64
diff changeset
1364 fprintf(stderr, "libdvdread: Unable to seek PTL_MAIT table at index %d.\n",i);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1365 free(ptl_mait->countries);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1366 free(ptl_mait);
63
46c05a214511 Inhibit double free of parental management information
erik
parents: 61
diff changeset
1367 ifofile->ptl_mait = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1368 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1369 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1370 info_length = (ptl_mait->nr_of_vtss + 1) * sizeof(pf_level_t);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1371 pf_temp = (uint16_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1372 if(!pf_temp) {
12
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
1373 free_ptl_mait(ptl_mait, i);
63
46c05a214511 Inhibit double free of parental management information
erik
parents: 61
diff changeset
1374 ifofile->ptl_mait = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1375 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1376 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1377 if(!(DVDReadBytes(ifofile->file, pf_temp, info_length))) {
65
fb0ccb03eb7d Report which index failed reading
erik
parents: 64
diff changeset
1378 fprintf(stderr, "libdvdread: Unable to read PTL_MAIT table at index %d.\n",i);
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
1379 free(pf_temp);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
1380 free_ptl_mait(ptl_mait, i);
63
46c05a214511 Inhibit double free of parental management information
erik
parents: 61
diff changeset
1381 ifofile->ptl_mait = NULL;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
1382 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1383 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1384 for (j = 0; j < ((ptl_mait->nr_of_vtss + 1) * 8); j++) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
1385 B2N_16(pf_temp[j]);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1386 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1387 ptl_mait->countries[i].pf_ptl_mai = (pf_level_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1388 if(!ptl_mait->countries[i].pf_ptl_mai) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1389 free(pf_temp);
12
056f5573a7dc moved various pieces of duplicated code to free_ptl_mait(); patch by Erik Hovland org
nicodvb
parents: 3
diff changeset
1390 free_ptl_mait(ptl_mait, i);
63
46c05a214511 Inhibit double free of parental management information
erik
parents: 61
diff changeset
1391 ifofile->ptl_mait = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1392 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1393 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1394 { /* Transpose the array so we can use C indexing. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1395 int level, vts;
64
70c34d162e6e Replaces the hard-coded values
erik
parents: 63
diff changeset
1396 for(level = 0; level < PTL_MAIT_NUM_LEVEL; level++) {
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1397 for(vts = 0; vts <= ptl_mait->nr_of_vtss; vts++) {
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1398 ptl_mait->countries[i].pf_ptl_mai[vts][level] =
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1399 pf_temp[(7-level)*(ptl_mait->nr_of_vtss+1) + vts];
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1400 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1401 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1402 free(pf_temp);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1403 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1404 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1405 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1406 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1407
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1408 void ifoFree_PTL_MAIT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1409 unsigned int i;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1410
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1411 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1412 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1413
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1414 if(ifofile->ptl_mait) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1415 for(i = 0; i < ifofile->ptl_mait->nr_of_countries; i++) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
1416 free(ifofile->ptl_mait->countries[i].pf_ptl_mai);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1417 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1418 free(ifofile->ptl_mait->countries);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1419 free(ifofile->ptl_mait);
74
133be2fe0eef Use NULL instead of 0 consistently.
erik
parents: 73
diff changeset
1420 ifofile->ptl_mait = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1421 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1422 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1423
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1424 int ifoRead_VTS_TMAPT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1425 vts_tmapt_t *vts_tmapt;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1426 uint32_t *vts_tmap_srp;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1427 unsigned int offset;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1428 int info_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1429 unsigned int i, j;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1430
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1431 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1432 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1433
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1434 if(!ifofile->vtsi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1435 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1436
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1437 if(ifofile->vtsi_mat->vts_tmapt == 0) { /* optional(?) */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1438 ifofile->vts_tmapt = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1439 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1440 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1441
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1442 offset = ifofile->vtsi_mat->vts_tmapt * DVD_BLOCK_LEN;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1443
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1444 if(!DVDFileSeek_(ifofile->file, offset))
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1445 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1446
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1447 vts_tmapt = (vts_tmapt_t *)malloc(sizeof(vts_tmapt_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1448 if(!vts_tmapt)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1449 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1450
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1451 ifofile->vts_tmapt = vts_tmapt;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1452
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1453 if(!(DVDReadBytes(ifofile->file, vts_tmapt, VTS_TMAPT_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1454 fprintf(stderr, "libdvdread: Unable to read VTS_TMAPT.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1455 free(vts_tmapt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1456 ifofile->vts_tmapt = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1457 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1458 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1459
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1460 B2N_16(vts_tmapt->nr_of_tmaps);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1461 B2N_32(vts_tmapt->last_byte);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1462
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1463 CHECK_ZERO(vts_tmapt->zero_1);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1464
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1465 info_length = vts_tmapt->nr_of_tmaps * 4;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1466
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1467 vts_tmap_srp = (uint32_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1468 if(!vts_tmap_srp) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1469 free(vts_tmapt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1470 ifofile->vts_tmapt = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1471 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1472 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1473
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1474 vts_tmapt->tmap_offset = vts_tmap_srp;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1475
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1476 if(!(DVDReadBytes(ifofile->file, vts_tmap_srp, info_length))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1477 fprintf(stderr, "libdvdread: Unable to read VTS_TMAPT.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1478 free(vts_tmap_srp);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1479 free(vts_tmapt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1480 ifofile->vts_tmapt = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1481 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1482 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1483
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1484 for (i = 0; i < vts_tmapt->nr_of_tmaps; i++) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
1485 B2N_32(vts_tmap_srp[i]);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1486 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1487
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1488
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1489 info_length = vts_tmapt->nr_of_tmaps * sizeof(vts_tmap_t);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1490
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1491 vts_tmapt->tmap = (vts_tmap_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1492 if(!vts_tmapt->tmap) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1493 free(vts_tmap_srp);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1494 free(vts_tmapt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1495 ifofile->vts_tmapt = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1496 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1497 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1498
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1499 memset(vts_tmapt->tmap, 0, info_length); /* So ifoFree_VTS_TMAPT works. */
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1500
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1501 for(i = 0; i < vts_tmapt->nr_of_tmaps; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1502 if(!DVDFileSeek_(ifofile->file, offset + vts_tmap_srp[i])) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1503 ifoFree_VTS_TMAPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1504 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1505 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1506
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1507 if(!(DVDReadBytes(ifofile->file, &vts_tmapt->tmap[i], VTS_TMAP_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1508 fprintf(stderr, "libdvdread: Unable to read VTS_TMAP.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1509 ifoFree_VTS_TMAPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1510 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1511 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1512
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1513 B2N_16(vts_tmapt->tmap[i].nr_of_entries);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1514 CHECK_ZERO(vts_tmapt->tmap[i].zero_1);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1515
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1516 if(vts_tmapt->tmap[i].nr_of_entries == 0) { /* Early out if zero entries */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1517 vts_tmapt->tmap[i].map_ent = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1518 continue;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1519 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1520
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1521 info_length = vts_tmapt->tmap[i].nr_of_entries * sizeof(map_ent_t);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1522
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1523 vts_tmapt->tmap[i].map_ent = (map_ent_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1524 if(!vts_tmapt->tmap[i].map_ent) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1525 ifoFree_VTS_TMAPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1526 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1527 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1528
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1529 if(!(DVDReadBytes(ifofile->file, vts_tmapt->tmap[i].map_ent, info_length))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1530 fprintf(stderr, "libdvdread: Unable to read VTS_TMAP_ENT.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1531 ifoFree_VTS_TMAPT(ifofile);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1532 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1533 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1534
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1535 for(j = 0; j < vts_tmapt->tmap[i].nr_of_entries; j++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1536 B2N_32(vts_tmapt->tmap[i].map_ent[j]);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1537 }
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1538
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1539 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1540 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1541
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1542 void ifoFree_VTS_TMAPT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1543 unsigned int i;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1544
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1545 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1546 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1547
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1548 if(ifofile->vts_tmapt) {
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1549 for(i = 0; i < ifofile->vts_tmapt->nr_of_tmaps; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1550 if(ifofile->vts_tmapt->tmap[i].map_ent)
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1551 free(ifofile->vts_tmapt->tmap[i].map_ent);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1552 free(ifofile->vts_tmapt->tmap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1553 free(ifofile->vts_tmapt->tmap_offset);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1554 free(ifofile->vts_tmapt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1555 ifofile->vts_tmapt = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1556 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1557 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1558
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1559
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1560 int ifoRead_TITLE_C_ADT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1561
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1562 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1563 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1564
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1565 if(!ifofile->vtsi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1566 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1567
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1568 if(ifofile->vtsi_mat->vts_c_adt == 0) /* mandatory */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1569 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1570
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1571 ifofile->vts_c_adt = (c_adt_t *)malloc(sizeof(c_adt_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1572 if(!ifofile->vts_c_adt)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1573 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1574
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1575 if(!ifoRead_C_ADT_internal(ifofile, ifofile->vts_c_adt,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1576 ifofile->vtsi_mat->vts_c_adt)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1577 free(ifofile->vts_c_adt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1578 ifofile->vts_c_adt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1579 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1580 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1581
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1582 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1583 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1584
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1585 int ifoRead_C_ADT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1586 unsigned int sector;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1587
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1588 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1589 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1590
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1591 if(ifofile->vmgi_mat) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1592 if(ifofile->vmgi_mat->vmgm_c_adt == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1593 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1594 sector = ifofile->vmgi_mat->vmgm_c_adt;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1595 } else if(ifofile->vtsi_mat) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1596 if(ifofile->vtsi_mat->vtsm_c_adt == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1597 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1598 sector = ifofile->vtsi_mat->vtsm_c_adt;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1599 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1600 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1601 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1602
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1603 ifofile->menu_c_adt = (c_adt_t *)malloc(sizeof(c_adt_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1604 if(!ifofile->menu_c_adt)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1605 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1606
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1607 if(!ifoRead_C_ADT_internal(ifofile, ifofile->menu_c_adt, sector)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1608 free(ifofile->menu_c_adt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1609 ifofile->menu_c_adt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1610 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1611 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1612
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1613 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1614 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1615
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1616 static int ifoRead_C_ADT_internal(ifo_handle_t *ifofile,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1617 c_adt_t *c_adt, unsigned int sector) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1618 int i, info_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1619
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1620 if(!DVDFileSeek_(ifofile->file, sector * DVD_BLOCK_LEN))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1621 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1622
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1623 if(!(DVDReadBytes(ifofile->file, c_adt, C_ADT_SIZE)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1624 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1625
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1626 B2N_16(c_adt->nr_of_vobs);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1627 B2N_32(c_adt->last_byte);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1628
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1629 info_length = c_adt->last_byte + 1 - C_ADT_SIZE;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1630
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1631 CHECK_ZERO(c_adt->zero_1);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1632 /* assert(c_adt->nr_of_vobs > 0);
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1633 Magic Knight Rayearth Daybreak is mastered very strange and has
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1634 Titles with a VOBS that has no cells. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1635 CHECK_VALUE(info_length % sizeof(cell_adr_t) == 0);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1636
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1637 /* assert(info_length / sizeof(cell_adr_t) >= c_adt->nr_of_vobs);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1638 Enemy of the State region 2 (de) has Titles where nr_of_vobs field
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1639 is to high, they high ones are never referenced though. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1640 if(info_length / sizeof(cell_adr_t) < c_adt->nr_of_vobs) {
61
eac01aeb7be5 Fix some spelling issues
siretart
parents: 59
diff changeset
1641 fprintf(stderr, "libdvdread: *C_ADT nr_of_vobs > available info entries\n");
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1642 c_adt->nr_of_vobs = info_length / sizeof(cell_adr_t);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1643 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1644
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1645 c_adt->cell_adr_table = (cell_adr_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1646 if(!c_adt->cell_adr_table)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1647 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1648
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1649 if(info_length &&
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1650 !(DVDReadBytes(ifofile->file, c_adt->cell_adr_table, info_length))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1651 free(c_adt->cell_adr_table);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1652 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1653 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1654
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1655 for(i = 0; i < info_length/sizeof(cell_adr_t); i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1656 B2N_16(c_adt->cell_adr_table[i].vob_id);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1657 B2N_32(c_adt->cell_adr_table[i].start_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1658 B2N_32(c_adt->cell_adr_table[i].last_sector);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1659
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1660 CHECK_ZERO(c_adt->cell_adr_table[i].zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1661 CHECK_VALUE(c_adt->cell_adr_table[i].vob_id > 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1662 CHECK_VALUE(c_adt->cell_adr_table[i].vob_id <= c_adt->nr_of_vobs);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1663 CHECK_VALUE(c_adt->cell_adr_table[i].cell_id > 0);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1664 CHECK_VALUE(c_adt->cell_adr_table[i].start_sector <
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
1665 c_adt->cell_adr_table[i].last_sector);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1666 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1667
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1668 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1669 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1670
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1671
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1672 static void ifoFree_C_ADT_internal(c_adt_t *c_adt) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1673 if(c_adt) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1674 free(c_adt->cell_adr_table);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1675 free(c_adt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1676 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1677 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1678
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1679 void ifoFree_C_ADT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1680 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1681 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1682
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1683 ifoFree_C_ADT_internal(ifofile->menu_c_adt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1684 ifofile->menu_c_adt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1685 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1686
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1687 void ifoFree_TITLE_C_ADT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1688 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1689 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1690
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1691 ifoFree_C_ADT_internal(ifofile->vts_c_adt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1692 ifofile->vts_c_adt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1693 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1694
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1695 int ifoRead_TITLE_VOBU_ADMAP(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1696 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1697 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1698
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1699 if(!ifofile->vtsi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1700 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1701
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1702 if(ifofile->vtsi_mat->vts_vobu_admap == 0) /* mandatory */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1703 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1704
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1705 ifofile->vts_vobu_admap = (vobu_admap_t *)malloc(sizeof(vobu_admap_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1706 if(!ifofile->vts_vobu_admap)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1707 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1708
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1709 if(!ifoRead_VOBU_ADMAP_internal(ifofile, ifofile->vts_vobu_admap,
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1710 ifofile->vtsi_mat->vts_vobu_admap)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1711 free(ifofile->vts_vobu_admap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1712 ifofile->vts_vobu_admap = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1713 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1714 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1715
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1716 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1717 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1718
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1719 int ifoRead_VOBU_ADMAP(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1720 unsigned int sector;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1721
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1722 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1723 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1724
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1725 if(ifofile->vmgi_mat) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1726 if(ifofile->vmgi_mat->vmgm_vobu_admap == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1727 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1728 sector = ifofile->vmgi_mat->vmgm_vobu_admap;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1729 } else if(ifofile->vtsi_mat) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1730 if(ifofile->vtsi_mat->vtsm_vobu_admap == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1731 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1732 sector = ifofile->vtsi_mat->vtsm_vobu_admap;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1733 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1734 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1735 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1736
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1737 ifofile->menu_vobu_admap = (vobu_admap_t *)malloc(sizeof(vobu_admap_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1738 if(!ifofile->menu_vobu_admap)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1739 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1740
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1741 if(!ifoRead_VOBU_ADMAP_internal(ifofile, ifofile->menu_vobu_admap, sector)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1742 free(ifofile->menu_vobu_admap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1743 ifofile->menu_vobu_admap = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1744 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1745 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1746
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1747 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1748 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1749
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1750 static int ifoRead_VOBU_ADMAP_internal(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1751 vobu_admap_t *vobu_admap,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1752 unsigned int sector) {
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1753 unsigned int i;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1754 int info_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1755
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1756 if(!DVDFileSeekForce_(ifofile->file, sector * DVD_BLOCK_LEN, sector))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1757 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1758
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1759 if(!(DVDReadBytes(ifofile->file, vobu_admap, VOBU_ADMAP_SIZE)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1760 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1761
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1762 B2N_32(vobu_admap->last_byte);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1763
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1764 info_length = vobu_admap->last_byte + 1 - VOBU_ADMAP_SIZE;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1765 /* assert(info_length > 0);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1766 Magic Knight Rayearth Daybreak is mastered very strange and has
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1767 Titles with a VOBS that has no VOBUs. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1768 CHECK_VALUE(info_length % sizeof(uint32_t) == 0);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1769
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1770 vobu_admap->vobu_start_sectors = (uint32_t *)malloc(info_length);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1771 if(!vobu_admap->vobu_start_sectors) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1772 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1773 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1774 if(info_length &&
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1775 !(DVDReadBytes(ifofile->file,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
1776 vobu_admap->vobu_start_sectors, info_length))) {
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1777 free(vobu_admap->vobu_start_sectors);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1778 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1779 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1780
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1781 for(i = 0; i < info_length/sizeof(uint32_t); i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1782 B2N_32(vobu_admap->vobu_start_sectors[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1783
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1784 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1785 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1786
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1787
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1788 static void ifoFree_VOBU_ADMAP_internal(vobu_admap_t *vobu_admap) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1789 if(vobu_admap) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1790 free(vobu_admap->vobu_start_sectors);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1791 free(vobu_admap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1792 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1793 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1794
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1795 void ifoFree_VOBU_ADMAP(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1796 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1797 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1798
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1799 ifoFree_VOBU_ADMAP_internal(ifofile->menu_vobu_admap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1800 ifofile->menu_vobu_admap = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1801 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1802
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1803 void ifoFree_TITLE_VOBU_ADMAP(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1804 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1805 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1806
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1807 ifoFree_VOBU_ADMAP_internal(ifofile->vts_vobu_admap);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1808 ifofile->vts_vobu_admap = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1809 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1810
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1811 int ifoRead_PGCIT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1812
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1813 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1814 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1815
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1816 if(!ifofile->vtsi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1817 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1818
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1819 if(ifofile->vtsi_mat->vts_pgcit == 0) /* mandatory */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1820 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1821
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1822 ifofile->vts_pgcit = (pgcit_t *)calloc(1, sizeof(pgcit_t));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1823 if(!ifofile->vts_pgcit)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1824 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1825
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1826 ifofile->vts_pgcit->ref_count = 1;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1827 if(!ifoRead_PGCIT_internal(ifofile, ifofile->vts_pgcit,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1828 ifofile->vtsi_mat->vts_pgcit * DVD_BLOCK_LEN)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1829 free(ifofile->vts_pgcit);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1830 ifofile->vts_pgcit = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1831 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1832 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1833
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1834 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1835 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1836
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1837 static int find_dup_pgc(pgci_srp_t *pgci_srp, uint32_t start_byte, int count) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1838 int i;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1839
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1840 for(i = 0; i < count; i++) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1841 if(pgci_srp[i].pgc_start_byte == start_byte) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1842 return i;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1843 }
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1844 }
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1845 return -1;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1846 }
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1847
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1848 static int ifoRead_PGCIT_internal(ifo_handle_t *ifofile, pgcit_t *pgcit,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1849 unsigned int offset) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1850 int i, info_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1851 uint8_t *data, *ptr;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1852
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1853 if(!DVDFileSeek_(ifofile->file, offset))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1854 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1855
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1856 if(!(DVDReadBytes(ifofile->file, pgcit, PGCIT_SIZE)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1857 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1858
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1859 B2N_16(pgcit->nr_of_pgci_srp);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1860 B2N_32(pgcit->last_byte);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1861
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1862 CHECK_ZERO(pgcit->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1863 /* assert(pgcit->nr_of_pgci_srp != 0);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1864 Magic Knight Rayearth Daybreak is mastered very strange and has
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1865 Titles with 0 PTTs. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1866 CHECK_VALUE(pgcit->nr_of_pgci_srp < 10000); /* ?? seen max of 1338 */
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1867
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1868 info_length = pgcit->nr_of_pgci_srp * PGCI_SRP_SIZE;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1869 data = malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1870 if(!data)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1871 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1872
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1873 if(info_length && !(DVDReadBytes(ifofile->file, data, info_length))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1874 free(data);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1875 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1876 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1877
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1878 pgcit->pgci_srp = malloc(pgcit->nr_of_pgci_srp * sizeof(pgci_srp_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1879 if(!pgcit->pgci_srp) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1880 free(data);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1881 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1882 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1883 ptr = data;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1884 for(i = 0; i < pgcit->nr_of_pgci_srp; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1885 memcpy(&pgcit->pgci_srp[i], ptr, PGCI_SRP_SIZE);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1886 ptr += PGCI_SRP_SIZE;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1887 read_pgci_srp(&pgcit->pgci_srp[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1888 CHECK_VALUE(pgcit->pgci_srp[i].unknown1 == 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1889 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1890 free(data);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1891
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1892 for(i = 0; i < pgcit->nr_of_pgci_srp; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1893 CHECK_VALUE(pgcit->pgci_srp[i].pgc_start_byte + PGC_SIZE <= pgcit->last_byte+1);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1894
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1895 for(i = 0; i < pgcit->nr_of_pgci_srp; i++) {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1896 int dup;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1897 if((dup = find_dup_pgc(pgcit->pgci_srp, pgcit->pgci_srp[i].pgc_start_byte, i)) >= 0) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1898 pgcit->pgci_srp[i].pgc = pgcit->pgci_srp[dup].pgc;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1899 pgcit->pgci_srp[i].pgc->ref_count++;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1900 continue;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1901 }
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1902 pgcit->pgci_srp[i].pgc = calloc(1, sizeof(pgc_t));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1903 if(!pgcit->pgci_srp[i].pgc) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1904 int j;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1905 for(j = 0; j < i; j++) {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1906 ifoFree_PGC(&pgcit->pgci_srp[j].pgc);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1907 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1908 goto fail;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1909 }
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1910 pgcit->pgci_srp[i].pgc->ref_count = 1;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1911 if(!ifoRead_PGC(ifofile, pgcit->pgci_srp[i].pgc,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1912 offset + pgcit->pgci_srp[i].pgc_start_byte)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1913 int j;
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1914 for(j = 0; j <= i; j++) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1915 ifoFree_PGC(&pgcit->pgci_srp[j].pgc);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1916 }
73
933bbcf89338 Fix memory leaks.
rathann
parents: 71
diff changeset
1917 free(pgcit->pgci_srp[i].pgc);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1918 goto fail;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1919 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1920 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1921
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1922 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1923 fail:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1924 free(pgcit->pgci_srp);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1925 pgcit->pgci_srp = NULL;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1926 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1927 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1928
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1929 static void ifoFree_PGCIT_internal(pgcit_t **pgcit) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1930 if(pgcit && *pgcit && (--(*pgcit)->ref_count <= 0)) {
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1931 int i;
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1932 for(i = 0; i < (*pgcit)->nr_of_pgci_srp; i++)
73
933bbcf89338 Fix memory leaks.
rathann
parents: 71
diff changeset
1933 {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1934 ifoFree_PGC(&(*pgcit)->pgci_srp[i].pgc);
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1935 free(&(*pgcit)->pgci_srp[i].pgc);
73
933bbcf89338 Fix memory leaks.
rathann
parents: 71
diff changeset
1936 }
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1937 free((*pgcit)->pgci_srp);
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1938 free(*pgcit);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1939 }
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1940 if (pgcit)
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1941 *pgcit = NULL;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1942 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1943
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1944 void ifoFree_PGCIT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1945 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1946 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1947
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1948 if(ifofile->vts_pgcit) {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1949 ifoFree_PGCIT_internal(&ifofile->vts_pgcit);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1950 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1951 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1952
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1953 static int find_dup_lut(pgci_lu_t *lu, uint32_t start_byte, int count) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1954 int i;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1955
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1956 for(i = 0; i < count; i++) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1957 if(lu[i].lang_start_byte == start_byte) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1958 return i;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1959 }
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1960 }
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1961 return -1;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
1962 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1963
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1964 int ifoRead_PGCI_UT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1965 pgci_ut_t *pgci_ut;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1966 unsigned int sector;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1967 unsigned int i;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1968 int info_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1969 uint8_t *data, *ptr;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1970
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1971 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1972 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1973
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1974 if(ifofile->vmgi_mat) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1975 if(ifofile->vmgi_mat->vmgm_pgci_ut == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1976 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1977 sector = ifofile->vmgi_mat->vmgm_pgci_ut;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1978 } else if(ifofile->vtsi_mat) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1979 if(ifofile->vtsi_mat->vtsm_pgci_ut == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1980 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1981 sector = ifofile->vtsi_mat->vtsm_pgci_ut;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1982 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1983 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1984 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1985
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1986 ifofile->pgci_ut = (pgci_ut_t *)malloc(sizeof(pgci_ut_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1987 if(!ifofile->pgci_ut)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1988 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1989
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1990 if(!DVDFileSeek_(ifofile->file, sector * DVD_BLOCK_LEN)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1991 free(ifofile->pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1992 ifofile->pgci_ut = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1993 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1994 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
1995
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1996 if(!(DVDReadBytes(ifofile->file, ifofile->pgci_ut, PGCI_UT_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1997 free(ifofile->pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1998 ifofile->pgci_ut = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1999 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2000 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2001
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2002 pgci_ut = ifofile->pgci_ut;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2003
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2004 B2N_16(pgci_ut->nr_of_lus);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2005 B2N_32(pgci_ut->last_byte);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2006
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2007 CHECK_ZERO(pgci_ut->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2008 CHECK_VALUE(pgci_ut->nr_of_lus != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2009 CHECK_VALUE(pgci_ut->nr_of_lus < 100); /* ?? 3-4 ? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2010 CHECK_VALUE((uint32_t)pgci_ut->nr_of_lus * PGCI_LU_SIZE < pgci_ut->last_byte);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2011
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2012 info_length = pgci_ut->nr_of_lus * PGCI_LU_SIZE;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2013 data = malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2014 if(!data) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2015 free(pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2016 ifofile->pgci_ut = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2017 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2018 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2019 if(!(DVDReadBytes(ifofile->file, data, info_length))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2020 free(data);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2021 free(pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2022 ifofile->pgci_ut = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2023 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2024 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2025
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2026 pgci_ut->lu = malloc(pgci_ut->nr_of_lus * sizeof(pgci_lu_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2027 if(!pgci_ut->lu) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2028 free(data);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2029 free(pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2030 ifofile->pgci_ut = 0;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
2031 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2032 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2033 ptr = data;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2034 for(i = 0; i < pgci_ut->nr_of_lus; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2035 memcpy(&pgci_ut->lu[i], ptr, PGCI_LU_SIZE);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2036 ptr += PGCI_LU_SIZE;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2037 B2N_16(pgci_ut->lu[i].lang_code);
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2038 B2N_32(pgci_ut->lu[i].lang_start_byte);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2039 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2040 free(data);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2041
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2042 for(i = 0; i < pgci_ut->nr_of_lus; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2043 /* Maybe this is only defined for v1.1 and later titles? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2044 /* If the bits in 'lu[i].exists' are enumerated abcd efgh then:
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
2045 VTS_x_yy.IFO VIDEO_TS.IFO
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2046 a == 0x83 "Root" 0x82 "Title"
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2047 b == 0x84 "Subpicture"
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2048 c == 0x85 "Audio"
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2049 d == 0x86 "Angle"
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2050 e == 0x87 "PTT"
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2051 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2052 CHECK_VALUE((pgci_ut->lu[i].exists & 0x07) == 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2053 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2054
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2055 for(i = 0; i < pgci_ut->nr_of_lus; i++) {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2056 int dup;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2057 if((dup = find_dup_lut(pgci_ut->lu, pgci_ut->lu[i].lang_start_byte, i)) >= 0) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2058 pgci_ut->lu[i].pgcit = pgci_ut->lu[dup].pgcit;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2059 pgci_ut->lu[i].pgcit->ref_count++;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2060 continue;
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2061 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2062 pgci_ut->lu[i].pgcit = malloc(sizeof(pgcit_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2063 if(!pgci_ut->lu[i].pgcit) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2064 unsigned int j;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2065 for(j = 0; j < i; j++) {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2066 ifoFree_PGCIT_internal(&pgci_ut->lu[j].pgcit);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2067 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2068 free(pgci_ut->lu);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2069 free(pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2070 ifofile->pgci_ut = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2071 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2072 }
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2073 pgci_ut->lu[i].pgcit->ref_count = 1;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2074 if(!ifoRead_PGCIT_internal(ifofile, pgci_ut->lu[i].pgcit,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2075 sector * DVD_BLOCK_LEN
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2076 + pgci_ut->lu[i].lang_start_byte)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2077 unsigned int j;
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2078 for(j = 0; j <= i; j++) {
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2079 ifoFree_PGCIT_internal(&pgci_ut->lu[j].pgcit);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2080 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2081 free(pgci_ut->lu);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2082 free(pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2083 ifofile->pgci_ut = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2084 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2085 }
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
2086 /* FIXME: Iterate and verify that all menus that should exists accordingly
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
2087 * to pgci_ut->lu[i].exists really do? */
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2088 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2089
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2090 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2091 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2092
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2093
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2094 void ifoFree_PGCI_UT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2095 unsigned int i;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2096
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2097 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2098 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2099
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2100 if(ifofile->pgci_ut) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2101 for(i = 0; i < ifofile->pgci_ut->nr_of_lus; i++) {
75
8e12b8e01713 Accommodate duplicate language units and pgcs.
rathann
parents: 74
diff changeset
2102 ifoFree_PGCIT_internal(&ifofile->pgci_ut->lu[i].pgcit);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2103 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2104 free(ifofile->pgci_ut->lu);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2105 free(ifofile->pgci_ut);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2106 ifofile->pgci_ut = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2107 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2108 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2109
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2110 static int ifoRead_VTS_ATTRIBUTES(ifo_handle_t *ifofile,
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2111 vts_attributes_t *vts_attributes,
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2112 unsigned int offset) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2113 unsigned int i;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2114
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2115 if(!DVDFileSeek_(ifofile->file, offset))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2116 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2117
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2118 if(!(DVDReadBytes(ifofile->file, vts_attributes, sizeof(vts_attributes_t))))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2119 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2120
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2121 read_video_attr(&vts_attributes->vtsm_vobs_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2122 read_video_attr(&vts_attributes->vtstt_vobs_video_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2123 read_audio_attr(&vts_attributes->vtsm_audio_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2124 for(i=0; i<8; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2125 read_audio_attr(&vts_attributes->vtstt_audio_attr[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2126 read_subp_attr(&vts_attributes->vtsm_subp_attr);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2127 for(i=0; i<32; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2128 read_subp_attr(&vts_attributes->vtstt_subp_attr[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2129 B2N_32(vts_attributes->last_byte);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2130 B2N_32(vts_attributes->vts_cat);
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2131
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2132 CHECK_ZERO(vts_attributes->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2133 CHECK_ZERO(vts_attributes->zero_2);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2134 CHECK_ZERO(vts_attributes->zero_3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2135 CHECK_ZERO(vts_attributes->zero_4);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2136 CHECK_ZERO(vts_attributes->zero_5);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2137 CHECK_ZERO(vts_attributes->zero_6);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2138 CHECK_ZERO(vts_attributes->zero_7);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2139 CHECK_VALUE(vts_attributes->nr_of_vtsm_audio_streams <= 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2140 CHECK_VALUE(vts_attributes->nr_of_vtsm_subp_streams <= 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2141 CHECK_VALUE(vts_attributes->nr_of_vtstt_audio_streams <= 8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2142 for(i = vts_attributes->nr_of_vtstt_audio_streams; i < 8; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2143 CHECK_ZERO(vts_attributes->vtstt_audio_attr[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2144 CHECK_VALUE(vts_attributes->nr_of_vtstt_subp_streams <= 32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2145 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2146 unsigned int nr_coded;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2147 CHECK_VALUE(vts_attributes->last_byte + 1 >= VTS_ATTRIBUTES_MIN_SIZE);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2148 nr_coded = (vts_attributes->last_byte + 1 - VTS_ATTRIBUTES_MIN_SIZE)/6;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2149 /* This is often nr_coded = 70, how do you know how many there really are? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2150 if(nr_coded > 32) { /* We haven't read more from disk/file anyway */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2151 nr_coded = 32;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2152 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2153 CHECK_VALUE(vts_attributes->nr_of_vtstt_subp_streams <= nr_coded);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2154 for(i = vts_attributes->nr_of_vtstt_subp_streams; i < nr_coded; i++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2155 CHECK_ZERO(vts_attributes->vtstt_subp_attr[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2156 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2157
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2158 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2159 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2160
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2161
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2162
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2163 int ifoRead_VTS_ATRT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2164 vts_atrt_t *vts_atrt;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2165 unsigned int i, info_length, sector;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2166 uint32_t *data;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2167
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2168 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2169 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2170
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2171 if(!ifofile->vmgi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2172 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2173
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2174 if(ifofile->vmgi_mat->vts_atrt == 0) /* mandatory */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2175 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2176
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2177 sector = ifofile->vmgi_mat->vts_atrt;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2178 if(!DVDFileSeek_(ifofile->file, sector * DVD_BLOCK_LEN))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2179 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2180
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2181 vts_atrt = (vts_atrt_t *)malloc(sizeof(vts_atrt_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2182 if(!vts_atrt)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2183 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2184
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2185 ifofile->vts_atrt = vts_atrt;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2186
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2187 if(!(DVDReadBytes(ifofile->file, vts_atrt, VTS_ATRT_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2188 free(vts_atrt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2189 ifofile->vts_atrt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2190 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2191 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2192
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2193 B2N_16(vts_atrt->nr_of_vtss);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2194 B2N_32(vts_atrt->last_byte);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2195
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2196 CHECK_ZERO(vts_atrt->zero_1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2197 CHECK_VALUE(vts_atrt->nr_of_vtss != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2198 CHECK_VALUE(vts_atrt->nr_of_vtss < 100); /* ?? */
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2199 CHECK_VALUE((uint32_t)vts_atrt->nr_of_vtss * (4 + VTS_ATTRIBUTES_MIN_SIZE) +
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
2200 VTS_ATRT_SIZE < vts_atrt->last_byte + 1);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2201
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2202 info_length = vts_atrt->nr_of_vtss * sizeof(uint32_t);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2203 data = (uint32_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2204 if(!data) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2205 free(vts_atrt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2206 ifofile->vts_atrt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2207 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2208 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2209
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2210 vts_atrt->vts_atrt_offsets = data;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2211
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2212 if(!(DVDReadBytes(ifofile->file, data, info_length))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2213 free(data);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2214 free(vts_atrt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2215 ifofile->vts_atrt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2216 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2217 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2218
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2219 for(i = 0; i < vts_atrt->nr_of_vtss; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2220 B2N_32(data[i]);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2221 CHECK_VALUE(data[i] + VTS_ATTRIBUTES_MIN_SIZE < vts_atrt->last_byte + 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2222 }
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2223
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2224 info_length = vts_atrt->nr_of_vtss * sizeof(vts_attributes_t);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2225 vts_atrt->vts = (vts_attributes_t *)malloc(info_length);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2226 if(!vts_atrt->vts) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2227 free(data);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2228 free(vts_atrt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2229 ifofile->vts_atrt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2230 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2231 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2232 for(i = 0; i < vts_atrt->nr_of_vtss; i++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2233 unsigned int offset = data[i];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2234 if(!ifoRead_VTS_ATTRIBUTES(ifofile, &(vts_atrt->vts[i]),
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2235 (sector * DVD_BLOCK_LEN) + offset)) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2236 free(data);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2237 free(vts_atrt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2238 ifofile->vts_atrt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2239 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2240 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2241
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2242 /* This assert cant be in ifoRead_VTS_ATTRIBUTES */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2243 CHECK_VALUE(offset + vts_atrt->vts[i].last_byte <= vts_atrt->last_byte + 1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2244 /* Is this check correct? */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2245 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2246
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2247 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2248 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2249
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2250
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2251 void ifoFree_VTS_ATRT(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2252 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2253 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2254
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2255 if(ifofile->vts_atrt) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2256 free(ifofile->vts_atrt->vts);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2257 free(ifofile->vts_atrt->vts_atrt_offsets);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2258 free(ifofile->vts_atrt);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2259 ifofile->vts_atrt = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2260 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2261 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2262
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2263
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2264 int ifoRead_TXTDT_MGI(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2265 txtdt_mgi_t *txtdt_mgi;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2266
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2267 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2268 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2269
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2270 if(!ifofile->vmgi_mat)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2271 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2272
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2273 /* Return successfully if there is nothing to read. */
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2274 if(ifofile->vmgi_mat->txtdt_mgi == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2275 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2276
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2277 if(!DVDFileSeek_(ifofile->file,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
2278 ifofile->vmgi_mat->txtdt_mgi * DVD_BLOCK_LEN))
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2279 return 0;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2280
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2281 txtdt_mgi = (txtdt_mgi_t *)malloc(sizeof(txtdt_mgi_t));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2282 if(!txtdt_mgi) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2283 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2284 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2285 ifofile->txtdt_mgi = txtdt_mgi;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2286
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2287 if(!(DVDReadBytes(ifofile->file, txtdt_mgi, TXTDT_MGI_SIZE))) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2288 fprintf(stderr, "libdvdread: Unable to read TXTDT_MGI.\n");
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2289 free(txtdt_mgi);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2290 ifofile->txtdt_mgi = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2291 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2292 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2293
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2294 /* fprintf(stderr, "-- Not done yet --\n"); */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2295 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2296 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2297
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2298 void ifoFree_TXTDT_MGI(ifo_handle_t *ifofile) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2299 if(!ifofile)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2300 return;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 12
diff changeset
2301
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2302 if(ifofile->txtdt_mgi) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2303 free(ifofile->txtdt_mgi);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2304 ifofile->txtdt_mgi = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2305 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2306 }