summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorNicolas George <george@nsup.org>2019-07-19 14:22:15 +0200
committerNicolas George <george@nsup.org>2019-08-13 15:38:57 +0200
commit3add65e052cf3511b284d53e73f986a6768e5486 (patch)
tree10b9339024c92641ae61abe881c0e9d5e5f5515a /libavformat
parent6e1a2dc11236fb04acf35bde647872eb4f3ded9c (diff)
lavf/concat: implement FFSEEK_SIZE.
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/concat.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/libavformat/concat.c b/libavformat/concat.c
index 19c83c309a..ea3bc1dfde 100644
--- a/libavformat/concat.c
+++ b/libavformat/concat.c
@@ -38,6 +38,7 @@ struct concat_data {
struct concat_nodes *nodes; ///< list of nodes to concat
size_t length; ///< number of cat'ed nodes
size_t current; ///< index of currently read node
+ uint64_t total_size;
};
static av_cold int concat_close(URLContext *h)
@@ -59,7 +60,7 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags)
{
char *node_uri = NULL;
int err = 0;
- int64_t size;
+ int64_t size, total_size = 0;
size_t len, i;
URLContext *uc;
struct concat_data *data = h->priv_data;
@@ -112,6 +113,7 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags)
/* assembling */
nodes[i].uc = uc;
nodes[i].size = size;
+ total_size += size;
}
av_free(node_uri);
data->length = i;
@@ -123,6 +125,7 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags)
err = AVERROR(ENOMEM);
} else
data->nodes = nodes;
+ data->total_size = total_size;
return err;
}
@@ -158,6 +161,8 @@ static int64_t concat_seek(URLContext *h, int64_t pos, int whence)
struct concat_nodes *nodes = data->nodes;
size_t i;
+ if ((whence & AVSEEK_SIZE))
+ return data->total_size;
switch (whence) {
case SEEK_END:
for (i = data->length - 1; i && pos < -nodes[i].size; i--)