diff options
Diffstat (limited to 'contrib/ffmpeg/libavformat/avio.h')
-rw-r--r-- | contrib/ffmpeg/libavformat/avio.h | 123 |
1 files changed, 90 insertions, 33 deletions
diff --git a/contrib/ffmpeg/libavformat/avio.h b/contrib/ffmpeg/libavformat/avio.h index be78c9a7b..9443cb017 100644 --- a/contrib/ffmpeg/libavformat/avio.h +++ b/contrib/ffmpeg/libavformat/avio.h @@ -18,8 +18,10 @@ * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVIO_H -#define AVIO_H +#ifndef FFMPEG_AVIO_H +#define FFMPEG_AVIO_H + +#include <stdint.h> /* output byte stream handling */ @@ -27,17 +29,20 @@ typedef int64_t offset_t; /* unbuffered I/O */ +/** + * URL 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(URLContext) must not be used outside libav*. + */ struct URLContext { struct URLProtocol *prot; int flags; 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 */ void *priv_data; -#if LIBAVFORMAT_VERSION_INT >= (52<<16) char *filename; /**< specified filename */ -#else - char filename[1]; /**< specified filename */ -#endif }; typedef struct URLContext URLContext; @@ -64,7 +69,7 @@ offset_t url_filesize(URLContext *h); /** * Return the maximum packet size associated to packetized file - * handle. If the file is not packetized (stream like http or file on + * handle. If the file is not packetized (stream like HTTP or file on * disk), then 0 is returned. * * @param h file handle @@ -74,10 +79,10 @@ int url_get_max_packet_size(URLContext *h); void url_get_filename(URLContext *h, char *buf, int buf_size); /** - * the callback is called in blocking functions to test regulary if + * The callback is called in blocking functions to test regulary if * asynchronous interruption is needed. AVERROR(EINTR) is returned * in this case by the interrupted function. 'NULL' means no interrupt - * callback is given. i + * callback is given. */ void url_set_interrupt_cb(URLInterruptCB *interrupt_cb); @@ -85,9 +90,36 @@ void url_set_interrupt_cb(URLInterruptCB *interrupt_cb); int url_poll(URLPollEntry *poll_table, int n, int timeout); /** - * passing this as the "whence" parameter to a seek function causes it to - * return the filesize without seeking anywhere, supporting this is optional - * if its not supprted then the seek function will return <0 + * Pause and resume playing - only meaningful if using a network streaming + * protocol (e.g. MMS). + * @param pause 1 for pause, 0 for resume + */ +int av_url_read_pause(URLContext *h, int pause); + +/** + * Seek to a given timestamp relative to some component stream. + * Only meaningful if using a network streaming protocol (e.g. MMS.). + * @param stream_index The stream index that the timestamp is relative to. + * If stream_index is (-1) the timestamp should be in AV_TIME_BASE + * units from the beginning of the presentation. + * If a stream_index >= 0 is used and the protocol does not support + * seeking based on component streams, the call will fail with ENOTSUP. + * @param timestamp timestamp in AVStream.time_base units + * or if there is no stream specified then in AV_TIME_BASE units. + * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE + * and AVSEEK_FLAG_ANY. The protocol may silently ignore + * AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will + * fail with ENOTSUP if used and not supported. + * @return >= 0 on success + * @see AVInputFormat::read_seek + */ +offset_t av_url_read_seek(URLContext *h, + int stream_index, int64_t timestamp, int flags); + +/** + * 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 @@ -99,13 +131,25 @@ typedef struct URLProtocol { offset_t (*url_seek)(URLContext *h, offset_t pos, int whence); int (*url_close)(URLContext *h); struct URLProtocol *next; + int (*url_read_pause)(URLContext *h, int pause); + offset_t (*url_read_seek)(URLContext *h, + int stream_index, int64_t timestamp, int flags); } URLProtocol; extern URLProtocol *first_protocol; extern URLInterruptCB *url_interrupt_cb; +URLProtocol *av_protocol_next(URLProtocol *p); + int register_protocol(URLProtocol *protocol); +/** + * 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(ByteIOContext) must not be used outside libav*. + */ typedef struct { unsigned char *buffer; int buffer_size; @@ -124,6 +168,9 @@ typedef struct { 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); + offset_t (*read_seek)(void *opaque, + int stream_index, int64_t timestamp, int flags); } ByteIOContext; int init_put_byte(ByteIOContext *s, @@ -134,6 +181,14 @@ int init_put_byte(ByteIOContext *s, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), offset_t (*seek)(void *opaque, offset_t offset, int whence)); +ByteIOContext *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), + offset_t (*seek)(void *opaque, offset_t offset, int whence)); void put_byte(ByteIOContext *s, int b); void put_buffer(ByteIOContext *s, const unsigned char *buf, int size); @@ -156,6 +211,10 @@ offset_t url_fsize(ByteIOContext *s); int url_feof(ByteIOContext *s); int url_ferror(ByteIOContext *s); +int av_url_read_fpause(ByteIOContext *h, int pause); +offset_t av_url_read_fseek(ByteIOContext *h, + int stream_index, int64_t timestamp, int flags); + #define URL_EOF (-1) /** @note return URL_EOF (-1) if EOF */ int url_fgetc(ByteIOContext *s); @@ -190,19 +249,28 @@ unsigned int get_be24(ByteIOContext *s); unsigned int get_be32(ByteIOContext *s); uint64_t get_be64(ByteIOContext *s); +uint64_t ff_get_v(ByteIOContext *bc); + static inline int url_is_streamed(ByteIOContext *s) { return s->is_streamed; } -int url_fdopen(ByteIOContext *s, URLContext *h); +/** @note when opened as read/write, the buffers are only used for + writing */ +int url_fdopen(ByteIOContext **s, URLContext *h); /** @warning must be called before any I/O */ int url_setbufsize(ByteIOContext *s, int buf_size); +/** 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. */ +int url_resetbuf(ByteIOContext *s, int flags); /** @note when opened as read/write, the buffers are only used for - reading */ -int url_fopen(ByteIOContext *s, const char *filename, int flags); + writing */ +int url_fopen(ByteIOContext **s, const char *filename, int flags); int url_fclose(ByteIOContext *s); URLContext *url_fileno(ByteIOContext *s); @@ -211,12 +279,12 @@ URLContext *url_fileno(ByteIOContext *s); * handle. If the file is not packetized (stream like http or file on * disk), then 0 is returned. * - * @param h buffered file handle + * @param s buffered file handle * @return maximum packet size in bytes */ int url_fget_max_packet_size(ByteIOContext *s); -int url_open_buf(ByteIOContext *s, uint8_t *buf, int buf_size, int flags); +int url_open_buf(ByteIOContext **s, uint8_t *buf, int buf_size, int flags); /** return the written or read size */ int url_close_buf(ByteIOContext *s); @@ -227,7 +295,7 @@ int url_close_buf(ByteIOContext *s); * @param s new IO context * @return zero if no error. */ -int url_open_dyn_buf(ByteIOContext *s); +int url_open_dyn_buf(ByteIOContext **s); /** * Open a write only packetized memory stream with a maximum packet @@ -238,35 +306,24 @@ int url_open_dyn_buf(ByteIOContext *s); * @param max_packet_size maximum packet size (must be > 0) * @return zero if no error. */ -int url_open_dyn_packet_buf(ByteIOContext *s, int max_packet_size); +int url_open_dyn_packet_buf(ByteIOContext **s, int max_packet_size); /** * Return the written size and a pointer to the buffer. The buffer * must be freed with av_free(). * @param s IO context - * @param pointer to a byte buffer + * @param pbuffer pointer to a byte buffer * @return the length of the byte buffer */ int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer); +unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, unsigned int len); unsigned long get_checksum(ByteIOContext *s); void init_checksum(ByteIOContext *s, unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum); -/* file.c */ -extern URLProtocol file_protocol; -extern URLProtocol pipe_protocol; - /* udp.c */ -extern URLProtocol udp_protocol; int udp_set_remote_url(URLContext *h, const char *uri); int udp_get_local_port(URLContext *h); int udp_get_file_handle(URLContext *h); -/* tcp.c */ -extern URLProtocol tcp_protocol; - -/* http.c */ -extern URLProtocol http_protocol; - -#endif - +#endif /* FFMPEG_AVIO_H */ |