Mercurial > libavformat.hg
annotate avio.c @ 5836:2997c88028cd libavformat
Move the probe loop from av_open_input_file() into its own method
av_probe_input_buffer() so that it can be reused. Here are a few
differences to the original way things were probed:
- maximum probe buffer size can be specified as a parameter.
- offset within the stream to probe from can be specified as a parameter.
- instead of seeking back to the start each time a probe fails, stream
data is appended to the reallocated buffer. This lowers the amount
of data read from the stream (there is no repetition) and results in
fewer closed and reopened streams (when seeking fails).
New attempt after r22296, which was revert in r22315 due to a FATE
failure.
See the thread:
Subject: [FFmpeg-devel] [PATCH] Move av_open_input_file probe loop to its own method
Date: 2010-03-05 03:23:57 GMT
Patch by Micah F. Galizia printf("%s%s@%s.%s", "micah", "galizia", "gmail", "com").
author | stefano |
---|---|
date | Sun, 14 Mar 2010 22:40:16 +0000 |
parents | 65b77d0674d0 |
children | a9a36b4f83a2 |
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 = |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
44 { "URLContext", urlcontext_to_name, options }; |
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 | |
4488
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
59 int av_register_protocol(URLProtocol *protocol) |
0 | 60 { |
61 URLProtocol **p; | |
62 p = &first_protocol; | |
63 while (*p != NULL) p = &(*p)->next; | |
64 *p = protocol; | |
65 protocol->next = NULL; | |
66 return 0; | |
67 } | |
68 | |
4488
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
69 #if LIBAVFORMAT_VERSION_MAJOR < 53 |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
70 int register_protocol(URLProtocol *protocol) |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
71 { |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
72 return av_register_protocol(protocol); |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
73 } |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
74 #endif |
724c0f6a52dc
Rename register_protocol() to av_register_protocol() and deprecate
stefano
parents:
3994
diff
changeset
|
75 |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
76 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
|
77 const char *filename, int flags) |
0 | 78 { |
79 URLContext *uc; | |
80 int err; | |
81 | |
5754
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
82 #if CONFIG_NETWORK |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
83 if (!ff_network_init()) |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
84 return AVERROR(EIO); |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
85 #endif |
5599
b934eb97fffd
Use av_mallocz in url_open_protocol for URLContext.
benoit
parents:
5584
diff
changeset
|
86 uc = av_mallocz(sizeof(URLContext) + strlen(filename) + 1); |
0 | 87 if (!uc) { |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1746
diff
changeset
|
88 err = AVERROR(ENOMEM); |
0 | 89 goto fail; |
90 } | |
3136
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
91 #if LIBAVFORMAT_VERSION_MAJOR >= 53 |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
92 uc->av_class = &urlcontext_class; |
e38d5357f0d0
Add AVClass to URLContext at next major version bump
superdump
parents:
2914
diff
changeset
|
93 #endif |
1648
90987914ad57
makes the filename member of the URLContext a pointer, so that the
gpoirier
parents:
1613
diff
changeset
|
94 uc->filename = (char *) &uc[1]; |
19 | 95 strcpy(uc->filename, filename); |
0 | 96 uc->prot = up; |
97 uc->flags = flags; | |
98 uc->is_streamed = 0; /* default = not streamed */ | |
99 uc->max_packet_size = 0; /* default: stream file */ | |
100 err = up->url_open(uc, filename, flags); | |
101 if (err < 0) { | |
102 av_free(uc); | |
5754
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
103 goto fail; |
0 | 104 } |
3277 | 105 |
5555 | 106 //We must be careful here as url_seek() could be slow, for example for http |
3277 | 107 if( (flags & (URL_WRONLY | URL_RDWR)) |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
108 || !strcmp(up->name, "file")) |
3277 | 109 if(!uc->is_streamed && url_seek(uc, 0, SEEK_SET) < 0) |
110 uc->is_streamed= 1; | |
0 | 111 *puc = uc; |
112 return 0; | |
113 fail: | |
114 *puc = NULL; | |
5754
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
115 #if CONFIG_NETWORK |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
116 ff_network_close(); |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
117 #endif |
0 | 118 return err; |
119 } | |
120 | |
3744
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
121 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
|
122 { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
123 URLProtocol *up; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
124 const char *p; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
125 char proto_str[128], *q; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
126 |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
127 p = filename; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
128 q = proto_str; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
129 while (*p != '\0' && *p != ':') { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
130 /* protocols can only contain alphabetic chars */ |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
131 if (!isalpha(*p)) |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
132 goto file_proto; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
133 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
|
134 *q++ = *p; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
135 p++; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
136 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
137 /* 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
|
138 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
|
139 file_proto: |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
140 strcpy(proto_str, "file"); |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
141 } else { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
142 *q = '\0'; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
143 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
144 |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
145 up = first_protocol; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
146 while (up != NULL) { |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
147 if (!strcmp(proto_str, up->name)) |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
148 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
|
149 up = up->next; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
150 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
151 *puc = NULL; |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
152 return AVERROR(ENOENT); |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
153 } |
b140b68a3747
Implement url_open_protocol(), which is basiclly the former url_open()
rbultje
parents:
3286
diff
changeset
|
154 |
0 | 155 int url_read(URLContext *h, unsigned char *buf, int size) |
156 { | |
157 int ret; | |
158 if (h->flags & URL_WRONLY) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
159 return AVERROR(EIO); |
0 | 160 ret = h->prot->url_read(h, buf, size); |
161 return ret; | |
162 } | |
163 | |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
164 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
|
165 { |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
166 int ret, len; |
5584
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
167 int fast_retries = 5; |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
168 |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
169 len = 0; |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
170 while (len < size) { |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
171 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
|
172 if (ret == AVERROR(EAGAIN)) { |
07ce73fed19f
Make url_read_complete retry on EAGAIN and return how much data it read
reimar
parents:
5555
diff
changeset
|
173 ret = 0; |
5584
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
174 if (fast_retries) |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
175 fast_retries--; |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
176 else |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
177 usleep(1000); |
5580
07ce73fed19f
Make url_read_complete retry on EAGAIN and return how much data it read
reimar
parents:
5555
diff
changeset
|
178 } else if (ret < 1) |
07ce73fed19f
Make url_read_complete retry on EAGAIN and return how much data it read
reimar
parents:
5555
diff
changeset
|
179 return ret < 0 ? ret : len; |
5584
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
180 if (ret) |
70488b6f7044
Make url_read_complete handle EAGAIN more intelligently.
reimar
parents:
5580
diff
changeset
|
181 fast_retries = FFMAX(fast_retries, 2); |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
182 len += ret; |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
183 } |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
184 return len; |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
185 } |
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4640
diff
changeset
|
186 |
0 | 187 int url_write(URLContext *h, unsigned char *buf, int size) |
188 { | |
189 int ret; | |
190 if (!(h->flags & (URL_WRONLY | URL_RDWR))) | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2189
diff
changeset
|
191 return AVERROR(EIO); |
0 | 192 /* avoid sending too big packets */ |
193 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
|
194 return AVERROR(EIO); |
0 | 195 ret = h->prot->url_write(h, buf, size); |
196 return ret; | |
197 } | |
198 | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
199 int64_t url_seek(URLContext *h, int64_t pos, int whence) |
0 | 200 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
201 int64_t ret; |
0 | 202 |
203 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
|
204 return AVERROR(EPIPE); |
0 | 205 ret = h->prot->url_seek(h, pos, whence); |
206 return ret; | |
207 } | |
208 | |
209 int url_close(URLContext *h) | |
210 { | |
2757 | 211 int ret = 0; |
2710 | 212 if (!h) return 0; /* can happen when url_open fails */ |
0 | 213 |
2757 | 214 if (h->prot->url_close) |
215 ret = h->prot->url_close(h); | |
5754
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
216 #if CONFIG_NETWORK |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
217 ff_network_close(); |
65b77d0674d0
Always call ff_network_init/ff_network_close when opening protocols
mstorsjo
parents:
5599
diff
changeset
|
218 #endif |
0 | 219 av_free(h); |
220 return ret; | |
221 } | |
222 | |
223 int url_exist(const char *filename) | |
224 { | |
225 URLContext *h; | |
226 if (url_open(&h, filename, URL_RDONLY) < 0) | |
227 return 0; | |
228 url_close(h); | |
229 return 1; | |
230 } | |
231 | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
232 int64_t url_filesize(URLContext *h) |
0 | 233 { |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
234 int64_t pos, size; |
885 | 235 |
1612
a6eaa0762191
seekless filesize retrieving support in 7 lines of code, also doesnt break compatibility
michael
parents:
1358
diff
changeset
|
236 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
|
237 if(size<0){ |
1613 | 238 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
|
239 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
|
240 return size; |
2649c0a9c037
protect the size=seek(SEEK_END,-1)+1 results with an if (.. < 0), else the
gpoirier
parents:
1648
diff
changeset
|
241 size++; |
1613 | 242 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
|
243 } |
0 | 244 return size; |
245 } | |
246 | |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
247 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
|
248 { |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
249 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
|
250 return -1; |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
251 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
|
252 } |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4488
diff
changeset
|
253 |
0 | 254 int url_get_max_packet_size(URLContext *h) |
255 { | |
256 return h->max_packet_size; | |
257 } | |
19 | 258 |
259 void url_get_filename(URLContext *h, char *buf, int buf_size) | |
260 { | |
2189 | 261 av_strlcpy(buf, h->filename, buf_size); |
19 | 262 } |
177 | 263 |
264 | |
265 static int default_interrupt_cb(void) | |
266 { | |
267 return 0; | |
268 } | |
269 | |
270 void url_set_interrupt_cb(URLInterruptCB *interrupt_cb) | |
271 { | |
272 if (!interrupt_cb) | |
273 interrupt_cb = default_interrupt_cb; | |
274 url_interrupt_cb = interrupt_cb; | |
275 } | |
2778
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
276 |
2839
b51319dd86e5
Merge recently added and still unused play and pause functions.
michael
parents:
2834
diff
changeset
|
277 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
|
278 { |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
279 if (!h->prot->url_read_pause) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
280 return AVERROR(ENOSYS); |
2839
b51319dd86e5
Merge recently added and still unused play and pause functions.
michael
parents:
2834
diff
changeset
|
281 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
|
282 } |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
283 |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3744
diff
changeset
|
284 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
|
285 int stream_index, int64_t timestamp, int flags) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
286 { |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
287 if (!h->prot->url_read_seek) |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
288 return AVERROR(ENOSYS); |
50e2307414ee
Extend URLProtocol with new function pointers and api functions for
andoma
parents:
2757
diff
changeset
|
289 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
|
290 } |