avio.h 21.4 KB
Newer Older
1 2 3
/*
 * copyright (c) 2001 Fabrice Bellard
 *
4
 * This file is part of Libav.
5
 *
6
 * Libav is free software; you can redistribute it and/or
7 8
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * Libav is distributed in the hope that it will be useful,
12 13 14 15 16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with Libav; if not, write to the Free Software
18 19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */
20 21
#ifndef AVFORMAT_AVIO_H
#define AVFORMAT_AVIO_H
22

23
/**
24
 * @file
Anton Khirnov's avatar
Anton Khirnov committed
25
 * Buffered I/O operations
26 27
 */

28 29
#include <stdint.h>

30
#include "libavutil/common.h"
31
#include "libavutil/log.h"
32

33 34
#include "libavformat/version.h"

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

#define AVIO_SEEKABLE_NORMAL 0x0001 /**< Seeking works like for a local file */

/**
 * Bytestream IO Context.
 * New fields can be added to the end with minor version bumps.
 * Removal, reordering and changes to existing fields require a major
 * version bump.
 * sizeof(AVIOContext) must not be used outside libav*.
 */
typedef struct {
    unsigned char *buffer;
    int buffer_size;
    unsigned char *buf_ptr, *buf_end;
    void *opaque;
    int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
    int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
    int64_t (*seek)(void *opaque, int64_t offset, int whence);
    int64_t pos; /**< position in the file of the current buffer */
    int must_flush; /**< true if the next seek should flush */
    int eof_reached; /**< true if eof reached */
    int write_flag;  /**< true if open for writing */
#if FF_API_OLD_AVIO
    attribute_deprecated int is_streamed;
#endif
    int max_packet_size;
    unsigned long checksum;
    unsigned char *checksum_ptr;
    unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
    int error;         ///< contains the error code or 0 if no error happened
    int (*read_pause)(void *opaque, int pause);
    int64_t (*read_seek)(void *opaque, int stream_index,
                         int64_t timestamp, int flags);
    /**
     * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
     */
    int seekable;
} AVIOContext;

Fabrice Bellard's avatar
Fabrice Bellard committed
74 75
/* unbuffered I/O */

76
#if FF_API_OLD_AVIO
77 78 79
/**
 * URL Context.
 * New fields can be added to the end with minor version bumps.
Diego Biurrun's avatar
Diego Biurrun committed
80
 * Removal, reordering and changes to existing fields require a major
81
 * version bump.
Diego Biurrun's avatar
Diego Biurrun committed
82
 * sizeof(URLContext) must not be used outside libav*.
83
 * @deprecated This struct will be made private
84
 */
85
typedef struct URLContext {
86
#if FF_API_URL_CLASS
87 88
    const AVClass *av_class; ///< information for av_log(). Set by url_open().
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
89
    struct URLProtocol *prot;
90
    int flags;
91 92
    int is_streamed;  /**< true if streamed (no seek possible), default = false */
    int max_packet_size;  /**< if non zero, the stream is packetized with this max packet size */
Fabrice Bellard's avatar
Fabrice Bellard committed
93
    void *priv_data;
94
    char *filename; /**< specified URL */
95
    int is_connected;
96
} URLContext;
Fabrice Bellard's avatar
Fabrice Bellard committed
97

98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#define URL_PROTOCOL_FLAG_NESTED_SCHEME 1 /*< The protocol name can be the first part of a nested protocol scheme */

/**
 * @deprecated This struct is to be made private. Use the higher-level
 *             AVIOContext-based API instead.
 */
typedef struct URLProtocol {
    const char *name;
    int (*url_open)(URLContext *h, const char *url, int flags);
    int (*url_read)(URLContext *h, unsigned char *buf, int size);
    int (*url_write)(URLContext *h, const unsigned char *buf, int size);
    int64_t (*url_seek)(URLContext *h, int64_t pos, int whence);
    int (*url_close)(URLContext *h);
    struct URLProtocol *next;
    int (*url_read_pause)(URLContext *h, int pause);
    int64_t (*url_read_seek)(URLContext *h, int stream_index,
                             int64_t timestamp, int flags);
    int (*url_get_file_handle)(URLContext *h);
    int priv_data_size;
    const AVClass *priv_data_class;
    int flags;
} URLProtocol;

