append extradata atoms when parsing, fix OLOCOONS_O3.mov

Originally committed as revision 10688 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Baptiste Coudurier 2007-10-08 13:06:48 +00:00
parent 6cb1d36169
commit 68bc33fa9f

View File

@ -470,16 +470,19 @@ static int mov_read_enda(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
static int mov_read_extradata(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) static int mov_read_extradata(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
{ {
AVStream *st = c->fc->streams[c->fc->nb_streams-1]; AVStream *st = c->fc->streams[c->fc->nb_streams-1];
if((uint64_t)atom.size > (1<<30)) uint64_t size= (uint64_t)st->codec->extradata_size + atom.size + 8 + FF_INPUT_BUFFER_PADDING_SIZE;
uint8_t *buf;
if(size > INT_MAX || (uint64_t)atom.size > INT_MAX)
return -1; return -1;
av_free(st->codec->extradata); buf= av_realloc(st->codec->extradata, size);
st->codec->extradata_size = atom.size + 8; if(!buf)
st->codec->extradata = av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); return -1;
if (st->codec->extradata) { st->codec->extradata= buf;
AV_WL32(st->codec->extradata + 4, atom.type); buf+= st->codec->extradata_size;
get_buffer(pb, st->codec->extradata + 8, atom.size); st->codec->extradata_size= size - FF_INPUT_BUFFER_PADDING_SIZE;
} else AV_WB32( buf , atom.size + 8);
url_fskip(pb, atom.size); AV_WL32( buf + 4, atom.type);
get_buffer(pb, buf + 8, atom.size);
return 0; return 0;
} }