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 { \