aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/subfile.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-06-20 06:33:41 +0200
committerNicolas George <george@nsup.org>2019-07-01 12:12:04 +0200
commit4877b5869ee1b3d17a3ed9b5b6d0988bd8b02b21 (patch)
treeef327168f9f82ea2a5973cc86d73551890e53aa9 /libavformat/subfile.c
parente51cc7ed856aa3d5e14c50a46d8156c79d483367 (diff)
downloadffmpeg-4877b5869ee1b3d17a3ed9b5b6d0988bd8b02b21.tar.gz
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/subfile.c')
-rw-r--r--libavformat/subfile.c12
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)