# HG changeset patch # User arpi # Date 1004392507 0 # Node ID fd48f0d813b6afb0ef21fdc632b81cb07cebf236 # Parent a28b5e54f5a6e3ddde09e73ac91795bebcb7500e using keyframe info for seeking diff -r a28b5e54f5a6 -r fd48f0d813b6 libmpdemux/demux_mov.c --- a/libmpdemux/demux_mov.c Mon Oct 29 21:25:10 2001 +0000 +++ b/libmpdemux/demux_mov.c Mon Oct 29 21:55:07 2001 +0000 @@ -71,6 +71,8 @@ mov_chunkmap_t* chunkmap; int durmap_size; mov_durmap_t* durmap; + int keyframes_size; + unsigned int* keyframes; } mov_track_t; void mov_build_index(mov_track_t* trak){ @@ -372,15 +374,12 @@ int ver = (temp << 24); int flags = (temp << 16)|(temp<<8)|temp; int i; - mp_msg(MSGT_DEMUX, MSGL_V,"MOV: %*sSyncing samples (keyframes) table! (%d entries) (ver:%d,flags:%ld)\n", level, "",entries, ver, flags); -#if 0 - for (i=0;istream)); - } -#endif + trak->keyframes_size=entries; + trak->keyframes=malloc(sizeof(unsigned int)*entries); + for (i=0;ikeyframes[i]=stream_read_dword(demuxer->stream)-1; +// for (i=0;ikeyframes[i]); break; } case MOV_FOURCC('m','d','i','a'): { @@ -751,8 +750,20 @@ unsigned int ipts=pts; // printf("MOV track seek - sample: %d \n",ipts); if(!(flags&1)) ipts+=trak->samples[trak->pos].pts; - trak->pos=0; - while(trak->possamples_size && trak->samples[trak->pos].ptspos; + for(trak->pos=0;trak->possamples_size;++trak->pos){ + if(trak->samples[trak->pos].pts>=ipts) break; // found it! + } + if(trak->keyframes_size){ + // find nearest keyframe + int i; + for(i=0;ikeyframes_size;i++){ + if(trak->keyframes[i]>=trak->pos) break; + } + if(i>0 && + (trak->keyframes[i]-trak->pos) > (trak->pos-trak->keyframes[i-1])) --i; + trak->pos=trak->keyframes[i]; +// printf("nearest keyframe: %d \n",trak->pos); + } pts=(float)trak->samples[trak->pos].pts/(float)trak->timescale; }