| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Unbuffered io for ffmpeg system | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * Copyright (c) 2001 Fabrice Bellard | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * This file is part of Libav. | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * Libav is free software; you can redistribute it and/or | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							| 
									
										
										
										
											2006-10-07 15:30:46 +00:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * Libav is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2002-05-25 22:34:32 +00:00
										 |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2011-03-18 17:35:10 +00:00
										 |  |  |  * License along with Libav; if not, write to the Free Software | 
					
						
							| 
									
										
										
										
											2006-01-12 22:43:26 +00:00
										 |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-05-09 11:56:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-24 18:09:46 +00:00
										 |  |  | /* needed for usleep() */ | 
					
						
							|  |  |  | #define _XOPEN_SOURCE 600
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							| 
									
										
										
										
											2008-05-09 11:56:36 +00:00
										 |  |  | #include "libavutil/avstring.h"
 | 
					
						
							| 
									
										
										
										
											2010-09-26 14:25:22 +00:00
										 |  |  | #include "libavutil/opt.h"
 | 
					
						
							| 
									
										
										
										
											2008-10-10 16:59:37 +00:00
										 |  |  | #include "os_support.h"
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | #include "avformat.h"
 | 
					
						
							| 
									
										
										
										
											2010-03-05 22:30:21 +00:00
										 |  |  | #if CONFIG_NETWORK
 | 
					
						
							|  |  |  | #include "network.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-03-31 16:04:59 +02:00
										 |  |  | #include "url.h"
 | 
					
						
							| 
									
										
										
										
											2008-03-10 19:03:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-19 16:49:08 +00:00
										 |  |  | #if FF_API_URL_CLASS
 | 
					
						
							| 
									
										
										
										
											2008-03-10 19:03:39 +00:00
										 |  |  | /** @name Logging context. */ | 
					
						
							|  |  |  | /*@{*/ | 
					
						
							|  |  |  | static const char *urlcontext_to_name(void *ptr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     URLContext *h = (URLContext *)ptr; | 
					
						
							|  |  |  |     if(h->prot) return h->prot->name; | 
					
						
							|  |  |  |     else        return "NULL"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | static const AVOption options[] = {{NULL}}; | 
					
						
							|  |  |  | static const AVClass urlcontext_class = | 
					
						
							| 
									
										
										
										
											2010-04-28 20:00:23 +00:00
										 |  |  |         { "URLContext", urlcontext_to_name, options, LIBAVUTIL_VERSION_INT }; | 
					
						
							| 
									
										
										
										
											2008-03-10 19:03:39 +00:00
										 |  |  | /*@}*/ | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-17 10:25:36 +00:00
										 |  |  | static int default_interrupt_cb(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | URLProtocol *first_protocol = NULL; | 
					
						
							| 
									
										
										
										
											2011-04-07 19:17:55 +02:00
										 |  |  | int (*url_interrupt_cb)(void) = default_interrupt_cb; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-12 19:01:58 +00:00
										 |  |  | URLProtocol *av_protocol_next(URLProtocol *p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if(p) return p->next; | 
					
						
							|  |  |  |     else  return first_protocol; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-04 20:35:04 +02:00
										 |  |  | int ffurl_register_protocol(URLProtocol *protocol, int size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     URLProtocol **p; | 
					
						
							| 
									
										
										
										
											2010-06-22 13:58:48 +00:00
										 |  |  |     if (size < sizeof(URLProtocol)) { | 
					
						
							|  |  |  |         URLProtocol* temp = av_mallocz(sizeof(URLProtocol)); | 
					
						
							|  |  |  |         memcpy(temp, protocol, size); | 
					
						
							|  |  |  |         protocol = temp; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     p = &first_protocol; | 
					
						
							|  |  |  |     while (*p != NULL) p = &(*p)->next; | 
					
						
							|  |  |  |     *p = protocol; | 
					
						
							|  |  |  |     protocol->next = NULL; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-19 21:21:32 +00:00
										 |  |  | #if FF_API_REGISTER_PROTOCOL
 | 
					
						
							| 
									
										
										
										
											2010-06-22 13:58:48 +00:00
										 |  |  | /* The layout of URLProtocol as of when major was bumped to 52 */ | 
					
						
							|  |  |  | struct URLProtocol_compat { | 
					
						
							|  |  |  |     const char *name; | 
					
						
							|  |  |  |     int (*url_open)(URLContext *h, const char *filename, int flags); | 
					
						
							|  |  |  |     int (*url_read)(URLContext *h, unsigned char *buf, int size); | 
					
						
							|  |  |  |     int (*url_write)(URLContext *h, unsigned char *buf, int size); | 
					
						
							|  |  |  |     int64_t (*url_seek)(URLContext *h, int64_t pos, int whence); | 
					
						
							|  |  |  |     int (*url_close)(URLContext *h); | 
					
						
							|  |  |  |     struct URLProtocol *next; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int av_register_protocol(URLProtocol *protocol) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-04 20:35:04 +02:00
										 |  |  |     return ffurl_register_protocol(protocol, sizeof(struct URLProtocol_compat)); | 
					
						
							| 
									
										
										
										
											2010-06-22 13:58:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-15 14:25:23 +00:00
										 |  |  | int register_protocol(URLProtocol *protocol) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-04 20:35:04 +02:00
										 |  |  |     return ffurl_register_protocol(protocol, sizeof(struct URLProtocol_compat)); | 
					
						
							| 
									
										
										
										
											2009-02-15 14:25:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  | static int url_alloc_for_protocol (URLContext **puc, struct URLProtocol *up, | 
					
						
							| 
									
										
										
										
											2010-06-23 11:26:43 +00:00
										 |  |  |                                    const char *filename, int flags) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     URLContext *uc; | 
					
						
							|  |  |  |     int err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-05 22:30:21 +00:00
										 |  |  | #if CONFIG_NETWORK
 | 
					
						
							|  |  |  |     if (!ff_network_init()) | 
					
						
							|  |  |  |         return AVERROR(EIO); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-01-28 09:11:26 +00:00
										 |  |  |     uc = av_mallocz(sizeof(URLContext) + strlen(filename) + 1); | 
					
						
							| 
									
										
										
										
											2002-07-24 17:50:23 +00:00
										 |  |  |     if (!uc) { | 
					
						
							| 
									
										
										
										
											2007-02-13 18:26:14 +00:00
										 |  |  |         err = AVERROR(ENOMEM); | 
					
						
							| 
									
										
										
										
											2002-07-24 17:50:23 +00:00
										 |  |  |         goto fail; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-08-19 16:49:08 +00:00
										 |  |  | #if FF_API_URL_CLASS
 | 
					
						
							| 
									
										
										
										
											2008-03-10 19:03:39 +00:00
										 |  |  |     uc->av_class = &urlcontext_class; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2007-01-14 22:07:19 +00:00
										 |  |  |     uc->filename = (char *) &uc[1]; | 
					
						
							| 
									
										
										
										
											2003-01-11 04:59:17 +00:00
										 |  |  |     strcpy(uc->filename, filename); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     uc->prot = up; | 
					
						
							|  |  |  |     uc->flags = flags; | 
					
						
							|  |  |  |     uc->is_streamed = 0; /* default = not streamed */ | 
					
						
							| 
									
										
										
										
											2002-07-24 17:50:23 +00:00
										 |  |  |     uc->max_packet_size = 0; /* default: stream file */ | 
					
						
							| 
									
										
										
										
											2010-06-22 14:09:08 +00:00
										 |  |  |     if (up->priv_data_size) { | 
					
						
							|  |  |  |         uc->priv_data = av_mallocz(up->priv_data_size); | 
					
						
							|  |  |  |         if (up->priv_data_class) { | 
					
						
							| 
									
										
										
										
											2010-06-27 17:33:52 +00:00
										 |  |  |             *(const AVClass**)uc->priv_data = up->priv_data_class; | 
					
						
							| 
									
										
										
										
											2010-06-22 14:09:08 +00:00
										 |  |  |             av_opt_set_defaults(uc->priv_data); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-05-05 09:17:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     *puc = uc; | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2002-07-24 17:50:23 +00:00
										 |  |  |  fail: | 
					
						
							|  |  |  |     *puc = NULL; | 
					
						
							| 
									
										
										
										
											2010-03-05 22:30:21 +00:00
										 |  |  | #if CONFIG_NETWORK
 | 
					
						
							|  |  |  |     ff_network_close(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-07-24 17:50:23 +00:00
										 |  |  |     return err; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 16:10:50 +02:00
										 |  |  | int ffurl_connect(URLContext* uc) | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int err = uc->prot->url_open(uc, uc->filename, uc->flags); | 
					
						
							|  |  |  |     if (err) | 
					
						
							|  |  |  |         return err; | 
					
						
							|  |  |  |     uc->is_connected = 1; | 
					
						
							| 
									
										
										
										
											2011-03-31 17:30:31 +02:00
										 |  |  |     //We must be careful here as ffurl_seek() could be slow, for example for http
 | 
					
						
							| 
									
										
										
										
											2011-04-04 20:11:19 +02:00
										 |  |  |     if(   (uc->flags & (AVIO_WRONLY | AVIO_RDWR)) | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |        || !strcmp(uc->prot->name, "file")) | 
					
						
							| 
									
										
										
										
											2011-03-31 17:30:31 +02:00
										 |  |  |         if(!uc->is_streamed && ffurl_seek(uc, 0, SEEK_SET) < 0) | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |             uc->is_streamed= 1; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 16:00:49 +02:00
										 |  |  | #if FF_API_OLD_AVIO
 | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  | int url_open_protocol (URLContext **puc, struct URLProtocol *up, | 
					
						
							|  |  |  |                        const char *filename, int flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = url_alloc_for_protocol(puc, up, filename, flags); | 
					
						
							|  |  |  |     if (ret) | 
					
						
							|  |  |  |         goto fail; | 
					
						
							| 
									
										
										
										
											2011-03-31 16:10:50 +02:00
										 |  |  |     ret = ffurl_connect(*puc); | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |     if (!ret) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |  fail: | 
					
						
							| 
									
										
										
										
											2011-03-31 17:36:06 +02:00
										 |  |  |     ffurl_close(*puc); | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |     *puc = NULL; | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 16:04:59 +02:00
										 |  |  | int url_alloc(URLContext **puc, const char *filename, int flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_alloc(puc, filename, flags); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 16:10:50 +02:00
										 |  |  | int url_connect(URLContext* uc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_connect(uc); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 16:25:10 +02:00
										 |  |  | int url_open(URLContext **puc, const char *filename, int flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_open(puc, filename, flags); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 16:31:43 +02:00
										 |  |  | int url_read(URLContext *h, unsigned char *buf, int size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_read(h, buf, size); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 16:40:31 +02:00
										 |  |  | int url_read_complete(URLContext *h, unsigned char *buf, int size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_read_complete(h, buf, size); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 16:48:01 +02:00
										 |  |  | int url_write(URLContext *h, const unsigned char *buf, int size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_write(h, buf, size); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 17:30:31 +02:00
										 |  |  | int64_t url_seek(URLContext *h, int64_t pos, int whence) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_seek(h, pos, whence); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 17:36:06 +02:00
										 |  |  | int url_close(URLContext *h) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_close(h); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 17:46:00 +02:00
										 |  |  | int64_t url_filesize(URLContext *h) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_size(h); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 17:51:24 +02:00
										 |  |  | int url_get_file_handle(URLContext *h) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_get_file_handle(h); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 17:58:04 +02:00
										 |  |  | int url_get_max_packet_size(URLContext *h) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return h->max_packet_size; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 18:00:55 +02:00
										 |  |  | void url_get_filename(URLContext *h, char *buf, int buf_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     av_strlcpy(buf, h->filename, buf_size); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-04-04 20:15:44 +02:00
										 |  |  | void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     avio_set_interrupt_cb(interrupt_cb); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-04-04 20:35:04 +02:00
										 |  |  | int av_register_protocol2(URLProtocol *protocol, int size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ffurl_register_protocol(protocol, size); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-31 16:00:49 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-18 18:38:23 +00:00
										 |  |  | #define URL_SCHEME_CHARS                        \
 | 
					
						
							|  |  |  |     "abcdefghijklmnopqrstuvwxyz"                \ | 
					
						
							|  |  |  |     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"                \ | 
					
						
							|  |  |  |     "0123456789+-." | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 16:04:59 +02:00
										 |  |  | int ffurl_alloc(URLContext **puc, const char *filename, int flags) | 
					
						
							| 
									
										
										
										
											2008-08-19 23:44:23 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     URLProtocol *up; | 
					
						
							| 
									
										
										
										
											2011-02-28 15:39:36 +02:00
										 |  |  |     char proto_str[128], proto_nested[128], *ptr; | 
					
						
							| 
									
										
										
										
											2010-07-18 18:38:23 +00:00
										 |  |  |     size_t proto_len = strspn(filename, URL_SCHEME_CHARS); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (filename[proto_len] != ':' || is_dos_path(filename)) | 
					
						
							| 
									
										
										
										
											2008-08-19 23:44:23 +00:00
										 |  |  |         strcpy(proto_str, "file"); | 
					
						
							| 
									
										
										
										
											2010-07-18 18:38:23 +00:00
										 |  |  |     else | 
					
						
							|  |  |  |         av_strlcpy(proto_str, filename, FFMIN(proto_len+1, sizeof(proto_str))); | 
					
						
							| 
									
										
										
										
											2008-08-19 23:44:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-28 15:39:36 +02:00
										 |  |  |     av_strlcpy(proto_nested, proto_str, sizeof(proto_nested)); | 
					
						
							|  |  |  |     if ((ptr = strchr(proto_nested, '+'))) | 
					
						
							|  |  |  |         *ptr = '\0'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-19 23:44:23 +00:00
										 |  |  |     up = first_protocol; | 
					
						
							|  |  |  |     while (up != NULL) { | 
					
						
							|  |  |  |         if (!strcmp(proto_str, up->name)) | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |             return url_alloc_for_protocol (puc, up, filename, flags); | 
					
						
							| 
									
										
										
										
											2011-02-28 15:39:36 +02:00
										 |  |  |         if (up->flags & URL_PROTOCOL_FLAG_NESTED_SCHEME && | 
					
						
							|  |  |  |             !strcmp(proto_nested, up->name)) | 
					
						
							|  |  |  |             return url_alloc_for_protocol (puc, up, filename, flags); | 
					
						
							| 
									
										
										
										
											2008-08-19 23:44:23 +00:00
										 |  |  |         up = up->next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     *puc = NULL; | 
					
						
							|  |  |  |     return AVERROR(ENOENT); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 16:25:10 +02:00
										 |  |  | int ffurl_open(URLContext **puc, const char *filename, int flags) | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-31 16:04:59 +02:00
										 |  |  |     int ret = ffurl_alloc(puc, filename, flags); | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |     if (ret) | 
					
						
							|  |  |  |         return ret; | 
					
						
							| 
									
										
										
										
											2011-03-31 16:10:50 +02:00
										 |  |  |     ret = ffurl_connect(*puc); | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |     if (!ret) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2011-03-31 17:36:06 +02:00
										 |  |  |     ffurl_close(*puc); | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |     *puc = NULL; | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-04 19:12:37 +01:00
										 |  |  | static inline int retry_transfer_wrapper(URLContext *h, unsigned char *buf, int size, int size_min, | 
					
						
							| 
									
										
										
										
											2010-10-06 11:18:38 +00:00
										 |  |  |                                          int (*transfer_func)(URLContext *h, unsigned char *buf, int size)) | 
					
						
							| 
									
										
										
										
											2009-06-04 06:25:53 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int ret, len; | 
					
						
							| 
									
										
										
										
											2010-01-24 18:09:46 +00:00
										 |  |  |     int fast_retries = 5; | 
					
						
							| 
									
										
										
										
											2009-06-04 06:25:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     len = 0; | 
					
						
							| 
									
										
										
										
											2011-02-04 19:12:37 +01:00
										 |  |  |     while (len < size_min) { | 
					
						
							| 
									
										
										
										
											2010-10-06 11:18:38 +00:00
										 |  |  |         ret = transfer_func(h, buf+len, size-len); | 
					
						
							| 
									
										
										
										
											2011-02-04 19:12:37 +01:00
										 |  |  |         if (ret == AVERROR(EINTR)) | 
					
						
							|  |  |  |             continue; | 
					
						
							| 
									
										
										
										
											2011-04-04 20:11:19 +02:00
										 |  |  |         if (h->flags & AVIO_FLAG_NONBLOCK) | 
					
						
							| 
									
										
										
										
											2011-02-04 19:12:37 +01:00
										 |  |  |             return ret; | 
					
						
							| 
									
										
										
										
											2010-01-23 10:23:47 +00:00
										 |  |  |         if (ret == AVERROR(EAGAIN)) { | 
					
						
							|  |  |  |             ret = 0; | 
					
						
							| 
									
										
										
										
											2010-01-24 18:09:46 +00:00
										 |  |  |             if (fast_retries) | 
					
						
							|  |  |  |                 fast_retries--; | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 usleep(1000); | 
					
						
							| 
									
										
										
										
											2010-01-23 10:23:47 +00:00
										 |  |  |         } else if (ret < 1) | 
					
						
							|  |  |  |             return ret < 0 ? ret : len; | 
					
						
							| 
									
										
										
										
											2010-01-24 18:09:46 +00:00
										 |  |  |         if (ret) | 
					
						
							|  |  |  |            fast_retries = FFMAX(fast_retries, 2); | 
					
						
							| 
									
										
										
										
											2009-06-04 06:25:53 +00:00
										 |  |  |         len += ret; | 
					
						
							| 
									
										
										
										
											2011-03-04 23:43:02 +01:00
										 |  |  |         if (url_interrupt_cb()) | 
					
						
							| 
									
										
										
										
											2011-03-13 00:42:27 +01:00
										 |  |  |             return AVERROR_EXIT; | 
					
						
							| 
									
										
										
										
											2009-06-04 06:25:53 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return len; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 16:31:43 +02:00
										 |  |  | int ffurl_read(URLContext *h, unsigned char *buf, int size) | 
					
						
							| 
									
										
										
										
											2011-02-04 19:12:37 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-04 20:11:19 +02:00
										 |  |  |     if (h->flags & AVIO_WRONLY) | 
					
						
							| 
									
										
										
										
											2011-02-04 19:12:37 +01:00
										 |  |  |         return AVERROR(EIO); | 
					
						
							|  |  |  |     return retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 16:40:31 +02:00
										 |  |  | int ffurl_read_complete(URLContext *h, unsigned char *buf, int size) | 
					
						
							| 
									
										
										
										
											2010-10-06 11:18:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-04 20:11:19 +02:00
										 |  |  |     if (h->flags & AVIO_WRONLY) | 
					
						
							| 
									
										
										
										
											2011-02-04 19:12:37 +01:00
										 |  |  |         return AVERROR(EIO); | 
					
						
							|  |  |  |     return retry_transfer_wrapper(h, buf, size, size, h->prot->url_read); | 
					
						
							| 
									
										
										
										
											2010-10-06 11:18:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 16:48:01 +02:00
										 |  |  | int ffurl_write(URLContext *h, const unsigned char *buf, int size) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-04 20:11:19 +02:00
										 |  |  |     if (!(h->flags & (AVIO_WRONLY | AVIO_RDWR))) | 
					
						
							| 
									
										
										
										
											2007-07-19 15:23:32 +00:00
										 |  |  |         return AVERROR(EIO); | 
					
						
							| 
									
										
										
										
											2002-07-24 17:50:23 +00:00
										 |  |  |     /* avoid sending too big packets */ | 
					
						
							|  |  |  |     if (h->max_packet_size && size > h->max_packet_size) | 
					
						
							| 
									
										
										
										
											2007-07-19 15:23:32 +00:00
										 |  |  |         return AVERROR(EIO); | 
					
						
							| 
									
										
										
										
											2010-10-06 11:18:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-04 19:12:37 +01:00
										 |  |  |     return retry_transfer_wrapper(h, buf, size, size, h->prot->url_write); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 17:30:31 +02:00
										 |  |  | int64_t ffurl_seek(URLContext *h, int64_t pos, int whence) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-10-03 10:16:29 +00:00
										 |  |  |     int64_t ret; | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!h->prot->url_seek) | 
					
						
							| 
									
										
										
										
											2010-04-18 17:37:16 +00:00
										 |  |  |         return AVERROR(ENOSYS); | 
					
						
							| 
									
										
										
										
											2010-03-15 22:54:22 +00:00
										 |  |  |     ret = h->prot->url_seek(h, pos, whence & ~AVSEEK_FORCE); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 17:36:06 +02:00
										 |  |  | int ffurl_close(URLContext *h) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-16 00:14:48 +00:00
										 |  |  |     int ret = 0; | 
					
						
							| 
									
										
										
										
											2011-03-31 16:25:10 +02:00
										 |  |  |     if (!h) return 0; /* can happen when ffurl_open fails */ | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-22 14:03:37 +00:00
										 |  |  |     if (h->is_connected && h->prot->url_close) | 
					
						
							| 
									
										
										
										
											2007-11-16 00:14:48 +00:00
										 |  |  |         ret = h->prot->url_close(h); | 
					
						
							| 
									
										
										
										
											2010-03-05 22:30:21 +00:00
										 |  |  | #if CONFIG_NETWORK
 | 
					
						
							|  |  |  |     ff_network_close(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-06-22 14:09:08 +00:00
										 |  |  |     if (h->prot->priv_data_size) | 
					
						
							|  |  |  |         av_free(h->priv_data); | 
					
						
							| 
									
										
										
										
											2002-05-18 23:11:09 +00:00
										 |  |  |     av_free(h); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int url_exist(const char *filename) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     URLContext *h; | 
					
						
							| 
									
										
										
										
											2011-04-04 20:11:19 +02:00
										 |  |  |     if (ffurl_open(&h, filename, AVIO_RDONLY) < 0) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2011-03-31 17:36:06 +02:00
										 |  |  |     ffurl_close(h); | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 17:46:00 +02:00
										 |  |  | int64_t ffurl_size(URLContext *h) | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-10-03 10:16:29 +00:00
										 |  |  |     int64_t pos, size; | 
					
						
							| 
									
										
										
										
											2005-12-17 18:14:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 17:30:31 +02:00
										 |  |  |     size= ffurl_seek(h, 0, AVSEEK_SIZE); | 
					
						
							| 
									
										
										
										
											2007-01-01 21:49:09 +00:00
										 |  |  |     if(size<0){ | 
					
						
							| 
									
										
										
										
											2011-03-31 17:30:31 +02:00
										 |  |  |         pos = ffurl_seek(h, 0, SEEK_CUR); | 
					
						
							|  |  |  |         if ((size = ffurl_seek(h, -1, SEEK_END)) < 0) | 
					
						
							| 
									
										
										
										
											2007-01-30 10:37:52 +00:00
										 |  |  |             return size; | 
					
						
							|  |  |  |         size++; | 
					
						
							| 
									
										
										
										
											2011-03-31 17:30:31 +02:00
										 |  |  |         ffurl_seek(h, pos, SEEK_SET); | 
					
						
							| 
									
										
										
										
											2007-01-01 21:49:09 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2001-07-22 14:18:56 +00:00
										 |  |  |     return size; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-07-24 17:50:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 17:51:24 +02:00
										 |  |  | int ffurl_get_file_handle(URLContext *h) | 
					
						
							| 
									
										
										
										
											2009-03-03 17:04:51 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!h->prot->url_get_file_handle) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     return h->prot->url_get_file_handle(h); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-07-17 10:25:36 +00:00
										 |  |  | static int default_interrupt_cb(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-07 19:17:55 +02:00
										 |  |  | void avio_set_interrupt_cb(int (*interrupt_cb)(void)) | 
					
						
							| 
									
										
										
										
											2003-07-17 10:25:36 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!interrupt_cb) | 
					
						
							|  |  |  |         interrupt_cb = default_interrupt_cb; | 
					
						
							|  |  |  |     url_interrupt_cb = interrupt_cb; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2007-11-24 07:09:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-04 19:46:19 +02:00
										 |  |  | #if FF_API_OLD_AVIO
 | 
					
						
							| 
									
										
										
										
											2007-12-19 20:57:13 +00:00
										 |  |  | int av_url_read_pause(URLContext *h, int pause) | 
					
						
							| 
									
										
										
										
											2007-11-24 07:09:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!h->prot->url_read_pause) | 
					
						
							|  |  |  |         return AVERROR(ENOSYS); | 
					
						
							| 
									
										
										
										
											2007-12-19 20:57:13 +00:00
										 |  |  |     return h->prot->url_read_pause(h, pause); | 
					
						
							| 
									
										
										
										
											2007-11-24 07:09:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-03 10:16:29 +00:00
										 |  |  | int64_t av_url_read_seek(URLContext *h, | 
					
						
							| 
									
										
										
										
											2007-11-24 07:09:32 +00:00
										 |  |  |         int stream_index, int64_t timestamp, int flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!h->prot->url_read_seek) | 
					
						
							|  |  |  |         return AVERROR(ENOSYS); | 
					
						
							|  |  |  |     return h->prot->url_read_seek(h, stream_index, timestamp, flags); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-04-04 19:48:31 +02:00
										 |  |  | #endif
 |