avio: Keep track of the amount of data written

Make avio_size() work with any write AVIOContext.
This commit is contained in:
Luca Barbato 2016-12-06 02:56:24 +01:00 committed by Vittorio Giovara
parent fc85646ad4
commit 3f75e5116b
3 changed files with 12 additions and 4 deletions

View File

@ -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;
/** /**

View File

@ -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)
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)
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);

View File

@ -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, \