summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authormichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-04-11 17:20:52 +0000
committermichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-04-11 17:20:52 +0000
commit9e29038395037bd59bdf335fd7dffaef855f7868 (patch)
tree1fb0572be75fb8e41d7b69096b8f75ffe94b7cf4 /libmpdemux
parent532af04dba498a92c90be42e63660324f369620f (diff)
downloadmpv-9e29038395037bd59bdf335fd7dffaef855f7868.tar.bz2
mpv-9e29038395037bd59bdf335fd7dffaef855f7868.tar.xz
seeking
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12169 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_lavf.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 51beb09fab..b42cc5585f 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -41,6 +41,7 @@ typedef struct lavf_priv_t{
ByteIOContext pb;
int audio_streams;
int video_streams;
+ int64_t last_pts;
}lavf_priv_t;
extern void print_wave_header(WAVEFORMATEX *h);
@@ -305,6 +306,8 @@ int demux_lavf_fill_buffer(demuxer_t *demux){
av_free_packet(&pkt);
}
+ priv->last_pts= pkt.pts;
+
dp->pts=pkt.pts / (float)AV_TIME_BASE;
dp->pos=demux->filepos;
dp->flags= !!(pkt.flags&PKT_FLAG_KEY);
@@ -314,7 +317,10 @@ int demux_lavf_fill_buffer(demuxer_t *demux){
}
void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, int flags){
- mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf()\n");
+ lavf_priv_t *priv = demuxer->priv;
+ mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf(%p, %f, %d)\n", demuxer, rel_seek_secs, flags);
+
+ av_seek_frame(priv->avfc, -1, priv->last_pts + rel_seek_secs*AV_TIME_BASE);
}
int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
@@ -322,19 +328,19 @@ int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
lavf_priv_t *priv = demuxer->priv;
switch (cmd) {
-/* case DEMUXER_CTRL_GET_TIME_LENGTH:
- if (priv->duration == 0)
+ case DEMUXER_CTRL_GET_TIME_LENGTH:
+ if (priv->avfc->duration == 0)
return DEMUXER_CTRL_DONTKNOW;
- *((unsigned long *)arg) = priv->duration;
+ *((unsigned long *)arg) = priv->avfc->duration / AV_TIME_BASE;
return DEMUXER_CTRL_OK;
case DEMUXER_CTRL_GET_PERCENT_POS:
- if (priv->duration == 0)
+ if (priv->avfc->duration == 0)
return DEMUXER_CTRL_DONTKNOW;
- *((int *)arg) = (int)(100 * lastpts / priv->duration);
- return DEMUXER_CTRL_OK;*/
+ *((int *)arg) = (int)(priv->last_pts*100 / priv->avfc->duration);
+ return DEMUXER_CTRL_OK;
default:
return DEMUXER_CTRL_NOTIMPL;