From 770d9dafa1b329a2ee2366ce5357068d6445630d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Axelsson?= Date: Thu, 11 Oct 2007 14:57:47 +0000 Subject: [PATCH] =?UTF-8?q?Add=20functionality=20to=20set=20the=20directio?= =?UTF-8?q?n=20of=20a=20ByteIOContext=20buffer.=20Patch=20by=20Bj=C3=B6rn?= =?UTF-8?q?=20Axelsson=20bjorn=20axelsson=20intinor=20se=20Original=20thre?= =?UTF-8?q?ad:=20[FFmpeg-devel]=20[PATCH]=20MMS=20protocol=20support=20pat?= =?UTF-8?q?ch=201=20Date:=2009/19/2007=2005:51=20PM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Originally committed as revision 10709 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/avio.h | 5 +++++ libavformat/aviobuf.c | 27 ++++++++++++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/libavformat/avio.h b/libavformat/avio.h index c8c9a04aea..6606226007 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -203,6 +203,11 @@ int url_fdopen(ByteIOContext *s, URLContext *h); /** @warning must be called before any I/O */ int url_setbufsize(ByteIOContext *s, int buf_size); +/** Reset the buffer for reading or writing. + * @note Will drop any data currently in the buffer without transmitting it. + * @param flags URL_RDONLY to set up the buffer for reading, or URL_WRONLY + * to set up the buffer for writing. */ +int url_resetbuf(ByteIOContext *s, int flags); /** @note when opened as read/write, the buffers are only used for writing */ diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 195bbae035..6370f57be6 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -38,11 +38,7 @@ int init_put_byte(ByteIOContext *s, s->buffer = buffer; s->buffer_size = buffer_size; s->buf_ptr = buffer; - s->write_flag = write_flag; - if (!s->write_flag) - s->buf_end = buffer; - else - s->buf_end = buffer + buffer_size; + url_resetbuf(s, write_flag ? URL_WRONLY : URL_RDONLY); s->opaque = opaque; s->write_packet = write_packet; s->read_packet = read_packet; @@ -534,10 +530,23 @@ int url_setbufsize(ByteIOContext *s, int buf_size) s->buffer = buffer; s->buffer_size = buf_size; s->buf_ptr = buffer; - if (!s->write_flag) - s->buf_end = buffer; - else - s->buf_end = buffer + buf_size; + url_resetbuf(s, s->write_flag ? URL_WRONLY : URL_RDONLY); + return 0; +} + +int url_resetbuf(ByteIOContext *s, int flags) +{ + URLContext *h = s->opaque; + if ((flags & URL_RDWR) || (h && h->flags != flags && !h->flags & URL_RDWR)) + return AVERROR(EINVAL); + + if (flags & URL_WRONLY) { + s->buf_end = s->buffer + s->buffer_size; + s->write_flag = 1; + } else { + s->buf_end = s->buffer; + s->write_flag = 0; + } return 0; } -- GitLab