Re: [libav-devel] [PATCH] avio: Keep track of the amount of data written

2016-12-08 Thread Vittorio Giovara
On Mon, Dec 5, 2016 at 8:56 PM, Luca Barbato  wrote:
> Make avio_size() work with any write AVIOContext.
> ---
>  libavformat/avio.h|  1 +
>  libavformat/aviobuf.c | 13 ++---
>  2 files changed, 11 insertions(+), 3 deletions(-)

Sure
-- 
Vittorio
___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel


[libav-devel] [PATCH] avio: Keep track of the amount of data written

2016-12-05 Thread Luca Barbato
Make avio_size() work with any write AVIOContext.
---
 libavformat/avio.h|  1 +
 libavformat/aviobuf.c | 13 ++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/libavformat/avio.h b/libavformat/avio.h
index 49721aa..7bf7985 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 5cb733d..6d83a96 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);
-- 
2.9.2

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel