diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2019-06-20 07:33:41 +0300 |
---|---|---|
committer | Nicolas George <george@nsup.org> | 2019-07-01 13:12:04 +0300 |
commit | 4877b5869ee1b3d17a3ed9b5b6d0988bd8b02b21 (patch) | |
tree | ef327168f9f82ea2a5973cc86d73551890e53aa9 /libavformat | |
parent | e51cc7ed856aa3d5e14c50a46d8156c79d483367 (diff) |
libavformat/subfile: Improve AVSEEK_SIZE/SEEK_END seeking
The subfile protocol treats an end of 0 as meaning "until EOF"; this got
implemented by simply setting the end to INT64_MAX. But seeking relative
to EOF or AVSEEK_SIZE seeking hasn't been adapted; the result is that
e.g. the duration of transport streams isn't correctly determined when
this option is used. This is fixed in this patch.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/subfile.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libavformat/subfile.c b/libavformat/subfile.c index b527f2bee1..2f162e0a34 100644 --- a/libavformat/subfile.c +++ b/libavformat/subfile.c @@ -116,11 +116,17 @@ static int subfile_read(URLContext *h, unsigned char *buf, int size) static int64_t subfile_seek(URLContext *h, int64_t pos, int whence) { SubfileContext *c = h->priv_data; - int64_t new_pos = -1; + int64_t new_pos = -1, end; int ret; + if (whence == AVSEEK_SIZE || whence == SEEK_END) { + end = c->end; + if (end == INT64_MAX && (end = ffurl_seek(c->h, 0, AVSEEK_SIZE)) < 0) + return end; + } + if (whence == AVSEEK_SIZE) - return c->end - c->start; + return end - c->start; switch (whence) { case SEEK_SET: new_pos = c->start + pos; @@ -129,7 +135,7 @@ static int64_t subfile_seek(URLContext *h, int64_t pos, int whence) new_pos += pos; break; case SEEK_END: - new_pos = c->end + c->pos; + new_pos = end + c->pos; break; } if (new_pos < c->start) |