/src/ffmpeg/libavformat/avio_internal.h
Line | Count | Source |
1 | | /* |
2 | | * This file is part of FFmpeg. |
3 | | * |
4 | | * FFmpeg is free software; you can redistribute it and/or |
5 | | * modify it under the terms of the GNU Lesser General Public |
6 | | * License as published by the Free Software Foundation; either |
7 | | * version 2.1 of the License, or (at your option) any later version. |
8 | | * |
9 | | * FFmpeg is distributed in the hope that it will be useful, |
10 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | | * Lesser General Public License for more details. |
13 | | * |
14 | | * You should have received a copy of the GNU Lesser General Public |
15 | | * License along with FFmpeg; if not, write to the Free Software |
16 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
17 | | */ |
18 | | |
19 | | #ifndef AVFORMAT_AVIO_INTERNAL_H |
20 | | #define AVFORMAT_AVIO_INTERNAL_H |
21 | | |
22 | | #include "avio.h" |
23 | | |
24 | | #include "libavutil/log.h" |
25 | | |
26 | | typedef struct AVFormatContext AVFormatContext; |
27 | | |
28 | | extern const AVClass ff_avio_class; |
29 | | |
30 | | typedef struct FFIOContext { |
31 | | AVIOContext pub; |
32 | | /** |
33 | | * A callback that is used instead of short_seek_threshold. |
34 | | */ |
35 | | int (*short_seek_get)(void *opaque); |
36 | | |
37 | | /** |
38 | | * Threshold to favor readahead over seek. |
39 | | */ |
40 | | int short_seek_threshold; |
41 | | |
42 | | enum AVIODataMarkerType current_type; |
43 | | int64_t last_time; |
44 | | |
45 | | /** |
46 | | * max filesize, used to limit allocations |
47 | | */ |
48 | | int64_t maxsize; |
49 | | |
50 | | /** |
51 | | * Bytes read statistic |
52 | | */ |
53 | | int64_t bytes_read; |
54 | | |
55 | | /** |
56 | | * Bytes written statistic |
57 | | */ |
58 | | int64_t bytes_written; |
59 | | |
60 | | /** |
61 | | * seek statistic |
62 | | */ |
63 | | int seek_count; |
64 | | |
65 | | /** |
66 | | * writeout statistic |
67 | | */ |
68 | | int writeout_count; |
69 | | |
70 | | /** |
71 | | * Original buffer size |
72 | | * used after probing to ensure seekback and to reset the buffer size |
73 | | */ |
74 | | int orig_buffer_size; |
75 | | |
76 | | /** |
77 | | * Written output size |
78 | | * is updated each time a successful writeout ends up further position-wise |
79 | | */ |
80 | | int64_t written_output_size; |
81 | | } FFIOContext; |
82 | | |
83 | | static av_always_inline FFIOContext *ffiocontext(AVIOContext *ctx) |
84 | 0 | { |
85 | 0 | return (FFIOContext*)ctx; |
86 | 0 | } Unexecuted instantiation: demux.c:ffiocontext Unexecuted instantiation: demux_utils.c:ffiocontext Unexecuted instantiation: format.c:ffiocontext Unexecuted instantiation: id3v2.c:ffiocontext Unexecuted instantiation: options.c:ffiocontext Unexecuted instantiation: seek.c:ffiocontext Unexecuted instantiation: utils.c:ffiocontext Unexecuted instantiation: avio.c:ffiocontext Unexecuted instantiation: aviobuf.c:ffiocontext |
87 | | |
88 | | void ffio_init_context(FFIOContext *s, |
89 | | unsigned char *buffer, |
90 | | int buffer_size, |
91 | | int write_flag, |
92 | | void *opaque, |
93 | | int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), |
94 | | int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size), |
95 | | int64_t (*seek)(void *opaque, int64_t offset, int whence)); |
96 | | |
97 | | /** |
98 | | * Wrap a buffer in an AVIOContext for reading. |
99 | | */ |
100 | | void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size); |
101 | | |
102 | | /** |
103 | | * Wrap a buffer in an AVIOContext for writing. |
104 | | */ |
105 | | void ffio_init_write_context(FFIOContext *s, uint8_t *buffer, int buffer_size); |
106 | | |
107 | | /** |
108 | | * Read size bytes from AVIOContext, returning a pointer. |
109 | | * Note that the data pointed at by the returned pointer is only |
110 | | * valid until the next call that references the same IO context. |
111 | | * @param s IO context |
112 | | * @param buf pointer to buffer into which to assemble the requested |
113 | | * data if it is not available in contiguous addresses in the |
114 | | * underlying buffer |
115 | | * @param size number of bytes requested |
116 | | * @param data address at which to store pointer: this will be a |
117 | | * a direct pointer into the underlying buffer if the requested |
118 | | * number of bytes are available at contiguous addresses, otherwise |
119 | | * will be a copy of buf |
120 | | * @return number of bytes read or AVERROR |
121 | | */ |
122 | | int ffio_read_indirect(AVIOContext *s, unsigned char *buf, int size, const unsigned char **data); |
123 | | |
124 | | void ffio_fill(AVIOContext *s, int b, int64_t count); |
125 | | |
126 | | static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s) |
127 | 0 | { |
128 | 0 | avio_wl32(pb, MKTAG(s[0], s[1], s[2], s[3])); |
129 | 0 | } Unexecuted instantiation: demux.c:ffio_wfourcc Unexecuted instantiation: demux_utils.c:ffio_wfourcc Unexecuted instantiation: format.c:ffio_wfourcc Unexecuted instantiation: id3v2.c:ffio_wfourcc Unexecuted instantiation: options.c:ffio_wfourcc Unexecuted instantiation: seek.c:ffio_wfourcc Unexecuted instantiation: utils.c:ffio_wfourcc Unexecuted instantiation: avio.c:ffio_wfourcc Unexecuted instantiation: aviobuf.c:ffio_wfourcc |
130 | | |
131 | | /** |
132 | | * Rewind the AVIOContext using the specified buffer containing the first buf_size bytes of the file. |
133 | | * Used after probing to avoid seeking. |
134 | | * Joins buf and s->buffer, taking any overlap into consideration. |
135 | | * @note s->buffer must overlap with buf or they can't be joined and the function fails |
136 | | * |
137 | | * @param s The read-only AVIOContext to rewind |
138 | | * @param buf The probe buffer containing the first buf_size bytes of the file |
139 | | * @param buf_size The size of buf |
140 | | * @return >= 0 in case of success, a negative value corresponding to an |
141 | | * AVERROR code in case of failure |
142 | | */ |
143 | | int ffio_rewind_with_probe_data(AVIOContext *s, unsigned char **buf, int buf_size); |
144 | | |
145 | | uint64_t ffio_read_varlen(AVIOContext *bc); |
146 | | |
147 | | /** |
148 | | * Read a unsigned integer coded as a variable number of up to eight |
149 | | * little-endian bytes, where the MSB in a byte signals another byte |
150 | | * must be read. |
151 | | * All coded bytes are read, but values > UINT_MAX are truncated. |
152 | | */ |
153 | | unsigned int ffio_read_leb(AVIOContext *s); |
154 | | |
155 | | void ffio_write_leb(AVIOContext *s, unsigned val); |
156 | | |
157 | | /** |
158 | | * Write a sequence of text lines, converting line endings. |
159 | | * All input line endings (LF, CRLF, CR) are converted to the configured line ending. |
160 | | * @param s The AVIOContext to write to |
161 | | * @param buf The buffer to write |
162 | | * @param size The size of the buffer, or <0 to use the full length of a null-terminated string |
163 | | * @param ending The line ending sequence to convert to, or NULL for \n |
164 | | */ |
165 | | void ffio_write_lines(AVIOContext *s, const unsigned char *buf, int size, |
166 | | const unsigned char *ending); |
167 | | |
168 | | /** |
169 | | * Read size bytes from AVIOContext into buf. |
170 | | * Check that exactly size bytes have been read. |
171 | | * @return number of bytes read or AVERROR |
172 | | */ |
173 | | int ffio_read_size(AVIOContext *s, unsigned char *buf, int size); |
174 | | |
175 | | /** |
176 | | * Reallocate a given buffer for AVIOContext. |
177 | | * |
178 | | * @param s the AVIOContext to realloc. |
179 | | * @param buf_size required new buffer size. |
180 | | * @return 0 on success, a negative AVERROR on failure. |
181 | | */ |
182 | | int ffio_realloc_buf(AVIOContext *s, int buf_size); |
183 | | |
184 | | /** |
185 | | * Ensures that the requested seekback buffer size will be available |
186 | | * |
187 | | * Will ensure that when reading sequentially up to buf_size, seeking |
188 | | * within the current pos and pos+buf_size is possible. |
189 | | * Once the stream position moves outside this window or another |
190 | | * ffio_ensure_seekback call requests a buffer outside this window this |
191 | | * guarantee is lost. |
192 | | */ |
193 | | int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size); |
194 | | |
195 | | int ffio_limit(AVIOContext *s, int size); |
196 | | |
197 | | void ffio_init_checksum(AVIOContext *s, |
198 | | unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), |
199 | | unsigned long checksum); |
200 | | unsigned long ffio_get_checksum(AVIOContext *s); |
201 | | unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, |
202 | | unsigned int len); |
203 | | unsigned long ff_crcEDB88320_update(unsigned long checksum, const uint8_t *buf, |
204 | | unsigned int len); |
205 | | unsigned long ff_crcA001_update(unsigned long checksum, const uint8_t *buf, |
206 | | unsigned int len); |
207 | | |
208 | | /** |
209 | | * Open a write only packetized memory stream with a maximum packet |
210 | | * size of 'max_packet_size'. The stream is stored in a memory buffer |
211 | | * with a big-endian 4 byte header giving the packet size in bytes. |
212 | | * |
213 | | * @param s new IO context |
214 | | * @param max_packet_size maximum packet size (must be > 0) |
215 | | * @return zero if no error. |
216 | | */ |
217 | | int ffio_open_dyn_packet_buf(AVIOContext **s, int max_packet_size); |
218 | | |
219 | | /** |
220 | | * Return the URLContext associated with the AVIOContext |
221 | | * |
222 | | * @param s IO context |
223 | | * @return pointer to URLContext or NULL. |
224 | | */ |
225 | | struct URLContext *ffio_geturlcontext(AVIOContext *s); |
226 | | |
227 | | /** |
228 | | * Create and initialize a AVIOContext for accessing the |
229 | | * resource referenced by the URLContext h. |
230 | | * @note When the URLContext h has been opened in read+write mode, the |
231 | | * AVIOContext can be used only for writing. |
232 | | * |
233 | | * @param s Used to return the pointer to the created AVIOContext. |
234 | | * In case of failure the pointed to value is set to NULL. |
235 | | * @return >= 0 in case of success, a negative value corresponding to an |
236 | | * AVERROR code in case of failure |
237 | | */ |
238 | | int ffio_fdopen(AVIOContext **s, struct URLContext *h); |
239 | | |
240 | | |
241 | | /** |
242 | | * Read url related dictionary options from the AVIOContext and write to the given dictionary |
243 | | */ |
244 | | int ffio_copy_url_options(AVIOContext* pb, AVDictionary** avio_opts); |
245 | | |
246 | | /** |
247 | | * Open a write-only fake memory stream. The written data is not stored |
248 | | * anywhere - this is only used for measuring the amount of data |
249 | | * written. |
250 | | * |
251 | | * @param s new IO context |
252 | | * @return zero if no error. |
253 | | */ |
254 | | int ffio_open_null_buf(AVIOContext **s); |
255 | | |
256 | | int ffio_open_whitelist(AVIOContext **s, const char *url, int flags, |
257 | | const AVIOInterruptCB *int_cb, AVDictionary **options, |
258 | | const char *whitelist, const char *blacklist); |
259 | | |
260 | | /** |
261 | | * Like ffio_open_whitelist(), but additionally records @p avfc on the |
262 | | * underlying URLContext before it is connected, so protocols can use shared |
263 | | * per-format resource. Pass NULL for standalone use. |
264 | | */ |
265 | | int ffio_open_whitelist2(AVIOContext **s, const char *url, int flags, |
266 | | const AVIOInterruptCB *int_cb, AVDictionary **options, |
267 | | const char *whitelist, const char *blacklist, |
268 | | AVFormatContext *avfc); |
269 | | |
270 | | /** |
271 | | * Close a null buffer. |
272 | | * |
273 | | * @param s an IO context opened by ffio_open_null_buf |
274 | | * @return the number of bytes written to the null buffer, negative on error |
275 | | */ |
276 | | int ffio_close_null_buf(AVIOContext *s); |
277 | | |
278 | | /** |
279 | | * Reset a dynamic buffer. |
280 | | * |
281 | | * Resets everything, but keeps the allocated buffer for later use. |
282 | | */ |
283 | | void ffio_reset_dyn_buf(AVIOContext *s); |
284 | | |
285 | | /** |
286 | | * Free a dynamic buffer. |
287 | | * |
288 | | * @param s a pointer to an IO context opened by avio_open_dyn_buf() |
289 | | */ |
290 | | void ffio_free_dyn_buf(AVIOContext **s); |
291 | | |
292 | | struct AVBPrint; |
293 | | /** |
294 | | * Read a whole line of text from AVIOContext to an AVBPrint buffer overwriting |
295 | | * its contents. Stop reading after reaching a \\r, a \\n, a \\r\\n, a \\0 or |
296 | | * EOF. The line ending characters are NOT included in the buffer, but they |
297 | | * are skipped on the input. |
298 | | * |
299 | | * @param s the read-only AVIOContext |
300 | | * @param bp the AVBPrint buffer |
301 | | * @return the length of the read line not including the line endings, |
302 | | * negative on error, or if the buffer becomes truncated. |
303 | | */ |
304 | | int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, struct AVBPrint *bp); |
305 | | |
306 | | /** |
307 | | * Read a whole null-terminated string of text from AVIOContext to an AVBPrint |
308 | | * buffer overwriting its contents. Stop reading after reaching the maximum |
309 | | * length, a \\0 or EOF. |
310 | | * |
311 | | * @param s the read-only AVIOContext |
312 | | * @param bp the AVBPrint buffer |
313 | | * @param max_len the maximum length to be read from the AVIOContext. |
314 | | * Negative (< 0) values signal that there is no known maximum |
315 | | * length applicable. A maximum length of zero means that the |
316 | | * AVIOContext is not touched, and the function returns |
317 | | * with a read length of zero. In all cases the AVBprint |
318 | | * is cleared. |
319 | | * @return the length of the read string not including the terminating null, |
320 | | * negative on error, or if the buffer becomes truncated. |
321 | | */ |
322 | | int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, struct AVBPrint *bp, |
323 | | int64_t max_len); |
324 | | |
325 | | #endif /* AVFORMAT_AVIO_INTERNAL_H */ |