mirror of
https://github.com/mpv-player/mpv
synced 2025-01-13 00:06:25 +01:00
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.
This commit is contained in:
parent
e5f18eb825
commit
e4837b2d42
@ -3590,7 +3590,8 @@ static void run_playloop(struct MPContext *mpctx)
|
|||||||
if (mpctx->backstep_active) {
|
if (mpctx->backstep_active) {
|
||||||
double current_pts = mpctx->last_vo_pts;
|
double current_pts = mpctx->last_vo_pts;
|
||||||
mpctx->backstep_active = false;
|
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);
|
double seek_pts = find_previous_pts(mpctx, current_pts);
|
||||||
if (seek_pts != MP_NOPTS_VALUE) {
|
if (seek_pts != MP_NOPTS_VALUE) {
|
||||||
queue_seek(mpctx, MPSEEK_ABSOLUTE, seek_pts, 1);
|
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,
|
// Note that current_pts should be part of the index,
|
||||||
// otherwise we can't find the previous frame, so set the
|
// otherwise we can't find the previous frame, so set the
|
||||||
// seek target an arbitrary amount of time after it.
|
// seek target an arbitrary amount of time after it.
|
||||||
mpctx->hrseek_pts = current_pts + 10.0;
|
if (mpctx->hrseek_active) {
|
||||||
mpctx->hrseek_framedrop = false;
|
mpctx->hrseek_pts = current_pts + 10.0;
|
||||||
mpctx->backstep_active = true;
|
mpctx->hrseek_framedrop = false;
|
||||||
|
mpctx->backstep_active = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
mpctx->backstep_active = true;
|
mpctx->backstep_active = true;
|
||||||
}
|
}
|
||||||
|
@ -925,6 +925,8 @@ static struct demuxer *open_given_type(struct MPOpts *opts,
|
|||||||
if (stream_manages_timeline(demuxer->stream)) {
|
if (stream_manages_timeline(demuxer->stream)) {
|
||||||
// Incorrect, but fixes some behavior with DVD/BD
|
// Incorrect, but fixes some behavior with DVD/BD
|
||||||
demuxer->ts_resets_possible = false;
|
demuxer->ts_resets_possible = false;
|
||||||
|
// Doesn't work, because stream_pts is a "guess".
|
||||||
|
demuxer->accurate_seek = false;
|
||||||
}
|
}
|
||||||
demuxer_sort_chapters(demuxer);
|
demuxer_sort_chapters(demuxer);
|
||||||
return demuxer;
|
return demuxer;
|
||||||
|
Loading…
Reference in New Issue
Block a user