annotate dvd_udf.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 99af5ed114a4
children 1b8797855771
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 * This code is based on dvdudf by:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
3 * Christian Wolff <scarabaeus@convergence.de>.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
4 *
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
5 * Modifications by:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
6 * Billy Biggs <vektor@dumbterm.net>.
22
447c5319a522 Convert all ISO8859-1 sequences to proper UTF-8.
diego
parents: 21
diff changeset
7 * Björn Englund <d4bjorn@dtek.chalmers.se>.
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
8 *
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
9 * dvdudf: parse and read the UDF volume information of a DVD Video
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
10 * Copyright (C) 1999 Christian Wolff for convergence integrated media
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
11 * GmbH The author can be reached at scarabaeus@convergence.de, the
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
12 * project's page is at http://linuxtv.org/dvd/
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
13 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
14 * This file is part of libdvdread.
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
15 *
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
16 * libdvdread is free software; you can redistribute it and/or modify
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
17 * it under the terms of the GNU General Public License as published by
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
18 * the Free Software Foundation; either version 2 of the License, or
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
19 * (at your option) any later version.
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
20 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
21 * libdvdread is distributed in the hope that it will be useful,
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
24 * GNU General Public License for more details.
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
25 *
21
4aa618ae094f Use consistent license headers everywhere: Fix FSF address and boilerplate.
diego
parents: 20
diff changeset
26 * 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
27 * 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
28 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
29 */
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
30
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
31 #include <stdio.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
32 #include <stdlib.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
33 #include <string.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
34
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
35 #include <sys/types.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
36 #include <sys/stat.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
37 #include <unistd.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
38 #include <inttypes.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
39
62
3bc841283972 Move UDFReadBlocksRaw declaration to dvdread_internal.h.
diego
parents: 49
diff changeset
40 #include "dvdread_internal.h"
33
c743d79f187b Move installed headers into dvdread directory to make them easier to
reimar
parents: 31
diff changeset
41 #include "dvdread/dvd_reader.h"
c743d79f187b Move installed headers into dvdread directory to make them easier to
reimar
parents: 31
diff changeset
42 #include "dvdread/dvd_udf.h"
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
43
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
44 /* It's required to either fail or deliver all the blocks asked for. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
45 static int DVDReadLBUDF( dvd_reader_t *device, uint32_t lb_number,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
46 size_t block_count, unsigned char *data,
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
47 int encrypted )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
48 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
49 int ret;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
50 size_t count = block_count;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
51
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
52 while(count > 0) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
53
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
54 ret = UDFReadBlocksRaw(device, lb_number, count, data, encrypted);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
55
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
56 if(ret <= 0) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
57 /* One of the reads failed or nothing more to read, too bad.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
58 * We won't even bother returning the reads that went ok. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
59 return ret;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
60 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
61
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
62 count -= (size_t)ret;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
63 lb_number += (uint32_t)ret;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
64 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
65
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
66 return block_count;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
67 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
68
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
69
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
70 #ifndef NULL
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
71 #define NULL ((void *)0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
72 #endif
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
73
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
74 struct Partition {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
75 int valid;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
76 char VolumeDesc[128];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
77 uint16_t Flags;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
78 uint16_t Number;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
79 char Contents[32];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
80 uint32_t AccessType;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
81 uint32_t Start;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
82 uint32_t Length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
83 };
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
84
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
85 struct AD {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
86 uint32_t Location;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
87 uint32_t Length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
88 uint8_t Flags;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
89 uint16_t Partition;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
90 };
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
91
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
92 struct extent_ad {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
93 uint32_t location;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
94 uint32_t length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
95 };
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
96
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
97 struct avdp_t {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
98 struct extent_ad mvds;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
99 struct extent_ad rvds;
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 struct pvd_t {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
103 uint8_t VolumeIdentifier[32];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
104 uint8_t VolumeSetIdentifier[128];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
105 };
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
106
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
107 struct lbudf {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
108 uint32_t lb;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
109 uint8_t *data;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
110 /* needed for proper freeing */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
111 uint8_t *data_base;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
112 };
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
113
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
114 struct icbmap {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
115 uint32_t lbn;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
116 struct AD file;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
117 uint8_t filetype;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
118 };
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
119
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
120 struct udf_cache {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
121 int avdp_valid;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
122 struct avdp_t avdp;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
123 int pvd_valid;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
124 struct pvd_t pvd;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
125 int partition_valid;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
126 struct Partition partition;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
127 int rooticb_valid;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
128 struct AD rooticb;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
129 int lb_num;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
130 struct lbudf *lbs;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
131 int map_num;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
132 struct icbmap *maps;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
133 };
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
134
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
135 typedef enum {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
136 PartitionCache, RootICBCache, LBUDFCache, MapCache, AVDPCache, PVDCache
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
137 } UDFCacheType;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
138
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
139 void FreeUDFCache(void *cache)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
140 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
141 struct udf_cache *c = (struct udf_cache *)cache;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
142 if(c == NULL)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
143 return;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
144
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
145 if(c->lbs) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
146 int n;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
147 for(n = 0; n < c->lb_num; n++)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
148 free(c->lbs[n].data_base);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
149 free(c->lbs);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
150 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
151 if(c->maps)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
152 free(c->maps);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
153 free(c);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
154 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
155
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
156
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
157 static int GetUDFCache(dvd_reader_t *device, UDFCacheType type,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
158 uint32_t nr, void *data)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
159 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
160 int n;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
161 struct udf_cache *c;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
162
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
163 if(DVDUDFCacheLevel(device, -1) <= 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
164 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
165
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
166 c = (struct udf_cache *)GetUDFCacheHandle(device);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
167
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
168 if(c == NULL)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
169 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
170
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
171 switch(type) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
172 case AVDPCache:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
173 if(c->avdp_valid) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
174 *(struct avdp_t *)data = c->avdp;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
175 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
176 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
177 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
178 case PVDCache:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
179 if(c->pvd_valid) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
180 *(struct pvd_t *)data = c->pvd;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
181 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
182 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
183 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
184 case PartitionCache:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
185 if(c->partition_valid) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
186 *(struct Partition *)data = c->partition;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
187 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
188 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
189 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
190 case RootICBCache:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
191 if(c->rooticb_valid) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
192 *(struct AD *)data = c->rooticb;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
193 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
194 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
195 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
196 case LBUDFCache:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
197 for(n = 0; n < c->lb_num; n++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
198 if(c->lbs[n].lb == nr) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
199 *(uint8_t **)data = c->lbs[n].data;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
200 return 1;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
201 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
202 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
203 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
204 case MapCache:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
205 for(n = 0; n < c->map_num; n++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
206 if(c->maps[n].lbn == nr) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
207 *(struct icbmap *)data = c->maps[n];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
208 return 1;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
209 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
210 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
211 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
212 default:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
213 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
214 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
215
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
216 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
217 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
218
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
219 static int SetUDFCache(dvd_reader_t *device, UDFCacheType type,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
220 uint32_t nr, void *data)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
221 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
222 int n;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
223 struct udf_cache *c;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
224 void *tmp;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
225
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
226 if(DVDUDFCacheLevel(device, -1) <= 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
227 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
228
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
229 c = (struct udf_cache *)GetUDFCacheHandle(device);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
230
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
231 if(c == NULL) {
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
232 c = calloc(1, sizeof(struct udf_cache));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
233 /* fprintf(stderr, "calloc: %d\n", sizeof(struct udf_cache)); */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
234 if(c == NULL)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
235 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
236 SetUDFCacheHandle(device, c);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
237 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
238
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
239
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
240 switch(type) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
241 case AVDPCache:
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
242 c->avdp = *(struct avdp_t *)data;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
243 c->avdp_valid = 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
244 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
245 case PVDCache:
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
246 c->pvd = *(struct pvd_t *)data;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
247 c->pvd_valid = 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
248 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
249 case PartitionCache:
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
250 c->partition = *(struct Partition *)data;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
251 c->partition_valid = 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
252 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
253 case RootICBCache:
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
254 c->rooticb = *(struct AD *)data;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
255 c->rooticb_valid = 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
256 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
257 case LBUDFCache:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
258 for(n = 0; n < c->lb_num; n++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
259 if(c->lbs[n].lb == nr) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
260 /* replace with new data */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
261 c->lbs[n].data_base = ((uint8_t **)data)[0];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
262 c->lbs[n].data = ((uint8_t **)data)[1];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
263 c->lbs[n].lb = nr;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
264 return 1;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
265 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
266 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
267 c->lb_num++;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
268 tmp = realloc(c->lbs, c->lb_num * sizeof(struct lbudf));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
269 /*
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
270 fprintf(stderr, "realloc lb: %d * %d = %d\n",
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
271 c->lb_num, sizeof(struct lbudf),
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
272 c->lb_num * sizeof(struct lbudf));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
273 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
274 if(tmp == NULL) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
275 if(c->lbs) free(c->lbs);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
276 c->lb_num = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
277 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
278 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
279 c->lbs = tmp;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
280 c->lbs[n].data_base = ((uint8_t **)data)[0];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
281 c->lbs[n].data = ((uint8_t **)data)[1];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
282 c->lbs[n].lb = nr;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
283 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
284 case MapCache:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
285 for(n = 0; n < c->map_num; n++) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
286 if(c->maps[n].lbn == nr) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
287 /* replace with new data */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
288 c->maps[n] = *(struct icbmap *)data;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
289 c->maps[n].lbn = nr;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
290 return 1;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
291 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
292 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
293 c->map_num++;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
294 tmp = realloc(c->maps, c->map_num * sizeof(struct icbmap));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
295 /*
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
296 fprintf(stderr, "realloc maps: %d * %d = %d\n",
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
297 c->map_num, sizeof(struct icbmap),
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
298 c->map_num * sizeof(struct icbmap));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
299 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
300 if(tmp == NULL) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
301 if(c->maps) free(c->maps);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
302 c->map_num = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
303 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
304 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
305 c->maps = tmp;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
306 c->maps[n] = *(struct icbmap *)data;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
307 c->maps[n].lbn = nr;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
308 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
309 default:
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
310 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
311 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
312
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
313 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
314 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
315
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
316
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
317 /* For direct data access, LSB first */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
318 #define GETN1(p) ((uint8_t)data[p])
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
319 #define GETN2(p) ((uint16_t)data[p] | ((uint16_t)data[(p) + 1] << 8))
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
320 #define GETN3(p) ((uint32_t)data[p] | ((uint32_t)data[(p) + 1] << 8) \
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
321 | ((uint32_t)data[(p) + 2] << 16))
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
322 #define GETN4(p) ((uint32_t)data[p] \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
323 | ((uint32_t)data[(p) + 1] << 8) \
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
324 | ((uint32_t)data[(p) + 2] << 16) \
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
325 | ((uint32_t)data[(p) + 3] << 24))
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
326 /* This is wrong with regard to endianess */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
327 #define GETN(p, n, target) memcpy(target, &data[p], n)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
328
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
329 static int Unicodedecode( uint8_t *data, int len, char *target )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
330 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
331 int p = 1, i = 0;
72
99af5ed114a4 Fix segfault when reading certain DVDs, for example "Thor".
rathann
parents: 62
diff changeset
332 int err = 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
333
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
334 if( ( data[ 0 ] == 8 ) || ( data[ 0 ] == 16 ) ) do {
72
99af5ed114a4 Fix segfault when reading certain DVDs, for example "Thor".
rathann
parents: 62
diff changeset
335 if( data[ 0 ] == 16 ) err |= data[p++]; /* character cannot be converted to 8bit, return error */
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
336 if( p < len ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
337 target[ i++ ] = data[ p++ ];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
338 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
339 } while( p < len );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
340
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
341 target[ i ] = '\0';
72
99af5ed114a4 Fix segfault when reading certain DVDs, for example "Thor".
rathann
parents: 62
diff changeset
342 return !err;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
343 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
344
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
345 static int UDFDescriptor( uint8_t *data, uint16_t *TagID )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
346 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
347 *TagID = GETN2(0);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
348 /* TODO: check CRC 'n stuff */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
349 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
350 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
351
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
352 static int UDFExtentAD( uint8_t *data, uint32_t *Length, uint32_t *Location )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
353 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
354 *Length = GETN4(0);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
355 *Location = GETN4(4);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
356 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
357 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
358
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
359 static int UDFShortAD( uint8_t *data, struct AD *ad,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
360 struct Partition *partition )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
361 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
362 ad->Length = GETN4(0);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
363 ad->Flags = ad->Length >> 30;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
364 ad->Length &= 0x3FFFFFFF;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
365 ad->Location = GETN4(4);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
366 ad->Partition = partition->Number; /* use number of current partition */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
367 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
368 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
369
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
370 static int UDFLongAD( uint8_t *data, struct AD *ad )
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
371 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
372 ad->Length = GETN4(0);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
373 ad->Flags = ad->Length >> 30;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
374 ad->Length &= 0x3FFFFFFF;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
375 ad->Location = GETN4(4);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
376 ad->Partition = GETN2(8);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
377 /* GETN(10, 6, Use); */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
378 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
379 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
380
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
381 static int UDFExtAD( uint8_t *data, struct AD *ad )
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
382 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
383 ad->Length = GETN4(0);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
384 ad->Flags = ad->Length >> 30;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
385 ad->Length &= 0x3FFFFFFF;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
386 ad->Location = GETN4(12);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
387 ad->Partition = GETN2(16);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
388 /* GETN(10, 6, Use); */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
389 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
390 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
391
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
392 static int UDFICB( uint8_t *data, uint8_t *FileType, uint16_t *Flags )
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
393 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
394 *FileType = GETN1(11);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
395 *Flags = GETN2(18);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
396 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
397 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
398
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
399
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
400 static int UDFPartition( uint8_t *data, uint16_t *Flags, uint16_t *Number,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
401 char *Contents, uint32_t *Start, uint32_t *Length )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
402 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
403 *Flags = GETN2(20);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
404 *Number = GETN2(22);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
405 GETN(24, 32, Contents);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
406 *Start = GETN4(188);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
407 *Length = GETN4(192);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
408 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
409 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
410
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
411 /**
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
412 * Reads the volume descriptor and checks the parameters. Returns 0 on OK, 1
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
413 * on error.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
414 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
415 static int UDFLogVolume( uint8_t *data, char *VolumeDescriptor )
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
416 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
417 uint32_t lbsize, MT_L, N_PM;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
418 Unicodedecode(&data[84], 128, VolumeDescriptor);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
419 lbsize = GETN4(212); /* should be 2048 */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
420 MT_L = GETN4(264); /* should be 6 */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
421 N_PM = GETN4(268); /* should be 1 */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
422 if (lbsize != DVD_VIDEO_LB_LEN) return 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
423 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
424 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
425
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
426 static int UDFFileEntry( uint8_t *data, uint8_t *FileType,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
427 struct Partition *partition, struct AD *ad )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
428 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
429 uint16_t flags;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
430 uint32_t L_EA, L_AD;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
431 unsigned int p;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
432
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
433 UDFICB( &data[ 16 ], FileType, &flags );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
434
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
435 /* Init ad for an empty file (i.e. there isn't a AD, L_AD == 0 ) */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
436 ad->Length = GETN4( 60 ); /* Really 8 bytes a 56 */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
437 ad->Flags = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
438 ad->Location = 0; /* what should we put here? */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
439 ad->Partition = partition->Number; /* use number of current partition */
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
440
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
441 L_EA = GETN4( 168 );
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
442 L_AD = GETN4( 172 );
48
d71db8e4e1c7 add bounds checking in UDFFileEntry
henry
parents: 38
diff changeset
443
d71db8e4e1c7 add bounds checking in UDFFileEntry
henry
parents: 38
diff changeset
444 if (176 + L_EA + L_AD > DVD_VIDEO_LB_LEN)
d71db8e4e1c7 add bounds checking in UDFFileEntry
henry
parents: 38
diff changeset
445 return 0;
d71db8e4e1c7 add bounds checking in UDFFileEntry
henry
parents: 38
diff changeset
446
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
447 p = 176 + L_EA;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
448 while( p < 176 + L_EA + L_AD ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
449 switch( flags & 0x0007 ) {
31
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
450 case 0:
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
451 UDFShortAD( &data[ p ], ad, partition );
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
452 p += 8;
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
453 break;
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
454 case 1:
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
455 UDFLongAD( &data[ p ], ad );
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
456 p += 16;
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
457 break;
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
458 case 2:
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
459 UDFExtAD( &data[ p ], ad );
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
460 p += 20;
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
461 break;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
462 case 3:
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
463 switch( L_AD ) {
31
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
464 case 8:
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
465 UDFShortAD( &data[ p ], ad, partition );
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
466 break;
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
467 case 16:
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
468 UDFLongAD( &data[ p ], ad );
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
469 break;
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
470 case 20:
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
471 UDFExtAD( &data[ p ], ad );
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
472 break;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
473 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
474 p += L_AD;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
475 break;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
476 default:
31
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
477 p += L_AD;
cd0187d307b4 cosmetics: sane indentation for case statements
diego
parents: 27
diff changeset
478 break;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
479 }
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
480 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
481 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
482 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
483
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
484 static int UDFFileIdentifier( uint8_t *data, uint8_t *FileCharacteristics,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
485 char *FileName, struct AD *FileICB )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
486 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
487 uint8_t L_FI;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
488 uint16_t L_IU;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
489
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
490 *FileCharacteristics = GETN1(18);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
491 L_FI = GETN1(19);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
492 UDFLongAD(&data[20], FileICB);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
493 L_IU = GETN2(36);
72
99af5ed114a4 Fix segfault when reading certain DVDs, for example "Thor".
rathann
parents: 62
diff changeset
494 if (L_FI) {
99af5ed114a4 Fix segfault when reading certain DVDs, for example "Thor".
rathann
parents: 62
diff changeset
495 if (!Unicodedecode(&data[38 + L_IU], L_FI, FileName)) FileName[0] = 0;
99af5ed114a4 Fix segfault when reading certain DVDs, for example "Thor".
rathann
parents: 62
diff changeset
496 } else FileName[0] = '\0';
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
497 return 4 * ((38 + L_FI + L_IU + 3) / 4);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
498 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
499
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
500 /**
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
501 * Maps ICB to FileAD
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
502 * ICB: Location of ICB of directory to scan
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
503 * FileType: Type of the file
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
504 * File: Location of file the ICB is pointing to
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
505 * return 1 on success, 0 on error;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
506 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
507 static int UDFMapICB( dvd_reader_t *device, struct AD ICB, uint8_t *FileType,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
508 struct Partition *partition, struct AD *File )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
509 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
510 uint8_t LogBlock_base[DVD_VIDEO_LB_LEN + 2048];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
511 uint8_t *LogBlock = (uint8_t *)(((uintptr_t)LogBlock_base & ~((uintptr_t)2047)) + 2048);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
512 uint32_t lbnum;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
513 uint16_t TagID;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
514 struct icbmap tmpmap;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
515
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
516 lbnum = partition->Start + ICB.Location;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
517 tmpmap.lbn = lbnum;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
518 if(GetUDFCache(device, MapCache, lbnum, &tmpmap)) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
519 *FileType = tmpmap.filetype;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
520 memcpy(File, &tmpmap.file, sizeof(tmpmap.file));
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
521 return 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
522 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
523
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
524 do {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
525 if( DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ) <= 0 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
526 TagID = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
527 else
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
528 UDFDescriptor( LogBlock, &TagID );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
529
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
530 if( TagID == 261 ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
531 UDFFileEntry( LogBlock, FileType, partition, File );
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
532 memcpy(&tmpmap.file, File, sizeof(tmpmap.file));
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
533 tmpmap.filetype = *FileType;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
534 SetUDFCache(device, MapCache, tmpmap.lbn, &tmpmap);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
535 return 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
536 };
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
537 } while( ( lbnum <= partition->Start + ICB.Location + ( ICB.Length - 1 )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
538 / DVD_VIDEO_LB_LEN ) && ( TagID != 261 ) );
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
539
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
540 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
541 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
542
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
543 /**
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
544 * Dir: Location of directory to scan
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
545 * FileName: Name of file to look for
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
546 * FileICB: Location of ICB of the found file
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
547 * return 1 on success, 0 on error;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
548 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
549 static int UDFScanDir( dvd_reader_t *device, struct AD Dir, char *FileName,
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
550 struct Partition *partition, struct AD *FileICB,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
551 int cache_file_info)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
552 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
553 char filename[ MAX_UDF_FILE_NAME_LEN ];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
554 uint8_t directory_base[ 2 * DVD_VIDEO_LB_LEN + 2048];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
555 uint8_t *directory = (uint8_t *)(((uintptr_t)directory_base & ~((uintptr_t)2047)) + 2048);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
556 uint32_t lbnum;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
557 uint16_t TagID;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
558 uint8_t filechar;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
559 unsigned int p;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
560 uint8_t *cached_dir_base = NULL, *cached_dir;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
561 uint32_t dir_lba;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
562 struct AD tmpICB;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
563 int found = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
564 int in_cache = 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
565
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
566 /* Scan dir for ICB of file */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
567 lbnum = partition->Start + Dir.Location;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
568
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
569 if(DVDUDFCacheLevel(device, -1) > 0) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
570 /* caching */
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
571
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
572 if(!GetUDFCache(device, LBUDFCache, lbnum, &cached_dir)) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
573 dir_lba = (Dir.Length + DVD_VIDEO_LB_LEN) / DVD_VIDEO_LB_LEN;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
574 if((cached_dir_base = malloc(dir_lba * DVD_VIDEO_LB_LEN + 2048)) == NULL)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
575 return 0;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
576 cached_dir = (uint8_t *)(((uintptr_t)cached_dir_base & ~((uintptr_t)2047)) + 2048);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
577 if( DVDReadLBUDF( device, lbnum, dir_lba, cached_dir, 0) <= 0 ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
578 free(cached_dir_base);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
579 cached_dir_base = NULL;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
580 cached_dir = NULL;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
581 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
582 /*
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
583 if(cached_dir) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
584 fprintf(stderr, "malloc dir: %d\n", dir_lba * DVD_VIDEO_LB_LEN);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
585 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
586 */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
587 {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
588 uint8_t *data[2];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
589 data[0] = cached_dir_base;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
590 data[1] = cached_dir;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
591 SetUDFCache(device, LBUDFCache, lbnum, data);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
592 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
593 } else
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
594 in_cache = 1;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
595
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
596 if(cached_dir == NULL)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
597 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
598
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
599 p = 0;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
600
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
601 while( p < Dir.Length ) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
602 UDFDescriptor( &cached_dir[ p ], &TagID );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
603 if( TagID == 257 ) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
604 p += UDFFileIdentifier( &cached_dir[ p ], &filechar,
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
605 filename, &tmpICB );
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
606 if(cache_file_info && !in_cache) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
607 uint8_t tmpFiletype;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
608 struct AD tmpFile;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
609
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
610 if( !strcasecmp( FileName, filename ) ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
611 memcpy(FileICB, &tmpICB, sizeof(tmpICB));
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
612 found = 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
613 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
614 UDFMapICB(device, tmpICB, &tmpFiletype, partition, &tmpFile);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
615 } else {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
616 if( !strcasecmp( FileName, filename ) ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
617 memcpy(FileICB, &tmpICB, sizeof(tmpICB));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
618 return 1;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
619 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
620 }
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
621 } else {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
622 if(cache_file_info && (!in_cache) && found)
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
623 return 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
624 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
625 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
626 }
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
627 if(cache_file_info && (!in_cache) && found)
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
628 return 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
629 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
630 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
631
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
632 if( DVDReadLBUDF( device, lbnum, 2, directory, 0 ) <= 0 )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
633 return 0;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
634
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
635 p = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
636 while( p < Dir.Length ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
637 if( p > DVD_VIDEO_LB_LEN ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
638 ++lbnum;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
639 p -= DVD_VIDEO_LB_LEN;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
640 Dir.Length -= DVD_VIDEO_LB_LEN;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
641 if( DVDReadLBUDF( device, lbnum, 2, directory, 0 ) <= 0 ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
642 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
643 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
644 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
645 UDFDescriptor( &directory[ p ], &TagID );
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
646 if( TagID == 257 ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
647 p += UDFFileIdentifier( &directory[ p ], &filechar,
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
648 filename, FileICB );
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
649 if( !strcasecmp( FileName, filename ) ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
650 return 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
651 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
652 } else
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
653 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
654 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
655
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
656 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
657 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
658
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
659
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
660 static int UDFGetAVDP( dvd_reader_t *device,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
661 struct avdp_t *avdp)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
662 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
663 uint8_t Anchor_base[ DVD_VIDEO_LB_LEN + 2048 ];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
664 uint8_t *Anchor = (uint8_t *)(((uintptr_t)Anchor_base & ~((uintptr_t)2047)) + 2048);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
665 uint32_t lbnum, MVDS_location, MVDS_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
666 uint16_t TagID;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
667 uint32_t lastsector;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
668 int terminate;
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
669 struct avdp_t;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
670
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
671 if(GetUDFCache(device, AVDPCache, 0, avdp))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
672 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
673
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
674 /* Find Anchor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
675 lastsector = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
676 lbnum = 256; /* Try #1, prime anchor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
677 terminate = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
678
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
679 for(;;) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
680 if( DVDReadLBUDF( device, lbnum, 1, Anchor, 0 ) > 0 ) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
681 UDFDescriptor( Anchor, &TagID );
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
682 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
683 TagID = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
684 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
685 if (TagID != 2) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
686 /* Not an anchor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
687 if( terminate ) return 0; /* Final try failed */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
688
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
689 if( lastsector ) {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
690 /* We already found the last sector. Try #3, alternative
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
691 * backup anchor. If that fails, don't try again.
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
692 */
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
693 lbnum = lastsector;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
694 terminate = 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
695 } else {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
696 /* TODO: Find last sector of the disc (this is optional). */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
697 if( lastsector )
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
698 /* Try #2, backup anchor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
699 lbnum = lastsector - 256;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
700 else
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
701 /* Unable to find last sector */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
702 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
703 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
704 } else
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
705 /* It's an anchor! We can leave */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
706 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
707 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
708 /* Main volume descriptor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
709 UDFExtentAD( &Anchor[ 16 ], &MVDS_length, &MVDS_location );
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
710 avdp->mvds.location = MVDS_location;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
711 avdp->mvds.length = MVDS_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
712
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
713 /* Backup volume descriptor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
714 UDFExtentAD( &Anchor[ 24 ], &MVDS_length, &MVDS_location );
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
715 avdp->rvds.location = MVDS_location;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
716 avdp->rvds.length = MVDS_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
717
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
718 SetUDFCache(device, AVDPCache, 0, avdp);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
719
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
720 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
721 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
722
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
723 /**
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
724 * Looks for partition on the disc. Returns 1 if partition found, 0 on error.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
725 * partnum: Number of the partition, starting at 0.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
726 * part: structure to fill with the partition information
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
727 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
728 static int UDFFindPartition( dvd_reader_t *device, int partnum,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
729 struct Partition *part )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
730 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
731 uint8_t LogBlock_base[ DVD_VIDEO_LB_LEN + 2048 ];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
732 uint8_t *LogBlock = (uint8_t *)(((uintptr_t)LogBlock_base & ~((uintptr_t)2047)) + 2048);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
733 uint32_t lbnum, MVDS_location, MVDS_length;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
734 uint16_t TagID;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
735 int i, volvalid;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
736 struct avdp_t avdp;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
737
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
738 if(!UDFGetAVDP(device, &avdp))
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
739 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
740
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
741 /* Main volume descriptor */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
742 MVDS_location = avdp.mvds.location;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
743 MVDS_length = avdp.mvds.length;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
744
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
745 part->valid = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
746 volvalid = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
747 part->VolumeDesc[ 0 ] = '\0';
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
748 i = 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
749 do {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
750 /* Find Volume Descriptor */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
751 lbnum = MVDS_location;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
752 do {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
753
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
754 if( DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ) <= 0 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
755 TagID = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
756 else
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
757 UDFDescriptor( LogBlock, &TagID );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
758
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
759 if( ( TagID == 5 ) && ( !part->valid ) ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
760 /* Partition Descriptor */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
761 UDFPartition( LogBlock, &part->Flags, &part->Number,
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
762 part->Contents, &part->Start, &part->Length );
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
763 part->valid = ( partnum == part->Number );
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
764 } else if( ( TagID == 6 ) && ( !volvalid ) ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
765 /* Logical Volume Descriptor */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
766 if( UDFLogVolume( LogBlock, part->VolumeDesc ) ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
767 /* TODO: sector size wrong! */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
768 } else
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
769 volvalid = 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
770 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
771
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
772 } while( ( lbnum <= MVDS_location + ( MVDS_length - 1 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
773 / DVD_VIDEO_LB_LEN ) && ( TagID != 8 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
774 && ( ( !part->valid ) || ( !volvalid ) ) );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
775
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
776 if( ( !part->valid) || ( !volvalid ) ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
777 /* Backup volume descriptor */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
778 MVDS_location = avdp.mvds.location;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
779 MVDS_length = avdp.mvds.length;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
780 }
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
781 } while( i-- && ( ( !part->valid ) || ( !volvalid ) ) );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
782
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
783 /* We only care for the partition, not the volume */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
784 return part->valid;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
785 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
786
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
787 uint32_t UDFFindFile( dvd_reader_t *device, char *filename,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
788 uint32_t *filesize )
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
789 {
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
790 uint8_t LogBlock_base[ DVD_VIDEO_LB_LEN + 2048 ];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
791 uint8_t *LogBlock = (uint8_t *)(((uintptr_t)LogBlock_base & ~((uintptr_t)2047)) + 2048);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
792 uint32_t lbnum;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
793 uint16_t TagID;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
794 struct Partition partition;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
795 struct AD RootICB, File, ICB;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
796 char tokenline[ MAX_UDF_FILE_NAME_LEN ];
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
797 char *token;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
798 uint8_t filetype;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
799
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
800 *filesize = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
801 tokenline[0] = '\0';
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
802 strncat(tokenline, filename, MAX_UDF_FILE_NAME_LEN - 1);
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
803 memset(&ICB, 0, sizeof(ICB));
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
804
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
805 if(!(GetUDFCache(device, PartitionCache, 0, &partition) &&
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
806 GetUDFCache(device, RootICBCache, 0, &RootICB))) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
807 /* Find partition, 0 is the standard location for DVD Video.*/
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
808 if( !UDFFindPartition( device, 0, &partition ) ) return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
809 SetUDFCache(device, PartitionCache, 0, &partition);
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
810
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
811 /* Find root dir ICB */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
812 lbnum = partition.Start;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
813 do {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
814 if( DVDReadLBUDF( device, lbnum++, 1, LogBlock, 0 ) <= 0 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
815 TagID = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
816 else
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
817 UDFDescriptor( LogBlock, &TagID );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
818
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
819 /* File Set Descriptor */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
820 if( TagID == 256 ) /* File Set Descriptor */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
821 UDFLongAD( &LogBlock[ 400 ], &RootICB );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
822 } while( ( lbnum < partition.Start + partition.Length )
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
823 && ( TagID != 8 ) && ( TagID != 256 ) );
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
824
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
825 /* Sanity checks. */
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
826 if( TagID != 256 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
827 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
828 if( RootICB.Partition != 0 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
829 return 0;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
830 SetUDFCache(device, RootICBCache, 0, &RootICB);
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
831 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
832
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
833 /* Find root dir */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
834 if( !UDFMapICB( device, RootICB, &filetype, &partition, &File ) )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
835 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
836 if( filetype != 4 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
837 return 0; /* Root dir should be dir */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
838 {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
839 int cache_file_info = 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
840 /* Tokenize filepath */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
841 token = strtok(tokenline, "/");
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
842
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
843 while( token != NULL ) {
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
844 if( !UDFScanDir( device, File, token, &partition, &ICB,
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
845 cache_file_info))
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
846 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
847 if( !UDFMapICB( device, ICB, &filetype, &partition, &File ) )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
848 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
849 if(!strcmp(token, "VIDEO_TS"))
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
850 cache_file_info = 1;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
851 token = strtok( NULL, "/" );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
852 }
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
853 }
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
854
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
855 /* Sanity check. */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
856 if( File.Partition != 0 )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
857 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
858 *filesize = File.Length;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
859 /* Hack to not return partition.Start for empty files. */
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
860 if( !File.Location )
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
861 return 0;
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
862 else
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
863 return partition.Start + File.Location;
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
864 }
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
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
868 /**
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
869 * Gets a Descriptor .
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
870 * Returns 1 if descriptor found, 0 on error.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
871 * id, tagid of descriptor
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
872 * bufsize, size of BlockBuf (must be >= DVD_VIDEO_LB_LEN).
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
873 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
874 static int UDFGetDescriptor( dvd_reader_t *device, int id,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
875 uint8_t *descriptor, int bufsize)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
876 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
877 uint32_t lbnum, MVDS_location, MVDS_length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
878 struct avdp_t avdp;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
879 uint16_t TagID;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
880 uint32_t lastsector;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
881 int i, terminate;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
882 int desc_found = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
883 /* Find Anchor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
884 lastsector = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
885 lbnum = 256; /* Try #1, prime anchor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
886 terminate = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
887 if(bufsize < DVD_VIDEO_LB_LEN)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
888 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
889
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
890 if(!UDFGetAVDP(device, &avdp))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
891 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
892
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
893 /* Main volume descriptor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
894 MVDS_location = avdp.mvds.location;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
895 MVDS_length = avdp.mvds.length;
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
896
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
897 i = 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
898 do {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
899 /* Find Descriptor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
900 lbnum = MVDS_location;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
901 do {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
902 if( DVDReadLBUDF( device, lbnum++, 1, descriptor, 0 ) <= 0 )
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
903 TagID = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
904 else
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
905 UDFDescriptor( descriptor, &TagID );
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
906 if( (TagID == id) && ( !desc_found ) )
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
907 /* Descriptor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
908 desc_found = 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
909 } while( ( lbnum <= MVDS_location + ( MVDS_length - 1 )
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
910 / DVD_VIDEO_LB_LEN ) && ( TagID != 8 )
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
911 && ( !desc_found) );
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
912
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
913 if( !desc_found ) {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
914 /* Backup volume descriptor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
915 MVDS_location = avdp.rvds.location;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
916 MVDS_length = avdp.rvds.length;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
917 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
918 } while( i-- && ( !desc_found ) );
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
919
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
920 return desc_found;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
921 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
922
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
923
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
924 static int UDFGetPVD(dvd_reader_t *device, struct pvd_t *pvd)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
925 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
926 uint8_t pvd_buf_base[DVD_VIDEO_LB_LEN + 2048];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
927 uint8_t *pvd_buf = (uint8_t *)(((uintptr_t)pvd_buf_base & ~((uintptr_t)2047)) + 2048);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
928 if(GetUDFCache(device, PVDCache, 0, pvd))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
929 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
930
49
1acf15da93ba fixed buffer size dimension in UDFGetPVD(); patch A00 by John Stebbins
nicodvb
parents: 48
diff changeset
931 if(!UDFGetDescriptor( device, 1, pvd_buf, DVD_VIDEO_LB_LEN))
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
932 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
933
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
934 memcpy(pvd->VolumeIdentifier, &pvd_buf[24], 32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
935 memcpy(pvd->VolumeSetIdentifier, &pvd_buf[72], 128);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
936 SetUDFCache(device, PVDCache, 0, pvd);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
937 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
938 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
939
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
940 /**
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
941 * Gets the Volume Identifier string, in 8bit unicode (latin-1)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
942 * volid, place to put the string
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
943 * volid_size, size of the buffer volid points to
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
944 * returns the size of buffer needed for all data
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
945 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
946 int UDFGetVolumeIdentifier(dvd_reader_t *device, char *volid,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
947 unsigned int volid_size)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
948 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
949 struct pvd_t pvd;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
950 unsigned int volid_len;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
951
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
952 /* get primary volume descriptor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
953 if(!UDFGetPVD(device, &pvd))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
954 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
955
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
956 volid_len = pvd.VolumeIdentifier[31];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
957 if(volid_len > 31)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
958 /* this field is only 32 bytes something is wrong */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
959 volid_len = 31;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
960 if(volid_size > volid_len)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
961 volid_size = volid_len;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
962 Unicodedecode(pvd.VolumeIdentifier, volid_size, volid);
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
963
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
964 return volid_len;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
965 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
966
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
967 /**
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
968 * Gets the Volume Set Identifier, as a 128-byte dstring (not decoded)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
969 * WARNING This is not a null terminated string
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
970 * volsetid, place to put the data
20
fce16251755c Remove all trailing whitespace,
rathann
parents: 9
diff changeset
971 * volsetid_size, size of the buffer volsetid points to
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
972 * the buffer should be >=128 bytes to store the whole volumesetidentifier
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
973 * returns the size of the available volsetid information (128)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
974 * or 0 on error
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 UDFGetVolumeSetIdentifier(dvd_reader_t *device, uint8_t *volsetid,
26
0d82d0f30c98 cosmetics: Convert all tabs to spaces.
diego
parents: 22
diff changeset
977 unsigned int volsetid_size)
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
978 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
979 struct pvd_t pvd;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
980
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
981 /* get primary volume descriptor */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
982 if(!UDFGetPVD(device, &pvd))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
983 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
984
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
985
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
986 if(volsetid_size > 128)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
987 volsetid_size = 128;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
988
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
989 memcpy(volsetid, pvd.VolumeSetIdentifier, volsetid_size);
27
98951f8ec89c cosmetics: Sync indentation and similar changes from libdvdread 0.9.5.
diego
parents: 26
diff changeset
990
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
991 return 128;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
992 }