Fabrice Bellard's avatar
Fabrice Bellard committed
121 122 123 124 125 126
typedef struct URLPollEntry {
    URLContext *handle;
    int events;
    int revents;
} URLPollEntry;

127 128 129
/* not implemented */
attribute_deprecated int url_poll(URLPollEntry *poll_table, int n, int timeout);

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
/**
 * @defgroup open_modes URL open modes
 * The flags argument to url_open and cosins must be one of the following
 * constants, optionally ORed with other flags.
 * @{
 */
#define URL_RDONLY 0  /**< read-only */
#define URL_WRONLY 1  /**< write-only */
#define URL_RDWR   2  /**< read-write */
/**
 * @}
 */

/**
 * Use non-blocking mode.
 * If this flag is set, operations on the context will return
 * AVERROR(EAGAIN) if they can not be performed immediately.
 * If this flag is not set, operations on the context will never return
 * AVERROR(EAGAIN).
 * Note that this flag does not affect the opening/connecting of the
 * context. Connecting a protocol will always block if necessary (e.g. on
 * network protocols) but never hang (e.g. on busy devices).
 * Warning: non-blocking protocols is work-in-progress; this flag may be
 * silently ignored.
 */
#define URL_FLAG_NONBLOCK 4
156

157
typedef int URLInterruptCB(void);
158
extern URLInterruptCB *url_interrupt_cb;
159

160
/**
161 162 163
 * @defgroup old_url_funcs Old url_* functions
 * @deprecated use the buffered API based on AVIOContext instead
 * @{
164
 */
165 166
attribute_deprecated int url_open_protocol (URLContext **puc, struct URLProtocol *up,
                                            const char *url, int flags);
Anton Khirnov's avatar
Anton Khirnov committed
167
attribute_deprecated int url_alloc(URLContext **h, const char *url, int flags);
168
attribute_deprecated int url_connect(URLContext *h);
169
attribute_deprecated int url_open(URLContext **h, const char *url, int flags);
170
attribute_deprecated int url_read(URLContext *h, unsigned char *buf, int size);
171
attribute_deprecated int url_read_complete(URLContext *h, unsigned char *buf, int size);
172
attribute_deprecated int url_write(URLContext *h, const unsigned char *buf, int size);
173
attribute_deprecated int64_t url_seek(URLContext *h, int64_t pos, int whence);
174
attribute_deprecated int url_close(URLContext *h);
175
attribute_deprecated int64_t url_filesize(URLContext *h);
176
attribute_deprecated int url_get_file_handle(URLContext *h);
177
attribute_deprecated int url_get_max_packet_size(URLContext *h);
178
attribute_deprecated void url_get_filename(URLContext *h, char *buf, int buf_size);
179
attribute_deprecated int av_url_read_pause(URLContext *h, int pause);
180 181
attribute_deprecated int64_t av_url_read_seek(URLContext *h, int stream_index,
                                              int64_t timestamp, int flags);
182
attribute_deprecated void url_set_interrupt_cb(int (*interrupt_cb)(void));
183 184
/**
 * If protocol is NULL, returns the first registered protocol,
185
 * if protocol is non-NULL, returns the next registered protocol after protocol,
186 187
 * or NULL if protocol is the last one.
 */
188
attribute_deprecated URLProtocol *av_protocol_next(URLProtocol *p);
189
/**
190
 * Register the URLProtocol protocol.
191 192
 *
 * @param size the size of the URLProtocol struct referenced
193
 */
194
attribute_deprecated int av_register_protocol2(URLProtocol *protocol, int size);
195 196 197 198
/**
 * @}
 */

199

200 201
typedef attribute_deprecated AVIOContext ByteIOContext;

202
attribute_deprecated int init_put_byte(AVIOContext *s,
Fabrice Bellard's avatar
Fabrice Bellard committed
203 204 205 206
                  unsigned char *buffer,
                  int buffer_size,
                  int write_flag,
                  void *opaque,
207 208
                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
209
                  int64_t (*seek)(void *opaque, int64_t offset, int whence));
210 211 212 213 214 215 216 217
attribute_deprecated AVIOContext *av_alloc_put_byte(
                  unsigned char *buffer,
                  int buffer_size,
                  int write_flag,
                  void *opaque,
                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
                  int64_t (*seek)(void *opaque, int64_t offset, int whence));
