summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/mpv.rst7
-rw-r--r--stream/stream_slice.c4
2 files changed, 11 insertions, 0 deletions
diff --git a/DOCS/man/mpv.rst b/DOCS/man/mpv.rst
index 09c3e24ea6..7b1c48c4a2 100644
--- a/DOCS/man/mpv.rst
+++ b/DOCS/man/mpv.rst
@@ -1208,6 +1208,8 @@ PROTOCOLS
``start`` and ``end`` represent a byte range and accept
suffixes such as ``KiB`` and ``MiB``. ``end`` is optional.
+ if ``end`` starts with ``+``, it is considered as offset from ``start``.
+
Only works with seekable streams.
Examples::
@@ -1217,6 +1219,11 @@ PROTOCOLS
This starts reading from cap.ts after seeking 1 GiB, then
reads until reaching 2 GiB or end of file.
+ mpv slice://1g-+2g@cap.ts
+
+ This starts reading from cap.ts after seeking 1 GiB, then
+ reads until reaching 3 GiB or end of file.
+
mpv slice://100m@appending://cap.ts
This starts reading from cap.ts after seeking 100MiB, then
diff --git a/stream/stream_slice.c b/stream/stream_slice.c
index 7889c8d059..d7d0a6bf05 100644
--- a/stream/stream_slice.c
+++ b/stream/stream_slice.c
@@ -116,11 +116,15 @@ static int parse_slice_range(stream_t *stream)
if (m_option_parse(stream->log, &opt, bstr0("slice_start"), start, &p->slice_start) < 0)
return STREAM_ERROR;
+ bool max_end_is_offset = bstr_startswith0(end, "+");
if (has_end) {
if (m_option_parse(stream->log, &opt, bstr0("slice_max_end"), end, &p->slice_max_end) < 0)
return STREAM_ERROR;
}
+ if (max_end_is_offset)
+ p->slice_max_end += p->slice_start;
+
if (p->slice_max_end && p->slice_max_end < p->slice_start) {
MP_ERR(stream, "The byte range end (%"PRId64") can't be smaller than the start (%"PRId64"): '%s'\n",
p->slice_max_end,