1 |
diff -Naur --exclude '*~' libdvdread-4.1.3/src/dvd_reader.c libdvdread-4.1.3-backward-compatibility/src/dvd_reader.c |
2 |
--- libdvdread-4.1.3/src/dvd_reader.c 2008-09-06 23:55:51.000000000 +0200 |
3 |
+++ libdvdread-4.1.3-backward-compatibility/src/dvd_reader.c 2008-11-22 13:16:51.000000000 +0100 |
4 |
@@ -889,6 +889,183 @@ |
5 |
} |
6 |
} |
7 |
|
8 |
+static int DVDFileStatVOBUDF(dvd_reader_t *dvd, int title, |
9 |
+ int menu, dvd_stat_t *statbuf) |
10 |
+{ |
11 |
+ char filename[ MAX_UDF_FILE_NAME_LEN ]; |
12 |
+ uint32_t size; |
13 |
+ off_t tot_size; |
14 |
+ off_t parts_size[9]; |
15 |
+ int nr_parts = 0; |
16 |
+ int n; |
17 |
+ |
18 |
+ if( title == 0 ) { |
19 |
+ sprintf( filename, "/VIDEO_TS/VIDEO_TS.VOB" ); |
20 |
+ } else { |
21 |
+ sprintf( filename, "/VIDEO_TS/VTS_%02d_%d.VOB", title, menu ? 0 : 1 ); |
22 |
+ } |
23 |
+ if(!UDFFindFile( dvd, filename, &size )) { |
24 |
+ return -1; |
25 |
+ } |
26 |
+ tot_size = size; |
27 |
+ nr_parts = 1; |
28 |
+ parts_size[0] = size; |
29 |
+ |
30 |
+ if( !menu ) { |
31 |
+ int cur; |
32 |
+ |
33 |
+ for( cur = 2; cur < 10; cur++ ) { |
34 |
+ sprintf( filename, "/VIDEO_TS/VTS_%02d_%d.VOB", title, cur ); |
35 |
+ if( !UDFFindFile( dvd, filename, &size ) ) { |
36 |
+ break; |
37 |
+ } |
38 |
+ parts_size[nr_parts] = size; |
39 |
+ tot_size += size; |
40 |
+ nr_parts++; |
41 |
+ } |
42 |
+ } |
43 |
+ |
44 |
+ statbuf->size = tot_size; |
45 |
+ statbuf->nr_parts = nr_parts; |
46 |
+ for(n = 0; n < nr_parts; n++) { |
47 |
+ statbuf->parts_size[n] = parts_size[n]; |
48 |
+ } |
49 |
+ return 0; |
50 |
+} |
51 |
+ |
52 |
+ |
53 |
+static int DVDFileStatVOBPath( dvd_reader_t *dvd, int title, |
54 |
+ int menu, dvd_stat_t *statbuf ) |
55 |
+{ |
56 |
+ char filename[ MAX_UDF_FILE_NAME_LEN ]; |
57 |
+ char full_path[ PATH_MAX + 1 ]; |
58 |
+ struct stat fileinfo; |
59 |
+ off_t tot_size; |
60 |
+ off_t parts_size[9]; |
61 |
+ int nr_parts = 0; |
62 |
+ int n; |
63 |
+ |
64 |
+ |
65 |
+ |
66 |
+ if( title == 0 ) { |
67 |
+ sprintf( filename, "VIDEO_TS.VOB" ); |
68 |
+ } else { |
69 |
+ sprintf( filename, "VTS_%02d_%d.VOB", title, menu ? 0 : 1 ); |
70 |
+ } |
71 |
+ if( !findDVDFile( dvd, filename, full_path ) ) { |
72 |
+ return -1; |
73 |
+ } |
74 |
+ |
75 |
+ if( stat( full_path, &fileinfo ) < 0 ) { |
76 |
+ return -1; |
77 |
+ } |
78 |
+ |
79 |
+ |
80 |
+ tot_size = fileinfo.st_size; |
81 |
+ nr_parts = 1; |
82 |
+ parts_size[0] = fileinfo.st_size; |
83 |
+ |
84 |
+ if( !menu ) { |
85 |
+ int cur; |
86 |
+ |
87 |
+ for( cur = 2; cur < 10; cur++ ) { |
88 |
+ |
89 |
+ sprintf( filename, "VTS_%02d_%d.VOB", title, cur ); |
90 |
+ if( !findDVDFile( dvd, filename, full_path ) ) { |
91 |
+ break; |
92 |
+ } |
93 |
+ |
94 |
+ if( stat( full_path, &fileinfo ) < 0 ) { |
95 |
+ break; |
96 |
+ } |
97 |
+ |
98 |
+ parts_size[nr_parts] = fileinfo.st_size; |
99 |
+ tot_size += parts_size[nr_parts]; |
100 |
+ nr_parts++; |
101 |
+ } |
102 |
+ } |
103 |
+ |
104 |
+ statbuf->size = tot_size; |
105 |
+ statbuf->nr_parts = nr_parts; |
106 |
+ for(n = 0; n < nr_parts; n++) { |
107 |
+ statbuf->parts_size[n] = parts_size[n]; |
108 |
+ } |
109 |
+ return 0; |
110 |
+} |
111 |
+ |
112 |
+ |
113 |
+int DVDFileStat(dvd_reader_t *dvd, int titlenum, |
114 |
+ dvd_read_domain_t domain, dvd_stat_t *statbuf) |
115 |
+{ |
116 |
+ char filename[ MAX_UDF_FILE_NAME_LEN ]; |
117 |
+ char full_path[ PATH_MAX + 1 ]; |
118 |
+ struct stat fileinfo; |
119 |
+ uint32_t size; |
120 |
+ |
121 |
+ /* Check arguments. */ |
122 |
+ if( dvd == NULL || titlenum < 0 ) { |
123 |
+ errno = EINVAL; |
124 |
+ return -1; |
125 |
+ } |
126 |
+ |
127 |
+ switch( domain ) { |
128 |
+ case DVD_READ_INFO_FILE: |
129 |
+ if( titlenum == 0 ) { |
130 |
+ sprintf( filename, "/VIDEO_TS/VIDEO_TS.IFO" ); |
131 |
+ } else { |
132 |
+ sprintf( filename, "/VIDEO_TS/VTS_%02i_0.IFO", titlenum ); |
133 |
+ } |
134 |
+ break; |
135 |
+ case DVD_READ_INFO_BACKUP_FILE: |
136 |
+ if( titlenum == 0 ) { |
137 |
+ sprintf( filename, "/VIDEO_TS/VIDEO_TS.BUP" ); |
138 |
+ } else { |
139 |
+ sprintf( filename, "/VIDEO_TS/VTS_%02i_0.BUP", titlenum ); |
140 |
+ } |
141 |
+ break; |
142 |
+ case DVD_READ_MENU_VOBS: |
143 |
+ if( dvd->isImageFile ) { |
144 |
+ return DVDFileStatVOBUDF( dvd, titlenum, 1, statbuf ); |
145 |
+ } else { |
146 |
+ return DVDFileStatVOBPath( dvd, titlenum, 1, statbuf ); |
147 |
+ } |
148 |
+ break; |
149 |
+ case DVD_READ_TITLE_VOBS: |
150 |
+ if( titlenum == 0 ) { |
151 |
+ return -1; |
152 |
+ } |
153 |
+ if( dvd->isImageFile ) { |
154 |
+ return DVDFileStatVOBUDF( dvd, titlenum, 0, statbuf ); |
155 |
+ } else { |
156 |
+ return DVDFileStatVOBPath( dvd, titlenum, 0, statbuf ); |
157 |
+ } |
158 |
+ break; |
159 |
+ default: |
160 |
+ errno = EINVAL; |
161 |
+ return -1; |
162 |
+ } |
163 |
+ |
164 |
+ if( dvd->isImageFile ) { |
165 |
+ if( UDFFindFile( dvd, filename, &size ) ) { |
166 |
+ statbuf->size = size; |
167 |
+ statbuf->nr_parts = 1; |
168 |
+ statbuf->parts_size[0] = size; |
169 |
+ return 0; |
170 |
+ } |
171 |
+ } else { |
172 |
+ if( findDVDFile( dvd, filename, full_path ) ) { |
173 |
+ if( stat( full_path, &fileinfo ) < 0 ) { |
174 |
+ } else { |
175 |
+ statbuf->size = fileinfo.st_size; |
176 |
+ statbuf->nr_parts = 1; |
177 |
+ statbuf->parts_size[0] = statbuf->size; |
178 |
+ return 0; |
179 |
+ } |
180 |
+ } |
181 |
+ } |
182 |
+ return -1; |
183 |
+} |
184 |
+ |
185 |
/* Internal, but used from dvd_udf.c */ |
186 |
int UDFReadBlocksRaw( dvd_reader_t *device, uint32_t lb_number, |
187 |
size_t block_count, unsigned char *data, |
188 |
diff -Naur --exclude '*~' libdvdread-4.1.3/src/dvd_reader.h libdvdread-4.1.3-backward-compatibility/src/dvd_reader.h |
189 |
--- libdvdread-4.1.3/src/dvd_reader.h 2008-09-06 23:55:51.000000000 +0200 |
190 |
+++ libdvdread-4.1.3-backward-compatibility/src/dvd_reader.h 2008-11-22 13:09:49.000000000 +0100 |
191 |
@@ -114,6 +114,39 @@ |
192 |
single file. */ |
193 |
} dvd_read_domain_t; |
194 |
|
195 |
+typedef struct { |
196 |
+ off_t size; /**< Total size of file in bytes */ |
197 |
+ int nr_parts; /**< Number of file parts */ |
198 |
+ off_t parts_size[9]; /**< Size of each part in bytes */ |
199 |
+} dvd_stat_t; |
200 |
+ |
201 |
+/** |
202 |
+ * Stats a file on the DVD given the title number and domain. |
203 |
+ * The information about the file is stored in a dvd_stat_t |
204 |
+ * which contains information about the size of the file and |
205 |
+ * the number of parts in case of a multipart file and the respective |
206 |
+ * sizes of the parts. |
207 |
+ * A multipart file is for instance VTS_02_1.VOB, VTS_02_2.VOB, VTS_02_3.VOB |
208 |
+ * The size of VTS_02_1.VOB will be stored in stat->parts_size[0], |
209 |
+ * VTS_02_2.VOB in stat->parts_size[1], ... |
210 |
+ * The total size (sum of all parts) is stored in stat->size and |
211 |
+ * stat->nr_parts will hold the number of parts. |
212 |
+ * Only DVD_READ_TITLE_VOBS (VTS_??_[1-9].VOB) can be multipart files. |
213 |
+ * |
214 |
+ * This function is only of use if you want to get the size of each file |
215 |
+ * in the filesystem. These sizes are not needed to use any other |
216 |
+ * functions in libdvdread. |
217 |
+ * |
218 |
+ * @param dvd A dvd read handle. |
219 |
+ * @param titlenum Which Video Title Set should be used, VIDEO_TS is 0. |
220 |
+ * @param domain Which domain. |
221 |
+ * @param stat Pointer to where the result is stored. |
222 |
+ * @return If successful 0, otherwise -1. |
223 |
+ * |
224 |
+ * int DVDFileStat(dvd, titlenum, domain, stat); |
225 |
+ */ |
226 |
+int DVDFileStat(dvd_reader_t *, int, dvd_read_domain_t, dvd_stat_t *); |
227 |
+ |
228 |
/** |
229 |
* Opens a file on the DVD given the title number and domain. |
230 |
* |