summaryrefslogtreecommitdiffstats
path: root/player/command.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-06-16 23:11:14 +0200
committerwm4 <wm4@nowhere>2015-06-16 23:11:14 +0200
commit72808be6f857ae7d66d5adb87568acf3f9159ade (patch)
tree4ab2cae1f5ce845d37fb60f06697d61f3037780d /player/command.c
parentdbdc46c97a32c53d41a19908aa365e7d81025c3e (diff)
downloadmpv-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/command.c')
-rw-r--r--player/command.c39
1 files changed, 21 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;