[FFmpeg-cvslog] aviobuf: Add functions for null buffers

Martin Storsjö git at videolan.org
Fri Sep 20 12:31:39 CEST 2013


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Wed Sep 18 21:50:50 2013 +0300| [3627ce2f1dab1d33b7f99d78907a3e4d86b7d847] | committer: Martin Storsjö

aviobuf: Add functions for null buffers

Null buffers are useful for simulating writing to a real buffer
for the sake of measuring how many bytes are written.

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3627ce2f1dab1d33b7f99d78907a3e4d86b7d847
---

 libavformat/avio_internal.h |   18 ++++++++++++++++++
 libavformat/aviobuf.c       |   33 +++++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)

diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h
index 5493163..fdc98ec 100644
--- a/libavformat/avio_internal.h
+++ b/libavformat/avio_internal.h
@@ -119,4 +119,22 @@ int ffio_open_dyn_packet_buf(AVIOContext **s, int max_packet_size);
  */
 int ffio_fdopen(AVIOContext **s, URLContext *h);
 
+/**
+ * Open a write-only fake memory stream. The written data is not stored
+ * anywhere - this is only used for measuring the amount of data
+ * written.
+ *
+ * @param s new IO context
+ * @return zero if no error.
+ */
+int ffio_open_null_buf(AVIOContext **s);
+
+/**
+ * Close a null buffer.
+ *
+ * @param s an IO context opened by ffio_open_null_buf
+ * @return the number of bytes written to the null buffer
+ */
+int ffio_close_null_buf(AVIOContext *s);
+
 #endif /* AVFORMAT_AVIO_INTERNAL_H */
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 7d76e0b..3f27d69 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -975,3 +975,36 @@ int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
     av_free(s);
     return size - padding;
 }
+
+static int null_buf_write(void *opaque, uint8_t *buf, int buf_size)
+{
+    DynBuffer *d = opaque;
+
+    d->pos += buf_size;
+    if (d->pos > d->size)
+        d->size = d->pos;
+    return buf_size;
+}
+
+int ffio_open_null_buf(AVIOContext **s)
+{
+    int ret = url_open_dyn_buf_internal(s, 0);
+    if (ret >= 0) {
+        AVIOContext *pb = *s;
+        pb->write_packet = null_buf_write;
+    }
+    return ret;
+}
+
+int ffio_close_null_buf(AVIOContext *s)
+{
+    DynBuffer *d = s->opaque;
+    int size;
+
+    avio_flush(s);
+
+    size = d->size;
+    av_free(d);
+    av_free(s);
+    return size;
+}



More information about the ffmpeg-cvslog mailing list