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