summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2016-12-06 02:56:24 +0100
committerVittorio Giovara <vittorio.giovara@gmail.com>2016-12-08 15:58:28 -0500
commit3f75e5116b900f1428aa13041fc7d6301bf1988a (patch)
treec9689a60ce1331ea63078c73f1727985fcf7a856
parentfc85646ad495f3418042468da415af73a7a07334 (diff)
avio: Keep track of the amount of data written
Make avio_size() work with any write AVIOContext.
-rw-r--r--libavformat/avio.h1
-rw-r--r--libavformat/aviobuf.c13
-rw-r--r--libavformat/version.h2
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, \