X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fsubfile.c;h=300672e657d43f9e69e335da669c8d4cad27a4fa;hb=704017d91ec8fbade0de072d222018c1a6013b70;hp=b527f2bee17e1e6d8d4d416b0e6fbfa8037e949c;hpb=14fe81b3a88dfe4dbac12e8715f9a3f05b5ef1bf;p=ffmpeg diff --git a/libavformat/subfile.c b/libavformat/subfile.c index b527f2bee17..300672e657d 100644 --- a/libavformat/subfile.c +++ b/libavformat/subfile.c @@ -86,7 +86,7 @@ static int subfile_open(URLContext *h, const char *filename, int flags, return ret; c->pos = c->start; if ((ret = slave_seek(h)) < 0) { - ffurl_close(c->h); + ffurl_closep(&c->h); return ret; } return 0; @@ -95,7 +95,7 @@ static int subfile_open(URLContext *h, const char *filename, int flags, static int subfile_close(URLContext *h) { SubfileContext *c = h->priv_data; - return ffurl_close(c->h); + return ffurl_closep(&c->h); } static int subfile_read(URLContext *h, unsigned char *buf, int size) @@ -116,20 +116,26 @@ 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, 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; break; case SEEK_CUR: - new_pos += pos; + new_pos = c->pos + pos; break; case SEEK_END: - new_pos = c->end + c->pos; + new_pos = end + pos; break; } if (new_pos < c->start)