Extend ByteIOContext and add the buffered IO functions:
authorBjörn Axelsson <gecko@acc.umu.se>
Wed, 28 Nov 2007 19:46:49 +0000 (19:46 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Wed, 28 Nov 2007 19:46:49 +0000 (19:46 +0000)
av_url_read_fplay(), av_url_read_fpause() and av_url_read_fseek().

patch by: Björn Axelsson, bjorn d axelsson a intinor d se

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

libavformat/avio.h
libavformat/aviobuf.c

index 138508e..5a8d19f 100644 (file)
@@ -156,6 +156,10 @@ typedef struct {
     unsigned char *checksum_ptr;
     unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
     int error;         ///< contains the error code or 0 if no error happened
+    int (*read_play)(void *opaque);
+    int (*read_pause)(void *opaque);
+    int (*read_seek)(void *opaque,
+                     int stream_index, int64_t timestamp, int flags);
 } ByteIOContext;
 
 int init_put_byte(ByteIOContext *s,
@@ -188,6 +192,11 @@ offset_t url_fsize(ByteIOContext *s);
 int url_feof(ByteIOContext *s);
 int url_ferror(ByteIOContext *s);
 
+int av_url_read_fplay(ByteIOContext *h);
+int av_url_read_fpause(ByteIOContext *h);
+int av_url_read_fseek(ByteIOContext *h,
+                      int stream_index, int64_t timestamp, int flags);
+
 #define URL_EOF (-1)
 /** @note return URL_EOF (-1) if EOF */
 int url_fgetc(ByteIOContext *s);
index c79f51f..328b53d 100644 (file)
@@ -55,6 +55,9 @@ int init_put_byte(ByteIOContext *s,
         s->pos = buffer_size;
         s->buf_end = s->buffer + buffer_size;
     }
+    s->read_play  = NULL;
+    s->read_pause = NULL;
+    s->read_seek  = NULL;
     return 0;
 }
 
@@ -551,6 +554,11 @@ int url_fdopen(ByteIOContext **s, URLContext *h)
     }
     (*s)->is_streamed = h->is_streamed;
     (*s)->max_packet_size = max_packet_size;
+    if(h->prot) {
+        (*s)->read_play  = (int (*)(void *))h->prot->url_read_play;
+        (*s)->read_pause = (int (*)(void *))h->prot->url_read_pause;
+        (*s)->read_seek  = (int (*)(void *, int, int64_t, int))h->prot->url_read_seek;
+    }
     return 0;
 }
 
@@ -656,6 +664,35 @@ int url_fget_max_packet_size(ByteIOContext *s)
     return s->max_packet_size;
 }
 
+int av_url_read_fplay(ByteIOContext *s)
+{
+    if (!s->read_play)
+        return AVERROR(ENOSYS);
+    return s->read_play(s->opaque);
+}
+
+int av_url_read_fpause(ByteIOContext *s)
+{
+    if (!s->read_pause)
+        return AVERROR(ENOSYS);
+    return s->read_pause(s->opaque);
+}
+
+int av_url_read_fseek(ByteIOContext *s,
+        int stream_index, int64_t timestamp, int flags)
+{
+    URLContext *h = s->opaque;
+    int ret;
+    if (!s->read_seek)
+        return AVERROR(ENOSYS);
+    ret = s->read_seek(h, stream_index, timestamp, flags);
+    if(ret >= 0) {
+        s->buf_ptr = s->buf_end; // Flush buffer
+        s->pos = s->seek(h, 0, SEEK_CUR);
+    }
+    return ret;
+}
+
 /* url_open_dyn_buf and url_close_dyn_buf are used in rtp.c to send a response
  * back to the server even if CONFIG_MUXERS is not set. */
 #if defined(CONFIG_MUXERS) || defined(CONFIG_NETWORK)