# HG changeset patch # User michael # Date 1139694201 0 # Node ID 929f84cc63c364bb6f42479b910488deb3a46526 # Parent 1214ae47de2b136ae84f02cd2d3f1659768a691e stsd fix by (Baptiste COUDURIER )baptiste.coudurier smartjog com) diff -r 1214ae47de2b -r 929f84cc63c3 mov.c --- a/mov.c Sat Feb 11 20:51:26 2006 +0000 +++ b/mov.c Sat Feb 11 21:43:21 2006 +0000 @@ -831,17 +831,21 @@ 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->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 + 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 @@ 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 @@ 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 @@ } 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);