218 219 220 221 222 223 224

/**
 * @defgroup old_avio_funcs Old put_/get_*() functions
 * @deprecated use the avio_ -prefixed functions instead.
 * @{
 */
attribute_deprecated int          get_buffer(AVIOContext *s, unsigned char *buf, int size);
225
attribute_deprecated int          get_partial_buffer(AVIOContext *s, unsigned char *buf, int size);
226 227 228 229 230 231 232 233 234
attribute_deprecated int          get_byte(AVIOContext *s);
attribute_deprecated unsigned int get_le16(AVIOContext *s);
attribute_deprecated unsigned int get_le24(AVIOContext *s);
attribute_deprecated unsigned int get_le32(AVIOContext *s);
attribute_deprecated uint64_t     get_le64(AVIOContext *s);
attribute_deprecated unsigned int get_be16(AVIOContext *s);
attribute_deprecated unsigned int get_be24(AVIOContext *s);
attribute_deprecated unsigned int get_be32(AVIOContext *s);
attribute_deprecated uint64_t     get_be64(AVIOContext *s);
235 236

attribute_deprecated void         put_byte(AVIOContext *s, int b);
Anton Khirnov's avatar
Anton Khirnov committed
237
attribute_deprecated void         put_nbyte(AVIOContext *s, int b, int count);
238 239 240 241 242 243 244 245 246
attribute_deprecated void         put_buffer(AVIOContext *s, const unsigned char *buf, int size);
attribute_deprecated void         put_le64(AVIOContext *s, uint64_t val);
attribute_deprecated void         put_be64(AVIOContext *s, uint64_t val);
attribute_deprecated void         put_le32(AVIOContext *s, unsigned int val);
attribute_deprecated void         put_be32(AVIOContext *s, unsigned int val);
attribute_deprecated void         put_le24(AVIOContext *s, unsigned int val);
attribute_deprecated void         put_be24(AVIOContext *s, unsigned int val);
attribute_deprecated void         put_le16(AVIOContext *s, unsigned int val);
attribute_deprecated void         put_be16(AVIOContext *s, unsigned int val);
Anton Khirnov's avatar
Anton Khirnov committed
247
attribute_deprecated void         put_tag(AVIOContext *s, const char *tag);
248 249 250
/**
 * @}
 */
251

252
attribute_deprecated int     av_url_read_fpause(AVIOContext *h,    int pause);
253
attribute_deprecated int64_t av_url_read_fseek (AVIOContext *h,    int stream_index,
254
                                                int64_t timestamp, int flags);
255 256 257 258 259 260 261 262

/**
 * @defgroup old_url_f_funcs Old url_f* functions
 * @deprecated use the avio_ -prefixed functions instead.
 * @{
 */
attribute_deprecated int url_fopen( AVIOContext **s, const char *url, int flags);
attribute_deprecated int url_fclose(AVIOContext *s);
263
attribute_deprecated int64_t url_fseek(AVIOContext *s, int64_t offset, int whence);
Anton Khirnov's avatar
Anton Khirnov committed
264
attribute_deprecated int url_fskip(AVIOContext *s, int64_t offset);
265
attribute_deprecated int64_t url_ftell(AVIOContext *s);
266
attribute_deprecated int64_t url_fsize(AVIOContext *s);
267 268
#define URL_EOF (-1)
attribute_deprecated int url_fgetc(AVIOContext *s);
269
attribute_deprecated int url_setbufsize(AVIOContext *s, int buf_size);
270 271 272 273 274
#ifdef __GNUC__
attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
#else
attribute_deprecated int url_fprintf(AVIOContext *s, const char *fmt, ...);
#endif
275
attribute_deprecated void put_flush_packet(AVIOContext *s);
276
attribute_deprecated int url_open_dyn_buf(AVIOContext **s);
277
attribute_deprecated int url_open_dyn_packet_buf(AVIOContext **s, int max_packet_size);
278
attribute_deprecated int url_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
279
attribute_deprecated int url_fdopen(AVIOContext **s, URLContext *h);
280 281 282
/**
 * @}
 */
