Mercurial > libavformat.hg
comparison asf.c @ 3486:f68fcc8b8e9e libavformat
factorize read_header failure freeing code
author | bcoudurier |
---|---|
date | Fri, 20 Jun 2008 17:16:56 +0000 |
parents | 7a0230981402 |
children | 2f191d610db9 |
comparison
equal
deleted
inserted
replaced
3485:99565673f94c | 3486:f68fcc8b8e9e |
---|---|
154 memset(dar, 0, sizeof(dar)); | 154 memset(dar, 0, sizeof(dar)); |
155 memset(bitrate, 0, sizeof(bitrate)); | 155 memset(bitrate, 0, sizeof(bitrate)); |
156 | 156 |
157 get_guid(pb, &g); | 157 get_guid(pb, &g); |
158 if (memcmp(&g, &asf_header, sizeof(GUID))) | 158 if (memcmp(&g, &asf_header, sizeof(GUID))) |
159 goto fail; | 159 return -1; |
160 get_le64(pb); | 160 get_le64(pb); |
161 get_le32(pb); | 161 get_le32(pb); |
162 get_byte(pb); | 162 get_byte(pb); |
163 get_byte(pb); | 163 get_byte(pb); |
164 memset(&asf->asfid2avid, -1, sizeof(asf->asfid2avid)); | 164 memset(&asf->asfid2avid, -1, sizeof(asf->asfid2avid)); |
179 asf->data_object_size = (uint64_t)-1; | 179 asf->data_object_size = (uint64_t)-1; |
180 } | 180 } |
181 break; | 181 break; |
182 } | 182 } |
183 if (gsize < 24) | 183 if (gsize < 24) |
184 goto fail; | 184 return -1; |
185 if (!memcmp(&g, &file_header, sizeof(GUID))) { | 185 if (!memcmp(&g, &file_header, sizeof(GUID))) { |
186 get_guid(pb, &asf->hdr.guid); | 186 get_guid(pb, &asf->hdr.guid); |
187 asf->hdr.file_size = get_le64(pb); | 187 asf->hdr.file_size = get_le64(pb); |
188 asf->hdr.create_time = get_le64(pb); | 188 asf->hdr.create_time = get_le64(pb); |
189 asf->nb_packets = get_le64(pb); | 189 asf->nb_packets = get_le64(pb); |
205 | 205 |
206 pos1 = url_ftell(pb); | 206 pos1 = url_ftell(pb); |
207 | 207 |
208 st = av_new_stream(s, 0); | 208 st = av_new_stream(s, 0); |
209 if (!st) | 209 if (!st) |
210 goto fail; | 210 return AVERROR(ENOMEM); |
211 av_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ | 211 av_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ |
212 asf_st = av_mallocz(sizeof(ASFStream)); | 212 asf_st = av_mallocz(sizeof(ASFStream)); |
213 if (!asf_st) | 213 if (!asf_st) |
214 goto fail; | 214 return AVERROR(ENOMEM); |
215 st->priv_data = asf_st; | 215 st->priv_data = asf_st; |
216 start_time = asf->hdr.preroll; | 216 start_time = asf->hdr.preroll; |
217 | 217 |
218 if(!(asf->hdr.flags & 0x01)) { // if we aren't streaming... | 218 if(!(asf->hdr.flags & 0x01)) { // if we aren't streaming... |
219 st->duration = asf->hdr.send_time / | 219 st->duration = asf->hdr.send_time / |
230 type = CODEC_TYPE_UNKNOWN; | 230 type = CODEC_TYPE_UNKNOWN; |
231 } else if (!memcmp(&g, &ext_stream_embed_stream_header, sizeof(GUID))) { | 231 } else if (!memcmp(&g, &ext_stream_embed_stream_header, sizeof(GUID))) { |
232 test_for_ext_stream_audio = 1; | 232 test_for_ext_stream_audio = 1; |
233 type = CODEC_TYPE_UNKNOWN; | 233 type = CODEC_TYPE_UNKNOWN; |
234 } else { | 234 } else { |
235 goto fail; | 235 return -1; |
236 } | 236 } |
237 get_guid(pb, &g); | 237 get_guid(pb, &g); |
238 total_size = get_le64(pb); | 238 total_size = get_le64(pb); |
239 type_specific_size = get_le32(pb); | 239 type_specific_size = get_le32(pb); |
240 get_le32(pb); | 240 get_le32(pb); |
511 } | 511 } |
512 *q = '\0'; | 512 *q = '\0'; |
513 } | 513 } |
514 #endif | 514 #endif |
515 } else if (url_feof(pb)) { | 515 } else if (url_feof(pb)) { |
516 goto fail; | 516 return -1; |
517 } else { | 517 } else { |
518 url_fseek(pb, gsize - 24, SEEK_CUR); | 518 url_fseek(pb, gsize - 24, SEEK_CUR); |
519 } | 519 } |
520 } | 520 } |
521 get_guid(pb, &g); | 521 get_guid(pb, &g); |
522 get_le64(pb); | 522 get_le64(pb); |
523 get_byte(pb); | 523 get_byte(pb); |
524 get_byte(pb); | 524 get_byte(pb); |
525 if (url_feof(pb)) | 525 if (url_feof(pb)) |
526 goto fail; | 526 return -1; |
527 asf->data_offset = url_ftell(pb); | 527 asf->data_offset = url_ftell(pb); |
528 asf->packet_size_left = 0; | 528 asf->packet_size_left = 0; |
529 | 529 |
530 | 530 |
531 for(i=0; i<128; i++){ | 531 for(i=0; i<128; i++){ |
541 //av_log(NULL, AV_LOG_ERROR, "dar %d:%d sar=%d:%d\n", dar[i].num, dar[i].den, codec->sample_aspect_ratio.num, codec->sample_aspect_ratio.den); | 541 //av_log(NULL, AV_LOG_ERROR, "dar %d:%d sar=%d:%d\n", dar[i].num, dar[i].den, codec->sample_aspect_ratio.num, codec->sample_aspect_ratio.den); |
542 } | 542 } |
543 } | 543 } |
544 | 544 |
545 return 0; | 545 return 0; |
546 | |
547 fail: | |
548 for(i=0;i<s->nb_streams;i++) { | |
549 AVStream *st = s->streams[i]; | |
550 if (st) { | |
551 av_free(st->priv_data); | |
552 av_free(st->codec->extradata); | |
553 } | |
554 av_free(st); | |
555 } | |
556 return -1; | |
557 } | 546 } |
558 | 547 |
559 #define DO_2BITS(bits, var, defval) \ | 548 #define DO_2BITS(bits, var, defval) \ |
560 switch (bits & 3) \ | 549 switch (bits & 3) \ |
561 { \ | 550 { \ |