summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--player/core.h1
-rw-r--r--player/loadfile.c2
-rw-r--r--player/misc.c10
-rw-r--r--player/playloop.c16
4 files changed, 19 insertions, 10 deletions
diff --git a/player/core.h b/player/core.h
index c0b3e3d8e0..bf4b62fa56 100644
--- a/player/core.h
+++ b/player/core.h
@@ -589,6 +589,7 @@ void add_step_frame(struct MPContext *mpctx, int dir);
void queue_seek(struct MPContext *mpctx, enum seek_type type, double amount,
enum seek_precision exact, int flags);
double get_time_length(struct MPContext *mpctx);
+double get_start_time(struct MPContext *mpctx, int dir);
double get_current_time(struct MPContext *mpctx);
double get_playback_time(struct MPContext *mpctx);
int get_percent_pos(struct MPContext *mpctx);
diff --git a/player/loadfile.c b/player/loadfile.c
index e1e0c2c794..c730d2e8f8 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -1555,7 +1555,7 @@ static void play_current_file(struct MPContext *mpctx)
// Backward playback -> start from end by default.
if (play_start_pts == MP_NOPTS_VALUE && opts->play_dir < 0)
- play_start_pts = MPMAX(mpctx->demuxer->duration, 0);
+ play_start_pts = get_start_time(mpctx, -1);
if (play_start_pts != MP_NOPTS_VALUE) {
queue_seek(mpctx, MPSEEK_ABSOLUTE, play_start_pts, MPSEEK_DEFAULT, 0);
diff --git a/player/misc.c b/player/misc.c
index a39c8df82b..b9a280f2cc 100644
--- a/player/misc.c
+++ b/player/misc.c
@@ -107,14 +107,8 @@ double get_play_start_pts(struct MPContext *mpctx)
{
struct MPOpts *opts = mpctx->opts;
double res = rel_time_to_abs(mpctx, opts->play_start);
- if (res == MP_NOPTS_VALUE) {
- res = 0;
- if (!opts->rebase_start_time && mpctx->demuxer)
- res = mpctx->demuxer->start_time;
- // Backward playback -> start from end by default.
- if (mpctx->play_dir < 0 && mpctx->demuxer)
- res = MPMAX(mpctx->demuxer->duration, 0);
- }
+ if (res == MP_NOPTS_VALUE)
+ res = get_start_time(mpctx, mpctx->play_dir);
return res;
}
diff --git a/player/playloop.c b/player/playloop.c
index 4067e13459..30c1bbb5d6 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -488,6 +488,20 @@ double get_time_length(struct MPContext *mpctx)
return demuxer && demuxer->duration >= 0 ? demuxer->duration : MP_NOPTS_VALUE;
}
+// Return approximate PTS of first frame played. This can be completely wrong
+// for a number of reasons in a number of situations.
+double get_start_time(struct MPContext *mpctx, int dir)
+{
+ double res = 0;
+ if (mpctx->demuxer) {
+ if (!mpctx->opts->rebase_start_time)
+ res += mpctx->demuxer->start_time;
+ if (dir < 0)
+ res += MPMAX(mpctx->demuxer->duration, 0);
+ }
+ return res;
+}
+
double get_current_time(struct MPContext *mpctx)
{
struct demuxer *demuxer = mpctx->demuxer;
@@ -827,7 +841,7 @@ static void handle_loop_file(struct MPContext *mpctx)
} else if (opts->loop_file) {
if (opts->loop_file > 0)
opts->loop_file--;
- target = 0;
+ target = get_start_time(mpctx, mpctx->play_dir);
}
if (target != MP_NOPTS_VALUE) {