aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-09-20 12:25:58 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-09-20 12:26:09 +0200
commit2ad8056c5e4c30c1c090eacad3d545a1e568235d (patch)
treeaf1148e1612fcbcd500748ae25c04e09ac0ce5c8
parent04ee57ce0aba34722e47419fce5977f81ea09d07 (diff)
parent3627ce2f1dab1d33b7f99d78907a3e4d86b7d847 (diff)
downloadffmpeg-2ad8056c5e4c30c1c090eacad3d545a1e568235d.tar.gz
Merge commit '3627ce2f1dab1d33b7f99d78907a3e4d86b7d847'
* commit '3627ce2f1dab1d33b7f99d78907a3e4d86b7d847': aviobuf: Add functions for null buffers Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/avio_internal.h18
-rw-r--r--libavformat/aviobuf.c33
2 files changed, 51 insertions, 0 deletions
diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h
index e67ba73812..c5a2a96014 100644
--- a/libavformat/avio_internal.h
+++ b/libavformat/avio_internal.h
@@ -130,4 +130,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 652b7769fb..e0fdf445bf 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -1045,3 +1045,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;
+}