FFmpeg
avio_internal.h
Go to the documentation of this file.
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 {
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  */
41 
44 
45  /**
46  * max filesize, used to limit allocations
47  */
49 
50  /**
51  * Bytes read statistic
52  */
54 
55  /**
56  * Bytes written statistic
57  */
59 
60  /**
61  * seek statistic
62  */
64 
65  /**
66  * writeout statistic
67  */
69 
70  /**
71  * Original buffer size
72  * used after probing to ensure seekback and to reset the buffer size
73  */
75 
76  /**
77  * Written output size
78  * is updated each time a successful writeout ends up further position-wise
79  */
81 } FFIOContext;
82 
84 {
85  return (FFIOContext*)ctx;
86 }
87 
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 {
128  avio_wl32(pb, MKTAG(s[0], s[1], s[2], s[3]));
129 }
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 
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  */
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  */
255 
256 int ffio_open_whitelist(AVIOContext **s, const char *url, int flags,
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,
267  const char *whitelist, const char *blacklist,
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  */
277 
278 /**
279  * Reset a dynamic buffer.
280  *
281  * Resets everything, but keeps the allocated buffer for later use.
282  */
284 
285 /**
286  * Free a dynamic buffer.
287  *
288  * @param s a pointer to an IO context opened by avio_open_dyn_buf()
289  */
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  */
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  */
323  int64_t max_len);
324 
325 #endif /* AVFORMAT_AVIO_INTERNAL_H */
ffio_init_context
void ffio_init_context(FFIOContext *s, 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, const uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Definition: aviobuf.c:50
ffio_copy_url_options
int ffio_copy_url_options(AVIOContext *pb, AVDictionary **avio_opts)
Read url related dictionary options from the AVIOContext and write to the given dictionary.
Definition: aviobuf.c:994
ffio_realloc_buf
int ffio_realloc_buf(AVIOContext *s, int buf_size)
Reallocate a given buffer for AVIOContext.
Definition: aviobuf.c:1106
ffio_wfourcc
static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s)
Definition: avio_internal.h:126
ffiocontext
static av_always_inline FFIOContext * ffiocontext(AVIOContext *ctx)
Definition: avio_internal.h:83
ffio_read_indirect
int ffio_read_indirect(AVIOContext *s, unsigned char *buf, int size, const unsigned char **data)
Read size bytes from AVIOContext, returning a pointer.
Definition: aviobuf.c:675
int64_t
long long int64_t
Definition: coverity.c:34
FFIOContext::written_output_size
int64_t written_output_size
Written output size is updated each time a successful writeout ends up further position-wise.
Definition: avio_internal.h:80
ff_read_line_to_bprint_overwrite
int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, struct AVBPrint *bp)
Read a whole line of text from AVIOContext to an AVBPrint buffer overwriting its contents.
Definition: aviobuf.c:858
b
#define b
Definition: input.c:43
data
const char data[16]
Definition: mxf.c:149
FFIOContext::short_seek_get
int(* short_seek_get)(void *opaque)
A callback that is used instead of short_seek_threshold.
Definition: avio_internal.h:35
ffio_open_whitelist
int ffio_open_whitelist(AVIOContext **s, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist)
Definition: avio.c:551
ff_avio_class
const AVClass ff_avio_class
Definition: avio.c:103
AVDictionary
Definition: dict.c:32
ffio_init_read_context
void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for reading.
Definition: aviobuf.c:99
AVIODataMarkerType
AVIODataMarkerType
Different data types that can be returned via the AVIO write_data_type callback.
Definition: avio.h:110
ffio_open_whitelist2
int ffio_open_whitelist2(AVIOContext **s, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist, AVFormatContext *avfc)
Like ffio_open_whitelist(), but additionally records avfc on the underlying URLContext before it is c...
Definition: avio.c:529
FFIOContext::short_seek_threshold
int short_seek_threshold
Threshold to favor readahead over seek.
Definition: avio_internal.h:40
FFIOContext
Definition: avio_internal.h:30
ffio_get_checksum
unsigned long ffio_get_checksum(AVIOContext *s)
Definition: aviobuf.c:586
update_checksum
static void update_checksum(AVIOContext *s)
Definition: aviobuf.c:1018
AVIOInterruptCB
Callback for checking whether to abort blocking functions.
Definition: avio.h:59
ffio_fdopen
int ffio_fdopen(AVIOContext **s, struct URLContext *h)
Create and initialize a AVIOContext for accessing the resource referenced by the URLContext h.
Definition: avio.c:470
av_always_inline
#define av_always_inline
Definition: attributes.h:76
ffio_open_null_buf
int ffio_open_null_buf(AVIOContext **s)
Open a write-only fake memory stream.
Definition: aviobuf.c:1462
val
static double val(void *priv, double ch)
Definition: aeval.c:77
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_read_callback.c:42
FFIOContext::bytes_read
int64_t bytes_read
Bytes read statistic.
Definition: avio_internal.h:53
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:504
FFIOContext::seek_count
int seek_count
seek statistic
Definition: avio_internal.h:63
ffio_read_leb
unsigned int ffio_read_leb(AVIOContext *s)
Read a unsigned integer coded as a variable number of up to eight little-endian bytes,...
Definition: aviobuf.c:930
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
ffio_write_leb
void ffio_write_leb(AVIOContext *s, unsigned val)
Definition: aviobuf.c:947
ff_crcEDB88320_update
unsigned long ff_crcEDB88320_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:574
AVFormatContext
Format I/O context.
Definition: avformat.h:1333
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
ffio_close_null_buf
int ffio_close_null_buf(AVIOContext *s)
Close a null buffer.
Definition: aviobuf.c:1472
FFIOContext::orig_buffer_size
int orig_buffer_size
Original buffer size used after probing to ensure seekback and to reset the buffer size.
Definition: avio_internal.h:74
options
Definition: swscale.c:50
seek
static void BS_FUNC() seek(BSCTX *bc, unsigned pos)
Seek to the given bit position.
Definition: bitstream_template.h:407
ffio_fill
void ffio_fill(AVIOContext *s, int b, int64_t count)
Definition: aviobuf.c:192
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
FFIOContext::maxsize
int64_t maxsize
max filesize, used to limit allocations
Definition: avio_internal.h:48
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
ffio_reset_dyn_buf
void ffio_reset_dyn_buf(AVIOContext *s)
Reset a dynamic buffer.
Definition: aviobuf.c:1399
FFIOContext::writeout_count
int writeout_count
writeout statistic
Definition: avio_internal.h:68
FFIOContext::pub
AVIOContext pub
Definition: avio_internal.h:31
ffio_geturlcontext
struct URLContext * ffio_geturlcontext(AVIOContext *s)
Return the URLContext associated with the AVIOContext.
Definition: avio.c:112
size
int size
Definition: twinvq_data.h:10344
avio.h
ffio_init_checksum
void ffio_init_checksum(AVIOContext *s, unsigned long(*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum)
Definition: aviobuf.c:594
ffio_open_dyn_packet_buf
int ffio_open_dyn_packet_buf(AVIOContext **s, int max_packet_size)
Open a write only packetized memory stream with a maximum packet size of 'max_packet_size'.
Definition: aviobuf.c:1370
avio_wl32
void avio_wl32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:360
ffio_ensure_seekback
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition: aviobuf.c:1026
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
ffio_read_varlen
uint64_t ffio_read_varlen(AVIOContext *bc)
Definition: aviobuf.c:919
ff_crc04C11DB7_update
unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:568
URLContext::avfc
struct AVFormatContext * avfc
the AVFormatContext that opened this URLContext, or NULL for standalone use
Definition: url.h:49
ffio_limit
int ffio_limit(AVIOContext *s, int size)
Definition: aviobuf.c:1064
URLContext
Definition: url.h:35
log.h
s
uint8_t s
Definition: llvidencdsp.c:39
ff_crcA001_update
unsigned long ff_crcA001_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:580
len
int len
Definition: vorbis_enc_data.h:426
int_cb
const AVIOInterruptCB int_cb
Definition: ffmpeg.c:322
write_packet
static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt)
Definition: ffmpeg_mux.c:204
ff_read_string_to_bprint_overwrite
int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, struct AVBPrint *bp, int64_t max_len)
Read a whole null-terminated string of text from AVIOContext to an AVBPrint buffer overwriting its co...
Definition: aviobuf.c:863
ffio_free_dyn_buf
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
Definition: aviobuf.c:1438
FFIOContext::current_type
enum AVIODataMarkerType current_type
Definition: avio_internal.h:42
ffio_write_lines
void ffio_write_lines(AVIOContext *s, const unsigned char *buf, int size, const unsigned char *ending)
Write a sequence of text lines, converting line endings.
Definition: aviobuf.c:963
ffio_init_write_context
void ffio_init_write_context(FFIOContext *s, uint8_t *buffer, int buffer_size)
Wrap a buffer in an AVIOContext for writing.
Definition: aviobuf.c:104
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
ffio_rewind_with_probe_data
int ffio_rewind_with_probe_data(AVIOContext *s, unsigned char **buf, int buf_size)
Rewind the AVIOContext using the specified buffer containing the first buf_size bytes of the file.
Definition: aviobuf.c:1151
FFIOContext::last_time
int64_t last_time
Definition: avio_internal.h:43
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
ffio_read_size
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:665
h
h
Definition: vp9dsp_template.c:2070
FFIOContext::bytes_written
int64_t bytes_written
Bytes written statistic.
Definition: avio_internal.h:58