diff options
Diffstat (limited to 'demux')
-rw-r--r-- | demux/demux.c | 4 | ||||
-rw-r--r-- | demux/demux_lavf.c | 12 |
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); } } |