diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2006-02-11 21:43:21 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2006-02-11 21:43:21 +0000 |
commit | 3840147e125cdff4f181f823a6b7f260160d28d4 (patch) | |
tree | ff8943bee15c4050cfe8a9cb4295fdaee27666ca /libavformat/mov.c | |
parent | 1a9150b194b7d9347114875806d29d650d3d0658 (diff) | |
download | ffmpeg-3840147e125cdff4f181f823a6b7f260160d28d4.tar.gz |
stsd fix by (Baptiste COUDURIER )baptiste.coudurier smartjog com)
Originally committed as revision 4994 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r-- | libavformat/mov.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index eeb0ebbd2f..5a2a0fe811 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -831,17 +831,21 @@ static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) if((uint64_t)atom.size > (1<<30)) return -1; - // pass all frma atom to codec, needed at least for QDM2 - av_free(st->codec->extradata); - st->codec->extradata_size = atom.size; - st->codec->extradata = (uint8_t*) av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); - - if (st->codec->extradata) { - get_buffer(pb, st->codec->extradata, atom.size); - //av_log(NULL, AV_LOG_DEBUG, "Reading frma %Ld %s\n", atom.size, (char*)st->codec->extradata); - } else + if (st->codec->codec_id == CODEC_ID_QDM2) { + // pass all frma atom to codec, needed at least for QDM2 + av_free(st->codec->extradata); + st->codec->extradata_size = atom.size; + st->codec->extradata = (uint8_t*) av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); + + if (st->codec->extradata) { + get_buffer(pb, st->codec->extradata, atom.size); + //av_log(NULL, AV_LOG_DEBUG, "Reading frma %Ld %s\n", atom.size, (char*)st->codec->extradata); + } else + url_fskip(pb, atom.size); + } else if (atom.size > 8) { /* to read frma, esds atoms */ + mov_read_default(c, pb, atom); + } else if (atom.size > 0) url_fskip(pb, atom.size); - return 0; } @@ -944,6 +948,7 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) while(entries--) { //Parsing Sample description table enum CodecID id; + offset_t start_pos = url_ftell(pb); int size = get_be32(pb); /* size */ format = get_le32(pb); /* data format */ @@ -1006,7 +1011,6 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) st->codec->time_base.den = 25; st->codec->time_base.num = 1; */ - size -= (16+8*4+2+32+2*2); #if 0 while (size >= 8) { MOV_atom_t a; @@ -1147,8 +1151,11 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) } else st->codec->palctrl = NULL; - a.size = size; - mov_read_default(c, pb, a); + a.size = size - (url_ftell(pb) - start_pos); + if (a.size > 8) + mov_read_default(c, pb, a); + else if (a.size > 0) + url_fskip(pb, a.size); #endif } else { st->codec->codec_id = codec_get_id(mov_audio_tags, format); |