Mercurial > audlegacy-plugins
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) {
