Move aviobuf.c comments to avio.h. By moving the aviobuf.c comments to avio.h,
[libav.git] / libavformat / avio.h
CommitLineData
04d7f601
DB
1/*
2 * unbuffered io for ffmpeg system
3 * copyright (c) 2001 Fabrice Bellard
4 *
b78e7197
DB
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
04d7f601
DB
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
b78e7197 10 * version 2.1 of the License, or (at your option) any later version.
04d7f601 11 *
b78e7197 12 * FFmpeg is distributed in the hope that it will be useful,
04d7f601
DB
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
b78e7197 18 * License along with FFmpeg; if not, write to the Free Software
04d7f601
DB
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
f031df23
FB
21#ifndef AVIO_H
22#define AVIO_H
23
de6d9b64
FB
24/* output byte stream handling */
25
0c1a9eda 26typedef int64_t offset_t;
de6d9b64
FB
27
28/* unbuffered I/O */
29
30struct URLContext {
31 struct URLProtocol *prot;
115329f1 32 int flags;
de6d9b64 33 int is_streamed; /* true if streamed (no seek possible), default = false */
f031df23 34 int max_packet_size; /* if non zero, the stream is packetized with this max packet size */
de6d9b64 35 void *priv_data;
62181004
RB
36#if LIBAVFORMAT_VERSION_INT >= (52<<16)
37 char *filename; /* specified filename */
38#else
f746a046 39 char filename[1]; /* specified filename */
62181004 40#endif
de6d9b64
FB
41};
42
de6d9b64
FB
43typedef struct URLContext URLContext;
44
45typedef struct URLPollEntry {
46 URLContext *handle;
47 int events;
48 int revents;
49} URLPollEntry;
50
51#define URL_RDONLY 0
52#define URL_WRONLY 1
f031df23
FB
53#define URL_RDWR 2
54
019ac05a
FB
55typedef int URLInterruptCB(void);
56
de6d9b64
FB
57int url_open(URLContext **h, const char *filename, int flags);
58int url_read(URLContext *h, unsigned char *buf, int size);
59int url_write(URLContext *h, unsigned char *buf, int size);
60offset_t url_seek(URLContext *h, offset_t pos, int whence);
de6d9b64
FB
61int url_close(URLContext *h);
62int url_exist(const char *filename);
63offset_t url_filesize(URLContext *h);
f031df23 64int url_get_max_packet_size(URLContext *h);
f746a046
FB
65void url_get_filename(URLContext *h, char *buf, int buf_size);
66
019ac05a 67/* the callback is called in blocking functions to test regulary if
8fa36ae0
FR
68 asynchronous interruption is needed. AVERROR(EINTR) is returned
69 in this case by the interrupted function. 'NULL' means no interrupt
019ac05a
FB
70 callback is given. */
71void url_set_interrupt_cb(URLInterruptCB *interrupt_cb);
72
de6d9b64
FB
73/* not implemented */
74int url_poll(URLPollEntry *poll_table, int n, int timeout);
75
aa38b097
MN
76/**
77 * passing this as the "whence" parameter to a seek function causes it to
78 * return the filesize without seeking anywhere, supporting this is optional
79 * if its not supprted then the seek function will return <0
80 */
8e287af0
MN
81#define AVSEEK_SIZE 0x10000
82
de6d9b64
FB
83typedef struct URLProtocol {
84 const char *name;
85 int (*url_open)(URLContext *h, const char *filename, int flags);
86 int (*url_read)(URLContext *h, unsigned char *buf, int size);
87 int (*url_write)(URLContext *h, unsigned char *buf, int size);
88 offset_t (*url_seek)(URLContext *h, offset_t pos, int whence);
89 int (*url_close)(URLContext *h);
de6d9b64
FB
90 struct URLProtocol *next;
91} URLProtocol;
92
93extern URLProtocol *first_protocol;
019ac05a 94extern URLInterruptCB *url_interrupt_cb;
de6d9b64
FB
95
96int register_protocol(URLProtocol *protocol);
97
98typedef struct {
99 unsigned char *buffer;
100 int buffer_size;
101 unsigned char *buf_ptr, *buf_end;
102 void *opaque;
0c1a9eda 103 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
576ae256 104 int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
536ffa59 105 offset_t (*seek)(void *opaque, offset_t offset, int whence);
de6d9b64
FB
106 offset_t pos; /* position in the file of the current buffer */
107 int must_flush; /* true if the next seek should flush */
108 int eof_reached; /* true if eof reached */
109 int write_flag; /* true if open for writing */
110 int is_streamed;
f031df23 111 int max_packet_size;
ee9f36a8
MN
112 unsigned long checksum;
113 unsigned char *checksum_ptr;
114 unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
576ae256 115 int error; ///< contains the error code or 0 if no error happened
de6d9b64
FB
116} ByteIOContext;
117
118int init_put_byte(ByteIOContext *s,
119 unsigned char *buffer,
120 int buffer_size,
121 int write_flag,
122 void *opaque,
0c1a9eda 123 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
576ae256 124 int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
536ffa59 125 offset_t (*seek)(void *opaque, offset_t offset, int whence));
de6d9b64
FB
126
127void put_byte(ByteIOContext *s, int b);
75bdb984 128void put_buffer(ByteIOContext *s, const unsigned char *buf, int size);
0c1a9eda
ZK
129void put_le64(ByteIOContext *s, uint64_t val);
130void put_be64(ByteIOContext *s, uint64_t val);
de6d9b64
FB
131void put_le32(ByteIOContext *s, unsigned int val);
132void put_be32(ByteIOContext *s, unsigned int val);
ea395e8c 133void put_le24(ByteIOContext *s, unsigned int val);
a254c574 134void put_be24(ByteIOContext *s, unsigned int val);
de6d9b64
FB
135void put_le16(ByteIOContext *s, unsigned int val);
136void put_be16(ByteIOContext *s, unsigned int val);
0570bf06 137void put_tag(ByteIOContext *s, const char *tag);
de6d9b64 138
3b4b29dc 139void put_strz(ByteIOContext *s, const char *buf);
75bdb984 140
de6d9b64
FB
141offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence);
142void url_fskip(ByteIOContext *s, offset_t offset);
143offset_t url_ftell(ByteIOContext *s);
a965c478 144offset_t url_fsize(ByteIOContext *s);
de6d9b64 145int url_feof(ByteIOContext *s);
576ae256 146int url_ferror(ByteIOContext *s);
de6d9b64 147
f031df23 148#define URL_EOF (-1)
a8c5ab27 149/* NOTE: return URL_EOF (-1) if EOF */
f031df23 150int url_fgetc(ByteIOContext *s);
a8c5ab27
PI
151
152/* XXX: currently size is limited */
572f992e 153#ifdef __GNUC__
08f29f82 154int url_fprintf(ByteIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
572f992e
MN
155#else
156int url_fprintf(ByteIOContext *s, const char *fmt, ...);
157#endif
a8c5ab27
PI
158
159/* note: unlike fgets, the EOL character is not returned and a whole
160 line is parsed. return NULL if first char read was EOF */
f031df23
FB
161char *url_fgets(ByteIOContext *s, char *buf, int buf_size);
162
de6d9b64
FB
163void put_flush_packet(ByteIOContext *s);
164
165int get_buffer(ByteIOContext *s, unsigned char *buf, int size);
e15dec10 166int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size);
a8c5ab27
PI
167
168/* NOTE: return 0 if EOF, so you cannot use it if EOF handling is
169 necessary */
de6d9b64 170int get_byte(ByteIOContext *s);
ea395e8c 171unsigned int get_le24(ByteIOContext *s);
de6d9b64 172unsigned int get_le32(ByteIOContext *s);
0c1a9eda 173uint64_t get_le64(ByteIOContext *s);
de6d9b64
FB
174unsigned int get_le16(ByteIOContext *s);
175
3b4b29dc 176char *get_strz(ByteIOContext *s, char *buf, int maxlen);
de6d9b64 177unsigned int get_be16(ByteIOContext *s);
a254c574 178unsigned int get_be24(ByteIOContext *s);
de6d9b64 179unsigned int get_be32(ByteIOContext *s);
0c1a9eda 180uint64_t get_be64(ByteIOContext *s);
de6d9b64 181
7ac13f0c 182static inline int url_is_streamed(ByteIOContext *s)
de6d9b64
FB
183{
184 return s->is_streamed;
185}
de6d9b64
FB
186
187int url_fdopen(ByteIOContext *s, URLContext *h);
a8c5ab27
PI
188
189/* XXX: must be called before any I/O */
de6d9b64 190int url_setbufsize(ByteIOContext *s, int buf_size);
a8c5ab27
PI
191
192/* NOTE: when opened as read/write, the buffers are only used for
193 reading */
de6d9b64
FB
194int url_fopen(ByteIOContext *s, const char *filename, int flags);
195int url_fclose(ByteIOContext *s);
196URLContext *url_fileno(ByteIOContext *s);
a8c5ab27
PI
197
198/*
199 * Return the maximum packet size associated to packetized buffered file
200 * handle. If the file is not packetized (stream like http or file on
201 * disk), then 0 is returned.
202 *
203 * @param h buffered file handle
204 * @return maximum packet size in bytes
205 */
f031df23 206int url_fget_max_packet_size(ByteIOContext *s);
de6d9b64 207
0c1a9eda 208int url_open_buf(ByteIOContext *s, uint8_t *buf, int buf_size, int flags);
a8c5ab27
PI
209
210/* return the written or read size */
de6d9b64
FB
211int url_close_buf(ByteIOContext *s);
212
a8c5ab27
PI
213/*
214 * Open a write only memory stream.
215 *
216 * @param s new IO context
217 * @return zero if no error.
218 */
f031df23 219int url_open_dyn_buf(ByteIOContext *s);
a8c5ab27
PI
220
221/*
222 * Open a write only packetized memory stream with a maximum packet
223 * size of 'max_packet_size'. The stream is stored in a memory buffer
224 * with a big endian 4 byte header giving the packet size in bytes.
225 *
226 * @param s new IO context
227 * @param max_packet_size maximum packet size (must be > 0)
228 * @return zero if no error.
229 */
f031df23 230int url_open_dyn_packet_buf(ByteIOContext *s, int max_packet_size);
a8c5ab27
PI
231
232/*
233 * Return the written size and a pointer to the buffer. The buffer
234 * must be freed with av_free().
235 * @param s IO context
236 * @param pointer to a byte buffer
237 * @return the length of the byte buffer
238 */
0c1a9eda 239int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer);
f031df23 240
ee9f36a8
MN
241unsigned long get_checksum(ByteIOContext *s);
242void init_checksum(ByteIOContext *s, unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum);
ee9f36a8 243
de6d9b64
FB
244/* file.c */
245extern URLProtocol file_protocol;
246extern URLProtocol pipe_protocol;
247
248/* udp.c */
249extern URLProtocol udp_protocol;
f031df23
FB
250int udp_set_remote_url(URLContext *h, const char *uri);
251int udp_get_local_port(URLContext *h);
252int udp_get_file_handle(URLContext *h);
253
254/* tcp.c */
255extern URLProtocol tcp_protocol;
de6d9b64
FB
256
257/* http.c */
258extern URLProtocol http_protocol;
f031df23
FB
259
260#endif
261