diff options
author | wm4 <wm4@nowhere> | 2015-06-16 23:11:14 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-06-16 23:11:14 +0200 |
commit | 72808be6f857ae7d66d5adb87568acf3f9159ade (patch) | |
tree | 4ab2cae1f5ce845d37fb60f06697d61f3037780d /player | |
parent | dbdc46c97a32c53d41a19908aa365e7d81025c3e (diff) | |
download | mpv-72808be6f857ae7d66d5adb87568acf3f9159ade.tar.bz2 mpv-72808be6f857ae7d66d5adb87568acf3f9159ade.tar.xz |
command: do not exit playback if the B point of A-B loop is past EOF
The previous behavior is confusing if the B point is near EOF (consider
B being the duration of the file, which is strictly speaking past the
last video timestamp). The new behavior is fine as well for B being far
past EOF.
Achieve this by checking the EOF state in addition to whether playback
has reached the B point. Also, move the A-B loop code out of
command_event(). It just isn't useful anymore, and obfuscates the code
more than it makes it loop simple.
Fixes #2046.
Diffstat (limited to 'player')
-rw-r--r-- | player/command.c | 39 | ||||
-rw-r--r-- | player/command.h | 2 | ||||
-rw-r--r-- | player/playloop.c | 2 |
3 files changed, 25 insertions, 18 deletions
diff --git a/player/command.c b/player/command.c index 438879c228..900e0cd6ed 100644 --- a/player/command.c +++ b/player/command.c @@ -4903,30 +4903,12 @@ void command_init(struct MPContext *mpctx) static void command_event(struct MPContext *mpctx, int event, void *arg) { struct command_ctx *ctx = mpctx->command_ctx; - struct MPOpts *opts = mpctx->opts; if (event == MPV_EVENT_START_FILE) { ctx->last_seek_pts = MP_NOPTS_VALUE; ctx->marked_pts = MP_NOPTS_VALUE; } - if (event == MPV_EVENT_TICK) { - double now = - mpctx->restart_complete ? mpctx->playback_pts : MP_NOPTS_VALUE; - if (now != MP_NOPTS_VALUE && opts->ab_loop[0] != MP_NOPTS_VALUE && - opts->ab_loop[1] != MP_NOPTS_VALUE) - { - if (ctx->prev_pts >= opts->ab_loop[0] && - ctx->prev_pts < opts->ab_loop[1] && - now >= opts->ab_loop[1]) - { - mark_seek(mpctx); - queue_seek(mpctx, MPSEEK_ABSOLUTE, opts->ab_loop[0], - MPSEEK_EXACT, false); - } - } - ctx->prev_pts = now; - } if (event == MPV_EVENT_SEEK) ctx->prev_pts = MP_NOPTS_VALUE; if (event == MPV_EVENT_IDLE) @@ -4939,6 +4921,27 @@ static void command_event(struct MPContext *mpctx, int event, void *arg) } } +void handle_ab_loop(struct MPContext *mpctx) +{ + struct command_ctx *ctx = mpctx->command_ctx; + struct MPOpts *opts = mpctx->opts; + + double now = mpctx->restart_complete ? mpctx->playback_pts : MP_NOPTS_VALUE; + if (now != MP_NOPTS_VALUE && opts->ab_loop[0] != MP_NOPTS_VALUE && + opts->ab_loop[1] != MP_NOPTS_VALUE) + { + if (ctx->prev_pts >= opts->ab_loop[0] && + ctx->prev_pts < opts->ab_loop[1] && + (now >= opts->ab_loop[1] || mpctx->stop_play == AT_END_OF_FILE)) + { + mark_seek(mpctx); + queue_seek(mpctx, MPSEEK_ABSOLUTE, opts->ab_loop[0], + MPSEEK_EXACT, false); + } + } + ctx->prev_pts = now; +} + void handle_command_updates(struct MPContext *mpctx) { struct command_ctx *ctx = mpctx->command_ctx; diff --git a/player/command.h b/player/command.h index c87cbeba7f..85e81966c6 100644 --- a/player/command.h +++ b/player/command.h @@ -54,4 +54,6 @@ enum { bool mp_hook_test_completion(struct MPContext *mpctx, char *type); void mp_hook_run(struct MPContext *mpctx, char *client, char *type); +void handle_ab_loop(struct MPContext *mpctx); + #endif /* MPLAYER_COMMAND_H */ diff --git a/player/playloop.c b/player/playloop.c index 03be7df80a..2b389def22 100644 --- a/player/playloop.c +++ b/player/playloop.c @@ -1043,6 +1043,8 @@ void run_playloop(struct MPContext *mpctx) handle_loop_file(mpctx); + handle_ab_loop(mpctx); + handle_keep_open(mpctx); handle_sstep(mpctx); |