diff --git a/core/mplayer.c b/core/mplayer.c index 20838b9ff8..5d8976c491 100644 --- a/core/mplayer.c +++ b/core/mplayer.c @@ -3590,7 +3590,8 @@ static void run_playloop(struct MPContext *mpctx) if (mpctx->backstep_active) { double current_pts = mpctx->last_vo_pts; mpctx->backstep_active = false; - if (mpctx->sh_video && current_pts != MP_NOPTS_VALUE) { + bool demuxer_ok = mpctx->demuxer && mpctx->demuxer->accurate_seek; + if (demuxer_ok && mpctx->sh_video && current_pts != MP_NOPTS_VALUE) { double seek_pts = find_previous_pts(mpctx, current_pts); if (seek_pts != MP_NOPTS_VALUE) { queue_seek(mpctx, MPSEEK_ABSOLUTE, seek_pts, 1); @@ -3617,9 +3618,11 @@ static void run_playloop(struct MPContext *mpctx) // Note that current_pts should be part of the index, // otherwise we can't find the previous frame, so set the // seek target an arbitrary amount of time after it. - mpctx->hrseek_pts = current_pts + 10.0; - mpctx->hrseek_framedrop = false; - mpctx->backstep_active = true; + if (mpctx->hrseek_active) { + mpctx->hrseek_pts = current_pts + 10.0; + mpctx->hrseek_framedrop = false; + mpctx->backstep_active = true; + } } else { mpctx->backstep_active = true; } diff --git a/demux/demux.c b/demux/demux.c index 305d414bfa..06b1a35d0f 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -925,6 +925,8 @@ static struct demuxer *open_given_type(struct MPOpts *opts, if (stream_manages_timeline(demuxer->stream)) { // Incorrect, but fixes some behavior with DVD/BD demuxer->ts_resets_possible = false; + // Doesn't work, because stream_pts is a "guess". + demuxer->accurate_seek = false; } demuxer_sort_chapters(demuxer); return demuxer;