Anton Khirnov's avatar
Anton Khirnov committed
283 284 285 286 287

/**
 * @deprecated use AVIOContext.eof_reached
 */
attribute_deprecated int url_feof(AVIOContext *s);
Anton Khirnov's avatar
Anton Khirnov committed
288
attribute_deprecated int url_ferror(AVIOContext *s);
289 290 291

attribute_deprecated int udp_set_remote_url(URLContext *h, const char *uri);
attribute_deprecated int udp_get_local_port(URLContext *h);
292 293 294 295

attribute_deprecated void init_checksum(AVIOContext *s,
                   unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len),
                   unsigned long checksum);
296
attribute_deprecated unsigned long get_checksum(AVIOContext *s);
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
attribute_deprecated void put_strz(AVIOContext *s, const char *buf);
/** @note unlike fgets, the EOL character is not returned and a whole
    line is parsed. return NULL if first char read was EOF */
attribute_deprecated char *url_fgets(AVIOContext *s, char *buf, int buf_size);
/**
 * @deprecated use avio_get_str instead
 */
attribute_deprecated char *get_strz(AVIOContext *s, char *buf, int maxlen);
/**
 * @deprecated Use AVIOContext.seekable field directly.
 */
attribute_deprecated static inline int url_is_streamed(AVIOContext *s)
{
    return !s->seekable;
}
attribute_deprecated URLContext *url_fileno(AVIOContext *s);

/**
 * @deprecated use AVIOContext.max_packet_size directly.
 */
attribute_deprecated int url_fget_max_packet_size(AVIOContext *s);

attribute_deprecated int url_open_buf(AVIOContext **s, uint8_t *buf, int buf_size, int flags);

/** return the written or read size */
attribute_deprecated int url_close_buf(AVIOContext *s);
#endif // FF_API_OLD_AVIO

/**
 * Return a non-zero value if the resource indicated by url
 * exists, 0 otherwise.
 */
int url_exist(const char *url);

/**
 * The callback is called in blocking functions to test regulary if
 * asynchronous interruption is needed. AVERROR_EXIT is returned
 * in this case by the interrupted function. 'NULL' means no interrupt
 * callback is given.
 */
void avio_set_interrupt_cb(int (*interrupt_cb)(void));

#if FF_API_REGISTER_PROTOCOL
extern URLProtocol *first_protocol;
#endif

#if FF_API_REGISTER_PROTOCOL
/**
 * @deprecated Use av_register_protocol() instead.
 */
attribute_deprecated int register_protocol(URLProtocol *protocol);

/**
 * @deprecated Use av_register_protocol2() instead.
 */
attribute_deprecated int av_register_protocol(URLProtocol *protocol);
353
#endif
354

355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
/**
 * Allocate and initialize an AVIOContext for buffered I/O. It must be later
 * freed with av_free().
 *
 * @param buffer Memory block for input/output operations via AVIOContext.
 * @param buffer_size The buffer size is very important for performance.
 *        For protocols with fixed blocksize it should be set to this blocksize.
 *        For others a typical size is a cache page, e.g. 4kb.
 * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise.
 * @param opaque An opaque pointer to user-specific data.
 * @param read_packet  A function for refilling the buffer, may be NULL.
 * @param write_packet A function for writing the buffer contents, may be NULL.
 * @param seek A function for seeking to specified byte position, may be NULL.
 *
 * @return Allocated AVIOContext or NULL on failure.
 */
371
AVIOContext *avio_alloc_context(
372 373 374 375
                  unsigned char *buffer,
                  int buffer_size,
                  int write_flag,
                  void *opaque,
376
                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
Michael Niedermayer's avatar
Michael Niedermayer committed
377
                  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
378
                  int64_t (*seek)(void *opaque, int64_t offset, int whence));
Fabrice Bellard's avatar
Fabrice Bellard committed
379

380 381 382 383 384 385 386 387 388 389
void avio_w8(AVIOContext *s, int b);
void avio_write(AVIOContext *s, const unsigned char *buf, int size);
void avio_wl64(AVIOContext *s, uint64_t val);
void avio_wb64(AVIOContext *s, uint64_t val);
void avio_wl32(AVIOContext *s, unsigned int val);
void avio_wb32(AVIOContext *s, unsigned int val);
void avio_wl24(AVIOContext *s, unsigned int val);
void avio_wb24(AVIOContext *s, unsigned int val);
void avio_wl16(AVIOContext *s, unsigned int val);
void avio_wb16(AVIOContext *s, unsigned int val);
Fabrice Bellard's avatar
Fabrice Bellard committed
390

