| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * copyright (c) 2001 Fabrice Bellard | |
| 3 * | |
| 4 * This file is part of FFmpeg. | |
| 5 * | |
| 6 * FFmpeg is free software; you can redistribute it and/or | |
| 7 * modify it under the terms of the GNU Lesser General Public | |
| 8 * 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 * FFmpeg is distributed in the hope that it will be useful, | |
| 12 * 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 * License along with FFmpeg; if not, write to the Free Software | |
| 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 19 */ | |
| 20 #ifndef AVFORMAT_AVIO_H | |
| 21 #define AVFORMAT_AVIO_H | |
| 22 | |
| 23 /** | |
| 24 * @file libavformat/avio.h | |
| 25 * unbuffered I/O operations | |
| 26 * | |
| 27 * @warning This file has to be considered an internal but installed | |
| 28 * header, so it should not be directly included in your projects. | |
| 29 */ | |
| 30 | |
| 31 #include <stdint.h> | |
| 32 | |
| 33 #include "libavutil/common.h" | |
| 34 | |
| 35 /* unbuffered I/O */ | |
| 36 | |
| 37 /** | |
| 38 * URL Context. | |
| 39 * New fields can be added to the end with minor version bumps. | |
| 40 * Removal, reordering and changes to existing fields require a major | |
| 41 * version bump. | |
| 42 * sizeof(URLContext) must not be used outside libav*. | |
| 43 */ | |
| 44 struct URLContext { | |
| 45 #if LIBAVFORMAT_VERSION_MAJOR >= 53 | |
| 46 const AVClass *av_class; ///< information for av_log(). Set by url_open(). | |
| 47 #endif | |
| 48 struct URLProtocol *prot; | |
| 49 int flags; | |
| 50 int is_streamed; /**< true if streamed (no seek possible), default = false
*/ | |
| 51 int max_packet_size; /**< if non zero, the stream is packetized with this m
ax packet size */ | |
| 52 void *priv_data; | |
| 53 char *filename; /**< specified filename */ | |
| 54 }; | |
| 55 | |
| 56 typedef struct URLContext URLContext; | |
| 57 | |
| 58 typedef struct URLPollEntry { | |
| 59 URLContext *handle; | |
| 60 int events; | |
| 61 int revents; | |
| 62 } URLPollEntry; | |
| 63 | |
| 64 #define URL_RDONLY 0 | |
| 65 #define URL_WRONLY 1 | |
| 66 #define URL_RDWR 2 | |
| 67 | |
| 68 typedef int URLInterruptCB(void); | |
| 69 | |
| 70 int url_open_protocol (URLContext **puc, struct URLProtocol *up, | |
| 71 const char *filename, int flags); | |
| 72 int url_open(URLContext **h, const char *filename, int flags); | |
| 73 int url_read(URLContext *h, unsigned char *buf, int size); | |
| 74 int url_write(URLContext *h, unsigned char *buf, int size); | |
| 75 int64_t url_seek(URLContext *h, int64_t pos, int whence); | |
| 76 int url_close(URLContext *h); | |
| 77 int url_exist(const char *filename); | |
| 78 int64_t url_filesize(URLContext *h); | |
| 79 | |
| 80 /** | |
| 81 * Return the file descriptor associated with this URL. For RTP, this | |
| 82 * will return only the RTP file descriptor, not the RTCP file descriptor. | |
| 83 * To get both, use rtp_get_file_handles(). | |
| 84 * | |
| 85 * @return the file descriptor associated with this URL, or <0 on error. | |
| 86 */ | |
| 87 int url_get_file_handle(URLContext *h); | |
| 88 | |
| 89 /** | |
| 90 * Return the maximum packet size associated to packetized file | |
| 91 * handle. If the file is not packetized (stream like HTTP or file on | |
| 92 * disk), then 0 is returned. | |
| 93 * | |
| 94 * @param h file handle | |
| 95 * @return maximum packet size in bytes | |
| 96 */ | |
| 97 int url_get_max_packet_size(URLContext *h); | |
| 98 void url_get_filename(URLContext *h, char *buf, int buf_size); | |
| 99 | |
| 100 /** | |
| 101 * The callback is called in blocking functions to test regulary if | |
| 102 * asynchronous interruption is needed. AVERROR(EINTR) is returned | |
| 103 * in this case by the interrupted function. 'NULL' means no interrupt | |
| 104 * callback is given. | |
| 105 */ | |
| 106 void url_set_interrupt_cb(URLInterruptCB *interrupt_cb); | |
| 107 | |
| 108 /* not implemented */ | |
| 109 int url_poll(URLPollEntry *poll_table, int n, int timeout); | |
| 110 | |
| 111 /** | |
| 112 * Pause and resume playing - only meaningful if using a network streaming | |
| 113 * protocol (e.g. MMS). | |
| 114 * @param pause 1 for pause, 0 for resume | |
| 115 */ | |
| 116 int av_url_read_pause(URLContext *h, int pause); | |
| 117 | |
| 118 /** | |
| 119 * Seek to a given timestamp relative to some component stream. | |
| 120 * Only meaningful if using a network streaming protocol (e.g. MMS.). | |
| 121 * @param stream_index The stream index that the timestamp is relative to. | |
| 122 * If stream_index is (-1) the timestamp should be in AV_TIME_BASE | |
| 123 * units from the beginning of the presentation. | |
| 124 * If a stream_index >= 0 is used and the protocol does not support | |
| 125 * seeking based on component streams, the call will fail with ENOTSUP. | |
| 126 * @param timestamp timestamp in AVStream.time_base units | |
| 127 * or if there is no stream specified then in AV_TIME_BASE units. | |
| 128 * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE | |
| 129 * and AVSEEK_FLAG_ANY. The protocol may silently ignore | |
| 130 * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will | |
| 131 * fail with ENOTSUP if used and not supported. | |
| 132 * @return >= 0 on success | |
| 133 * @see AVInputFormat::read_seek | |
| 134 */ | |
| 135 int64_t av_url_read_seek(URLContext *h, int stream_index, | |
| 136 int64_t timestamp, int flags); | |
| 137 | |
| 138 /** | |
| 139 * Passing this as the "whence" parameter to a seek function causes it to | |
| 140 * return the filesize without seeking anywhere. Supporting this is optional. | |
| 141 * If it is not supported then the seek function will return <0. | |
| 142 */ | |
| 143 #define AVSEEK_SIZE 0x10000 | |
| 144 | |
| 145 typedef struct URLProtocol { | |
| 146 const char *name; | |
| 147 int (*url_open)(URLContext *h, const char *filename, int flags); | |
| 148 int (*url_read)(URLContext *h, unsigned char *buf, int size); | |
| 149 int (*url_write)(URLContext *h, unsigned char *buf, int size); | |
| 150 int64_t (*url_seek)(URLContext *h, int64_t pos, int whence); | |
| 151 int (*url_close)(URLContext *h); | |
| 152 struct URLProtocol *next; | |
| 153 int (*url_read_pause)(URLContext *h, int pause); | |
| 154 int64_t (*url_read_seek)(URLContext *h, int stream_index, | |
| 155 int64_t timestamp, int flags); | |
| 156 int (*url_get_file_handle)(URLContext *h); | |
| 157 } URLProtocol; | |
| 158 | |
| 159 #if LIBAVFORMAT_VERSION_MAJOR < 53 | |
| 160 extern URLProtocol *first_protocol; | |
| 161 #endif | |
| 162 | |
| 163 extern URLInterruptCB *url_interrupt_cb; | |
| 164 | |
| 165 /** | |
| 166 * If protocol is NULL, returns the first registered protocol, | |
| 167 * if protocol is non-NULL, returns the next registered protocol after protocol, | |
| 168 * or NULL if protocol is the last one. | |
| 169 */ | |
| 170 URLProtocol *av_protocol_next(URLProtocol *p); | |
| 171 | |
| 172 #if LIBAVFORMAT_VERSION_MAJOR < 53 | |
| 173 /** | |
| 174 * @deprecated Use av_register_protocol() instead. | |
| 175 */ | |
| 176 attribute_deprecated int register_protocol(URLProtocol *protocol); | |
| 177 #endif | |
| 178 | |
| 179 int av_register_protocol(URLProtocol *protocol); | |
| 180 | |
| 181 /** | |
| 182 * Bytestream IO Context. | |
| 183 * New fields can be added to the end with minor version bumps. | |
| 184 * Removal, reordering and changes to existing fields require a major | |
| 185 * version bump. | |
| 186 * sizeof(ByteIOContext) must not be used outside libav*. | |
| 187 */ | |
| 188 typedef struct { | |
| 189 unsigned char *buffer; | |
| 190 int buffer_size; | |
| 191 unsigned char *buf_ptr, *buf_end; | |
| 192 void *opaque; | |
| 193 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); | |
| 194 int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); | |
| 195 int64_t (*seek)(void *opaque, int64_t offset, int whence); | |
| 196 int64_t pos; /**< position in the file of the current buffer */ | |
| 197 int must_flush; /**< true if the next seek should flush */ | |
| 198 int eof_reached; /**< true if eof reached */ | |
| 199 int write_flag; /**< true if open for writing */ | |
| 200 int is_streamed; | |
| 201 int max_packet_size; | |
| 202 unsigned long checksum; | |
| 203 unsigned char *checksum_ptr; | |
| 204 unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf,
unsigned int size); | |
| 205 int error; ///< contains the error code or 0 if no error happened | |
| 206 int (*read_pause)(void *opaque, int pause); | |
| 207 int64_t (*read_seek)(void *opaque, int stream_index, | |
| 208 int64_t timestamp, int flags); | |
| 209 } ByteIOContext; | |
| 210 | |
| 211 int init_put_byte(ByteIOContext *s, | |
| 212 unsigned char *buffer, | |
| 213 int buffer_size, | |
| 214 int write_flag, | |
| 215 void *opaque, | |
| 216 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), | |
| 217 int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), | |
| 218 int64_t (*seek)(void *opaque, int64_t offset, int whence)); | |
| 219 ByteIOContext *av_alloc_put_byte( | |
| 220 unsigned char *buffer, | |
| 221 int buffer_size, | |
| 222 int write_flag, | |
| 223 void *opaque, | |
| 224 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), | |
| 225 int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), | |
| 226 int64_t (*seek)(void *opaque, int64_t offset, int whence)); | |
| 227 | |
| 228 void put_byte(ByteIOContext *s, int b); | |
| 229 void put_buffer(ByteIOContext *s, const unsigned char *buf, int size); | |
| 230 void put_le64(ByteIOContext *s, uint64_t val); | |
| 231 void put_be64(ByteIOContext *s, uint64_t val); | |
| 232 void put_le32(ByteIOContext *s, unsigned int val); | |
| 233 void put_be32(ByteIOContext *s, unsigned int val); | |
| 234 void put_le24(ByteIOContext *s, unsigned int val); | |
| 235 void put_be24(ByteIOContext *s, unsigned int val); | |
| 236 void put_le16(ByteIOContext *s, unsigned int val); | |
| 237 void put_be16(ByteIOContext *s, unsigned int val); | |
| 238 void put_tag(ByteIOContext *s, const char *tag); | |
| 239 | |
| 240 void put_strz(ByteIOContext *s, const char *buf); | |
| 241 | |
| 242 /** | |
| 243 * fseek() equivalent for ByteIOContext. | |
| 244 * @return new position or AVERROR. | |
| 245 */ | |
| 246 int64_t url_fseek(ByteIOContext *s, int64_t offset, int whence); | |
| 247 | |
| 248 /** | |
| 249 * Skip given number of bytes forward. | |
| 250 * @param offset number of bytes | |
| 251 */ | |
| 252 void url_fskip(ByteIOContext *s, int64_t offset); | |
| 253 | |
| 254 /** | |
| 255 * ftell() equivalent for ByteIOContext. | |
| 256 * @return position or AVERROR. | |
| 257 */ | |
| 258 int64_t url_ftell(ByteIOContext *s); | |
| 259 | |
| 260 /** | |
| 261 * Gets the filesize. | |
| 262 * @return filesize or AVERROR | |
| 263 */ | |
| 264 int64_t url_fsize(ByteIOContext *s); | |
| 265 | |
| 266 /** | |
| 267 * feof() equivalent for ByteIOContext. | |
| 268 * @return non zero if and only if end of file | |
| 269 */ | |
| 270 int url_feof(ByteIOContext *s); | |
| 271 | |
| 272 int url_ferror(ByteIOContext *s); | |
| 273 | |
| 274 int av_url_read_fpause(ByteIOContext *h, int pause); | |
| 275 int64_t av_url_read_fseek(ByteIOContext *h, int stream_index, | |
| 276 int64_t timestamp, int flags); | |
| 277 | |
| 278 #define URL_EOF (-1) | |
| 279 /** @note return URL_EOF (-1) if EOF */ | |
| 280 int url_fgetc(ByteIOContext *s); | |
| 281 | |
| 282 /** @warning currently size is limited */ | |
| 283 #ifdef __GNUC__ | |
| 284 int url_fprintf(ByteIOContext *s, const char *fmt, ...) __attribute__ ((__format
__ (__printf__, 2, 3))); | |
| 285 #else | |
| 286 int url_fprintf(ByteIOContext *s, const char *fmt, ...); | |
| 287 #endif | |
| 288 | |
| 289 /** @note unlike fgets, the EOL character is not returned and a whole | |
| 290 line is parsed. return NULL if first char read was EOF */ | |
| 291 char *url_fgets(ByteIOContext *s, char *buf, int buf_size); | |
| 292 | |
| 293 void put_flush_packet(ByteIOContext *s); | |
| 294 | |
| 295 | |
| 296 /** | |
| 297 * Reads size bytes from ByteIOContext into buf. | |
| 298 * @returns number of bytes read or AVERROR | |
| 299 */ | |
| 300 int get_buffer(ByteIOContext *s, unsigned char *buf, int size); | |
| 301 | |
| 302 /** | |
| 303 * Reads size bytes from ByteIOContext into buf. | |
| 304 * This reads at most 1 packet. If that is not enough fewer bytes will be | |
| 305 * returned. | |
| 306 * @returns number of bytes read or AVERROR | |
| 307 */ | |
| 308 int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size); | |
| 309 | |
| 310 /** @note return 0 if EOF, so you cannot use it if EOF handling is | |
| 311 necessary */ | |
| 312 int get_byte(ByteIOContext *s); | |
| 313 unsigned int get_le24(ByteIOContext *s); | |
| 314 unsigned int get_le32(ByteIOContext *s); | |
| 315 uint64_t get_le64(ByteIOContext *s); | |
| 316 unsigned int get_le16(ByteIOContext *s); | |
| 317 | |
| 318 char *get_strz(ByteIOContext *s, char *buf, int maxlen); | |
| 319 unsigned int get_be16(ByteIOContext *s); | |
| 320 unsigned int get_be24(ByteIOContext *s); | |
| 321 unsigned int get_be32(ByteIOContext *s); | |
| 322 uint64_t get_be64(ByteIOContext *s); | |
| 323 | |
| 324 uint64_t ff_get_v(ByteIOContext *bc); | |
| 325 | |
| 326 static inline int url_is_streamed(ByteIOContext *s) | |
| 327 { | |
| 328 return s->is_streamed; | |
| 329 } | |
| 330 | |
| 331 /** @note when opened as read/write, the buffers are only used for | |
| 332 writing */ | |
| 333 int url_fdopen(ByteIOContext **s, URLContext *h); | |
| 334 | |
| 335 /** @warning must be called before any I/O */ | |
| 336 int url_setbufsize(ByteIOContext *s, int buf_size); | |
| 337 /** Reset the buffer for reading or writing. | |
| 338 * @note Will drop any data currently in the buffer without transmitting it. | |
| 339 * @param flags URL_RDONLY to set up the buffer for reading, or URL_WRONLY | |
| 340 * to set up the buffer for writing. */ | |
| 341 int url_resetbuf(ByteIOContext *s, int flags); | |
| 342 | |
| 343 /** @note when opened as read/write, the buffers are only used for | |
| 344 writing */ | |
| 345 int url_fopen(ByteIOContext **s, const char *filename, int flags); | |
| 346 int url_fclose(ByteIOContext *s); | |
| 347 URLContext *url_fileno(ByteIOContext *s); | |
| 348 | |
| 349 /** | |
| 350 * Return the maximum packet size associated to packetized buffered file | |
| 351 * handle. If the file is not packetized (stream like http or file on | |
| 352 * disk), then 0 is returned. | |
| 353 * | |
| 354 * @param s buffered file handle | |
| 355 * @return maximum packet size in bytes | |
| 356 */ | |
| 357 int url_fget_max_packet_size(ByteIOContext *s); | |
| 358 | |
| 359 int url_open_buf(ByteIOContext **s, uint8_t *buf, int buf_size, int flags); | |
| 360 | |
| 361 /** return the written or read size */ | |
| 362 int url_close_buf(ByteIOContext *s); | |
| 363 | |
| 364 /** | |
| 365 * Open a write only memory stream. | |
| 366 * | |
| 367 * @param s new IO context | |
| 368 * @return zero if no error. | |
| 369 */ | |
| 370 int url_open_dyn_buf(ByteIOContext **s); | |
| 371 | |
| 372 /** | |
| 373 * Open a write only packetized memory stream with a maximum packet | |
| 374 * size of 'max_packet_size'. The stream is stored in a memory buffer | |
| 375 * with a big endian 4 byte header giving the packet size in bytes. | |
| 376 * | |
| 377 * @param s new IO context | |
| 378 * @param max_packet_size maximum packet size (must be > 0) | |
| 379 * @return zero if no error. | |
| 380 */ | |
| 381 int url_open_dyn_packet_buf(ByteIOContext **s, int max_packet_size); | |
| 382 | |
| 383 /** | |
| 384 * Return the written size and a pointer to the buffer. The buffer | |
| 385 * must be freed with av_free(). | |
| 386 * @param s IO context | |
| 387 * @param pbuffer pointer to a byte buffer | |
| 388 * @return the length of the byte buffer | |
| 389 */ | |
| 390 int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer); | |
| 391 | |
| 392 unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, | |
| 393 unsigned int len); | |
| 394 unsigned long get_checksum(ByteIOContext *s); | |
| 395 void init_checksum(ByteIOContext *s, | |
| 396 unsigned long (*update_checksum)(unsigned long c, const uint8
_t *p, unsigned int len), | |
| 397 unsigned long checksum); | |
| 398 | |
| 399 /* udp.c */ | |
| 400 int udp_set_remote_url(URLContext *h, const char *uri); | |
| 401 int udp_get_local_port(URLContext *h); | |
| 402 #if (LIBAVFORMAT_VERSION_MAJOR <= 52) | |
| 403 int udp_get_file_handle(URLContext *h); | |
| 404 #endif | |
| 405 | |
| 406 #endif /* AVFORMAT_AVIO_H */ | |
| OLD | NEW |