summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
Diffstat (limited to 'demux')
-rw-r--r--demux/demux.c4
-rw-r--r--demux/demux_lavf.c12
2 files changed, 14 insertions, 2 deletions
diff --git a/demux/demux.c b/demux/demux.c
index 82159057d8..f765b2ae87 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -1077,6 +1077,10 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay,
mp_tmsg(MSGT_SEEK, MSGL_WARN, "Cannot seek in this file.\n");
return 0;
}
+
+ if (rel_seek_secs == MP_NOPTS_VALUE && (flags & SEEK_ABSOLUTE))
+ return 0;
+
// clear demux buffers:
demux_flush(demuxer);
demuxer->video->eof = 0;
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index c1c15f345a..42b687dc20 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -886,9 +886,17 @@ static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs,
priv->last_pts += rel_seek_secs * priv->avfc->duration;
} else
priv->last_pts += rel_seek_secs * AV_TIME_BASE;
- if (av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags) < 0) {
- avsflags ^= AVSEEK_FLAG_BACKWARD;
+
+ if (!priv->avfc->iformat->read_seek2) {
+ // Normal seeking.
av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags);
+ } else {
+ // av_seek_frame() won't work. Use "new" seeking API. We don't use this
+ // API by default, because there are some major issues.
+ // Set max_ts==ts, so that demuxing starts from an earlier position in
+ // the worst case.
+ avformat_seek_file(priv->avfc, -1, INT64_MIN,
+ priv->last_pts, priv->last_pts, avsflags);
}
}