summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorhyc <hyc@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-05-25 23:07:28 +0000
committerhyc <hyc@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-05-25 23:07:28 +0000
commit3c1cedaa565572c8fdbb6a2c085aaca0bcc39d6f (patch)
tree96a23762756eff1cb9acce1432f77681897813a1 /libmpdemux
parente765b9cd43385050f4a18213a7100435599560e7 (diff)
downloadmpv-3c1cedaa565572c8fdbb6a2c085aaca0bcc39d6f.tar.bz2
mpv-3c1cedaa565572c8fdbb6a2c085aaca0bcc39d6f.tar.xz
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31218 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_lavf.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 67374277ed..3305611876 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -83,7 +83,8 @@ typedef struct lavf_priv_t{
}lavf_priv_t;
static int mp_read(void *opaque, uint8_t *buf, int size) {
- stream_t *stream = opaque;
+ demuxer_t *demuxer = opaque;
+ stream_t *stream = demuxer->stream;
int ret;
if(stream_eof(stream)) //needed?
@@ -95,7 +96,8 @@ static int mp_read(void *opaque, uint8_t *buf, int size) {
}
static int64_t mp_seek(void *opaque, int64_t pos, int whence) {
- stream_t *stream = opaque;
+ demuxer_t *demuxer = opaque;
+ stream_t *stream = demuxer->stream;
int64_t current_pos;
mp_msg(MSGT_HEADER,MSGL_DBG2,"mp_seek(%p, %"PRId64", %d)\n", stream, pos, whence);
if(whence == SEEK_CUR)
@@ -123,6 +125,21 @@ static int64_t mp_seek(void *opaque, int64_t pos, int whence) {
return pos - stream->start_pos;
}
+static int64_t mp_read_seek(void *opaque, int stream_idx, int64_t ts, int flags) {
+ demuxer_t *demuxer = opaque;
+ stream_t *stream = demuxer->stream;
+ lavf_priv_t *priv = demuxer->priv;
+ AVStream *st = priv->avfc->streams[stream_idx];
+ int ret;
+ double pts;
+
+ pts = (double)ts * st->time_base.num / st->time_base.den;
+ ret = stream_control(stream, STREAM_CTRL_SEEK_TO_TIME, &pts);
+ if (ret < 0)
+ ret = AVERROR(ENOSYS);
+ return ret;
+}
+
static void list_formats(void) {
AVInputFormat *fmt;
mp_msg(MSGT_DEMUX, MSGL_INFO, "Available lavf input formats:\n");
@@ -503,7 +520,8 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){
av_strlcat(mp_filename, "foobar.dummy", sizeof(mp_filename));
priv->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 0,
- demuxer->stream, mp_read, NULL, mp_seek);
+ demuxer, mp_read, NULL, mp_seek);
+ priv->pb->read_seek = mp_read_seek;
priv->pb->is_streamed = !demuxer->stream->end_pos || (demuxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK;
if(av_open_input_stream(&avfc, priv->pb, mp_filename, priv->avif, &ap)<0){