summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-11-16 23:54:43 +0100
committerwm4 <wm4@nowhere>2019-11-17 02:11:45 +0100
commit6bcda94cbc86bd1ab710546816b019e86bc92ec9 (patch)
treee6fbce4c394314bbb4ffd6b438454f75d875d12c
parentba6ba3282534a7606cadd73f25133cd7b106aecc (diff)
downloadmpv-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.c13
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;