391 392 393 394
/**
 * Write a NULL-terminated string.
 * @return number of bytes written.
 */
395
int avio_put_str(AVIOContext *s, const char *str);
396

397 398 399 400
/**
 * Convert an UTF-8 string to UTF-16LE and write it.
 * @return number of bytes written.
 */
401
int avio_put_str16le(AVIOContext *s, const char *str);
402

403 404 405 406 407 408 409 410 411 412 413 414 415 416 417
/**
 * Passing this as the "whence" parameter to a seek function causes it to
 * return the filesize without seeking anywhere. Supporting this is optional.
 * If it is not supported then the seek function will return <0.
 */
#define AVSEEK_SIZE 0x10000

/**
 * Oring this flag as into the "whence" parameter to a seek function causes it to
 * seek by any means (like reopening and linear reading) or other normally unreasonble
 * means that can be extreemly slow.
 * This may be ignored by the seek code.
 */
#define AVSEEK_FORCE 0x20000

418
/**
419
 * fseek() equivalent for AVIOContext.
420 421
 * @return new position or AVERROR.
 */
422
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence);
423

Peter Ross's avatar
Peter Ross committed
424 425 426 427
/**
 * Skip given number of bytes forward
 * @return new position or AVERROR.
 */
428 429 430 431
static av_always_inline int64_t avio_skip(AVIOContext *s, int64_t offset)
{
    return avio_seek(s, offset, SEEK_CUR);
}
Peter Ross's avatar
Peter Ross committed
432

433
/**
434
 * ftell() equivalent for AVIOContext.
435 436
 * @return position or AVERROR.
 */
437 438 439 440
static av_always_inline int64_t avio_tell(AVIOContext *s)
{
    return avio_seek(s, 0, SEEK_CUR);
}
441 442

/**
443
 * Get the filesize.
444 445
 * @return filesize or AVERROR
 */
446
int64_t avio_size(AVIOContext *s);
447

448
/** @warning currently size is limited */
449
#ifdef __GNUC__
450
int avio_printf(AVIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
451
#else
452
int avio_printf(AVIOContext *s, const char *fmt, ...);
453
#endif
454

455
void avio_flush(AVIOContext *s);
Fabrice Bellard's avatar
Fabrice Bellard committed
456

Michael Niedermayer's avatar
Michael Niedermayer committed
457 458

/**
459
 * Read size bytes from AVIOContext into buf.
Benoit Fouet's avatar
Benoit Fouet committed
460
 * @return number of bytes read or AVERROR
Michael Niedermayer's avatar
Michael Niedermayer committed
461
 */
462
int avio_read(AVIOContext *s, unsigned char *buf, int size);
Michael Niedermayer's avatar
Michael Niedermayer committed
463

464
/** @note return 0 if EOF, so you cannot use it if EOF handling is
Diego Biurrun's avatar
Diego Biurrun committed
465
    necessary */
466 467 468 469 470
int          avio_r8  (AVIOContext *s);
unsigned int avio_rl16(AVIOContext *s);
unsigned int avio_rl24(AVIOContext *s);
unsigned int avio_rl32(AVIOContext *s);
uint64_t     avio_rl64(AVIOContext *s);
Fabrice Bellard's avatar
Fabrice Bellard committed
471

Reimar Döffinger's avatar
Reimar Döffinger committed
472 473 474 475 476 477 478 479 480 481 482 483 484 485
/**
 * Read a string from pb into buf. The reading will terminate when either
 * a NULL character was encountered, maxlen bytes have been read, or nothing
 * more can be read from pb. The result is guaranteed to be NULL-terminated, it
 * will be truncated if buf is too small.
 * Note that the string is not interpreted or validated in any way, it
 * might get truncated in the middle of a sequence for multi-byte encodings.
 *
 * @return number of bytes read (is always <= maxlen).
 * If reading ends on EOF or error, the return value will be one more than
 * bytes actually read.
 */
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen);

