summaryrefslogtreecommitdiff
path: root/libavformat/aviobuf.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2013-01-01 22:57:36 +0200
committerMartin Storsjö <martin@martin.st>2013-01-03 15:14:09 +0200
commita0b7e289075dccf223b7f407790d8a86fc5d77e8 (patch)
tree0fa029b5f1e43561ff13358374a81f2ce4a54b8f /libavformat/aviobuf.c
parent3048fae63c990356f850bcabd9bb65a71faf6b0a (diff)
aviobuf: Partial support for reading in read/write contexts
So far, aviocontexts are used either in pure-read or pure-write mode - full read/write mode doesn't work well (and implementing it is a much larger, not totally trivial change). This patch allows using avio_read and ffio_read_partial on read/write aviocontexts, where the read operations are passed through directly unbuffered, while writes are buffered as usual. This is enough to support the operations needed by packet based data transfer like in udp/rtp, where aviocontext is the only public API for hooking up custom IO. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/aviobuf.c')
-rw-r--r--libavformat/aviobuf.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 0da1e0579b..8f3e511fc4 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -452,7 +452,7 @@ int avio_read(AVIOContext *s, unsigned char *buf, int size)
len = s->buf_end - s->buf_ptr;
if (len > size)
len = size;
- if (len == 0) {
+ if (len == 0 || s->write_flag) {
if(size > s->buffer_size && !s->update_checksum){
if(s->read_packet)
len = s->read_packet(s->opaque, buf, size);
@@ -497,6 +497,13 @@ int ffio_read_partial(AVIOContext *s, unsigned char *buf, int size)
if (size < 0)
return -1;
+ if (s->read_packet && s->write_flag) {
+ len = s->read_packet(s->opaque, buf, size);
+ if (len > 0)
+ s->pos += len;
+ return len;
+ }
+
len = s->buf_end - s->buf_ptr;
if (len == 0) {
fill_buffer(s);