diff options
author | wm4 <wm4@nowhere> | 2012-11-18 18:02:14 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-11-20 18:00:11 +0100 |
commit | f5e2ee513862da957858be4963cd6535fa23f861 (patch) | |
tree | e406d96b9bafb6d041e08b3c0d422188a57d83d5 | |
parent | 39428525c372e593f042c107e35e38b5409afc07 (diff) | |
download | mpv-f5e2ee513862da957858be4963cd6535fa23f861.tar.bz2 mpv-f5e2ee513862da957858be4963cd6535fa23f861.tar.xz |
options: support chapters for --start and --end
The --start and --end switch now accept a chapter number. The chapter
number is prefixed with '#', e.g. "--start=#2" jumps to chapter 2.
The chapter support might be able to replace --chapter completely, but
for now I am not sure how well this works out with e.g. DVDs and BDs,
and a separate --chapter option is useful interface-wise.
(This was supposed to be added in 51503a, but apparently the fixup
commit adding it was lost in a rebase. This might also be the reason
for the mess-up fixed in 394285.)
-rw-r--r-- | DOCS/man/en/options.rst | 6 | ||||
-rw-r--r-- | core/m_option.c | 12 | ||||
-rw-r--r-- | core/m_option.h | 1 | ||||
-rw-r--r-- | core/mplayer.c | 4 |
4 files changed, 21 insertions, 2 deletions
diff --git a/DOCS/man/en/options.rst b/DOCS/man/en/options.rst index cc52d8f2bb..44462ec863 100644 --- a/DOCS/man/en/options.rst +++ b/DOCS/man/en/options.rst @@ -1703,7 +1703,9 @@ 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. - It's also possible to seek to a percent position with ``pp%``. + ``pp%`` seeks to percent position pp (0-100). + + ``#c`` seeks to chapter number c. (Chapters start from 1.) *EXAMPLE*: @@ -1718,6 +1720,8 @@ ``--start=-3:20 --length=10`` Seeks to 3 minutes and 20 seconds before the end of the file, plays 10 seconds, and exits. + ``--start=#2 --end=#4`` + Plays chapters 2 and 3, and exits. --ssf=<mode> Specifies software scaler parameters. diff --git a/core/m_option.c b/core/m_option.c index dcb849a34d..58e93dfff9 100644 --- a/core/m_option.c +++ b/core/m_option.c @@ -1268,6 +1268,16 @@ static int parse_rel_time(const m_option_t *opt, struct bstr name, } } + // Chapter pos + if (bstr_startswith0(param, "#")) { + int chapter = bstrtoll(bstr_cut(param, 1), ¶m, 10); + if (param.len == 0 && chapter >= 1) { + t.type = REL_TIME_CHAPTER; + t.pos = chapter - 1; + goto out; + } + } + bool sign = bstr_eatstart0(¶m, "-"); double time; if (parse_timestring(param, &time, 0)) { @@ -1277,7 +1287,7 @@ static int parse_rel_time(const m_option_t *opt, struct bstr name, } mp_msg(MSGT_CFGPARSER, MSGL_ERR, - "Option %.*s: invalid time or size: '%.*s'\n", + "Option %.*s: invalid time or position: '%.*s'\n", BSTR_P(name), BSTR_P(param)); return M_OPT_INVALID; diff --git a/core/m_option.h b/core/m_option.h index d7041f9cf4..ed9cc33f5f 100644 --- a/core/m_option.h +++ b/core/m_option.h @@ -63,6 +63,7 @@ enum m_rel_time_type { REL_TIME_ABSOLUTE, REL_TIME_NEGATIVE, REL_TIME_PERCENT, + REL_TIME_CHAPTER, }; struct m_rel_time { diff --git a/core/mplayer.c b/core/mplayer.c index a48bd4b37c..8f974c5bc2 100644 --- a/core/mplayer.c +++ b/core/mplayer.c @@ -270,6 +270,10 @@ static double rel_time_to_abs(struct MPContext *mpctx, struct m_rel_time t, if (length != 0) return length * (t.pos / 100.0); break; + case REL_TIME_CHAPTER: + if (chapter_start_time(mpctx, t.pos) >= 0) + return chapter_start_time(mpctx, t.pos); + break; } return fallback_time; } |