diff options
author | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-10-29 21:55:07 +0000 |
---|---|---|
committer | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-10-29 21:55:07 +0000 |
commit | 10f5c87656d2eb530732603236b29fdc86229edc (patch) | |
tree | 4135cc0d54436099d1fe92586cedbac56814decd /libmpdemux/demux_mov.c | |
parent | 4e83a6009824006b3be1ffe4d3184eea18807526 (diff) | |
download | mpv-10f5c87656d2eb530732603236b29fdc86229edc.tar.bz2 mpv-10f5c87656d2eb530732603236b29fdc86229edc.tar.xz |
using keyframe info for seeking
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2545 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_mov.c')
-rw-r--r-- | libmpdemux/demux_mov.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c index 080ac68ca7..afcd801f60 100644 --- a/libmpdemux/demux_mov.c +++ b/libmpdemux/demux_mov.c @@ -71,6 +71,8 @@ typedef struct { 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 @@ static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak 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;i<entries;i++) - { - printf("entry#%d: %ld\n", i, stream_read_dword(demuxer->stream)); - } -#endif + trak->keyframes_size=entries; + trak->keyframes=malloc(sizeof(unsigned int)*entries); + for (i=0;i<entries;i++) trak->keyframes[i]=stream_read_dword(demuxer->stream)-1; +// for (i=0;i<entries;i++) printf("%3d: %d\n",i,trak->keyframes[i]); break; } case MOV_FOURCC('m','d','i','a'): { @@ -751,8 +750,20 @@ if(trak->samplesize){ 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->pos<trak->samples_size && trak->samples[trak->pos].pts<ipts) ++trak->pos; + for(trak->pos=0;trak->pos<trak->samples_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;i<trak->keyframes_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; } |