You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-11-23 21:54:53 +02:00
lavf/concat: implement FFSEEK_SIZE.
This commit is contained in:
@@ -38,6 +38,7 @@ struct concat_data {
|
|||||||
struct concat_nodes *nodes; ///< list of nodes to concat
|
struct concat_nodes *nodes; ///< list of nodes to concat
|
||||||
size_t length; ///< number of cat'ed nodes
|
size_t length; ///< number of cat'ed nodes
|
||||||
size_t current; ///< index of currently read node
|
size_t current; ///< index of currently read node
|
||||||
|
uint64_t total_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
static av_cold int concat_close(URLContext *h)
|
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;
|
char *node_uri = NULL;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int64_t size;
|
int64_t size, total_size = 0;
|
||||||
size_t len, i;
|
size_t len, i;
|
||||||
URLContext *uc;
|
URLContext *uc;
|
||||||
struct concat_data *data = h->priv_data;
|
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 */
|
/* assembling */
|
||||||
nodes[i].uc = uc;
|
nodes[i].uc = uc;
|
||||||
nodes[i].size = size;
|
nodes[i].size = size;
|
||||||
|
total_size += size;
|
||||||
}
|
}
|
||||||
av_free(node_uri);
|
av_free(node_uri);
|
||||||
data->length = i;
|
data->length = i;
|
||||||
@@ -123,6 +125,7 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags)
|
|||||||
err = AVERROR(ENOMEM);
|
err = AVERROR(ENOMEM);
|
||||||
} else
|
} else
|
||||||
data->nodes = nodes;
|
data->nodes = nodes;
|
||||||
|
data->total_size = total_size;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,6 +161,8 @@ static int64_t concat_seek(URLContext *h, int64_t pos, int whence)
|
|||||||
struct concat_nodes *nodes = data->nodes;
|
struct concat_nodes *nodes = data->nodes;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
if ((whence & AVSEEK_SIZE))
|
||||||
|
return data->total_size;
|
||||||
switch (whence) {
|
switch (whence) {
|
||||||
case SEEK_END:
|
case SEEK_END:
|
||||||
for (i = data->length - 1; i && pos < -nodes[i].size; i--)
|
for (i = data->length - 1; i && pos < -nodes[i].size; i--)
|
||||||
|
|||||||
Reference in New Issue
Block a user