diff options
author | 2013-05-04 02:59:42 +0200 | |
---|---|---|
committer | 2013-05-05 18:44:24 +0200 | |
commit | e4837b2d423e728bc294fb77c0d01b957c78848f (patch) | |
tree | d2ea6830d194c777a4b59f89bf3b9c66acdf9874 | |
parent | e5f18eb82516a8d9e78185c9542d1e29e2819f18 (diff) |
core: ignore backstep command if demuxer is not capable
Also, mark demuxer as not capable if DVD playback is done. The problem
with DVD is that playback time (stream_pts) is not reported frame-exact,
and the time is a "guess" at best.
-rw-r--r-- | core/mplayer.c | 11 | ||||
-rw-r--r-- | demux/demux.c | 2 |
2 files changed, 9 insertions, 4 deletions
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; |