comparison mov.c @ 5496:324c7c25e4ad libavformat

simplify error handling in mov_read_default
author bcoudurier
date Mon, 04 Jan 2010 22:58:19 +0000
parents cce2ae0f48a0
children 59df3b64dc89
comparison
equal deleted inserted replaced
5495:cce2ae0f48a0 5496:324c7c25e4ad
179 static int mov_read_default(MOVContext *c, ByteIOContext *pb, MOVAtom atom) 179 static int mov_read_default(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
180 { 180 {
181 int64_t total_size = 0; 181 int64_t total_size = 0;
182 MOVAtom a; 182 MOVAtom a;
183 int i; 183 int i;
184 int err = 0;
185 184
186 if (atom.size < 0) 185 if (atom.size < 0)
187 atom.size = INT64_MAX; 186 atom.size = INT64_MAX;
188 while(((total_size + 8) < atom.size) && !url_feof(pb) && !err) { 187 while(((total_size + 8) < atom.size) && !url_feof(pb)) {
189 int (*parse)(MOVContext*, ByteIOContext*, MOVAtom) = NULL; 188 int (*parse)(MOVContext*, ByteIOContext*, MOVAtom) = NULL;
190 a.size = atom.size; 189 a.size = atom.size;
191 a.type=0; 190 a.type=0;
192 if(atom.size >= 8) { 191 if(atom.size >= 8) {
193 a.size = get_be32(pb); 192 a.size = get_be32(pb);
224 if (!parse) { /* skip leaf atoms data */ 223 if (!parse) { /* skip leaf atoms data */
225 url_fskip(pb, a.size); 224 url_fskip(pb, a.size);
226 } else { 225 } else {
227 int64_t start_pos = url_ftell(pb); 226 int64_t start_pos = url_ftell(pb);
228 int64_t left; 227 int64_t left;
229 err = parse(c, pb, a); 228 int err = parse(c, pb, a);
229 if (err < 0)
230 return err;
230 if (url_is_streamed(pb) && c->found_moov && c->found_mdat) 231 if (url_is_streamed(pb) && c->found_moov && c->found_mdat)
231 break; 232 break;
232 left = a.size - url_ftell(pb) + start_pos; 233 left = a.size - url_ftell(pb) + start_pos;
233 if (left > 0) /* skip garbage at atom end */ 234 if (left > 0) /* skip garbage at atom end */
234 url_fskip(pb, left); 235 url_fskip(pb, left);
235 } 236 }
236 237
237 total_size += a.size; 238 total_size += a.size;
238 } 239 }
239 240
240 if (!err && total_size < atom.size && atom.size < 0x7ffff) 241 if (total_size < atom.size && atom.size < 0x7ffff)
241 url_fskip(pb, atom.size - total_size); 242 url_fskip(pb, atom.size - total_size);
242 243
243 return err; 244 return 0;
244 } 245 }
245 246
246 static int mov_read_dref(MOVContext *c, ByteIOContext *pb, MOVAtom atom) 247 static int mov_read_dref(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
247 { 248 {
248 AVStream *st; 249 AVStream *st;