Mercurial > mplayer.hg
diff libmpdemux/demux_mov.c @ 16613:465ad78c43c9
Detect eof when seeking and do _not_ restart the video.
Also fixes some invalid reads.
author | reimar |
---|---|
date | Wed, 28 Sep 2005 15:37:30 +0000 |
parents | 9574fb378080 |
children | 66ce674de624 |
line wrap: on
line diff
--- a/libmpdemux/demux_mov.c Tue Sep 27 19:04:10 2005 +0000 +++ b/libmpdemux/demux_mov.c Wed Sep 28 15:37:30 2005 +0000 @@ -1850,6 +1850,7 @@ int x; off_t pos; + if (ds->eof) return 0; trak = stream_track(priv, ds); if (!trak) return 0; @@ -1946,6 +1947,7 @@ if(!(flags&1)) sample+=trak->chunks[trak->pos].sample; // relative trak->pos=0; while(trak->pos<trak->chunks_size && trak->chunks[trak->pos].sample<sample) ++trak->pos; + if (trak->pos == trak->chunks_size) return -1; pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; } else { unsigned int ipts; @@ -1956,12 +1958,14 @@ for(trak->pos=0;trak->pos<trak->samples_size;++trak->pos){ if(trak->samples[trak->pos].pts>=ipts) break; // found it! } + if (trak->pos == trak->samples_size) return -1; 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 == trak->keyframes_size) return -1; if(i>0 && (trak->keyframes[i]-trak->pos) > (trak->pos-trak->keyframes[i-1])) --i; trak->pos=trak->keyframes[i]; @@ -1987,7 +1991,9 @@ if (trak) { //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; //if(!(flags&1)) pts+=ds->pts; - pts=ds->pts=mov_seek_track(trak,pts,flags); + ds->pts=mov_seek_track(trak,pts,flags); + if (ds->pts < 0) ds->eof = 1; + else pts = ds->pts; flags=1; // absolute seconds } @@ -1997,6 +2003,7 @@ //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; //if(!(flags&1)) pts+=ds->pts; ds->pts=mov_seek_track(trak,pts,flags); + if (ds->pts < 0) ds->eof = 1; if (demuxer->video->id < 0) ((sh_audio_t*)ds->sh)->delay = ds->pts; }