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@martin.st>tags/n2.1
| @@ -119,4 +119,22 @@ int ffio_open_dyn_packet_buf(AVIOContext **s, int max_packet_size); | |||||
| */ | */ | ||||
| int ffio_fdopen(AVIOContext **s, URLContext *h); | 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 */ | #endif /* AVFORMAT_AVIO_INTERNAL_H */ | ||||
| @@ -975,3 +975,36 @@ int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer) | |||||
| av_free(s); | av_free(s); | ||||
| return size - padding; | 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; | |||||
| } | |||||