# HG changeset patch # User arpi # Date 1032376151 0 # Node ID 13716c8114a8ab8c02465fa912191bf276c62abc # Parent db45f7ac40d9e8955b8ca26b2cc376352a4494f7 fixing edit-list playback (it uses the mvhd-timescale instead of the mdhd-one) diff -r db45f7ac40d9 -r 13716c8114a8 libmpdemux/demux_mov.c --- a/libmpdemux/demux_mov.c Wed Sep 18 16:03:22 2002 +0000 +++ b/libmpdemux/demux_mov.c Wed Sep 18 19:09:11 2002 +0000 @@ -138,7 +138,7 @@ void* desc; // image/sound/etc description (pointer to ImageDescription etc) } mov_track_t; -void mov_build_index(mov_track_t* trak){ +void mov_build_index(mov_track_t* trak,int timescale){ int i,j,s; int last=trak->chunks_size; unsigned int pts=0; @@ -248,8 +248,8 @@ if(pts<=trak->samples[sample].pts) break; } el->start_sample=sample; - el->pts_offset=e_pts-trak->samples[sample].pts; - pts+=el->dur; + el->pts_offset=((long long)e_pts*(long long)trak->timescale)/(long long)timescale-trak->samples[sample].pts; + pts+=((long long)el->dur*(long long)trak->timescale)/(long long)timescale; e_pts+=el->dur; // find end sample for(;samplesamples_size;sample++){ @@ -271,6 +271,8 @@ off_t mdat_end; int track_db; mov_track_t* tracks[MOV_MAX_TRACKS]; + int timescale; // movie timescale + int duration; // movie duration (in movie timescale units) } mov_priv_t; #define MOV_FOURCC(a,b,c,d) ((a<<24)|(b<<16)|(c<<8)|(d)) @@ -423,6 +425,29 @@ trak->tkdata_len=len; trak->tkdata=malloc(trak->tkdata_len); stream_read(demuxer->stream,trak->tkdata,trak->tkdata_len); +/* +0 1 Version +1 3 Flags +4 4 Creation time +8 4 Modification time +12 4 Track ID +16 4 Reserved +20 4 Duration +24 8 Reserved +32 2 Layer +34 2 Alternate group +36 2 Volume +38 2 Reserved +40 36 Matrix structure +76 4 Track width +80 4 Track height +*/ + mp_msg(MSGT_DEMUX,MSGL_V,"tkhd len=%d ver=%d flags=0x%X id=%d dur=%d lay=%d vol=%d\n", + trak->tkdata_len, trak->tkdata[0], trak->tkdata[1], + char2int(trak->tkdata,12), // id + char2int(trak->tkdata,20), // duration + char2short(trak->tkdata,32), // layer + char2short(trak->tkdata,36)); // volume break; } case MOV_FOURCC('m','d','h','d'): { @@ -661,6 +686,14 @@ }//switch(id) } else { /* not in track */ switch(id) { + case MOV_FOURCC('m','v','h','d'): { + stream_skip(demuxer->stream,12); + priv->timescale=stream_read_dword(demuxer->stream); + priv->duration=stream_read_dword(demuxer->stream); + mp_msg(MSGT_DEMUX, MSGL_V,"MOV: %*sMovie header (%d bytes): tscale=%d dur=%d\n",level,"",(int)len, + (int)priv->timescale,(int)priv->duration); + break; + } case MOV_FOURCC('t','r','a','k'): { // if(trak) printf("MOV: Warning! trak in trak?\n"); if(priv->track_db>=MOV_MAX_TRACKS){ @@ -674,7 +707,7 @@ trak->id=priv->track_db; priv->tracks[priv->track_db]=trak; lschunks(demuxer,level+1,pos+len,trak); - mov_build_index(trak); + mov_build_index(trak,priv->timescale); switch(trak->type){ case MOV_TRAK_AUDIO: { #if 0