diff options
author | wm4 <wm4@nowhere> | 2019-11-16 23:54:43 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2019-11-17 02:11:45 +0100 |
commit | 6bcda94cbc86bd1ab710546816b019e86bc92ec9 (patch) | |
tree | e6fbce4c394314bbb4ffd6b438454f75d875d12c | |
parent | ba6ba3282534a7606cadd73f25133cd7b106aecc (diff) | |
download | mpv-6bcda94cbc86bd1ab710546816b019e86bc92ec9.tar.bz2 mpv-6bcda94cbc86bd1ab710546816b019e86bc92ec9.tar.xz |
video: if hr-seek goes past last frame, seek to last frame
This gives much better behavior in general, and is what we want if video
somehow ends earlier than audio.
A common special is using an audio file with an external image file.
This commit makes things like switching aspect ratio work (provided the
demuxer for the image behaves correctly, which currently isn't the case
with demux_mf.c). Since the image file had timestamp 0, it was usually
skipped by hr-seek, and changed properties weren't applied to it at the
start of the filter chain.
-rw-r--r-- | player/video.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/player/video.c b/player/video.c index 1a3cfb3b5f..9b73b438c4 100644 --- a/player/video.c +++ b/player/video.c @@ -494,12 +494,11 @@ static int video_output_image(struct MPContext *mpctx) mp_pin_out_unread(vo_c->filter->f->pins[1], frame); img = NULL; r = VD_EOF; - } else if (hrseek && mpctx->hrseek_lastframe) { + } else if (hrseek && (img->pts < mpctx->hrseek_pts - .005 || + mpctx->hrseek_lastframe)) + { + /* just skip - but save in case it was the last frame */ mp_image_setrefp(&mpctx->saved_frame, img); - } else if (hrseek && img->pts < mpctx->hrseek_pts - .005) { - /* just skip - but save if backstep active */ - if (mpctx->hrseek_backstep) - mp_image_setrefp(&mpctx->saved_frame, img); } else if (mpctx->video_status == STATUS_SYNCING && mpctx->playback_pts != MP_NOPTS_VALUE && img->pts < mpctx->playback_pts && !vo_c->is_coverart) @@ -522,8 +521,8 @@ static int video_output_image(struct MPContext *mpctx) } } - // Last-frame seek - if (r <= 0 && hrseek && mpctx->hrseek_lastframe && mpctx->saved_frame) { + // If hr-seek went past EOF, use the last frame. + if (r <= 0 && hrseek && mpctx->saved_frame && r == VD_EOF) { add_new_frame(mpctx, mpctx->saved_frame); mpctx->saved_frame = NULL; r = VD_PROGRESS; |