From 1aef780b6cd7743df7e21cfb7dc45ad5f99e0825 Mon Sep 17 00:00:00 2001 From: Tsukasa OMOTO Date: Mon, 30 Jun 2014 02:44:32 +0900 Subject: options: support setting start time relative to start PTS Signed-off-by: wm4 --- DOCS/man/options.rst | 9 ++++++--- options/m_option.c | 7 +++++-- options/m_option.h | 2 +- player/misc.c | 11 ++++++++--- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index eacb3fbde9..7dfc4bf884 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -2133,7 +2133,8 @@ OPTIONS Seek to given time position. The general format for absolute times is ``[[hh:]mm:]ss[.ms]``. If the time - is negated with ``-``, the seek is relative from the end of the file. + is given with a prefix of ``+`` or ``-``, the seek is relative from the start + or end of the file. ``pp%`` seeks to percent position pp (0-100). @@ -2141,8 +2142,10 @@ OPTIONS .. admonition:: Examples - ``--start=56`` - Seeks to 56 seconds. + ``--start=+56``, ``--start=+00:56`` + Seeks to the start time + 56 seconds. + ``--start=-56``, ``--start=-00:56`` + Seeks to the end time - 56 seconds. ``--start=01:10:00`` Seeks to 1 hour 10 min. ``--start=50%`` diff --git a/options/m_option.c b/options/m_option.c index 04b4783dc1..3baaaa6762 100644 --- a/options/m_option.c +++ b/options/m_option.c @@ -2181,10 +2181,13 @@ static int parse_rel_time(struct mp_log *log, const m_option_t *opt, } } - bool sign = bstr_eatstart0(¶m, "-"); double time; if (parse_timestring(param, &time, 0)) { - t.type = sign ? REL_TIME_NEGATIVE : REL_TIME_ABSOLUTE; + if (bstr_startswith0(param, "+") || bstr_startswith0(param, "-")) { + t.type = REL_TIME_RELATIVE; + } else { + t.type = REL_TIME_ABSOLUTE; + } t.pos = time; goto out; } diff --git a/options/m_option.h b/options/m_option.h index 02fcb9bfca..13afea22df 100644 --- a/options/m_option.h +++ b/options/m_option.h @@ -70,7 +70,7 @@ typedef void (*m_opt_print_fn)(struct mp_log *log); enum m_rel_time_type { REL_TIME_NONE, REL_TIME_ABSOLUTE, - REL_TIME_NEGATIVE, + REL_TIME_RELATIVE, REL_TIME_PERCENT, REL_TIME_CHAPTER, }; diff --git a/player/misc.c b/player/misc.c index 6eae646242..6aa58863e8 100644 --- a/player/misc.c +++ b/player/misc.c @@ -53,12 +53,17 @@ double get_relative_time(struct MPContext *mpctx) double rel_time_to_abs(struct MPContext *mpctx, struct m_rel_time t) { double length = get_time_length(mpctx); + double start = get_start_time(mpctx); switch (t.type) { case REL_TIME_ABSOLUTE: return t.pos; - case REL_TIME_NEGATIVE: - if (length != 0) - return MPMAX(length - t.pos, 0.0); + case REL_TIME_RELATIVE: + if (t.pos >= 0) { + return start + t.pos; + } else { + if (length != 0) + return MPMAX(start + length + t.pos, 0.0); + } break; case REL_TIME_PERCENT: if (length != 0) -- cgit v1.2.3