--- libmpdemux/demux_mov.c +++ libmpdemux/demux_mov.c @@ -56,6 +56,11 @@ #define char2short(x,y) BE_16(&(x)[(y)]) #define char2int(x,y) BE_32(&(x)[(y)]) +#ifndef FFMAX +#define FFMAX(a,b) ((a) > (b) ? (a) : (b)) +#define FFMIN(a,b) ((a) > (b) ? (b) : (a)) +#endif /* FFMAX */ + typedef struct { unsigned int pts; // duration unsigned int size; @@ -163,11 +166,12 @@ void mov_build_index(mov_track_t* trak,int timescale){ i=trak->chunkmap_size; while(i>0){ --i; - for(j=trak->chunkmap[i].first;j<last;j++){ + j=FFMAX(trak->chunkmap[i].first, 0); + for(;j<last;j++){ trak->chunks[j].desc=trak->chunkmap[i].sdid; trak->chunks[j].size=trak->chunkmap[i].spc; } - last=trak->chunkmap[i].first; + last=FFMIN(trak->chunkmap[i].first, trak->chunks_size); } #if 0 @@ -209,6 +213,8 @@ void mov_build_index(mov_track_t* trak,int timescale){ s=0; for(j=0;j<trak->durmap_size;j++){ for(i=0;i<trak->durmap[j].num;i++){ + if (s >= trak->samples_size) + break; trak->samples[s].pts=pts; ++s; pts+=trak->durmap[j].dur; @@ -220,6 +226,8 @@ void mov_build_index(mov_track_t* trak,int timescale){ for(j=0;j<trak->chunks_size;j++){ off_t pos=trak->chunks[j].pos; for(i=0;i<trak->chunks[j].size;i++){ + if (s >= trak->samples_size) + break; trak->samples[s].pos=pos; mp_msg(MSGT_DEMUX, MSGL_DBG3, "Sample %5d: pts=%8d off=0x%08X size=%d\n",s, trak->samples[s].pts, @@ -1454,8 +1462,7 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak if( udta_len>udta_size) udta_len=udta_size; { - char dump[udta_len-4]; - stream_read(demuxer->stream, (char *)&dump, udta_len-4-4); + stream_skip(demuxer->stream, udta_len-4-4); udta_size -= udta_len; } }