ffmpeg / libavformat / avio.h @ c1a9012d
History | View | Annotate | Download (22.3 KB)
1 | 04d7f601 | Diego Biurrun | /*
|
---|---|---|---|
2 | * copyright (c) 2001 Fabrice Bellard
|
||
3 | *
|
||
4 | 2912e87a | Mans Rullgard | * This file is part of Libav.
|
5 | b78e7197 | Diego Biurrun | *
|
6 | 2912e87a | Mans Rullgard | * Libav is free software; you can redistribute it and/or
|
7 | 04d7f601 | Diego Biurrun | * modify it under the terms of the GNU Lesser General Public
|
8 | * License as published by the Free Software Foundation; either
|
||
9 | b78e7197 | Diego Biurrun | * version 2.1 of the License, or (at your option) any later version.
|
10 | 04d7f601 | Diego Biurrun | *
|
11 | 2912e87a | Mans Rullgard | * Libav is distributed in the hope that it will be useful,
|
12 | 04d7f601 | Diego Biurrun | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
14 | * Lesser General Public License for more details.
|
||
15 | *
|
||
16 | * You should have received a copy of the GNU Lesser General Public
|
||
17 | 2912e87a | Mans Rullgard | * License along with Libav; if not, write to the Free Software
|
18 | 04d7f601 | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
19 | */
|
||
20 | 98790382 | Stefano Sabatini | #ifndef AVFORMAT_AVIO_H
|
21 | #define AVFORMAT_AVIO_H
|
||
22 | f031df23 | Fabrice Bellard | |
23 | aafe9b63 | Stefano Sabatini | /**
|
24 | ba87f080 | Diego Biurrun | * @file
|
25 | 6084ee5d | Anton Khirnov | * Buffered I/O operations
|
26 | aafe9b63 | Stefano Sabatini | */
|
27 | |||
28 | 99545457 | Måns Rullgård | #include <stdint.h> |
29 | |||
30 | 30f68128 | Diego Biurrun | #include "libavutil/common.h" |
31 | ed8d5766 | Martin Storsjö | #include "libavutil/log.h" |
32 | 30f68128 | Diego Biurrun | |
33 | 50196a98 | Anton Khirnov | #include "libavformat/version.h" |
34 | |||
35 | fafa7290 | Anton Khirnov | |
36 | #define AVIO_SEEKABLE_NORMAL 0x0001 /**< Seeking works like for a local file */ |
||
37 | |||
38 | /**
|
||
39 | * Bytestream IO Context.
|
||
40 | * New fields can be added to the end with minor version bumps.
|
||
41 | * Removal, reordering and changes to existing fields require a major
|
||
42 | * version bump.
|
||
43 | * sizeof(AVIOContext) must not be used outside libav*.
|
||
44 | */
|
||
45 | typedef struct { |
||
46 | c1a9012d | Anton Khirnov | unsigned char *buffer; /**< Start of the buffer. */ |
47 | int buffer_size; /**< Maximum buffer size */ |
||
48 | unsigned char *buf_ptr; /**< Current position in the buffer */ |
||
49 | unsigned char *buf_end; /**< End of the data, may be less than |
||
50 | buffer+buffer_size if the read function returned
|
||
51 | less data than requested, e.g. for streams where
|
||
52 | no more data has been received yet. */
|
||
53 | void *opaque; /**< A private pointer, passed to the read/write/seek/... |
||
54 | functions. */
|
||
55 | fafa7290 | Anton Khirnov | int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); |
56 | int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); |
||
57 | int64_t (*seek)(void *opaque, int64_t offset, int whence); |
||
58 | 893816ba | Anton Khirnov | int64_t pos; /**< position in the file of the current buffer */
|
59 | int must_flush; /**< true if the next seek should flush */ |
||
60 | int eof_reached; /**< true if eof reached */ |
||
61 | int write_flag; /**< true if open for writing */ |
||
62 | fafa7290 | Anton Khirnov | #if FF_API_OLD_AVIO
|
63 | attribute_deprecated int is_streamed;
|
||
64 | #endif
|
||
65 | int max_packet_size;
|
||
66 | unsigned long checksum; |
||
67 | unsigned char *checksum_ptr; |
||
68 | unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); |
||
69 | 893816ba | Anton Khirnov | int error; /**< contains the error code or 0 if no error happened */ |
70 | fafa7290 | Anton Khirnov | int (*read_pause)(void *opaque, int pause); |
71 | int64_t (*read_seek)(void *opaque, int stream_index, |
||
72 | int64_t timestamp, int flags);
|
||
73 | /**
|
||
74 | * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
|
||
75 | */
|
||
76 | int seekable;
|
||
77 | } AVIOContext; |
||
78 | |||
79 | de6d9b64 | Fabrice Bellard | /* unbuffered I/O */
|
80 | |||
81 | c486dade | Anton Khirnov | #if FF_API_OLD_AVIO
|
82 | 1308f273 | Michael Niedermayer | /**
|
83 | * URL Context.
|
||
84 | * New fields can be added to the end with minor version bumps.
|
||
85 | 8bfb108b | Diego Biurrun | * Removal, reordering and changes to existing fields require a major
|
86 | 1308f273 | Michael Niedermayer | * version bump.
|
87 | 8bfb108b | Diego Biurrun | * sizeof(URLContext) must not be used outside libav*.
|
88 | c486dade | Anton Khirnov | * @deprecated This struct will be made private
|
89 | 1308f273 | Michael Niedermayer | */
|
90 | 597b4b3f | Stefano Sabatini | typedef struct URLContext { |
91 | 404eba44 | Aurelien Jacobs | #if FF_API_URL_CLASS
|
92 | 5acef35f | Björn Axelsson | const AVClass *av_class; ///< information for av_log(). Set by url_open(). |
93 | #endif
|
||
94 | de6d9b64 | Fabrice Bellard | struct URLProtocol *prot;
|
95 | 115329f1 | Diego Biurrun | int flags;
|
96 | c3316802 | Panagiotis Issaris | int is_streamed; /**< true if streamed (no seek possible), default = false */ |
97 | int max_packet_size; /**< if non zero, the stream is packetized with this max packet size */ |
||
98 | de6d9b64 | Fabrice Bellard | void *priv_data;
|
99 | 725b3da9 | Stefano Sabatini | char *filename; /**< specified URL */ |
100 | ffbb289a | Martin Storsjö | int is_connected;
|
101 | 597b4b3f | Stefano Sabatini | } URLContext; |
102 | de6d9b64 | Fabrice Bellard | |
103 | 37744e32 | Anton Khirnov | #define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */ |
104 | |||
105 | /**
|
||
106 | * @deprecated This struct is to be made private. Use the higher-level
|
||
107 | * AVIOContext-based API instead.
|
||
108 | */
|
||
109 | typedef struct URLProtocol { |
||
110 | const char *name; |
||
111 | int (*url_open)(URLContext *h, const char *url, int flags); |
||
112 | int (*url_read)(URLContext *h, unsigned char *buf, int size); |
||
113 | int (*url_write)(URLContext *h, const unsigned char *buf, int size); |
||
114 | int64_t (*url_seek)(URLContext *h, int64_t pos, int whence);
|
||
115 | int (*url_close)(URLContext *h);
|
||
116 | struct URLProtocol *next;
|
||
117 | int (*url_read_pause)(URLContext *h, int pause); |
||
118 | int64_t (*url_read_seek)(URLContext *h, int stream_index,
|
||
119 | int64_t timestamp, int flags);
|
||
120 | int (*url_get_file_handle)(URLContext *h);
|
||
121 | int priv_data_size;
|
||
122 | const AVClass *priv_data_class;
|
||
123 | int flags;
|
||
124 | } URLProtocol; |
||
125 | |||
126 | de6d9b64 | Fabrice Bellard | typedef struct URLPollEntry { |
127 | URLContext *handle; |
||
128 | int events;
|
||
129 | int revents;
|
||
130 | } URLPollEntry; |
||
131 | |||
132 | 37744e32 | Anton Khirnov | /* not implemented */
|
133 | attribute_deprecated int url_poll(URLPollEntry *poll_table, int n, int timeout); |
||
134 | |||
135 | fe174fc8 | Nicolas George | /**
|
136 | * @defgroup open_modes URL open modes
|
||
137 | * The flags argument to url_open and cosins must be one of the following
|
||
138 | * constants, optionally ORed with other flags.
|
||
139 | * @{
|
||
140 | */
|
||
141 | #define URL_RDONLY 0 /**< read-only */ |
||
142 | #define URL_WRONLY 1 /**< write-only */ |
||
143 | #define URL_RDWR 2 /**< read-write */ |
||
144 | /**
|
||
145 | * @}
|
||
146 | */
|
||
147 | |||
148 | /**
|
||
149 | * Use non-blocking mode.
|
||
150 | * If this flag is set, operations on the context will return
|
||
151 | * AVERROR(EAGAIN) if they can not be performed immediately.
|
||
152 | * If this flag is not set, operations on the context will never return
|
||
153 | * AVERROR(EAGAIN).
|
||
154 | * Note that this flag does not affect the opening/connecting of the
|
||
155 | * context. Connecting a protocol will always block if necessary (e.g. on
|
||
156 | * network protocols) but never hang (e.g. on busy devices).
|
||
157 | * Warning: non-blocking protocols is work-in-progress; this flag may be
|
||
158 | * silently ignored.
|
||
159 | */
|
||
160 | #define URL_FLAG_NONBLOCK 4 |
||
161 | f031df23 | Fabrice Bellard | |
162 | 019ac05a | Fabrice Bellard | typedef int URLInterruptCB(void); |
163 | 37744e32 | Anton Khirnov | extern URLInterruptCB *url_interrupt_cb;
|
164 | 019ac05a | Fabrice Bellard | |
165 | 333146dd | Stefano Sabatini | /**
|
166 | 333e8943 | Anton Khirnov | * @defgroup old_url_funcs Old url_* functions
|
167 | * @deprecated use the buffered API based on AVIOContext instead
|
||
168 | * @{
|
||
169 | 333146dd | Stefano Sabatini | */
|
170 | 333e8943 | Anton Khirnov | attribute_deprecated int url_open_protocol (URLContext **puc, struct URLProtocol *up, |
171 | const char *url, int flags); |
||
172 | 5652bb94 | Anton Khirnov | attribute_deprecated int url_alloc(URLContext **h, const char *url, int flags); |
173 | 62eaaeac | Anton Khirnov | attribute_deprecated int url_connect(URLContext *h);
|
174 | 0589da0a | Anton Khirnov | attribute_deprecated int url_open(URLContext **h, const char *url, int flags); |
175 | bc371aca | Anton Khirnov | attribute_deprecated int url_read(URLContext *h, unsigned char *buf, int size); |
176 | dce37564 | Anton Khirnov | attribute_deprecated int url_read_complete(URLContext *h, unsigned char *buf, int size); |
177 | 925e908b | Anton Khirnov | attribute_deprecated int url_write(URLContext *h, const unsigned char *buf, int size); |
178 | 58a48c65 | Anton Khirnov | attribute_deprecated int64_t url_seek(URLContext *h, int64_t pos, int whence);
|
179 | e52a9145 | Anton Khirnov | attribute_deprecated int url_close(URLContext *h);
|
180 | 32a97d46 | Anton Khirnov | attribute_deprecated int64_t url_filesize(URLContext *h); |
181 | 1869ea03 | Anton Khirnov | attribute_deprecated int url_get_file_handle(URLContext *h);
|
182 | 5958df34 | Anton Khirnov | attribute_deprecated int url_get_max_packet_size(URLContext *h);
|
183 | 727c7aa0 | Anton Khirnov | attribute_deprecated void url_get_filename(URLContext *h, char *buf, int buf_size); |
184 | fa104e14 | Anton Khirnov | attribute_deprecated int av_url_read_pause(URLContext *h, int pause); |
185 | 1305d93c | Anton Khirnov | attribute_deprecated int64_t av_url_read_seek(URLContext *h, int stream_index,
|
186 | int64_t timestamp, int flags);
|
||
187 | 026e1757 | Anton Khirnov | attribute_deprecated void url_set_interrupt_cb(int (*interrupt_cb)(void)); |
188 | 9075d1e0 | Stefano Sabatini | /**
|
189 | * If protocol is NULL, returns the first registered protocol,
|
||
190 | c1b02101 | Stefano Sabatini | * if protocol is non-NULL, returns the next registered protocol after protocol,
|
191 | 9075d1e0 | Stefano Sabatini | * or NULL if protocol is the last one.
|
192 | */
|
||
193 | cdc6a87f | Anton Khirnov | attribute_deprecated URLProtocol *av_protocol_next(URLProtocol *p); |
194 | d19a046e | Stefano Sabatini | /**
|
195 | 49bd8e4b | Måns Rullgård | * Register the URLProtocol protocol.
|
196 | 9b07a2dc | Martin Storsjö | *
|
197 | * @param size the size of the URLProtocol struct referenced
|
||
198 | d19a046e | Stefano Sabatini | */
|
199 | 8e76a19b | Anton Khirnov | attribute_deprecated int av_register_protocol2(URLProtocol *protocol, int size); |
200 | 1308f273 | Michael Niedermayer | /**
|
201 | 333e8943 | Anton Khirnov | * @}
|
202 | */
|
||
203 | |||
204 | 37744e32 | Anton Khirnov | |
205 | ae628ec1 | Anton Khirnov | typedef attribute_deprecated AVIOContext ByteIOContext;
|
206 | |||
207 | e731b8d8 | Anton Khirnov | attribute_deprecated int init_put_byte(AVIOContext *s,
|
208 | de6d9b64 | Fabrice Bellard | unsigned char *buffer, |
209 | int buffer_size,
|
||
210 | int write_flag,
|
||
211 | void *opaque,
|
||
212 | 1e0f3468 | Reimar Döffinger | int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), |
213 | int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), |
||
214 | bc5c918e | Diego Biurrun | int64_t (*seek)(void *opaque, int64_t offset, int whence)); |
215 | 8d9ac969 | Anton Khirnov | attribute_deprecated AVIOContext *av_alloc_put_byte( |
216 | unsigned char *buffer, |
||
217 | int buffer_size,
|
||
218 | int write_flag,
|
||
219 | void *opaque,
|
||
220 | int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), |
||
221 | int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), |
||
222 | int64_t (*seek)(void *opaque, int64_t offset, int whence)); |
||
223 | b7effd4e | Anton Khirnov | |
224 | /**
|
||
225 | * @defgroup old_avio_funcs Old put_/get_*() functions
|
||
226 | * @deprecated use the avio_ -prefixed functions instead.
|
||
227 | * @{
|
||
228 | */
|
||
229 | attribute_deprecated int get_buffer(AVIOContext *s, unsigned char *buf, int size); |
||
230 | b3db9cee | Anton Khirnov | attribute_deprecated int get_partial_buffer(AVIOContext *s, unsigned char *buf, int size); |
231 | b7effd4e | Anton Khirnov | attribute_deprecated int get_byte(AVIOContext *s);
|
232 | attribute_deprecated unsigned int get_le16(AVIOContext *s); |
||
233 | attribute_deprecated unsigned int get_le24(AVIOContext *s); |
||
234 | attribute_deprecated unsigned int get_le32(AVIOContext *s); |
||
235 | attribute_deprecated uint64_t get_le64(AVIOContext *s); |
||
236 | attribute_deprecated unsigned int get_be16(AVIOContext *s); |
||
237 | attribute_deprecated unsigned int get_be24(AVIOContext *s); |
||
238 | attribute_deprecated unsigned int get_be32(AVIOContext *s); |
||
239 | attribute_deprecated uint64_t get_be64(AVIOContext *s); |
||
240 | 77eb5504 | Anton Khirnov | |
241 | attribute_deprecated void put_byte(AVIOContext *s, int b); |
||
242 | 0ac8e2bf | Anton Khirnov | attribute_deprecated void put_nbyte(AVIOContext *s, int b, int count); |
243 | 77eb5504 | Anton Khirnov | attribute_deprecated void put_buffer(AVIOContext *s, const unsigned char *buf, int size); |
244 | attribute_deprecated void put_le64(AVIOContext *s, uint64_t val);
|
||
245 | attribute_deprecated void put_be64(AVIOContext *s, uint64_t val);
|
||
246 | attribute_deprecated void put_le32(AVIOContext *s, unsigned int val); |
||
247 | attribute_deprecated void put_be32(AVIOContext *s, unsigned int val); |
||
248 | attribute_deprecated void put_le24(AVIOContext *s, unsigned int val); |
||
249 | attribute_deprecated void put_be24(AVIOContext *s, unsigned int val); |
||
250 | attribute_deprecated void put_le16(AVIOContext *s, unsigned int val); |
||
251 | attribute_deprecated void put_be16(AVIOContext *s, unsigned int val); |
||
252 | 61840b43 | Anton Khirnov | attribute_deprecated void put_tag(AVIOContext *s, const char *tag); |
253 | b7effd4e | Anton Khirnov | /**
|
254 | * @}
|
||
255 | */
|
||
256 | 22a3212e | Anton Khirnov | |
257 | 933e90a6 | Anton Khirnov | attribute_deprecated int av_url_read_fpause(AVIOContext *h, int pause); |
258 | 491653ed | Anton Khirnov | attribute_deprecated int64_t av_url_read_fseek (AVIOContext *h, int stream_index,
|
259 | 933e90a6 | Anton Khirnov | int64_t timestamp, int flags);
|
260 | 22a3212e | Anton Khirnov | |
261 | /**
|
||
262 | * @defgroup old_url_f_funcs Old url_f* functions
|
||
263 | * @deprecated use the avio_ -prefixed functions instead.
|
||
264 | * @{
|
||
265 | */
|
||
266 | attribute_deprecated int url_fopen( AVIOContext **s, const char *url, int flags); |
||
267 | attribute_deprecated int url_fclose(AVIOContext *s);
|
||
268 | 6b4aa5da | Anton Khirnov | attribute_deprecated int64_t url_fseek(AVIOContext *s, int64_t offset, int whence);
|
269 | 0300db8a | Anton Khirnov | attribute_deprecated int url_fskip(AVIOContext *s, int64_t offset);
|
270 | a2704c97 | Anton Khirnov | attribute_deprecated int64_t url_ftell(AVIOContext *s); |
271 | 76aa876e | Anton Khirnov | attribute_deprecated int64_t url_fsize(AVIOContext *s); |
272 | e5197539 | Anton Khirnov | #define URL_EOF (-1) |
273 | attribute_deprecated int url_fgetc(AVIOContext *s);
|
||
274 | 59f65d95 | Anton Khirnov | attribute_deprecated int url_setbufsize(AVIOContext *s, int buf_size); |
275 | d9d86e00 | Anton Khirnov | #ifdef __GNUC__
|
276 | attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); |
||
277 | #else
|
||
278 | attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...); |
||
279 | #endif
|
||
280 | b7f2fdde | Anton Khirnov | attribute_deprecated void put_flush_packet(AVIOContext *s);
|
281 | b92c5452 | Anton Khirnov | attribute_deprecated int url_open_dyn_buf(AVIOContext **s);
|
282 | 403ee835 | Anton Khirnov | attribute_deprecated int url_open_dyn_packet_buf(AVIOContext **s, int max_packet_size); |
283 | 6dc7d80d | Anton Khirnov | attribute_deprecated int url_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
|
284 | 724f6a0f | Anton Khirnov | attribute_deprecated int url_fdopen(AVIOContext **s, URLContext *h);
|
285 | 22a3212e | Anton Khirnov | /**
|
286 | * @}
|
||
287 | */
|
||
288 | 66e5b1df | Anton Khirnov | |
289 | /**
|
||
290 | * @deprecated use AVIOContext.eof_reached
|
||
291 | */
|
||
292 | attribute_deprecated int url_feof(AVIOContext *s);
|
||
293 | 3e68b3ba | Anton Khirnov | attribute_deprecated int url_ferror(AVIOContext *s);
|
294 | 4ec153bb | Anton Khirnov | |
295 | attribute_deprecated int udp_set_remote_url(URLContext *h, const char *uri); |
||
296 | attribute_deprecated int udp_get_local_port(URLContext *h);
|
||
297 | 4c4427a7 | Anton Khirnov | |
298 | attribute_deprecated void init_checksum(AVIOContext *s,
|
||
299 | unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), |
||
300 | unsigned long checksum); |
||
301 | b64030f2 | Anton Khirnov | attribute_deprecated unsigned long get_checksum(AVIOContext *s); |
302 | 37744e32 | Anton Khirnov | attribute_deprecated void put_strz(AVIOContext *s, const char *buf); |
303 | /** @note unlike fgets, the EOL character is not returned and a whole
|
||
304 | line is parsed. return NULL if first char read was EOF */
|
||
305 | attribute_deprecated char *url_fgets(AVIOContext *s, char *buf, int buf_size); |
||
306 | /**
|
||
307 | * @deprecated use avio_get_str instead
|
||
308 | */
|
||
309 | attribute_deprecated char *get_strz(AVIOContext *s, char *buf, int maxlen); |
||
310 | /**
|
||
311 | * @deprecated Use AVIOContext.seekable field directly.
|
||
312 | */
|
||
313 | attribute_deprecated static inline int url_is_streamed(AVIOContext *s) |
||
314 | { |
||
315 | return !s->seekable;
|
||
316 | } |
||
317 | attribute_deprecated URLContext *url_fileno(AVIOContext *s); |
||
318 | |||
319 | /**
|
||
320 | * @deprecated use AVIOContext.max_packet_size directly.
|
||
321 | */
|
||
322 | attribute_deprecated int url_fget_max_packet_size(AVIOContext *s);
|
||
323 | |||
324 | attribute_deprecated int url_open_buf(AVIOContext **s, uint8_t *buf, int buf_size, int flags); |
||
325 | |||
326 | /** return the written or read size */
|
||
327 | attribute_deprecated int url_close_buf(AVIOContext *s);
|
||
328 | #endif // FF_API_OLD_AVIO |
||
329 | |||
330 | /**
|
||
331 | * Return a non-zero value if the resource indicated by url
|
||
332 | * exists, 0 otherwise.
|
||
333 | */
|
||
334 | int url_exist(const char *url); |
||
335 | |||
336 | /**
|
||
337 | * The callback is called in blocking functions to test regulary if
|
||
338 | * asynchronous interruption is needed. AVERROR_EXIT is returned
|
||
339 | * in this case by the interrupted function. 'NULL' means no interrupt
|
||
340 | * callback is given.
|
||
341 | */
|
||
342 | void avio_set_interrupt_cb(int (*interrupt_cb)(void)); |
||
343 | |||
344 | #if FF_API_REGISTER_PROTOCOL
|
||
345 | extern URLProtocol *first_protocol;
|
||
346 | #endif
|
||
347 | |||
348 | #if FF_API_REGISTER_PROTOCOL
|
||
349 | /**
|
||
350 | * @deprecated Use av_register_protocol() instead.
|
||
351 | */
|
||
352 | attribute_deprecated int register_protocol(URLProtocol *protocol);
|
||
353 | |||
354 | /**
|
||
355 | * @deprecated Use av_register_protocol2() instead.
|
||
356 | */
|
||
357 | attribute_deprecated int av_register_protocol(URLProtocol *protocol);
|
||
358 | e731b8d8 | Anton Khirnov | #endif
|
359 | 8d9ac969 | Anton Khirnov | |
360 | 3c96c648 | Anton Khirnov | /**
|
361 | * Allocate and initialize an AVIOContext for buffered I/O. It must be later
|
||
362 | * freed with av_free().
|
||
363 | *
|
||
364 | * @param buffer Memory block for input/output operations via AVIOContext.
|
||
365 | * @param buffer_size The buffer size is very important for performance.
|
||
366 | * For protocols with fixed blocksize it should be set to this blocksize.
|
||
367 | * For others a typical size is a cache page, e.g. 4kb.
|
||
368 | * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise.
|
||
369 | * @param opaque An opaque pointer to user-specific data.
|
||
370 | * @param read_packet A function for refilling the buffer, may be NULL.
|
||
371 | * @param write_packet A function for writing the buffer contents, may be NULL.
|
||
372 | * @param seek A function for seeking to specified byte position, may be NULL.
|
||
373 | *
|
||
374 | * @return Allocated AVIOContext or NULL on failure.
|
||
375 | */
|
||
376 | 8d9ac969 | Anton Khirnov | AVIOContext *avio_alloc_context( |
377 | 1e0f3468 | Reimar Döffinger | unsigned char *buffer, |
378 | int buffer_size,
|
||
379 | int write_flag,
|
||
380 | void *opaque,
|
||
381 | 0c1a9eda | Zdenek Kabelac | int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), |
382 | 576ae256 | Michael Niedermayer | int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), |
383 | bc5c918e | Diego Biurrun | int64_t (*seek)(void *opaque, int64_t offset, int whence)); |
384 | de6d9b64 | Fabrice Bellard | |
385 | 77eb5504 | Anton Khirnov | void avio_w8(AVIOContext *s, int b); |
386 | void avio_write(AVIOContext *s, const unsigned char *buf, int size); |
||
387 | void avio_wl64(AVIOContext *s, uint64_t val);
|
||
388 | void avio_wb64(AVIOContext *s, uint64_t val);
|
||
389 | void avio_wl32(AVIOContext *s, unsigned int val); |
||
390 | void avio_wb32(AVIOContext *s, unsigned int val); |
||
391 | void avio_wl24(AVIOContext *s, unsigned int val); |
||
392 | void avio_wb24(AVIOContext *s, unsigned int val); |
||
393 | void avio_wl16(AVIOContext *s, unsigned int val); |
||
394 | void avio_wb16(AVIOContext *s, unsigned int val); |
||
395 | de6d9b64 | Fabrice Bellard | |
396 | 4efd5cf3 | Anton Khirnov | /**
|
397 | * Write a NULL-terminated string.
|
||
398 | * @return number of bytes written.
|
||
399 | */
|
||
400 | ae628ec1 | Anton Khirnov | int avio_put_str(AVIOContext *s, const char *str); |
401 | 75bdb984 | Philip Gladstone | |
402 | 67e21020 | Michael Niedermayer | /**
|
403 | dccbd97d | Anton Khirnov | * Convert an UTF-8 string to UTF-16LE and write it.
|
404 | * @return number of bytes written.
|
||
405 | */
|
||
406 | ae628ec1 | Anton Khirnov | int avio_put_str16le(AVIOContext *s, const char *str); |
407 | dccbd97d | Anton Khirnov | |
408 | /**
|
||
409 | 230a4686 | Anton Khirnov | * Passing this as the "whence" parameter to a seek function causes it to
|
410 | * return the filesize without seeking anywhere. Supporting this is optional.
|
||
411 | * If it is not supported then the seek function will return <0.
|
||
412 | */
|
||
413 | #define AVSEEK_SIZE 0x10000 |
||
414 | |||
415 | /**
|
||
416 | * Oring this flag as into the "whence" parameter to a seek function causes it to
|
||
417 | * seek by any means (like reopening and linear reading) or other normally unreasonble
|
||
418 | * means that can be extreemly slow.
|
||
419 | * This may be ignored by the seek code.
|
||
420 | */
|
||
421 | #define AVSEEK_FORCE 0x20000 |
||
422 | |||
423 | /**
|
||
424 | ae628ec1 | Anton Khirnov | * fseek() equivalent for AVIOContext.
|
425 | 67e21020 | Michael Niedermayer | * @return new position or AVERROR.
|
426 | */
|
||
427 | 6b4aa5da | Anton Khirnov | int64_t avio_seek(AVIOContext *s, int64_t offset, int whence);
|
428 | 67e21020 | Michael Niedermayer | |
429 | /**
|
||
430 | 2af07d36 | Peter Ross | * Skip given number of bytes forward
|
431 | * @return new position or AVERROR.
|
||
432 | */
|
||
433 | af020732 | Anton Khirnov | static av_always_inline int64_t avio_skip(AVIOContext *s, int64_t offset)
|
434 | { |
||
435 | return avio_seek(s, offset, SEEK_CUR);
|
||
436 | } |
||
437 | 2af07d36 | Peter Ross | |
438 | /**
|
||
439 | ae628ec1 | Anton Khirnov | * ftell() equivalent for AVIOContext.
|
440 | 67e21020 | Michael Niedermayer | * @return position or AVERROR.
|
441 | */
|
||
442 | af020732 | Anton Khirnov | static av_always_inline int64_t avio_tell(AVIOContext *s)
|
443 | { |
||
444 | return avio_seek(s, 0, SEEK_CUR); |
||
445 | } |
||
446 | 67e21020 | Michael Niedermayer | |
447 | /**
|
||
448 | 49bd8e4b | Måns Rullgård | * Get the filesize.
|
449 | 67e21020 | Michael Niedermayer | * @return filesize or AVERROR
|
450 | */
|
||
451 | 76aa876e | Anton Khirnov | int64_t avio_size(AVIOContext *s); |
452 | 67e21020 | Michael Niedermayer | |
453 | c3316802 | Panagiotis Issaris | /** @warning currently size is limited */
|
454 | 572f992e | Michael Niedermayer | #ifdef __GNUC__
|
455 | d9d86e00 | Anton Khirnov | int avio_printf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); |
456 | 572f992e | Michael Niedermayer | #else
|
457 | d9d86e00 | Anton Khirnov | int avio_printf(AVIOContext *s, const char *fmt, ...); |
458 | 572f992e | Michael Niedermayer | #endif
|
459 | a8c5ab27 | Panagiotis Issaris | |
460 | b7f2fdde | Anton Khirnov | void avio_flush(AVIOContext *s);
|
461 | de6d9b64 | Fabrice Bellard | |
462 | 4edfcecc | Michael Niedermayer | |
463 | /**
|
||
464 | ae628ec1 | Anton Khirnov | * Read size bytes from AVIOContext into buf.
|
465 | 32e543f8 | Benoit Fouet | * @return number of bytes read or AVERROR
|
466 | 4edfcecc | Michael Niedermayer | */
|
467 | b7effd4e | Anton Khirnov | int avio_read(AVIOContext *s, unsigned char *buf, int size); |
468 | 4edfcecc | Michael Niedermayer | |
469 | 72d4405b | Anton Khirnov | /**
|
470 | * @defgroup avio_read Functions for reading from AVIOContext.
|
||
471 | * @{
|
||
472 | *
|
||
473 | * @note return 0 if EOF, so you cannot use it if EOF handling is
|
||
474 | * necessary
|
||
475 | */
|
||
476 | b7effd4e | Anton Khirnov | int avio_r8 (AVIOContext *s);
|
477 | unsigned int avio_rl16(AVIOContext *s); |
||
478 | unsigned int avio_rl24(AVIOContext *s); |
||
479 | unsigned int avio_rl32(AVIOContext *s); |
||
480 | uint64_t avio_rl64(AVIOContext *s); |
||
481 | 72d4405b | Anton Khirnov | unsigned int avio_rb16(AVIOContext *s); |
482 | unsigned int avio_rb24(AVIOContext *s); |
||
483 | unsigned int avio_rb32(AVIOContext *s); |
||
484 | uint64_t avio_rb64(AVIOContext *s); |
||
485 | /**
|
||
486 | * @}
|
||
487 | */
|
||
488 | de6d9b64 | Fabrice Bellard | |
489 | 93b78d12 | Anton Khirnov | /**
|
490 | 41d8555f | Reimar Döffinger | * Read a string from pb into buf. The reading will terminate when either
|
491 | * a NULL character was encountered, maxlen bytes have been read, or nothing
|
||
492 | * more can be read from pb. The result is guaranteed to be NULL-terminated, it
|
||
493 | * will be truncated if buf is too small.
|
||
494 | * Note that the string is not interpreted or validated in any way, it
|
||
495 | * might get truncated in the middle of a sequence for multi-byte encodings.
|
||
496 | *
|
||
497 | * @return number of bytes read (is always <= maxlen).
|
||
498 | * If reading ends on EOF or error, the return value will be one more than
|
||
499 | * bytes actually read.
|
||
500 | */
|
||
501 | int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen); |
||
502 | |||
503 | /**
|
||
504 | 93b78d12 | Anton Khirnov | * Read a UTF-16 string from pb and convert it to UTF-8.
|
505 | * The reading will terminate when either a null or invalid character was
|
||
506 | * encountered or maxlen bytes have been read.
|
||
507 | * @return number of bytes read (is always <= maxlen)
|
||
508 | */
|
||
509 | ae628ec1 | Anton Khirnov | int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen); |
510 | int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen); |
||
511 | 93b78d12 | Anton Khirnov | |
512 | de6d9b64 | Fabrice Bellard | |
513 | 364cacc7 | Aurelien Jacobs | #if FF_API_URL_RESETBUF
|
514 | 770d9daf | Björn Axelsson | /** Reset the buffer for reading or writing.
|
515 | * @note Will drop any data currently in the buffer without transmitting it.
|
||
516 | * @param flags URL_RDONLY to set up the buffer for reading, or URL_WRONLY
|
||
517 | * to set up the buffer for writing. */
|
||
518 | ae628ec1 | Anton Khirnov | int url_resetbuf(AVIOContext *s, int flags); |
519 | 08580cb0 | Benoit Fouet | #endif
|
520 | a8c5ab27 | Panagiotis Issaris | |
521 | fe4fbb58 | Stefano Sabatini | /**
|
522 | f87b1b37 | Anton Khirnov | * @defgroup open_modes URL open modes
|
523 | * The flags argument to avio_open must be one of the following
|
||
524 | * constants, optionally ORed with other flags.
|
||
525 | * @{
|
||
526 | */
|
||
527 | #define AVIO_RDONLY 0 /**< read-only */ |
||
528 | #define AVIO_WRONLY 1 /**< write-only */ |
||
529 | #define AVIO_RDWR 2 /**< read-write */ |
||
530 | /**
|
||
531 | * @}
|
||
532 | */
|
||
533 | |||
534 | /**
|
||
535 | * Use non-blocking mode.
|
||
536 | * If this flag is set, operations on the context will return
|
||
537 | * AVERROR(EAGAIN) if they can not be performed immediately.
|
||
538 | * If this flag is not set, operations on the context will never return
|
||
539 | * AVERROR(EAGAIN).
|
||
540 | * Note that this flag does not affect the opening/connecting of the
|
||
541 | * context. Connecting a protocol will always block if necessary (e.g. on
|
||
542 | * network protocols) but never hang (e.g. on busy devices).
|
||
543 | * Warning: non-blocking protocols is work-in-progress; this flag may be
|
||
544 | * silently ignored.
|
||
545 | */
|
||
546 | #define AVIO_FLAG_NONBLOCK 4 |
||
547 | |||
548 | /**
|
||
549 | ae628ec1 | Anton Khirnov | * Create and initialize a AVIOContext for accessing the
|
550 | fe4fbb58 | Stefano Sabatini | * resource indicated by url.
|
551 | * @note When the resource indicated by url has been opened in
|
||
552 | ae628ec1 | Anton Khirnov | * read+write mode, the AVIOContext can be used only for writing.
|
553 | fe4fbb58 | Stefano Sabatini | *
|
554 | ae628ec1 | Anton Khirnov | * @param s Used to return the pointer to the created AVIOContext.
|
555 | fe4fbb58 | Stefano Sabatini | * In case of failure the pointed to value is set to NULL.
|
556 | * @param flags flags which control how the resource indicated by url
|
||
557 | * is to be opened
|
||
558 | * @return 0 in case of success, a negative value corresponding to an
|
||
559 | * AVERROR code in case of failure
|
||
560 | */
|
||
561 | 22a3212e | Anton Khirnov | int avio_open(AVIOContext **s, const char *url, int flags); |
562 | fe4fbb58 | Stefano Sabatini | |
563 | e782a0c6 | Anton Khirnov | /**
|
564 | * Close the resource accessed by the AVIOContext s and free it.
|
||
565 | * This function can only be used if s was opened by avio_open().
|
||
566 | *
|
||
567 | * @return 0 on success, an AVERROR < 0 on error.
|
||
568 | */
|
||
569 | 22a3212e | Anton Khirnov | int avio_close(AVIOContext *s);
|
570 | a8c5ab27 | Panagiotis Issaris | |
571 | c3316802 | Panagiotis Issaris | /**
|
572 | a8c5ab27 | Panagiotis Issaris | * Open a write only memory stream.
|
573 | *
|
||
574 | * @param s new IO context
|
||
575 | * @return zero if no error.
|
||
576 | */
|
||
577 | b92c5452 | Anton Khirnov | int avio_open_dyn_buf(AVIOContext **s);
|
578 | a8c5ab27 | Panagiotis Issaris | |
579 | c3316802 | Panagiotis Issaris | /**
|
580 | a8c5ab27 | Panagiotis Issaris | * Return the written size and a pointer to the buffer. The buffer
|
581 | 403ee835 | Anton Khirnov | * must be freed with av_free().
|
582 | * Padding of FF_INPUT_BUFFER_PADDING_SIZE is added to the buffer.
|
||
583 | de1807bb | Josh Allmann | *
|
584 | a8c5ab27 | Panagiotis Issaris | * @param s IO context
|
585 | e8b7c70f | Panagiotis Issaris | * @param pbuffer pointer to a byte buffer
|
586 | a8c5ab27 | Panagiotis Issaris | * @return the length of the byte buffer
|
587 | */
|
||
588 | 6dc7d80d | Anton Khirnov | int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
|
589 | f031df23 | Fabrice Bellard | |
590 | 8ef30ac1 | Aurelien Jacobs | #if FF_API_UDP_GET_FILE
|
591 | f031df23 | Fabrice Bellard | int udp_get_file_handle(URLContext *h);
|
592 | f0a80394 | Ronald S. Bultje | #endif
|
593 | f031df23 | Fabrice Bellard | |
594 | f8270bbf | Anton Khirnov | /**
|
595 | * Iterate through names of available protocols.
|
||
596 | *
|
||
597 | * @param opaque A private pointer representing current protocol.
|
||
598 | * It must be a pointer to NULL on first iteration and will
|
||
599 | * be updated by successive calls to avio_enum_protocols.
|
||
600 | * @param output If set to 1, iterate over output protocols,
|
||
601 | * otherwise over input protocols.
|
||
602 | *
|
||
603 | * @return A static string containing the name of current protocol or NULL
|
||
604 | */
|
||
605 | const char *avio_enum_protocols(void **opaque, int output); |
||
606 | |||
607 | 98790382 | Stefano Sabatini | #endif /* AVFORMAT_AVIO_H */ |