Mercurial > libavformat.hg
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; |