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;
int64_t last_time;
int64_t written;
} AVIOContext;
/**

View File

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

View File

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