Commit 3f75e511 authored by Luca Barbato's avatar Luca Barbato Committed by Vittorio Giovara

avio: Keep track of the amount of data written

Make avio_size() work with any write AVIOContext.
parent fc85646a
......@@ -176,6 +176,7 @@ typedef struct AVIOContext {
*/
enum AVIODataMarkerType current_type;
int64_t last_time;
int64_t written;
} AVIOContext;
/**
......
......@@ -168,18 +168,22 @@ AVIOContext *avio_alloc_context(
static void flush_buffer(AVIOContext *s)
{
if (s->buf_ptr > s->buffer) {
int size = s->buf_ptr - s->buffer;
if (!s->error) {
int ret = 0;
if (s->write_data_type)
ret = s->write_data_type(s->opaque, s->buffer,
s->buf_ptr - s->buffer,
size,
s->current_type,
s->last_time);
else if (s->write_packet)
ret = s->write_packet(s->opaque, s->buffer,
s->buf_ptr - s->buffer);
size);
if (ret < 0) {
s->error = ret;
} else {
if (s->pos + size > s->written)
s->written = s->pos + size;
}
}
if (s->current_type == AVIO_DATA_MARKER_SYNC_POINT ||
......@@ -192,7 +196,7 @@ static void flush_buffer(AVIOContext *s)
s->buf_ptr - s->checksum_ptr);
s->checksum_ptr = s->buffer;
}
s->pos += s->buf_ptr - s->buffer;
s->pos += size;
}
s->buf_ptr = s->buffer;
}
......@@ -301,6 +305,9 @@ int64_t avio_size(AVIOContext *s)
if (!s)
return AVERROR(EINVAL);
if (s->written)
return s->written;
if (!s->seek)
return AVERROR(ENOSYS);
size = s->seek(s->opaque, 0, AVSEEK_SIZE);
......
......@@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 57
#define LIBAVFORMAT_VERSION_MINOR 10
#define LIBAVFORMAT_VERSION_MICRO 1
#define LIBAVFORMAT_VERSION_MICRO 2
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment