Browse code

Add functionality to set the direction of a ByteIOContext buffer. Patch by Björn Axelsson bjorn axelsson intinor se Original thread: [FFmpeg-devel] [PATCH] MMS protocol support patch 1 Date: 09/19/2007 05:51 PM

Originally committed as revision 10709 to svn://svn.ffmpeg.org/ffmpeg/trunk

Björn Axelsson authored on 2007/10/11 23:57:47
Showing 2 changed files
... ...
@@ -203,6 +203,11 @@ int url_fdopen(ByteIOContext *s, URLContext *h);
203 203
 
204 204
 /** @warning must be called before any I/O */
205 205
 int url_setbufsize(ByteIOContext *s, int buf_size);
206
+/** Reset the buffer for reading or writing.
207
+ * @note Will drop any data currently in the buffer without transmitting it.
208
+ * @param flags URL_RDONLY to set up the buffer for reading, or URL_WRONLY
209
+ *        to set up the buffer for writing. */
210
+int url_resetbuf(ByteIOContext *s, int flags);
206 211
 
207 212
 /** @note when opened as read/write, the buffers are only used for
208 213
    writing */
... ...
@@ -38,11 +38,7 @@ int init_put_byte(ByteIOContext *s,
38 38
     s->buffer = buffer;
39 39
     s->buffer_size = buffer_size;
40 40
     s->buf_ptr = buffer;
41
-    s->write_flag = write_flag;
42
-    if (!s->write_flag)
43
-        s->buf_end = buffer;
44
-    else
45
-        s->buf_end = buffer + buffer_size;
41
+    url_resetbuf(s, write_flag ? URL_WRONLY : URL_RDONLY);
46 42
     s->opaque = opaque;
47 43
     s->write_packet = write_packet;
48 44
     s->read_packet = read_packet;
... ...
@@ -534,10 +530,23 @@ int url_setbufsize(ByteIOContext *s, int buf_size)
534 534
     s->buffer = buffer;
535 535
     s->buffer_size = buf_size;
536 536
     s->buf_ptr = buffer;
537
-    if (!s->write_flag)
538
-        s->buf_end = buffer;
539
-    else
540
-        s->buf_end = buffer + buf_size;
537
+    url_resetbuf(s, s->write_flag ? URL_WRONLY : URL_RDONLY);
538
+    return 0;
539
+}
540
+
541
+int url_resetbuf(ByteIOContext *s, int flags)
542
+{
543
+    URLContext *h = s->opaque;
544
+    if ((flags & URL_RDWR) || (h && h->flags != flags && !h->flags & URL_RDWR))
545
+        return AVERROR(EINVAL);
546
+
547
+    if (flags & URL_WRONLY) {
548
+        s->buf_end = s->buffer + s->buffer_size;
549
+        s->write_flag = 1;
550
+    } else {
551
+        s->buf_end = s->buffer;
552
+        s->write_flag = 0;
553
+    }
541 554
     return 0;
542 555
 }
543 556