diff src/ffmpeg/libavformat/avio.c @ 823:a195f1259a6b trunk

[svn] - merge VFS support from wma plugin.
author nenolod
date Mon, 12 Mar 2007 14:12:00 -0700
parents e8776388b02a
children
line wrap: on
line diff
--- a/src/ffmpeg/libavformat/avio.c	Mon Mar 12 14:04:53 2007 -0700
+++ b/src/ffmpeg/libavformat/avio.c	Mon Mar 12 14:12:00 2007 -0700
@@ -2,21 +2,19 @@
  * Unbuffered io for ffmpeg system
  * Copyright (c) 2001 Fabrice Bellard
  *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
+ * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
+ * version 2 of the License, or (at your option) any later version.
  *
- * FFmpeg is distributed in the hope that it will be useful,
+ * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 #include "avformat.h"
 
@@ -35,6 +33,38 @@
     return 0;
 }
 
+int url_vopen(URLContext **puc, VFSFile *fd)
+{
+    URLContext *uc;
+    URLProtocol *up;
+    const char *p;
+    char proto_str[128], *q;
+    int err = 0;
+
+    up = first_protocol;
+    uc = av_malloc(sizeof(URLContext) + strlen(fd->uri ? fd->uri : ""));
+    if (!uc) {
+        err = -ENOMEM;
+        goto fail;
+    }
+    strcpy(uc->filename, fd->uri ? fd->uri : "");
+    uc->prot = up;
+    uc->flags = URL_RDONLY;
+    uc->is_streamed = 0; /* default = not streamed */
+    uc->max_packet_size = 0; /* default: stream file */
+    uc->priv_data = fd;
+    if (err < 0) {
+        free(uc);
+        *puc = NULL;
+        return err;
+    }
+    *puc = uc;
+    return 0;
+ fail:
+    *puc = NULL;
+    return err;
+}
+
 int url_open(URLContext **puc, const char *filename, int flags)
 {
     URLContext *uc;
@@ -43,33 +73,7 @@
     char proto_str[128], *q;
     int err;
 
-    p = filename;
-    q = proto_str;
-    while (*p != '\0' && *p != ':') {
-        /* protocols can only contain alphabetic chars */
-        if (!isalpha(*p))
-            goto file_proto;
-        if ((q - proto_str) < sizeof(proto_str) - 1)
-            *q++ = *p;
-        p++;
-    }
-    /* if the protocol has length 1, we consider it is a dos drive */
-    if (*p == '\0' || (q - proto_str) <= 1) {
-    file_proto:
-        strcpy(proto_str, "file");
-    } else {
-        *q = '\0';
-    }
-
     up = first_protocol;
-    while (up != NULL) {
-        if (!strcmp(proto_str, up->name))
-            goto found;
-        up = up->next;
-    }
-    err = -ENOENT;
-    goto fail;
- found:
     uc = av_malloc(sizeof(URLContext) + strlen(filename));
     if (!uc) {
         err = -ENOMEM;
@@ -82,7 +86,7 @@
     uc->max_packet_size = 0; /* default: stream file */
     err = up->url_open(uc, filename, flags);
     if (err < 0) {
-        av_free(uc);
+        free(uc);
         *puc = NULL;
         return err;
     }
@@ -97,25 +101,11 @@
 {
     int ret;
     if (h->flags & URL_WRONLY)
-        return AVERROR_IO;
+        return -EIO;
     ret = h->prot->url_read(h, buf, size);
     return ret;
 }
 
-#if defined(CONFIG_MUXERS) || defined(CONFIG_PROTOCOLS)
-int url_write(URLContext *h, unsigned char *buf, int size)
-{
-    int ret;
-    if (!(h->flags & (URL_WRONLY | URL_RDWR)))
-        return AVERROR_IO;
-    /* avoid sending too big packets */
-    if (h->max_packet_size && size > h->max_packet_size)
-        return AVERROR_IO;
-    ret = h->prot->url_write(h, buf, size);
-    return ret;
-}
-#endif //CONFIG_MUXERS || CONFIG_PROTOCOLS
-
 offset_t url_seek(URLContext *h, offset_t pos, int whence)
 {
     offset_t ret;
@@ -128,11 +118,12 @@
 
 int url_close(URLContext *h)
 {
-    int ret;
+	int ret;
 
-    ret = h->prot->url_close(h);
-    av_free(h);
-    return ret;
+    	ret = h->prot->url_close(h);
+    	free(h);
+    
+	return ret;
 }
 
 int url_exist(const char *filename)
@@ -147,18 +138,18 @@
 offset_t url_filesize(URLContext *h)
 {
     offset_t pos, size;
-
+    
     pos = url_seek(h, 0, SEEK_CUR);
-    size = url_seek(h, -1, SEEK_END)+1;
+    size = url_seek(h, 0, SEEK_END);
     url_seek(h, pos, SEEK_SET);
     return size;
 }
 
-/*
+/* 
  * Return the maximum packet size associated to packetized file
  * handle. If the file is not packetized (stream like http or file on
  * disk), then 0 is returned.
- *
+ * 
  * @param h file handle
  * @return maximum packet size in bytes
  */
@@ -178,11 +169,11 @@
     return 0;
 }
 
-/**
+/** 
  * The callback is called in blocking functions to test regulary if
  * asynchronous interruption is needed. -EINTR is returned in this
  * case by the interrupted function. 'NULL' means no interrupt
- * callback is given.
+ * callback is given.  
  */
 void url_set_interrupt_cb(URLInterruptCB *interrupt_cb)
 {