486 487 488 489 490 491
/**
 * Read a UTF-16 string from pb and convert it to UTF-8.
 * The reading will terminate when either a null or invalid character was
 * encountered or maxlen bytes have been read.
 * @return number of bytes read (is always <= maxlen)
 */
492 493
int avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen);
int avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen);
494

495 496 497 498
unsigned int avio_rb16(AVIOContext *s);
unsigned int avio_rb24(AVIOContext *s);
unsigned int avio_rb32(AVIOContext *s);
uint64_t     avio_rb64(AVIOContext *s);
Fabrice Bellard's avatar
Fabrice Bellard committed
499

500
#if FF_API_URL_RESETBUF
501 502 503 504
/** Reset the buffer for reading or writing.
 * @note Will drop any data currently in the buffer without transmitting it.
 * @param flags URL_RDONLY to set up the buffer for reading, or URL_WRONLY
 *        to set up the buffer for writing. */
505
int url_resetbuf(AVIOContext *s, int flags);
506
#endif
507

508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
/**
 * @defgroup open_modes URL open modes
 * The flags argument to avio_open must be one of the following
 * constants, optionally ORed with other flags.
 * @{
 */
#define AVIO_RDONLY 0  /**< read-only */
#define AVIO_WRONLY 1  /**< write-only */
#define AVIO_RDWR   2  /**< read-write */
/**
 * @}
 */

/**
 * Use non-blocking mode.
 * If this flag is set, operations on the context will return
 * AVERROR(EAGAIN) if they can not be performed immediately.
 * If this flag is not set, operations on the context will never return
 * AVERROR(EAGAIN).
 * Note that this flag does not affect the opening/connecting of the
 * context. Connecting a protocol will always block if necessary (e.g. on
 * network protocols) but never hang (e.g. on busy devices).
 * Warning: non-blocking protocols is work-in-progress; this flag may be
 * silently ignored.
 */
#define AVIO_FLAG_NONBLOCK 4

Stefano Sabatini's avatar
Stefano Sabatini committed
535
/**
536
 * Create and initialize a AVIOContext for accessing the
Stefano Sabatini's avatar
Stefano Sabatini committed
537 538
 * resource indicated by url.
 * @note When the resource indicated by url has been opened in
539
 * read+write mode, the AVIOContext can be used only for writing.
Stefano Sabatini's avatar
Stefano Sabatini committed
540
 *
541
 * @param s Used to return the pointer to the created AVIOContext.
Stefano Sabatini's avatar
Stefano Sabatini committed
542 543 544 545 546 547
 * In case of failure the pointed to value is set to NULL.
 * @param flags flags which control how the resource indicated by url
 * is to be opened
 * @return 0 in case of success, a negative value corresponding to an
 * AVERROR code in case of failure
 */
548
int avio_open(AVIOContext **s, const char *url, int flags);
Stefano Sabatini's avatar
Stefano Sabatini committed
549

550
int avio_close(AVIOContext *s);
551

552
/**
553 554 555 556 557
 * Open a write only memory stream.
 *
 * @param s new IO context
 * @return zero if no error.
 */
558
int avio_open_dyn_buf(AVIOContext **s);
559

560
/**
561
 * Return the written size and a pointer to the buffer. The buffer
562 563
 * must be freed with av_free().
 * Padding of FF_INPUT_BUFFER_PADDING_SIZE is added to the buffer.
564
 *
565
 * @param s IO context
566
 * @param pbuffer pointer to a byte buffer
567 568
 * @return the length of the byte buffer
 */
569
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);
570

571
#if FF_API_UDP_GET_FILE
572
int udp_get_file_handle(URLContext *h);
573
#endif
574

575 576 577 578 579 580 581 582 583 584 585 586 587
/**
 * Iterate through names of available protocols.
 *
 * @param opaque A private pointer representing current protocol.
 *        It must be a pointer to NULL on first iteration and will
 *        be updated by successive calls to avio_enum_protocols.
 * @param output If set to 1, iterate over output protocols,
 *               otherwise over input protocols.
 *
 * @return A static string containing the name of current protocol or NULL
 */
const char *avio_enum_protocols(void **opaque, int output);

588
#endif /* AVFORMAT_AVIO_H */