parse header chunk in a loop (don't depend on a fixed chunk ordering)

Originally committed as revision 10792 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Aurelien Jacobs 17 years ago
parent af704ee420
commit f8cab062ca
  1. 27
      libavformat/electronicarts.c

@ -162,17 +162,16 @@ static int process_ea_header(AVFormatContext *s) {
uint32_t blockid, size = 0; uint32_t blockid, size = 0;
EaDemuxContext *ea = s->priv_data; EaDemuxContext *ea = s->priv_data;
ByteIOContext *pb = &s->pb; ByteIOContext *pb = &s->pb;
int i;
for (i=0; i<5 && (!ea->audio_codec || !ea->video_codec); i++) {
unsigned int startpos = url_ftell(pb);
blockid = get_le32(pb); blockid = get_le32(pb);
if (blockid == MVhd_TAG) {
size = get_le32(pb); size = get_le32(pb);
process_video_header_vp6(s);
url_fskip(pb, size-32); switch (blockid) {
blockid = get_le32(pb); case SCHl_TAG :
}
if (blockid != SCHl_TAG)
return 0;
size += get_le32(pb);
blockid = get_le32(pb); blockid = get_le32(pb);
if (blockid == GSTR_TAG) { if (blockid == GSTR_TAG) {
url_fskip(pb, 4); url_fskip(pb, 4);
@ -182,9 +181,17 @@ static int process_ea_header(AVFormatContext *s) {
} }
process_audio_header_elements(s); process_audio_header_elements(s);
break;
case MVhd_TAG :
process_video_header_vp6(s);
break;
}
url_fseek(pb, startpos + size, SEEK_SET);
}
/* skip to the start of the data */ url_fseek(pb, 0, SEEK_SET);
url_fseek(pb, size, SEEK_SET);
return 1; return 1;
} }

Loading…
Cancel
Save