Mercurial > libavformat.hg
annotate avio.c @ 4387:5c42816e12c6 libavformat
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
to the parse_packet() function pointer in RTPDynamicProtocolHandlers. This
allows these functions to peek back and retrieve values from the demuxer's
context (or RTSPState). The ASF/RTP payload parser will use this to be able
to parse SDP values (which occur even before the payload ID is given), store
them in the RTSPState and then retrieve them while parsing payload data. See
"[PATCH] RTSP-MS 13/15: add RTSP demuxer AVFormatContext to parse_packet()
function pointer (was: transport context)" mailinglist thread.
author | rbultje |
---|---|
date | Fri, 06 Feb 2009 01:37:19 +0000 |
parents | 4d5d9ac28e21 |
children | 724c0f6a52dc |
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 |
22 #include "libavutil/avstring.h" | |
23 #include "libavcodec/opt.h" | |
3994
4d5d9ac28e21
Only special-case absolute DOS paths on systems that support them.
ramiro
parents:
3973
diff
changeset
|
24 #include "os_support.h" |
0 | 25 #include "avformat.h" |
3136
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
26 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
27 #if LIBAVFORMAT_VERSION_MAJOR >= 53 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
28 /** @name Logging context. */ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
29 /*@{*/ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
30 static const char *urlcontext_to_name(void *ptr) |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
31 { |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
32 URLContext *h = (URLContext *)ptr; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
33 if(h->prot) return h->prot->name; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
34 else return "NULL"; |
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 AVOption options[] = {{NULL}}; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
37 static const AVClass urlcontext_class = |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
38 { "URLContext", urlcontext_to_name, options }; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
39 /*@}*/ |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
40 #endif |
0 | 41 |
177 | 42 static int default_interrupt_cb(void); |
43 | |
0 | 44 URLProtocol *first_protocol = NULL; |
177 | 45 URLInterruptCB *url_interrupt_cb = default_interrupt_cb; |
0 | 46 |
2812 | 47 URLProtocol *av_protocol_next(URLProtocol *p) |
48 { | |
49 if(p) return p->next; | |
50 else return first_protocol; | |
51 } | |
52 | |
0 | 53 int register_protocol(URLProtocol *protocol) |
54 { | |
55 URLProtocol **p; | |
56 p = &first_protocol; | |
57 while (*p != NULL) p = &(*p)->next; | |
58 *p = protocol; | |
59 protocol->next = NULL; | |
60 return 0; | |
61 } | |
62 | |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
63 int url_open_protocol (URLContext **puc, struct URLProtocol *up, |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
64 const char *filename, int flags) |
0 | 65 { |
66 URLContext *uc; | |
67 int err; | |
68 | |
1648
90987914ad57
makes the filename member of the URLContext a pointer, so that the
gpoirier
parents:
1613
diff
changeset
|
69 uc = av_malloc(sizeof(URLContext) + strlen(filename) + 1); |
0 | 70 if (!uc) { |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1746
diff
changeset
|
71 err = AVERROR(ENOMEM); |
0 | 72 goto fail; |
73 } | |
3136
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
74 #if LIBAVFORMAT_VERSION_MAJOR >= 53 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
75 uc->av_class = &urlcontext_class; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
76 #endif |
1648
90987914ad57
makes the filename member of the URLContext a pointer, so that the
gpoirier
parents:
1613
diff
changeset
|
77 uc->filename = (char *) &uc[1]; |
19 | 78 strcpy(uc->filename, filename); |
0 | 79 uc->prot = up; |
80 uc->flags = flags; | |
81 uc->is_streamed = 0; /* default = not streamed */ | |
82 uc->max_packet_size = 0; /* default: stream file */ | |
83 err = up->url_open(uc, filename, flags); | |
84 if (err < 0) { | |
85 av_free(uc); | |
86 *puc = NULL; | |
87 return err; | |
88 } | |
3277 | 89 |
90 //We must be carefull here as url_seek() could be slow, for example for http | |
91 if( (flags & (URL_WRONLY | URL_RDWR)) | |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
92 || !strcmp(up->name, "file")) |
3277 | 93 if(!uc->is_streamed && url_seek(uc, 0, SEEK_SET) < 0) |
94 uc->is_streamed= 1; | |
0 | 95 *puc = uc; |
96 return 0; | |
97 fail: | |
98 *puc = NULL; | |
99 return err; | |
100 } | |
101 | |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
102 int url_open(URLContext **puc, const char *filename, int flags) |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
103 { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
104 URLProtocol *up; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
105 const char *p; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
106 char proto_str[128], *q; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
107 |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
108 p = filename; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
109 q = proto_str; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
110 while (*p != '\0' && *p != ':') { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
111 /* protocols can only contain alphabetic chars */ |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
112 if (!isalpha(*p)) |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
113 goto file_proto; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
114 if ((q - proto_str) < sizeof(proto_str) - 1) |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
115 *q++ = *p; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
116 p++; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
117 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
118 /* if the protocol has length 1, we consider it is a dos drive */ |
3994
4d5d9ac28e21
Only special-case absolute DOS paths on systems that support them.
ramiro
parents:
3973
diff
changeset
|
119 if (*p == '\0' || is_dos_path(filename)) { |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
120 file_proto: |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
121 strcpy(proto_str, "file"); |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
122 } else { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
123 *q = '\0'; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
124 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
125 |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
126 up = first_protocol; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
127 while (up != NULL) { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
128 if (!strcmp(proto_str, up->name)) |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
129 return url_open_protocol (puc, up, filename, flags); |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
130 up = up->next; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
131 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
132 *puc = NULL; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
133 return AVERROR(ENOENT); |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
134 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
135 |
0 | 136 int url_read(URLContext *h, unsigned char *buf, int size) |
137 { | |
138 int ret; | |
139 if (h->flags & URL_WRONLY) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
140 return AVERROR(EIO); |
0 | 141 ret = h->prot->url_read(h, buf, size); |
142 return ret; | |
143 } | |
144 | |
145 int url_write(URLContext *h, unsigned char *buf, int size) | |
146 { | |
147 int ret; | |
148 if (!(h->flags & (URL_WRONLY | URL_RDWR))) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
149 return AVERROR(EIO); |
0 | 150 /* avoid sending too big packets */ |
151 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
|
152 return AVERROR(EIO); |
0 | 153 ret = h->prot->url_write(h, buf, size); |
154 return ret; | |
155 } | |
156 | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
157 int64_t url_seek(URLContext *h, int64_t pos, int whence) |
0 | 158 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
159 int64_t ret; |
0 | 160 |
161 if (!h->prot->url_seek) | |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1746
diff
changeset
|
162 return AVERROR(EPIPE); |
0 | 163 ret = h->prot->url_seek(h, pos, whence); |
164 return ret; | |
165 } | |
166 | |
167 int url_close(URLContext *h) | |
168 { | |
2757 | 169 int ret = 0; |
2710 | 170 if (!h) return 0; /* can happen when url_open fails */ |
0 | 171 |
2757 | 172 if (h->prot->url_close) |
173 ret = h->prot->url_close(h); | |
0 | 174 av_free(h); |
175 return ret; | |
176 } | |
177 | |
178 int url_exist(const char *filename) | |
179 { | |
180 URLContext *h; | |
181 if (url_open(&h, filename, URL_RDONLY) < 0) | |
182 return 0; | |
183 url_close(h); | |
184 return 1; | |
185 } | |
186 | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
187 int64_t url_filesize(URLContext *h) |
0 | 188 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
189 int64_t pos, size; |
885 | 190 |
1612
a6eaa0762191
seekless filesize retrieving support in 7 lines of code, also doesnt break compatibility
michael
parents:
1358
diff
changeset
|
191 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
|
192 if(size<0){ |
1613 | 193 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
|
194 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
|
195 return size; |
2649c0a9c037
protect the size=seek(SEEK_END,-1)+1 results with an if (.. < 0), else the
gpoirier
parents:
1648
diff
changeset
|
196 size++; |
1613 | 197 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
|
198 } |
0 | 199 return size; |
200 } | |
201 | |
202 int url_get_max_packet_size(URLContext *h) | |
203 { | |
204 return h->max_packet_size; | |
205 } | |
19 | 206 |
207 void url_get_filename(URLContext *h, char *buf, int buf_size) | |
208 { | |
2189 | 209 av_strlcpy(buf, h->filename, buf_size); |
19 | 210 } |
177 | 211 |
212 | |
213 static int default_interrupt_cb(void) | |
214 { | |
215 return 0; | |
216 } | |
217 | |
218 void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) | |
219 { | |
220 if (!interrupt_cb) | |
221 interrupt_cb = default_interrupt_cb; | |
222 url_interrupt_cb = interrupt_cb; | |
223 } | |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
224 |
2839
b51319dd86e5
Merge recently added and still unused play and pause functions.
michael
parents:
2834
diff
changeset
|
225 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
|
226 { |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
227 if (!h->prot->url_read_pause) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
228 return AVERROR(ENOSYS); |
2839
b51319dd86e5
Merge recently added and still unused play and pause functions.
michael
parents:
2834
diff
changeset
|
229 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
|
230 } |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
231 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
232 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
|
233 int stream_index, int64_t timestamp, int flags) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
234 { |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
235 if (!h->prot->url_read_seek) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
236 return AVERROR(ENOSYS); |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
237 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
|
238 } |