aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2006-02-11 21:43:21 +0000
committerMichael Niedermayer <michaelni@gmx.at>2006-02-11 21:43:21 +0000
commit3840147e125cdff4f181f823a6b7f260160d28d4 (patch)
treeff8943bee15c4050cfe8a9cb4295fdaee27666ca /libavformat/mov.c
parent1a9150b194b7d9347114875806d29d650d3d0658 (diff)
downloadffmpeg-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.c33
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);