]> git.sesse.net Git - ffmpeg/blob - libavformat/avio.h
cosmetic part of the commit below
[ffmpeg] / libavformat / avio.h
1 /*
2  * unbuffered io for ffmpeg system
3  * copyright (c) 2001 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
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
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #ifndef AVIO_H
22 #define AVIO_H
23
24 /* output byte stream handling */
25
26 typedef int64_t offset_t;
27
28 /* unbuffered I/O */
29
30 struct URLContext {
31     struct URLProtocol *prot;
32     int flags;
33     int is_streamed;  /* true if streamed (no seek possible), default = false */
34     int max_packet_size;  /* if non zero, the stream is packetized with this max packet size */
35     void *priv_data;
36 #if LIBAVFORMAT_VERSION_INT >= (52<<16)
37     char *filename; /* specified filename */
38 #else
39     char filename[1]; /* specified filename */
40 #endif
41 };
42
43 typedef struct URLContext URLContext;
44
45 typedef struct URLPollEntry {
46     URLContext *handle;
47     int events;
48     int revents;
49 } URLPollEntry;
50
51 #define URL_RDONLY 0
52 #define URL_WRONLY 1
53 #define URL_RDWR   2
54
55 typedef int URLInterruptCB(void);
56
57 int url_open(URLContext **h, const char *filename, int flags);
58 int url_read(URLContext *h, unsigned char *buf, int size);
59 int url_write(URLContext *h, unsigned char *buf, int size);
60 offset_t url_seek(URLContext *h, offset_t pos, int whence);
61 int url_close(URLContext *h);
62 int url_exist(const char *filename);
63 offset_t url_filesize(URLContext *h);
64 int url_get_max_packet_size(URLContext *h);
65 void url_get_filename(URLContext *h, char *buf, int buf_size);
66
67 /* the callback is called in blocking functions to test regulary if
68    asynchronous interruption is needed. AVERROR(EINTR) is returned
69    in this case by the interrupted function. 'NULL' means no interrupt
70    callback is given. */
71 void url_set_interrupt_cb(URLInterruptCB *interrupt_cb);
72
73 /* not implemented */
74 int url_poll(URLPollEntry *poll_table, int n, int timeout);
75
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  */
81 #define AVSEEK_SIZE 0x10000
82
83 typedef 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);
90     struct URLProtocol *next;
91 } URLProtocol;
92
93 extern URLProtocol *first_protocol;
94 extern URLInterruptCB *url_interrupt_cb;
95
96 int register_protocol(URLProtocol *protocol);
97
98 typedef struct {
99     unsigned char *buffer;
100     int buffer_size;
101     unsigned char *buf_ptr, *buf_end;
102     void *opaque;
103     int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);
104     int (*write_packet)(void *opaque, uint8_t *buf, int buf_size);
105     offset_t (*seek)(void *opaque, offset_t offset, int whence);
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;
111     int max_packet_size;
112     unsigned long checksum;
113     unsigned char *checksum_ptr;
114     unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);
115     int error;         ///< contains the error code or 0 if no error happened
116 } ByteIOContext;
117
118 int init_put_byte(ByteIOContext *s,
119                   unsigned char *buffer,
120                   int buffer_size,
121                   int write_flag,
122                   void *opaque,
123                   int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
124                   int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
125                   offset_t (*seek)(void *opaque, offset_t offset, int whence));
126
127 void put_byte(ByteIOContext *s, int b);
128 void put_buffer(ByteIOContext *s, const unsigned char *buf, int size);
129 void put_le64(ByteIOContext *s, uint64_t val);
130 void put_be64(ByteIOContext *s, uint64_t val);
131 void put_le32(ByteIOContext *s, unsigned int val);
132 void put_be32(ByteIOContext *s, unsigned int val);
133 void put_le24(ByteIOContext *s, unsigned int val);
134 void put_be24(ByteIOContext *s, unsigned int val);
135 void put_le16(ByteIOContext *s, unsigned int val);
136 void put_be16(ByteIOContext *s, unsigned int val);
137 void put_tag(ByteIOContext *s, const char *tag);
138
139 void put_strz(ByteIOContext *s, const char *buf);
140
141 offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence);
142 void url_fskip(ByteIOContext *s, offset_t offset);
143 offset_t url_ftell(ByteIOContext *s);
144 offset_t url_fsize(ByteIOContext *s);
145 int url_feof(ByteIOContext *s);
146 int url_ferror(ByteIOContext *s);
147
148 #define URL_EOF (-1)
149 int url_fgetc(ByteIOContext *s);
150 #ifdef __GNUC__
151 int url_fprintf(ByteIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
152 #else
153 int url_fprintf(ByteIOContext *s, const char *fmt, ...);
154 #endif
155 char *url_fgets(ByteIOContext *s, char *buf, int buf_size);
156
157 void put_flush_packet(ByteIOContext *s);
158
159 int get_buffer(ByteIOContext *s, unsigned char *buf, int size);
160 int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size);
161 int get_byte(ByteIOContext *s);
162 unsigned int get_le24(ByteIOContext *s);
163 unsigned int get_le32(ByteIOContext *s);
164 uint64_t get_le64(ByteIOContext *s);
165 unsigned int get_le16(ByteIOContext *s);
166
167 char *get_strz(ByteIOContext *s, char *buf, int maxlen);
168 unsigned int get_be16(ByteIOContext *s);
169 unsigned int get_be24(ByteIOContext *s);
170 unsigned int get_be32(ByteIOContext *s);
171 uint64_t get_be64(ByteIOContext *s);
172
173 static inline int url_is_streamed(ByteIOContext *s)
174 {
175     return s->is_streamed;
176 }
177
178 int url_fdopen(ByteIOContext *s, URLContext *h);
179 int url_setbufsize(ByteIOContext *s, int buf_size);
180 int url_fopen(ByteIOContext *s, const char *filename, int flags);
181 int url_fclose(ByteIOContext *s);
182 URLContext *url_fileno(ByteIOContext *s);
183 int url_fget_max_packet_size(ByteIOContext *s);
184
185 int url_open_buf(ByteIOContext *s, uint8_t *buf, int buf_size, int flags);
186 int url_close_buf(ByteIOContext *s);
187
188 int url_open_dyn_buf(ByteIOContext *s);
189 int url_open_dyn_packet_buf(ByteIOContext *s, int max_packet_size);
190 int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer);
191
192 unsigned long get_checksum(ByteIOContext *s);
193 void init_checksum(ByteIOContext *s, unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum);
194
195 /* file.c */
196 extern URLProtocol file_protocol;
197 extern URLProtocol pipe_protocol;
198
199 /* udp.c */
200 extern URLProtocol udp_protocol;
201 int udp_set_remote_url(URLContext *h, const char *uri);
202 int udp_get_local_port(URLContext *h);
203 int udp_get_file_handle(URLContext *h);
204
205 /* tcp.c  */
206 extern URLProtocol tcp_protocol;
207
208 /* http.c */
209 extern URLProtocol http_protocol;
210
211 #endif
212