annotate dvdread/dvd_udf.c @ 355:80a6f5839cf7 src

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