summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTsukasa OMOTO <henry0312@gmail.com>2014-06-30 02:44:32 +0900
committerwm4 <wm4@nowhere>2014-06-29 20:39:49 +0200
commit1aef780b6cd7743df7e21cfb7dc45ad5f99e0825 (patch)
treec47f0ffdee6c8fc0857155946dc8b25082f5c125
parenta73415584c9dbf920ec14d26d0b0629cae81b3d5 (diff)
downloadmpv-1aef780b6cd7743df7e21cfb7dc45ad5f99e0825.tar.bz2
mpv-1aef780b6cd7743df7e21cfb7dc45ad5f99e0825.tar.xz
options: support setting start time relative to start PTS
Signed-off-by: wm4 <wm4@nowhere>
-rw-r--r--DOCS/man/options.rst9
-rw-r--r--options/m_option.c7
-rw-r--r--options/m_option.h2
-rw-r--r--player/misc.c11
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(&param, "-");
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)