Mercurial > libavformat.hg
annotate avio.c @ 6274:1c656ac8c9c9 libavformat
Allow all valid (and only valid) characters in URL scheme for url_open()
The URL specification allows letters, numbers, plus, hyphen, and period
in the scheme part. The isalpha() test would allow additional characters
depending on locale settings while rejecting numbers and punctuation.
author | mru |
---|---|
date | Sun, 18 Jul 2010 18:38:23 +0000 |
parents | eb590b2816f8 |
children | daca8bebdd88 |
rev | line source |
---|---|
0 | 1 /* |
2 * Unbuffered io for ffmpeg system | |
3 * Copyright (c) 2001 Fabrice Bellard | |
4 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
905
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
3286 | 21 |
5584
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
22 /* needed for usleep() */ |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
23 #define _XOPEN_SOURCE 600 |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
24 #include <unistd.h> |
3286 | 25 #include "libavutil/avstring.h" |
26 #include "libavcodec/opt.h" | |
3994
4d5d9ac28e21
Only special-case absolute DOS paths on systems that support them.
ramiro
parents:
3973
diff
changeset
|
27 #include "os_support.h" |
0 | 28 #include "avformat.h" |
5754
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
29 #if CONFIG_NETWORK |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
30 #include "network.h" |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
31 #endif |
3136
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
32 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
33 #if LIBAVFORMAT_VERSION_MAJOR >= 53 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
34 /** @name Logging context. */ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
35 /*@{*/ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
36 static const char *urlcontext_to_name(void *ptr) |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
37 { |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
38 URLContext *h = (URLContext *)ptr; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
39 if(h->prot) return h->prot->name; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
40 else return "NULL"; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
41 } |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
42 static const AVOption options[] = {{NULL}}; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
43 static const AVClass urlcontext_class = |
5987
d5672e116fe4
Add version to AVClass so we can add to and use fields of AVClass without ABI issues.
michael
parents:
5960
diff
changeset
|
44 { "URLContext", urlcontext_to_name, options, LIBAVUTIL_VERSION_INT }; |
3136
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
45 /*@}*/ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
46 #endif |
0 | 47 |
177 | 48 static int default_interrupt_cb(void); |
49 | |
0 | 50 URLProtocol *first_protocol = NULL; |
177 | 51 URLInterruptCB *url_interrupt_cb = default_interrupt_cb; |
0 | 52 |
2812 | 53 URLProtocol *av_protocol_next(URLProtocol *p) |
54 { | |
55 if(p) return p->next; | |
56 else return first_protocol; | |
57 } | |
58 | |
6159
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
59 int av_register_protocol2(URLProtocol *protocol, int size) |
0 | 60 { |
61 URLProtocol **p; | |
6159
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
62 if (size < sizeof(URLProtocol)) { |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
63 URLProtocol* temp = av_mallocz(sizeof(URLProtocol)); |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
64 memcpy(temp, protocol, size); |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
65 protocol = temp; |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
66 } |
0 | 67 p = &first_protocol; |
68 while (*p != NULL) p = &(*p)->next; | |
69 *p = protocol; | |
70 protocol->next = NULL; | |
71 return 0; | |
72 } | |
73 | |
4488
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
74 #if LIBAVFORMAT_VERSION_MAJOR < 53 |
6159
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
75 /* The layout of URLProtocol as of when major was bumped to 52 */ |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
76 struct URLProtocol_compat { |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
77 const char *name; |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
78 int (*url_open)(URLContext *h, const char *filename, int flags); |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
79 int (*url_read)(URLContext *h, unsigned char *buf, int size); |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
80 int (*url_write)(URLContext *h, unsigned char *buf, int size); |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
81 int64_t (*url_seek)(URLContext *h, int64_t pos, int whence); |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
82 int (*url_close)(URLContext *h); |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
83 struct URLProtocol *next; |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
84 }; |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
85 |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
86 int av_register_protocol(URLProtocol *protocol) |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
87 { |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
88 return av_register_protocol2(protocol, sizeof(struct URLProtocol_compat)); |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
89 } |
3fcaee5cf416
Add an av_register_protocol2 function that takes a size parameter
mstorsjo
parents:
6068
diff
changeset
|
90 |
4488
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
91 int register_protocol(URLProtocol *protocol) |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
92 { |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
93 return av_register_protocol(protocol); |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
94 } |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
95 #endif |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
96 |
6160
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
97 static int url_alloc_for_protocol (URLContext **puc, struct URLProtocol *up, |
6169 | 98 const char *filename, int flags) |
0 | 99 { |
100 URLContext *uc; | |
101 int err; | |
102 | |
5754
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
103 #if CONFIG_NETWORK |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
104 if (!ff_network_init()) |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
105 return AVERROR(EIO); |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
106 #endif |
5599
b934eb97fffd
Use av_mallocz in url_open_protocol for URLContext.
benoit
parents:
5584
diff
changeset
|
107 uc = av_mallocz(sizeof(URLContext) + strlen(filename) + 1); |
0 | 108 if (!uc) { |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1746
diff
changeset
|
109 err = AVERROR(ENOMEM); |
0 | 110 goto fail; |
111 } | |
3136
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
112 #if LIBAVFORMAT_VERSION_MAJOR >= 53 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
113 uc->av_class = &urlcontext_class; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
114 #endif |
1648
90987914ad57
makes the filename member of the URLContext a pointer, so that the
gpoirier
parents:
1613
diff
changeset
|
115 uc->filename = (char *) &uc[1]; |
19 | 116 strcpy(uc->filename, filename); |
0 | 117 uc->prot = up; |
118 uc->flags = flags; | |
119 uc->is_streamed = 0; /* default = not streamed */ | |
120 uc->max_packet_size = 0; /* default: stream file */ | |
6161
f7090c70ed34
Add priv_data_size and priv_data_class to URLProtocol
mstorsjo
parents:
6160
diff
changeset
|
121 if (up->priv_data_size) { |
f7090c70ed34
Add priv_data_size and priv_data_class to URLProtocol
mstorsjo
parents:
6160
diff
changeset
|
122 uc->priv_data = av_mallocz(up->priv_data_size); |
f7090c70ed34
Add priv_data_size and priv_data_class to URLProtocol
mstorsjo
parents:
6160
diff
changeset
|
123 if (up->priv_data_class) { |
6183
91c7c6929874
Add proper const declaration to a cast, fixes a warning
mstorsjo
parents:
6169
diff
changeset
|
124 *(const AVClass**)uc->priv_data = up->priv_data_class; |
6161
f7090c70ed34
Add priv_data_size and priv_data_class to URLProtocol
mstorsjo
parents:
6160
diff
changeset
|
125 av_opt_set_defaults(uc->priv_data); |
f7090c70ed34
Add priv_data_size and priv_data_class to URLProtocol
mstorsjo
parents:
6160
diff
changeset
|
126 } |
f7090c70ed34
Add priv_data_size and priv_data_class to URLProtocol
mstorsjo
parents:
6160
diff
changeset
|
127 } |
3277 | 128 |
0 | 129 *puc = uc; |
130 return 0; | |
131 fail: | |
132 *puc = NULL; | |
5754
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
133 #if CONFIG_NETWORK |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
134 ff_network_close(); |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
135 #endif |
0 | 136 return err; |
137 } | |
138 | |
6160
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
139 int url_connect(URLContext* uc) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
140 { |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
141 int err = uc->prot->url_open(uc, uc->filename, uc->flags); |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
142 if (err) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
143 return err; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
144 uc->is_connected = 1; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
145 //We must be careful here as url_seek() could be slow, for example for http |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
146 if( (uc->flags & (URL_WRONLY | URL_RDWR)) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
147 || !strcmp(uc->prot->name, "file")) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
148 if(!uc->is_streamed && url_seek(uc, 0, SEEK_SET) < 0) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
149 uc->is_streamed= 1; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
150 return 0; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
151 } |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
152 |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
153 int url_open_protocol (URLContext **puc, struct URLProtocol *up, |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
154 const char *filename, int flags) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
155 { |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
156 int ret; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
157 |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
158 ret = url_alloc_for_protocol(puc, up, filename, flags); |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
159 if (ret) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
160 goto fail; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
161 ret = url_connect(*puc); |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
162 if (!ret) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
163 return 0; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
164 fail: |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
165 url_close(*puc); |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
166 *puc = NULL; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
167 return ret; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
168 } |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
169 |
6274
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
170 #define URL_SCHEME_CHARS \ |
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
171 "abcdefghijklmnopqrstuvwxyz" \ |
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
172 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ |
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
173 "0123456789+-." |
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
174 |
6160
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
175 int url_alloc(URLContext **puc, const char *filename, int flags) |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
176 { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
177 URLProtocol *up; |
6274
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
178 char proto_str[128]; |
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
179 size_t proto_len = strspn(filename, URL_SCHEME_CHARS); |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
180 |
6274
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
181 if (filename[proto_len] != ':' || is_dos_path(filename)) |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
182 strcpy(proto_str, "file"); |
6274
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
183 else |
1c656ac8c9c9
Allow all valid (and only valid) characters in URL scheme for url_open()
mru
parents:
6184
diff
changeset
|
184 av_strlcpy(proto_str, filename, FFMIN(proto_len+1, sizeof(proto_str))); |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
185 |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
186 up = first_protocol; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
187 while (up != NULL) { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
188 if (!strcmp(proto_str, up->name)) |
6160
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
189 return url_alloc_for_protocol (puc, up, filename, flags); |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
190 up = up->next; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
191 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
192 *puc = NULL; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
193 return AVERROR(ENOENT); |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
194 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
195 |
6160
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
196 int url_open(URLContext **puc, const char *filename, int flags) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
197 { |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
198 int ret = url_alloc(puc, filename, flags); |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
199 if (ret) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
200 return ret; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
201 ret = url_connect(*puc); |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
202 if (!ret) |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
203 return 0; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
204 url_close(*puc); |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
205 *puc = NULL; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
206 return ret; |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
207 } |
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
208 |
0 | 209 int url_read(URLContext *h, unsigned char *buf, int size) |
210 { | |
211 int ret; | |
212 if (h->flags & URL_WRONLY) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
213 return AVERROR(EIO); |
0 | 214 ret = h->prot->url_read(h, buf, size); |
215 return ret; | |
216 } | |
217 | |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
218 int url_read_complete(URLContext *h, unsigned char *buf, int size) |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
219 { |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
220 int ret, len; |
5584
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
221 int fast_retries = 5; |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
222 |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
223 len = 0; |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
224 while (len < size) { |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
225 ret = url_read(h, buf+len, size-len); |
5580
07ce73fed19f
Make url_read_complete retry on EAGAIN and return how much data it read
reimar
parents:
5555
diff
changeset
|
226 if (ret == AVERROR(EAGAIN)) { |
07ce73fed19f
Make url_read_complete retry on EAGAIN and return how much data it read
reimar
parents:
5555
diff
changeset
|
227 ret = 0; |
5584
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
228 if (fast_retries) |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
229 fast_retries--; |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
230 else |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
231 usleep(1000); |
5580
07ce73fed19f
Make url_read_complete retry on EAGAIN and return how much data it read
reimar
parents:
5555
diff
changeset
|
232 } else if (ret < 1) |
07ce73fed19f
Make url_read_complete retry on EAGAIN and return how much data it read
reimar
parents:
5555
diff
changeset
|
233 return ret < 0 ? ret : len; |
5584
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
234 if (ret) |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
235 fast_retries = FFMAX(fast_retries, 2); |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
236 len += ret; |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
237 } |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
238 return len; |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
239 } |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
240 |
6068 | 241 int url_write(URLContext *h, const unsigned char *buf, int size) |
0 | 242 { |
243 int ret; | |
244 if (!(h->flags & (URL_WRONLY | URL_RDWR))) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
245 return AVERROR(EIO); |
0 | 246 /* avoid sending too big packets */ |
247 if (h->max_packet_size && size > h->max_packet_size) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
248 return AVERROR(EIO); |
0 | 249 ret = h->prot->url_write(h, buf, size); |
250 return ret; | |
251 } | |
252 | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
253 int64_t url_seek(URLContext *h, int64_t pos, int whence) |
0 | 254 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
255 int64_t ret; |
0 | 256 |
257 if (!h->prot->url_seek) | |
5960
c758fd290a6e
Make url_seek() return AVERROR(ENOSYS) rather than AVERROR(EPIPE) in
stefano
parents:
5850
diff
changeset
|
258 return AVERROR(ENOSYS); |
5850
a9a36b4f83a2
Add AVSEEK_FORCE flag to indicate that the code should attempt to seek
michael
parents:
5754
diff
changeset
|
259 ret = h->prot->url_seek(h, pos, whence & ~AVSEEK_FORCE); |
0 | 260 return ret; |
261 } | |
262 | |
263 int url_close(URLContext *h) | |
264 { | |
2757 | 265 int ret = 0; |
2710 | 266 if (!h) return 0; /* can happen when url_open fails */ |
0 | 267 |
6160
1b4be334ef89
Split url_open and url_open_protocol into url_alloc and url_connect
mstorsjo
parents:
6159
diff
changeset
|
268 if (h->is_connected && h->prot->url_close) |
2757 | 269 ret = h->prot->url_close(h); |
5754
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
270 #if CONFIG_NETWORK |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
271 ff_network_close(); |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
272 #endif |
6161
f7090c70ed34
Add priv_data_size and priv_data_class to URLProtocol
mstorsjo
parents:
6160
diff
changeset
|
273 if (h->prot->priv_data_size) |
f7090c70ed34
Add priv_data_size and priv_data_class to URLProtocol
mstorsjo
parents:
6160
diff
changeset
|
274 av_free(h->priv_data); |
0 | 275 av_free(h); |
276 return ret; | |
277 } | |
278 | |
279 int url_exist(const char *filename) | |
280 { | |
281 URLContext *h; | |
282 if (url_open(&h, filename, URL_RDONLY) < 0) | |
283 return 0; | |
284 url_close(h); | |
285 return 1; | |
286 } | |
287 | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
288 int64_t url_filesize(URLContext *h) |
0 | 289 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
290 int64_t pos, size; |
885 | 291 |
1612
a6eaa0762191
seekless filesize retrieving support in 7 lines of code, also doesnt break compatibility
michael
parents:
1358
diff
changeset
|
292 size= url_seek(h, 0, AVSEEK_SIZE); |
a6eaa0762191
seekless filesize retrieving support in 7 lines of code, also doesnt break compatibility
michael
parents:
1358
diff
changeset
|
293 if(size<0){ |
1613 | 294 pos = url_seek(h, 0, SEEK_CUR); |
1746
2649c0a9c037
protect the size=seek(SEEK_END,-1)+1 results with an if (.. < 0), else the
gpoirier
parents:
1648
diff
changeset
|
295 if ((size = url_seek(h, -1, SEEK_END)) < 0) |
2649c0a9c037
protect the size=seek(SEEK_END,-1)+1 results with an if (.. < 0), else the
gpoirier
parents:
1648
diff
changeset
|
296 return size; |
2649c0a9c037
protect the size=seek(SEEK_END,-1)+1 results with an if (.. < 0), else the
gpoirier
parents:
1648
diff
changeset
|
297 size++; |
1613 | 298 url_seek(h, pos, SEEK_SET); |
1612
a6eaa0762191
seekless filesize retrieving support in 7 lines of code, also doesnt break compatibility
michael
parents:
1358
diff
changeset
|
299 } |
0 | 300 return size; |
301 } | |
302 | |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
303 int url_get_file_handle(URLContext *h) |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
304 { |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
305 if (!h->prot->url_get_file_handle) |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
306 return -1; |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
307 return h->prot->url_get_file_handle(h); |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
308 } |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
309 |
0 | 310 int url_get_max_packet_size(URLContext *h) |
311 { | |
312 return h->max_packet_size; | |
313 } | |
19 | 314 |
315 void url_get_filename(URLContext *h, char *buf, int buf_size) | |
316 { | |
2189 | 317 av_strlcpy(buf, h->filename, buf_size); |
19 | 318 } |
177 | 319 |
320 | |
321 static int default_interrupt_cb(void) | |
322 { | |
323 return 0; | |
324 } | |
325 | |
326 void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) | |
327 { | |
328 if (!interrupt_cb) | |
329 interrupt_cb = default_interrupt_cb; | |
330 url_interrupt_cb = interrupt_cb; | |
331 } | |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
332 |
2839
b51319dd86e5
Merge recently added and still unused play and pause functions.
michael
parents:
2834
diff
changeset
|
333 int av_url_read_pause(URLContext *h, int pause) |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
334 { |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
335 if (!h->prot->url_read_pause) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
336 return AVERROR(ENOSYS); |
2839
b51319dd86e5
Merge recently added and still unused play and pause functions.
michael
parents:
2834
diff
changeset
|
337 return h->prot->url_read_pause(h, pause); |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
338 } |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
339 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
340 int64_t av_url_read_seek(URLContext *h, |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
341 int stream_index, int64_t timestamp, int flags) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
342 { |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
343 if (!h->prot->url_read_seek) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
344 return AVERROR(ENOSYS); |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
345 return h->prot->url_read_seek(h, stream_index, timestamp, flags); |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
346 } |