diff --git a/mpvcore/command.c b/mpvcore/command.c index 038e58bc8d..f16d171bf4 100644 --- a/mpvcore/command.c +++ b/mpvcore/command.c @@ -2502,6 +2502,11 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd) set_osd_tmsg(mpctx, OSD_MSG_SUB_DELAY, osdl, osd_duration, "Sub delay: %d ms", ROUND(opts->sub_delay * 1000)); } else { + // We can easily get stuck by failing to seek to the video + // frame which actually shows the sub first (because video + // frame PTS and sub PTS rarely match exactly). Add some + // rounding for the mess of it. + a[0] += 0.01 * (a[1] > 0 ? 1 : -1); queue_seek(mpctx, MPSEEK_RELATIVE, a[0], 1); set_osd_function(mpctx, (a[0] > 0) ? OSD_FFW : OSD_REW); if (bar_osd) diff --git a/sub/sd_ass.c b/sub/sd_ass.c index 7de0ab6c43..591f9d5105 100644 --- a/sub/sd_ass.c +++ b/sub/sd_ass.c @@ -289,8 +289,11 @@ static int control(struct sd *sd, enum sd_ctrl cmd, void *arg) switch (cmd) { case SD_CTRL_SUB_STEP: { double *a = arg; - a[0] = ass_step_sub(ctx->ass_track, a[0] * 1000 + .5, a[1]) / 1000.0; - return CONTROL_OK; + long long res = ass_step_sub(ctx->ass_track, a[0] * 1000 + 0.5, a[1]); + if (!res) + return false; + a[0] = res / 1000.0; + return true; case SD_CTRL_SET_VIDEO_PARAMS: ctx->video_params = *(struct mp_image_params *)arg; return CONTROL_OK;