diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2016-12-06 04:56:24 +0300 |
---|---|---|
committer | Vittorio Giovara <vittorio.giovara@gmail.com> | 2016-12-08 23:58:28 +0300 |
commit | 3f75e5116b900f1428aa13041fc7d6301bf1988a (patch) | |
tree | c9689a60ce1331ea63078c73f1727985fcf7a856 /libavformat | |
parent | fc85646ad495f3418042468da415af73a7a07334 (diff) |
avio: Keep track of the amount of data written
Make avio_size() work with any write AVIOContext.
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/avio.h | 1 | ||||
-rw-r--r-- | libavformat/aviobuf.c | 13 | ||||
-rw-r--r-- | libavformat/version.h | 2 |
3 files changed, 12 insertions, 4 deletions
diff --git a/libavformat/avio.h b/libavformat/avio.h index 49721aa131..7bf7985c5e 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -176,6 +176,7 @@ typedef struct AVIOContext { */ enum AVIODataMarkerType current_type; int64_t last_time; + int64_t written; } AVIOContext; /** diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 5cb733d3d8..6d83a9661b 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -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); diff --git a/libavformat/version.h b/libavformat/version.h index ad7997ec4f..3fa2c4443b 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -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, \ |