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 { ...@@ -176,6 +176,7 @@ typedef struct AVIOContext {
*/ */
enum AVIODataMarkerType current_type; enum AVIODataMarkerType current_type;
int64_t last_time; int64_t last_time;
int64_t written;
} AVIOContext; } AVIOContext;
/** /**
......
...@@ -168,18 +168,22 @@ AVIOContext *avio_alloc_context( ...@@ -168,18 +168,22 @@ AVIOContext *avio_alloc_context(
static void flush_buffer(AVIOContext *s) static void flush_buffer(AVIOContext *s)
{ {
if (s->buf_ptr > s->buffer) { if (s->buf_ptr > s->buffer) {
int size = s->buf_ptr - s->buffer;
if (!s->error) { if (!s->error) {
int ret = 0; int ret = 0;
if (s->write_data_type) if (s->write_data_type)
ret = s->write_data_type(s->opaque, s->buffer, ret = s->write_data_type(s->opaque, s->buffer,
s->buf_ptr - s->buffer, size,
s->current_type, s->current_type,
s->last_time); s->last_time);
else if (s->write_packet) else if (s->write_packet)
ret = s->write_packet(s->opaque, s->buffer, ret = s->write_packet(s->opaque, s->buffer,
s->buf_ptr - s->buffer); size);
if (ret < 0) { if (ret < 0) {
s->error = ret; s->error = ret;
} else {
if (s->pos + size > s->written)
s->written = s->pos + size;
} }
} }
if (s->current_type == AVIO_DATA_MARKER_SYNC_POINT || if (s->current_type == AVIO_DATA_MARKER_SYNC_POINT ||
...@@ -192,7 +196,7 @@ static void flush_buffer(AVIOContext *s) ...@@ -192,7 +196,7 @@ static void flush_buffer(AVIOContext *s)
s->buf_ptr - s->checksum_ptr); s->buf_ptr - s->checksum_ptr);
s->checksum_ptr = s->buffer; s->checksum_ptr = s->buffer;
} }
s->pos += s->buf_ptr - s->buffer; s->pos += size;
} }
s->buf_ptr = s->buffer; s->buf_ptr = s->buffer;
} }
...@@ -301,6 +305,9 @@ int64_t avio_size(AVIOContext *s) ...@@ -301,6 +305,9 @@ int64_t avio_size(AVIOContext *s)
if (!s) if (!s)
return AVERROR(EINVAL); return AVERROR(EINVAL);
if (s->written)
return s->written;
if (!s->seek) if (!s->seek)
return AVERROR(ENOSYS); return AVERROR(ENOSYS);
size = s->seek(s->opaque, 0, AVSEEK_SIZE); size = s->seek(s->opaque, 0, AVSEEK_SIZE);
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 57 #define LIBAVFORMAT_VERSION_MAJOR 57
#define LIBAVFORMAT_VERSION_MINOR 10 #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, \ #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \ 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