FFmpeg
aviobuf.c
Go to the documentation of this file.
1 /*
2  * buffered I/O
3  * Copyright (c) 2000,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 
22 #include "libavutil/bprint.h"
23 #include "libavutil/crc.h"
24 #include "libavutil/dict.h"
25 #include "libavutil/internal.h"
26 #include "libavutil/intreadwrite.h"
27 #include "libavutil/log.h"
28 #include "libavutil/opt.h"
29 #include "libavutil/avassert.h"
30 #include "libavcodec/defs.h"
31 #include "avio.h"
32 #include "avio_internal.h"
33 #include "internal.h"
34 #include "url.h"
35 #include <stdarg.h>
36 
37 #define IO_BUFFER_SIZE 32768
38 
39 /**
40  * Do seeks within this distance ahead of the current buffer by skipping
41  * data instead of calling the protocol seek function, for seekable
42  * protocols.
43  */
44 #define SHORT_SEEK_THRESHOLD 32768
45 
46 static void *ff_avio_child_next(void *obj, void *prev)
47 {
48  AVIOContext *s = obj;
49  return prev ? NULL : s->opaque;
50 }
51 
52 static const AVClass *child_class_iterate(void **iter)
53 {
54  const AVClass *c = *iter ? NULL : &ffurl_context_class;
55  *iter = (void*)(uintptr_t)c;
56  return c;
57 }
58 
59 #define OFFSET(x) offsetof(AVIOContext,x)
60 #define E AV_OPT_FLAG_ENCODING_PARAM
61 #define D AV_OPT_FLAG_DECODING_PARAM
62 static const AVOption ff_avio_options[] = {
63  {"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, D },
64  { NULL },
65 };
66 
68  .class_name = "AVIOContext",
69  .item_name = av_default_item_name,
70  .version = LIBAVUTIL_VERSION_INT,
71  .option = ff_avio_options,
72  .child_next = ff_avio_child_next,
73  .child_class_iterate = child_class_iterate,
74 };
75 
76 static void fill_buffer(AVIOContext *s);
77 static int url_resetbuf(AVIOContext *s, int flags);
78 /** @warning must be called before any I/O */
79 static int set_buf_size(AVIOContext *s, int buf_size);
80 
82  unsigned char *buffer,
83  int buffer_size,
84  int write_flag,
85  void *opaque,
86  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
87  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
88  int64_t (*seek)(void *opaque, int64_t offset, int whence))
89 {
90  AVIOContext *const s = &ctx->pub;
91 
92  memset(ctx, 0, sizeof(*ctx));
93 
94  s->buffer = buffer;
95  ctx->orig_buffer_size =
96  s->buffer_size = buffer_size;
97  s->buf_ptr = buffer;
98  s->buf_ptr_max = buffer;
99  s->opaque = opaque;
100  s->direct = 0;
101 
102  url_resetbuf(s, write_flag ? AVIO_FLAG_WRITE : AVIO_FLAG_READ);
103 
104  s->write_packet = write_packet;
105  s->read_packet = read_packet;
106  s->seek = seek;
107  s->pos = 0;
108  s->eof_reached = 0;
109  s->error = 0;
110  s->seekable = seek ? AVIO_SEEKABLE_NORMAL : 0;
111  s->min_packet_size = 0;
112  s->max_packet_size = 0;
113  s->update_checksum = NULL;
114  ctx->short_seek_threshold = SHORT_SEEK_THRESHOLD;
115 
116  if (!read_packet && !write_flag) {
117  s->pos = buffer_size;
118  s->buf_end = s->buffer + buffer_size;
119  }
120  s->read_pause = NULL;
121  s->read_seek = NULL;
122 
123  s->write_data_type = NULL;
124  s->ignore_boundary_point = 0;
125  ctx->current_type = AVIO_DATA_MARKER_UNKNOWN;
126  ctx->last_time = AV_NOPTS_VALUE;
127  ctx->short_seek_get = NULL;
128 }
129 
131  unsigned char *buffer,
132  int buffer_size,
133  int write_flag,
134  void *opaque,
135  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
136  int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
137  int64_t (*seek)(void *opaque, int64_t offset, int whence))
138 {
139  FFIOContext *s = av_malloc(sizeof(*s));
140  if (!s)
141  return NULL;
142  ffio_init_context(s, buffer, buffer_size, write_flag, opaque,
144  return &s->pub;
145 }
146 
148 {
149  av_freep(ps);
150 }
151 
152 static void writeout(AVIOContext *s, const uint8_t *data, int len)
153 {
154  FFIOContext *const ctx = ffiocontext(s);
155  if (!s->error) {
156  int ret = 0;
157  if (s->write_data_type)
158  ret = s->write_data_type(s->opaque, (uint8_t *)data,
159  len,
160  ctx->current_type,
161  ctx->last_time);
162  else if (s->write_packet)
163  ret = s->write_packet(s->opaque, (uint8_t *)data, len);
164  if (ret < 0) {
165  s->error = ret;
166  } else {
167  ctx->bytes_written += len;
168  s->bytes_written = ctx->bytes_written;
169 
170  if (s->pos + len > ctx->written_output_size) {
171  ctx->written_output_size = s->pos + len;
172  }
173  }
174  }
175  if (ctx->current_type == AVIO_DATA_MARKER_SYNC_POINT ||
176  ctx->current_type == AVIO_DATA_MARKER_BOUNDARY_POINT) {
177  ctx->current_type = AVIO_DATA_MARKER_UNKNOWN;
178  }
179  ctx->last_time = AV_NOPTS_VALUE;
180  ctx->writeout_count++;
181  s->pos += len;
182 }
183 
185 {
186  s->buf_ptr_max = FFMAX(s->buf_ptr, s->buf_ptr_max);
187  if (s->write_flag && s->buf_ptr_max > s->buffer) {
188  writeout(s, s->buffer, s->buf_ptr_max - s->buffer);
189  if (s->update_checksum) {
190  s->checksum = s->update_checksum(s->checksum, s->checksum_ptr,
191  s->buf_ptr_max - s->checksum_ptr);
192  s->checksum_ptr = s->buffer;
193  }
194  }
195  s->buf_ptr = s->buf_ptr_max = s->buffer;
196  if (!s->write_flag)
197  s->buf_end = s->buffer;
198 }
199 
200 void avio_w8(AVIOContext *s, int b)
201 {
202  av_assert2(b>=-128 && b<=255);
203  *s->buf_ptr++ = b;
204  if (s->buf_ptr >= s->buf_end)
205  flush_buffer(s);
206 }
207 
208 void ffio_fill(AVIOContext *s, int b, int64_t count)
209 {
210  while (count > 0) {
211  int len = FFMIN(s->buf_end - s->buf_ptr, count);
212  memset(s->buf_ptr, b, len);
213  s->buf_ptr += len;
214 
215  if (s->buf_ptr >= s->buf_end)
216  flush_buffer(s);
217 
218  count -= len;
219  }
220 }
221 
222 void avio_write(AVIOContext *s, const unsigned char *buf, int size)
223 {
224  if (size <= 0)
225  return;
226  if (s->direct && !s->update_checksum) {
227  avio_flush(s);
228  writeout(s, buf, size);
229  return;
230  }
231  do {
232  int len = FFMIN(s->buf_end - s->buf_ptr, size);
233  memcpy(s->buf_ptr, buf, len);
234  s->buf_ptr += len;
235 
236  if (s->buf_ptr >= s->buf_end)
237  flush_buffer(s);
238 
239  buf += len;
240  size -= len;
241  } while (size > 0);
242 }
243 
245 {
246  int seekback = s->write_flag ? FFMIN(0, s->buf_ptr - s->buf_ptr_max) : 0;
247  flush_buffer(s);
248  if (seekback)
249  avio_seek(s, seekback, SEEK_CUR);
250 }
251 
252 int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
253 {
254  FFIOContext *const ctx = ffiocontext(s);
255  int64_t offset1;
256  int64_t pos;
257  int force = whence & AVSEEK_FORCE;
258  int buffer_size;
259  int short_seek;
260  whence &= ~AVSEEK_FORCE;
261 
262  if(!s)
263  return AVERROR(EINVAL);
264 
265  if ((whence & AVSEEK_SIZE))
266  return s->seek ? s->seek(s->opaque, offset, AVSEEK_SIZE) : AVERROR(ENOSYS);
267 
268  buffer_size = s->buf_end - s->buffer;
269  // pos is the absolute position that the beginning of s->buffer corresponds to in the file
270  pos = s->pos - (s->write_flag ? 0 : buffer_size);
271 
272  if (whence != SEEK_CUR && whence != SEEK_SET)
273  return AVERROR(EINVAL);
274 
275  if (whence == SEEK_CUR) {
276  offset1 = pos + (s->buf_ptr - s->buffer);
277  if (offset == 0)
278  return offset1;
279  if (offset > INT64_MAX - offset1)
280  return AVERROR(EINVAL);
281  offset += offset1;
282  }
283  if (offset < 0)
284  return AVERROR(EINVAL);
285 
286  short_seek = ctx->short_seek_threshold;
287  if (ctx->short_seek_get) {
288  int tmp = ctx->short_seek_get(s->opaque);
289  short_seek = FFMAX(tmp, short_seek);
290  }
291 
292  offset1 = offset - pos; // "offset1" is the relative offset from the beginning of s->buffer
293  s->buf_ptr_max = FFMAX(s->buf_ptr_max, s->buf_ptr);
294  if ((!s->direct || !s->seek) &&
295  offset1 >= 0 && offset1 <= (s->write_flag ? s->buf_ptr_max - s->buffer : buffer_size)) {
296  /* can do the seek inside the buffer */
297  s->buf_ptr = s->buffer + offset1;
298  } else if ((!(s->seekable & AVIO_SEEKABLE_NORMAL) ||
299  offset1 <= buffer_size + short_seek) &&
300  !s->write_flag && offset1 >= 0 &&
301  (!s->direct || !s->seek) &&
302  (whence != SEEK_END || force)) {
303  while(s->pos < offset && !s->eof_reached)
304  fill_buffer(s);
305  if (s->eof_reached)
306  return AVERROR_EOF;
307  s->buf_ptr = s->buf_end - (s->pos - offset);
308  } else if(!s->write_flag && offset1 < 0 && -offset1 < buffer_size>>1 && s->seek && offset > 0) {
309  int64_t res;
310 
311  pos -= FFMIN(buffer_size>>1, pos);
312  if ((res = s->seek(s->opaque, pos, SEEK_SET)) < 0)
313  return res;
314  s->buf_end =
315  s->buf_ptr = s->buffer;
316  s->pos = pos;
317  s->eof_reached = 0;
318  fill_buffer(s);
319  return avio_seek(s, offset, SEEK_SET | force);
320  } else {
321  int64_t res;
322  if (s->write_flag) {
323  flush_buffer(s);
324  }
325  if (!s->seek)
326  return AVERROR(EPIPE);
327  if ((res = s->seek(s->opaque, offset, SEEK_SET)) < 0)
328  return res;
329  ctx->seek_count++;
330  if (!s->write_flag)
331  s->buf_end = s->buffer;
332  s->buf_ptr = s->buf_ptr_max = s->buffer;
333  s->pos = offset;
334  }
335  s->eof_reached = 0;
336  return offset;
337 }
338 
339 int64_t avio_skip(AVIOContext *s, int64_t offset)
340 {
341  return avio_seek(s, offset, SEEK_CUR);
342 }
343 
345 {
346  FFIOContext *const ctx = ffiocontext(s);
347  int64_t size;
348 
349  if (!s)
350  return AVERROR(EINVAL);
351 
352  if (ctx->written_output_size)
353  return ctx->written_output_size;
354 
355  if (!s->seek)
356  return AVERROR(ENOSYS);
357  size = s->seek(s->opaque, 0, AVSEEK_SIZE);
358  if (size < 0) {
359  if ((size = s->seek(s->opaque, -1, SEEK_END)) < 0)
360  return size;
361  size++;
362  s->seek(s->opaque, s->pos, SEEK_SET);
363  }
364  return size;
365 }
366 
368 {
369  if(!s)
370  return 0;
371  if(s->eof_reached){
372  s->eof_reached=0;
373  fill_buffer(s);
374  }
375  return s->eof_reached;
376 }
377 
378 void avio_wl32(AVIOContext *s, unsigned int val)
379 {
380  avio_w8(s, (uint8_t) val );
381  avio_w8(s, (uint8_t)(val >> 8 ));
382  avio_w8(s, (uint8_t)(val >> 16));
383  avio_w8(s, val >> 24 );
384 }
385 
386 void avio_wb32(AVIOContext *s, unsigned int val)
387 {
388  avio_w8(s, val >> 24 );
389  avio_w8(s, (uint8_t)(val >> 16));
390  avio_w8(s, (uint8_t)(val >> 8 ));
391  avio_w8(s, (uint8_t) val );
392 }
393 
394 int avio_put_str(AVIOContext *s, const char *str)
395 {
396  int len = 1;
397  if (str) {
398  len += strlen(str);
399  avio_write(s, (const unsigned char *) str, len);
400  } else
401  avio_w8(s, 0);
402  return len;
403 }
404 
405 static inline int put_str16(AVIOContext *s, const char *str, const int be)
406 {
407  const uint8_t *q = str;
408  int ret = 0;
409  int err = 0;
410 
411  while (*q) {
412  uint32_t ch;
413  uint16_t tmp;
414 
415  GET_UTF8(ch, *q++, goto invalid;)
416  PUT_UTF16(ch, tmp, be ? avio_wb16(s, tmp) : avio_wl16(s, tmp);
417  ret += 2;)
418  continue;
419 invalid:
420  av_log(s, AV_LOG_ERROR, "Invalid UTF8 sequence in avio_put_str16%s\n", be ? "be" : "le");
421  err = AVERROR(EINVAL);
422  if (!*(q-1))
423  break;
424  }
425  if (be)
426  avio_wb16(s, 0);
427  else
428  avio_wl16(s, 0);
429  if (err)
430  return err;
431  ret += 2;
432  return ret;
433 }
434 
435 #define PUT_STR16(type, big_endian) \
436 int avio_put_str16 ## type(AVIOContext *s, const char *str) \
437 { \
438 return put_str16(s, str, big_endian); \
439 }
440 
441 PUT_STR16(le, 0)
442 PUT_STR16(be, 1)
443 
444 #undef PUT_STR16
445 
446 void avio_wl64(AVIOContext *s, uint64_t val)
447 {
448  avio_wl32(s, (uint32_t)(val & 0xffffffff));
449  avio_wl32(s, (uint32_t)(val >> 32));
450 }
451 
452 void avio_wb64(AVIOContext *s, uint64_t val)
453 {
454  avio_wb32(s, (uint32_t)(val >> 32));
455  avio_wb32(s, (uint32_t)(val & 0xffffffff));
456 }
457 
458 void avio_wl16(AVIOContext *s, unsigned int val)
459 {
460  avio_w8(s, (uint8_t)val);
461  avio_w8(s, (int)val >> 8);
462 }
463 
464 void avio_wb16(AVIOContext *s, unsigned int val)
465 {
466  avio_w8(s, (int)val >> 8);
467  avio_w8(s, (uint8_t)val);
468 }
469 
470 void avio_wl24(AVIOContext *s, unsigned int val)
471 {
472  avio_wl16(s, val & 0xffff);
473  avio_w8(s, (int)val >> 16);
474 }
475 
476 void avio_wb24(AVIOContext *s, unsigned int val)
477 {
478  avio_wb16(s, (int)val >> 8);
479  avio_w8(s, (uint8_t)val);
480 }
481 
483 {
484  FFIOContext *const ctx = ffiocontext(s);
486  if (s->buf_ptr - s->buffer >= s->min_packet_size)
487  avio_flush(s);
488  return;
489  }
490  if (!s->write_data_type)
491  return;
492  // If ignoring boundary points, just treat it as unknown
493  if (type == AVIO_DATA_MARKER_BOUNDARY_POINT && s->ignore_boundary_point)
495  // Avoid unnecessary flushes if we are already in non-header/trailer
496  // data and setting the type to unknown
498  (ctx->current_type != AVIO_DATA_MARKER_HEADER &&
499  ctx->current_type != AVIO_DATA_MARKER_TRAILER))
500  return;
501 
502  switch (type) {
505  // For header/trailer, ignore a new marker of the same type;
506  // consecutive header/trailer markers can be merged.
507  if (type == ctx->current_type)
508  return;
509  break;
510  }
511 
512  // If we've reached here, we have a new, noteworthy marker.
513  // Flush the previous data and mark the start of the new data.
514  avio_flush(s);
515  ctx->current_type = type;
516  ctx->last_time = time;
517 }
518 
519 static int read_packet_wrapper(AVIOContext *s, uint8_t *buf, int size)
520 {
521  int ret;
522 
523  if (!s->read_packet)
524  return AVERROR(EINVAL);
525  ret = s->read_packet(s->opaque, buf, size);
526  av_assert2(ret || s->max_packet_size);
527  return ret;
528 }
529 
530 /* Input stream */
531 
532 static void fill_buffer(AVIOContext *s)
533 {
534  FFIOContext *const ctx = (FFIOContext *)s;
535  int max_buffer_size = s->max_packet_size ?
536  s->max_packet_size : IO_BUFFER_SIZE;
537  uint8_t *dst = s->buf_end - s->buffer + max_buffer_size <= s->buffer_size ?
538  s->buf_end : s->buffer;
539  int len = s->buffer_size - (dst - s->buffer);
540 
541  /* can't fill the buffer without read_packet, just set EOF if appropriate */
542  if (!s->read_packet && s->buf_ptr >= s->buf_end)
543  s->eof_reached = 1;
544 
545  /* no need to do anything if EOF already reached */
546  if (s->eof_reached)
547  return;
548 
549  if (s->update_checksum && dst == s->buffer) {
550  if (s->buf_end > s->checksum_ptr)
551  s->checksum = s->update_checksum(s->checksum, s->checksum_ptr,
552  s->buf_end - s->checksum_ptr);
553  s->checksum_ptr = s->buffer;
554  }
555 
556  /* make buffer smaller in case it ended up large after probing */
557  if (s->read_packet && ctx->orig_buffer_size &&
558  s->buffer_size > ctx->orig_buffer_size && len >= ctx->orig_buffer_size) {
559  if (dst == s->buffer && s->buf_ptr != dst) {
560  int ret = set_buf_size(s, ctx->orig_buffer_size);
561  if (ret < 0)
562  av_log(s, AV_LOG_WARNING, "Failed to decrease buffer size\n");
563 
564  s->checksum_ptr = dst = s->buffer;
565  }
566  len = ctx->orig_buffer_size;
567  }
568 
569  len = read_packet_wrapper(s, dst, len);
570  if (len == AVERROR_EOF) {
571  /* do not modify buffer if EOF reached so that a seek back can
572  be done without rereading data */
573  s->eof_reached = 1;
574  } else if (len < 0) {
575  s->eof_reached = 1;
576  s->error= len;
577  } else {
578  s->pos += len;
579  s->buf_ptr = dst;
580  s->buf_end = dst + len;
582  s->bytes_read = ffiocontext(s)->bytes_read;
583  }
584 }
585 
586 unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf,
587  unsigned int len)
588 {
589  return av_crc(av_crc_get_table(AV_CRC_32_IEEE), checksum, buf, len);
590 }
591 
592 unsigned long ff_crcEDB88320_update(unsigned long checksum, const uint8_t *buf,
593  unsigned int len)
594 {
595  return av_crc(av_crc_get_table(AV_CRC_32_IEEE_LE), checksum, buf, len);
596 }
597 
598 unsigned long ff_crcA001_update(unsigned long checksum, const uint8_t *buf,
599  unsigned int len)
600 {
601  return av_crc(av_crc_get_table(AV_CRC_16_ANSI_LE), checksum, buf, len);
602 }
603 
605 {
606  s->checksum = s->update_checksum(s->checksum, s->checksum_ptr,
607  s->buf_ptr - s->checksum_ptr);
608  s->update_checksum = NULL;
609  return s->checksum;
610 }
611 
613  unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len),
614  unsigned long checksum)
615 {
616  s->update_checksum = update_checksum;
617  if (s->update_checksum) {
618  s->checksum = checksum;
619  s->checksum_ptr = s->buf_ptr;
620  }
621 }
622 
623 /* XXX: put an inline version */
625 {
626  if (s->buf_ptr >= s->buf_end)
627  fill_buffer(s);
628  if (s->buf_ptr < s->buf_end)
629  return *s->buf_ptr++;
630  return 0;
631 }
632 
633 int avio_read(AVIOContext *s, unsigned char *buf, int size)
634 {
635  int len, size1;
636 
637  size1 = size;
638  while (size > 0) {
639  len = FFMIN(s->buf_end - s->buf_ptr, size);
640  if (len == 0 || s->write_flag) {
641  if((s->direct || size > s->buffer_size) && !s->update_checksum && s->read_packet) {
642  // bypass the buffer and read data directly into buf
643  len = read_packet_wrapper(s, buf, size);
644  if (len == AVERROR_EOF) {
645  /* do not modify buffer if EOF reached so that a seek back can
646  be done without rereading data */
647  s->eof_reached = 1;
648  break;
649  } else if (len < 0) {
650  s->eof_reached = 1;
651  s->error= len;
652  break;
653  } else {
654  s->pos += len;
656  s->bytes_read = ffiocontext(s)->bytes_read;
657  size -= len;
658  buf += len;
659  // reset the buffer
660  s->buf_ptr = s->buffer;
661  s->buf_end = s->buffer/* + len*/;
662  }
663  } else {
664  fill_buffer(s);
665  len = s->buf_end - s->buf_ptr;
666  if (len == 0)
667  break;
668  }
669  } else {
670  memcpy(buf, s->buf_ptr, len);
671  buf += len;
672  s->buf_ptr += len;
673  size -= len;
674  }
675  }
676  if (size1 == size) {
677  if (s->error) return s->error;
678  if (avio_feof(s)) return AVERROR_EOF;
679  }
680  return size1 - size;
681 }
682 
683 int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
684 {
685  int ret = avio_read(s, buf, size);
686  if (ret == size)
687  return ret;
688  if (ret < 0 && ret != AVERROR_EOF)
689  return ret;
690  return AVERROR_INVALIDDATA;
691 }
692 
693 int ffio_read_indirect(AVIOContext *s, unsigned char *buf, int size, const unsigned char **data)
694 {
695  if (s->buf_end - s->buf_ptr >= size && !s->write_flag) {
696  *data = s->buf_ptr;
697  s->buf_ptr += size;
698  return size;
699  } else {
700  *data = buf;
701  return avio_read(s, buf, size);
702  }
703 }
704 
705 int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
706 {
707  int len;
708 
709  if (size < 0)
710  return AVERROR(EINVAL);
711 
712  if (s->read_packet && s->write_flag) {
713  len = read_packet_wrapper(s, buf, size);
714  if (len > 0)
715  s->pos += len;
716  return len;
717  }
718 
719  len = s->buf_end - s->buf_ptr;
720  if (len == 0) {
721  fill_buffer(s);
722  len = s->buf_end - s->buf_ptr;
723  }
724  if (len > size)
725  len = size;
726  memcpy(buf, s->buf_ptr, len);
727  s->buf_ptr += len;
728  if (!len) {
729  if (s->error) return s->error;
730  if (avio_feof(s)) return AVERROR_EOF;
731  }
732  return len;
733 }
734 
735 unsigned int avio_rl16(AVIOContext *s)
736 {
737  unsigned int val;
738  val = avio_r8(s);
739  val |= avio_r8(s) << 8;
740  return val;
741 }
742 
743 unsigned int avio_rl24(AVIOContext *s)
744 {
745  unsigned int val;
746  val = avio_rl16(s);
747  val |= avio_r8(s) << 16;
748  return val;
749 }
750 
751 unsigned int avio_rl32(AVIOContext *s)
752 {
753  unsigned int val;
754  val = avio_rl16(s);
755  val |= avio_rl16(s) << 16;
756  return val;
757 }
758 
760 {
761  uint64_t val;
762  val = (uint64_t)avio_rl32(s);
763  val |= (uint64_t)avio_rl32(s) << 32;
764  return val;
765 }
766 
767 unsigned int avio_rb16(AVIOContext *s)
768 {
769  unsigned int val;
770  val = avio_r8(s) << 8;
771  val |= avio_r8(s);
772  return val;
773 }
774 
775 unsigned int avio_rb24(AVIOContext *s)
776 {
777  unsigned int val;
778  val = avio_rb16(s) << 8;
779  val |= avio_r8(s);
780  return val;
781 }
782 unsigned int avio_rb32(AVIOContext *s)
783 {
784  unsigned int val;
785  val = avio_rb16(s) << 16;
786  val |= avio_rb16(s);
787  return val;
788 }
789 
790 int ff_get_line(AVIOContext *s, char *buf, int maxlen)
791 {
792  int i = 0;
793  char c;
794 
795  do {
796  c = avio_r8(s);
797  if (c && i < maxlen-1)
798  buf[i++] = c;
799  } while (c != '\n' && c != '\r' && c);
800  if (c == '\r' && avio_r8(s) != '\n' && !avio_feof(s))
801  avio_skip(s, -1);
802 
803  buf[i] = 0;
804  return i;
805 }
806 
807 int ff_get_chomp_line(AVIOContext *s, char *buf, int maxlen)
808 {
809  int len = ff_get_line(s, buf, maxlen);
810  while (len > 0 && av_isspace(buf[len - 1]))
811  buf[--len] = '\0';
812  return len;
813 }
814 
819 
820 static int64_t read_string_to_bprint(AVIOContext *s, AVBPrint *bp,
822  int64_t max_len)
823 {
824  int len, end;
825  int64_t read = 0;
826  char tmp[1024];
827  char c;
828 
829  if (!max_len)
830  return 0;
831 
832  do {
833  len = 0;
834  do {
835  c = avio_r8(s);
836  end = ((mode == FFBPrintReadLine && (c == '\r' || c == '\n')) ||
837  c == '\0');
838  if (!end)
839  tmp[len++] = c;
840  } while (!end && len < sizeof(tmp) &&
841  ((max_len < 0) || (read + len < max_len)));
843  read += len;
844  } while (!end && ((max_len < 0) || (read < max_len)));
845 
846  if (mode == FFBPrintReadLine &&
847  c == '\r' && avio_r8(s) != '\n' && !avio_feof(s))
848  avio_skip(s, -1);
849 
850  if (!c && s->error)
851  return s->error;
852 
853  if (!c && !read && avio_feof(s))
854  return AVERROR_EOF;
855 
856  return read;
857 }
858 
859 static int64_t read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp,
861  int64_t max_len)
862 {
863  int64_t ret;
864 
865  av_bprint_clear(bp);
866  ret = read_string_to_bprint(s, bp, mode, max_len);
867  if (ret < 0)
868  return ret;
869 
870  if (!av_bprint_is_complete(bp))
871  return AVERROR(ENOMEM);
872 
873  return bp->len;
874 }
875 
877 {
879 }
880 
882  int64_t max_len)
883 {
885 }
886 
887 int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
888 {
889  int i;
890 
891  if (buflen <= 0)
892  return AVERROR(EINVAL);
893  // reserve 1 byte for terminating 0
894  buflen = FFMIN(buflen - 1, maxlen);
895  for (i = 0; i < buflen; i++)
896  if (!(buf[i] = avio_r8(s)))
897  return i + 1;
898  buf[i] = 0;
899  for (; i < maxlen; i++)
900  if (!avio_r8(s))
901  return i + 1;
902  return maxlen;
903 }
904 
905 #define GET_STR16(type, read) \
906  int avio_get_str16 ##type(AVIOContext *pb, int maxlen, char *buf, int buflen)\
907 {\
908  char* q = buf;\
909  int ret = 0;\
910  if (buflen <= 0) \
911  return AVERROR(EINVAL); \
912  while (ret + 1 < maxlen) {\
913  uint8_t tmp;\
914  uint32_t ch;\
915  GET_UTF16(ch, (ret += 2) <= maxlen ? read(pb) : 0, break;)\
916  if (!ch)\
917  break;\
918  PUT_UTF8(ch, tmp, if (q - buf < buflen - 1) *q++ = tmp;)\
919  }\
920  *q = 0;\
921  return ret;\
922 }\
923 
924 GET_STR16(le, avio_rl16)
926 
927 #undef GET_STR16
928 
930 {
931  uint64_t val;
932  val = (uint64_t)avio_rb32(s) << 32;
933  val |= (uint64_t)avio_rb32(s);
934  return val;
935 }
936 
938  uint64_t val = 0;
939  int tmp;
940 
941  do{
942  tmp = avio_r8(bc);
943  val= (val<<7) + (tmp&127);
944  }while(tmp&128);
945  return val;
946 }
947 
949 {
950  uint8_t *buffer = NULL;
951  int buffer_size, max_packet_size;
952 
953  max_packet_size = h->max_packet_size;
954  if (max_packet_size) {
955  buffer_size = max_packet_size; /* no need to bufferize more than one packet */
956  } else {
957  buffer_size = IO_BUFFER_SIZE;
958  }
959  if (!(h->flags & AVIO_FLAG_WRITE) && h->is_streamed) {
960  if (buffer_size > INT_MAX/2)
961  return AVERROR(EINVAL);
962  buffer_size *= 2;
963  }
964  buffer = av_malloc(buffer_size);
965  if (!buffer)
966  return AVERROR(ENOMEM);
967 
968  *s = avio_alloc_context(buffer, buffer_size, h->flags & AVIO_FLAG_WRITE, h,
969  (int (*)(void *, uint8_t *, int)) ffurl_read,
970  (int (*)(void *, uint8_t *, int)) ffurl_write,
971  (int64_t (*)(void *, int64_t, int))ffurl_seek);
972  if (!*s) {
973  av_freep(&buffer);
974  return AVERROR(ENOMEM);
975  }
976  (*s)->protocol_whitelist = av_strdup(h->protocol_whitelist);
977  if (!(*s)->protocol_whitelist && h->protocol_whitelist) {
978  avio_closep(s);
979  return AVERROR(ENOMEM);
980  }
981  (*s)->protocol_blacklist = av_strdup(h->protocol_blacklist);
982  if (!(*s)->protocol_blacklist && h->protocol_blacklist) {
983  avio_closep(s);
984  return AVERROR(ENOMEM);
985  }
986  (*s)->direct = h->flags & AVIO_FLAG_DIRECT;
987 
988  (*s)->seekable = h->is_streamed ? 0 : AVIO_SEEKABLE_NORMAL;
989  (*s)->max_packet_size = max_packet_size;
990  (*s)->min_packet_size = h->min_packet_size;
991  if(h->prot) {
992  (*s)->read_pause = (int (*)(void *, int))h->prot->url_read_pause;
993  (*s)->read_seek =
994  (int64_t (*)(void *, int, int64_t, int))h->prot->url_read_seek;
995 
996  if (h->prot->url_read_seek)
997  (*s)->seekable |= AVIO_SEEKABLE_TIME;
998  }
999  ((FFIOContext*)(*s))->short_seek_get = (int (*)(void *))ffurl_get_short_seek;
1000  (*s)->av_class = &ff_avio_class;
1001  return 0;
1002 }
1003 
1005 {
1006  if (!s)
1007  return NULL;
1008 
1009  if (s->opaque && s->read_packet == (int (*)(void *, uint8_t *, int))ffurl_read)
1010  return s->opaque;
1011  else
1012  return NULL;
1013 }
1014 
1016 {
1017  const char *opts[] = {
1018  "headers", "user_agent", "cookies", "http_proxy", "referer", "rw_timeout", "icy", NULL };
1019  const char **opt = opts;
1020  uint8_t *buf = NULL;
1021  int ret = 0;
1022 
1023  while (*opt) {
1024  if (av_opt_get(pb, *opt, AV_OPT_SEARCH_CHILDREN, &buf) >= 0) {
1025  if (buf[0] != '\0') {
1026  ret = av_dict_set(avio_opts, *opt, buf, AV_DICT_DONT_STRDUP_VAL);
1027  if (ret < 0)
1028  return ret;
1029  } else {
1030  av_freep(&buf);
1031  }
1032  }
1033  opt++;
1034  }
1035 
1036  return ret;
1037 }
1038 
1040 {
1041  if (s->update_checksum && s->buf_ptr > s->checksum_ptr) {
1042  s->checksum = s->update_checksum(s->checksum, s->checksum_ptr,
1043  s->buf_ptr - s->checksum_ptr);
1044  }
1045 }
1046 
1047 int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
1048 {
1049  uint8_t *buffer;
1050  int max_buffer_size = s->max_packet_size ?
1051  s->max_packet_size : IO_BUFFER_SIZE;
1052  ptrdiff_t filled = s->buf_end - s->buf_ptr;
1053 
1054  if (buf_size <= s->buf_end - s->buf_ptr)
1055  return 0;
1056 
1057  if (buf_size > INT_MAX - max_buffer_size)
1058  return AVERROR(EINVAL);
1059 
1060  buf_size += max_buffer_size - 1;
1061 
1062  if (buf_size + s->buf_ptr - s->buffer <= s->buffer_size || s->seekable || !s->read_packet)
1063  return 0;
1064  av_assert0(!s->write_flag);
1065 
1066  if (buf_size <= s->buffer_size) {
1067  update_checksum(s);
1068  memmove(s->buffer, s->buf_ptr, filled);
1069  } else {
1070  buffer = av_malloc(buf_size);
1071  if (!buffer)
1072  return AVERROR(ENOMEM);
1073  update_checksum(s);
1074  memcpy(buffer, s->buf_ptr, filled);
1075  av_free(s->buffer);
1076  s->buffer = buffer;
1077  s->buffer_size = buf_size;
1078  }
1079  s->buf_ptr = s->buffer;
1080  s->buf_end = s->buffer + filled;
1081  s->checksum_ptr = s->buffer;
1082  return 0;
1083 }
1084 
1086 {
1087  FFIOContext *const ctx = ffiocontext(s);
1088  if (ctx->maxsize >= 0) {
1089  int64_t pos = avio_tell(s);
1090  int64_t remaining = ctx->maxsize - pos;
1091  if (remaining < size) {
1092  int64_t newsize = avio_size(s);
1093  if (!ctx->maxsize || ctx->maxsize < newsize)
1094  ctx->maxsize = newsize - !newsize;
1095  if (pos > ctx->maxsize && ctx->maxsize >= 0)
1096  ctx->maxsize = AVERROR(EIO);
1097  if (ctx->maxsize >= 0)
1098  remaining = ctx->maxsize - pos;
1099  }
1100 
1101  if (ctx->maxsize >= 0 && remaining < size && size > 1) {
1102  av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG,
1103  "Truncating packet of size %d to %"PRId64"\n",
1104  size, remaining + !remaining);
1105  size = remaining + !remaining;
1106  }
1107  }
1108  return size;
1109 }
1110 
1111 static int set_buf_size(AVIOContext *s, int buf_size)
1112 {
1113  uint8_t *buffer;
1114  buffer = av_malloc(buf_size);
1115  if (!buffer)
1116  return AVERROR(ENOMEM);
1117 
1118  av_free(s->buffer);
1119  s->buffer = buffer;
1121  s->buffer_size = buf_size;
1122  s->buf_ptr = s->buf_ptr_max = buffer;
1123  url_resetbuf(s, s->write_flag ? AVIO_FLAG_WRITE : AVIO_FLAG_READ);
1124  return 0;
1125 }
1126 
1127 int ffio_realloc_buf(AVIOContext *s, int buf_size)
1128 {
1129  uint8_t *buffer;
1130  int data_size;
1131 
1132  if (!s->buffer_size)
1133  return set_buf_size(s, buf_size);
1134 
1135  if (buf_size <= s->buffer_size)
1136  return 0;
1137 
1138  buffer = av_malloc(buf_size);
1139  if (!buffer)
1140  return AVERROR(ENOMEM);
1141 
1142  data_size = s->write_flag ? (s->buf_ptr - s->buffer) : (s->buf_end - s->buf_ptr);
1143  if (data_size > 0)
1144  memcpy(buffer, s->write_flag ? s->buffer : s->buf_ptr, data_size);
1145  av_free(s->buffer);
1146  s->buffer = buffer;
1147  ffiocontext(s)->orig_buffer_size = buf_size;
1148  s->buffer_size = buf_size;
1149  s->buf_ptr = s->write_flag ? (s->buffer + data_size) : s->buffer;
1150  if (s->write_flag)
1151  s->buf_ptr_max = s->buffer + data_size;
1152 
1153  s->buf_end = s->write_flag ? (s->buffer + s->buffer_size) : (s->buf_ptr + data_size);
1154 
1155  return 0;
1156 }
1157 
1158 static int url_resetbuf(AVIOContext *s, int flags)
1159 {
1161 
1162  if (flags & AVIO_FLAG_WRITE) {
1163  s->buf_end = s->buffer + s->buffer_size;
1164  s->write_flag = 1;
1165  } else {
1166  s->buf_end = s->buffer;
1167  s->write_flag = 0;
1168  }
1169  return 0;
1170 }
1171 
1172 int ffio_rewind_with_probe_data(AVIOContext *s, unsigned char **bufp, int buf_size)
1173 {
1174  int64_t buffer_start;
1175  int buffer_size;
1176  int overlap, new_size, alloc_size;
1177  uint8_t *buf = *bufp;
1178 
1179  if (s->write_flag) {
1180  av_freep(bufp);
1181  return AVERROR(EINVAL);
1182  }
1183 
1184  buffer_size = s->buf_end - s->buffer;
1185 
1186  /* the buffers must touch or overlap */
1187  if ((buffer_start = s->pos - buffer_size) > buf_size) {
1188  av_freep(bufp);
1189  return AVERROR(EINVAL);
1190  }
1191 
1192  overlap = buf_size - buffer_start;
1193  new_size = buf_size + buffer_size - overlap;
1194 
1195  alloc_size = FFMAX(s->buffer_size, new_size);
1196  if (alloc_size > buf_size)
1197  if (!(buf = (*bufp) = av_realloc_f(buf, 1, alloc_size)))
1198  return AVERROR(ENOMEM);
1199 
1200  if (new_size > buf_size) {
1201  memcpy(buf + buf_size, s->buffer + overlap, buffer_size - overlap);
1202  buf_size = new_size;
1203  }
1204 
1205  av_free(s->buffer);
1206  s->buf_ptr = s->buffer = buf;
1207  s->buffer_size = alloc_size;
1208  s->pos = buf_size;
1209  s->buf_end = s->buf_ptr + buf_size;
1210  s->eof_reached = 0;
1211 
1212  return 0;
1213 }
1214 
1215 int avio_open(AVIOContext **s, const char *filename, int flags)
1216 {
1217  return avio_open2(s, filename, flags, NULL, NULL);
1218 }
1219 
1220 int ffio_open_whitelist(AVIOContext **s, const char *filename, int flags,
1222  const char *whitelist, const char *blacklist
1223  )
1224 {
1225  URLContext *h;
1226  int err;
1227 
1228  *s = NULL;
1229 
1230  err = ffurl_open_whitelist(&h, filename, flags, int_cb, options, whitelist, blacklist, NULL);
1231  if (err < 0)
1232  return err;
1233  err = ffio_fdopen(s, h);
1234  if (err < 0) {
1235  ffurl_close(h);
1236  return err;
1237  }
1238  return 0;
1239 }
1240 
1241 int avio_open2(AVIOContext **s, const char *filename, int flags,
1243 {
1244  return ffio_open_whitelist(s, filename, flags, int_cb, options, NULL, NULL);
1245 }
1246 
1248 {
1249  FFIOContext *const ctx = ffiocontext(s);
1250  URLContext *h;
1251  int ret, error;
1252 
1253  if (!s)
1254  return 0;
1255 
1256  avio_flush(s);
1257  h = s->opaque;
1258  s->opaque = NULL;
1259 
1260  av_freep(&s->buffer);
1261  if (s->write_flag)
1263  "Statistics: %"PRId64" bytes written, %d seeks, %d writeouts\n",
1264  ctx->bytes_written, ctx->seek_count, ctx->writeout_count);
1265  else
1266  av_log(s, AV_LOG_VERBOSE, "Statistics: %"PRId64" bytes read, %d seeks\n",
1267  ctx->bytes_read, ctx->seek_count);
1268  av_opt_free(s);
1269 
1270  error = s->error;
1271  avio_context_free(&s);
1272 
1273  ret = ffurl_close(h);
1274  if (ret < 0)
1275  return ret;
1276 
1277  return error;
1278 }
1279 
1281 {
1282  int ret = avio_close(*s);
1283  *s = NULL;
1284  return ret;
1285 }
1286 
1287 int avio_vprintf(AVIOContext *s, const char *fmt, va_list ap)
1288 {
1289  AVBPrint bp;
1290 
1291  av_bprint_init(&bp, 0, INT_MAX);
1292  av_vbprintf(&bp, fmt, ap);
1293  if (!av_bprint_is_complete(&bp)) {
1294  av_bprint_finalize(&bp, NULL);
1295  s->error = AVERROR(ENOMEM);
1296  return AVERROR(ENOMEM);
1297  }
1298  avio_write(s, bp.str, bp.len);
1299  av_bprint_finalize(&bp, NULL);
1300  return bp.len;
1301 }
1302 
1303 int avio_printf(AVIOContext *s, const char *fmt, ...)
1304 {
1305  va_list ap;
1306  int ret;
1307 
1308  va_start(ap, fmt);
1309  ret = avio_vprintf(s, fmt, ap);
1310  va_end(ap);
1311 
1312  return ret;
1313 }
1314 
1315 void avio_print_string_array(AVIOContext *s, const char *strings[])
1316 {
1317  for(; *strings; strings++)
1318  avio_write(s, (const unsigned char *)*strings, strlen(*strings));
1319 }
1320 
1321 int avio_pause(AVIOContext *s, int pause)
1322 {
1323  if (!s->read_pause)
1324  return AVERROR(ENOSYS);
1325  return s->read_pause(s->opaque, pause);
1326 }
1327 
1328 int64_t avio_seek_time(AVIOContext *s, int stream_index,
1329  int64_t timestamp, int flags)
1330 {
1331  int64_t ret;
1332  if (!s->read_seek)
1333  return AVERROR(ENOSYS);
1334  ret = s->read_seek(s->opaque, stream_index, timestamp, flags);
1335  if (ret >= 0) {
1336  int64_t pos;
1337  s->buf_ptr = s->buf_end; // Flush buffer
1338  pos = s->seek(s->opaque, 0, SEEK_CUR);
1339  if (pos >= 0)
1340  s->pos = pos;
1341  else if (pos != AVERROR(ENOSYS))
1342  ret = pos;
1343  }
1344  return ret;
1345 }
1346 
1347 int avio_read_to_bprint(AVIOContext *h, AVBPrint *pb, size_t max_size)
1348 {
1349  int ret;
1350  char buf[1024];
1351  while (max_size) {
1352  ret = avio_read(h, buf, FFMIN(max_size, sizeof(buf)));
1353  if (ret == AVERROR_EOF)
1354  return 0;
1355  if (ret <= 0)
1356  return ret;
1357  av_bprint_append_data(pb, buf, ret);
1358  if (!av_bprint_is_complete(pb))
1359  return AVERROR(ENOMEM);
1360  max_size -= ret;
1361  }
1362  return 0;
1363 }
1364 
1366 {
1367  int ret;
1368  URLContext *sc = s->opaque;
1369  URLContext *cc = NULL;
1370  ret = ffurl_accept(sc, &cc);
1371  if (ret < 0)
1372  return ret;
1373  return ffio_fdopen(c, cc);
1374 }
1375 
1377 {
1378  URLContext *cc = c->opaque;
1379  return ffurl_handshake(cc);
1380 }
1381 
1382 /* output in a dynamic buffer */
1383 
1384 typedef struct DynBuffer {
1386  uint8_t *buffer;
1388  uint8_t io_buffer[1];
1389 } DynBuffer;
1390 
1391 static int dyn_buf_write(void *opaque, uint8_t *buf, int buf_size)
1392 {
1393  DynBuffer *d = opaque;
1394  unsigned new_size;
1395 
1396  /* reallocate buffer if needed */
1397  new_size = (unsigned)d->pos + buf_size;
1398  if (new_size < d->pos || new_size > INT_MAX)
1399  return AVERROR(ERANGE);
1400  if (new_size > d->allocated_size) {
1401  unsigned new_allocated_size = d->allocated_size ? d->allocated_size
1402  : new_size;
1403  int err;
1404  while (new_size > new_allocated_size)
1405  new_allocated_size += new_allocated_size / 2 + 1;
1406 
1407  new_allocated_size = FFMIN(new_allocated_size, INT_MAX);
1408 
1409  if ((err = av_reallocp(&d->buffer, new_allocated_size)) < 0) {
1410  d->allocated_size = 0;
1411  d->size = 0;
1412  return err;
1413  }
1414  d->allocated_size = new_allocated_size;
1415  }
1416  memcpy(d->buffer + d->pos, buf, buf_size);
1417  d->pos = new_size;
1418  if (d->pos > d->size)
1419  d->size = d->pos;
1420  return buf_size;
1421 }
1422 
1423 static int dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size)
1424 {
1425  unsigned char buf1[4];
1426  int ret;
1427 
1428  /* packetized write: output the header */
1429  AV_WB32(buf1, buf_size);
1430  ret = dyn_buf_write(opaque, buf1, 4);
1431  if (ret < 0)
1432  return ret;
1433 
1434  /* then the data */
1435  return dyn_buf_write(opaque, buf, buf_size);
1436 }
1437 
1438 static int64_t dyn_buf_seek(void *opaque, int64_t offset, int whence)
1439 {
1440  DynBuffer *d = opaque;
1441 
1442  if (whence == SEEK_CUR)
1443  offset += d->pos;
1444  else if (whence == SEEK_END)
1445  offset += d->size;
1446  if (offset < 0)
1447  return AVERROR(EINVAL);
1448  if (offset > INT_MAX)
1449  return AVERROR(ERANGE);
1450  d->pos = offset;
1451  return 0;
1452 }
1453 
1454 static int url_open_dyn_buf_internal(AVIOContext **s, int max_packet_size)
1455 {
1456  struct { FFIOContext pb; DynBuffer d; } *ret;
1457  DynBuffer *d;
1458  unsigned io_buffer_size = max_packet_size ? max_packet_size : 1024;
1459 
1460  if (sizeof(*ret) + io_buffer_size < io_buffer_size)
1461  return AVERROR(ERANGE);
1462  ret = av_mallocz(sizeof(*ret) + io_buffer_size);
1463  if (!ret)
1464  return AVERROR(ENOMEM);
1465  d = &ret->d;
1466  d->io_buffer_size = io_buffer_size;
1467  ffio_init_context(&ret->pb, d->io_buffer, d->io_buffer_size, 1, d, NULL,
1468  max_packet_size ? dyn_packet_buf_write : dyn_buf_write,
1469  max_packet_size ? NULL : dyn_buf_seek);
1470  *s = &ret->pb.pub;
1471  (*s)->max_packet_size = max_packet_size;
1472  return 0;
1473 }
1474 
1476 {
1477  return url_open_dyn_buf_internal(s, 0);
1478 }
1479 
1480 int ffio_open_dyn_packet_buf(AVIOContext **s, int max_packet_size)
1481 {
1482  if (max_packet_size <= 0)
1483  return AVERROR(EINVAL);
1484  return url_open_dyn_buf_internal(s, max_packet_size);
1485 }
1486 
1487 int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
1488 {
1489  DynBuffer *d;
1490 
1491  if (!s) {
1492  *pbuffer = NULL;
1493  return 0;
1494  }
1495  d = s->opaque;
1496 
1497  if (!s->error && !d->size) {
1498  *pbuffer = d->io_buffer;
1499  return FFMAX(s->buf_ptr, s->buf_ptr_max) - s->buffer;
1500  }
1501 
1502  avio_flush(s);
1503 
1504  *pbuffer = d->buffer;
1505 
1506  return d->size;
1507 }
1508 
1510 {
1511  DynBuffer *d = s->opaque;
1512  int max_packet_size = s->max_packet_size;
1513 
1514  ffio_init_context(ffiocontext(s), d->io_buffer, d->io_buffer_size,
1515  1, d, NULL, s->write_packet, s->seek);
1516  s->max_packet_size = max_packet_size;
1517  d->pos = d->size = 0;
1518 }
1519 
1520 int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
1521 {
1522  DynBuffer *d;
1523  int size;
1524  int padding = 0;
1525 
1526  if (!s) {
1527  *pbuffer = NULL;
1528  return 0;
1529  }
1530 
1531  /* don't attempt to pad fixed-size packet buffers */
1532  if (!s->max_packet_size) {
1534  padding = AV_INPUT_BUFFER_PADDING_SIZE;
1535  }
1536 
1537  avio_flush(s);
1538 
1539  d = s->opaque;
1540  *pbuffer = d->buffer;
1541  size = d->size;
1542 
1543  avio_context_free(&s);
1544 
1545  return size - padding;
1546 }
1547 
1549 {
1550  DynBuffer *d;
1551 
1552  if (!*s)
1553  return;
1554 
1555  d = (*s)->opaque;
1556  av_free(d->buffer);
1558 }
1559 
1560 static int null_buf_write(void *opaque, uint8_t *buf, int buf_size)
1561 {
1562  DynBuffer *d = opaque;
1563 
1564  d->pos += buf_size;
1565  if (d->pos > d->size)
1566  d->size = d->pos;
1567  return buf_size;
1568 }
1569 
1571 {
1572  int ret = url_open_dyn_buf_internal(s, 0);
1573  if (ret >= 0) {
1574  AVIOContext *pb = *s;
1576  }
1577  return ret;
1578 }
1579 
1581 {
1582  DynBuffer *d = s->opaque;
1583  int size;
1584 
1585  avio_flush(s);
1586 
1587  size = d->size;
1588 
1589  avio_context_free(&s);
1590 
1591  return size;
1592 }
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:31
ff_get_chomp_line
int ff_get_chomp_line(AVIOContext *s, char *buf, int maxlen)
Same as ff_get_line but strip the white-space characters in the text tail.
Definition: aviobuf.c:807
be
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 be(in the first position) for now. Options ------- Then comes the options array. This is what will define the user accessible options. For example
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
put_str16
static int put_str16(AVIOContext *s, const char *str, const int be)
Definition: aviobuf.c:405
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:367
AVIO_DATA_MARKER_BOUNDARY_POINT
@ AVIO_DATA_MARKER_BOUNDARY_POINT
A point in the output bytestream where a demuxer can start parsing (for non self synchronizing bytest...
Definition: avio.h:133
null_buf_write
static int null_buf_write(void *opaque, uint8_t *buf, int buf_size)
Definition: aviobuf.c:1560
ffurl_context_class
const AVClass ffurl_context_class
Definition: avio.c:64
D
#define D
Definition: aviobuf.c:61
av_bprint_is_complete
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition: bprint.h:215
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
avio_get_dyn_buf
int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition: aviobuf.c:1487
url_open_dyn_buf_internal
static int url_open_dyn_buf_internal(AVIOContext **s, int max_packet_size)
Definition: aviobuf.c:1454
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
ffiocontext
static av_always_inline FFIOContext * ffiocontext(AVIOContext *ctx)
Definition: avio_internal.h:82
ffurl_seek
int64_t ffurl_seek(URLContext *h, int64_t pos, int whence)
Change the position that will be used by the next read/write operation on the resource accessed by h.
Definition: avio.c:428
avio_rl24
unsigned int avio_rl24(AVIOContext *s)
Definition: aviobuf.c:743
dyn_buf_seek
static int64_t dyn_buf_seek(void *opaque, int64_t offset, int whence)
Definition: aviobuf.c:1438
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
avio_wl24
void avio_wl24(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:470
av_isspace
static av_const int av_isspace(int c)
Locale-independent conversion of ASCII isspace.
Definition: avstring.h:219
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
ffio_get_checksum
unsigned long ffio_get_checksum(AVIOContext *s)
Definition: aviobuf.c:604
DynBuffer::buffer
uint8_t * buffer
Definition: aviobuf.c:1386
ffio_open_null_buf
int ffio_open_null_buf(AVIOContext **s)
Open a write-only fake memory stream.
Definition: aviobuf.c:1570
ffio_geturlcontext
URLContext * ffio_geturlcontext(AVIOContext *s)
Return the URLContext associated with the AVIOContext.
Definition: aviobuf.c:1004
AVOption
AVOption.
Definition: opt.h:251
b
#define b
Definition: input.c:41
AVSEEK_SIZE
#define AVSEEK_SIZE
ORing this as the "whence" parameter to a seek function causes it to return the filesize without seek...
Definition: avio.h:474
IO_BUFFER_SIZE
#define IO_BUFFER_SIZE
Definition: aviobuf.c:37
data
const char data[16]
Definition: mxf.c:146
avio_seek_time
int64_t avio_seek_time(AVIOContext *s, int stream_index, int64_t timestamp, int flags)
Seek to a given timestamp relative to some component stream.
Definition: aviobuf.c:1328
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
avio_accept
int avio_accept(AVIOContext *s, AVIOContext **c)
Accept and allocate a client context on a server context.
Definition: aviobuf.c:1365
ffurl_close
int ffurl_close(URLContext *h)
Definition: avio.c:461
DynBuffer::io_buffer
uint8_t io_buffer[1]
Definition: aviobuf.c:1388
avio_put_str
int avio_put_str(AVIOContext *s, const char *str)
Write a NULL-terminated string.
Definition: aviobuf.c:394
AVDictionary
Definition: dict.c:32
avio_wl32
void avio_wl32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:378
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
avio_read_to_bprint
int avio_read_to_bprint(AVIOContext *h, AVBPrint *pb, size_t max_size)
Read contents of h into print buffer, up to max_size bytes, or up to EOF.
Definition: aviobuf.c:1347
ff_crcEDB88320_update
unsigned long ff_crcEDB88320_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:592
FFBPrintReadString
@ FFBPrintReadString
Definition: aviobuf.c:816
AVIODataMarkerType
AVIODataMarkerType
Different data types that can be returned via the AVIO write_data_type callback.
Definition: avio.h:116
FFIOContext
Definition: avio_internal.h:29
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:200
update_checksum
static void update_checksum(AVIOContext *s)
Definition: aviobuf.c:1039
fill_buffer
static void fill_buffer(AVIOContext *s)
Definition: aviobuf.c:532
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
AVIOInterruptCB
Callback for checking whether to abort blocking functions.
Definition: avio.h:59
crc.h
ffio_reset_dyn_buf
void ffio_reset_dyn_buf(AVIOContext *s)
Reset a dynamic buffer.
Definition: aviobuf.c:1509
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:500
AV_CRC_16_ANSI_LE
@ AV_CRC_16_ANSI_LE
Definition: crc.h:54
val
static double val(void *priv, double ch)
Definition: aeval.c:77
avio_wb24
void avio_wb24(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:476
type
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 type
Definition: writing_filters.txt:86
avio_wl16
void avio_wl16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:458
ffio_open_whitelist
int ffio_open_whitelist(AVIOContext **s, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist)
Definition: aviobuf.c:1220
OFFSET
#define OFFSET(x)
Definition: aviobuf.c:59
ff_avio_child_next
static void * ff_avio_child_next(void *obj, void *prev)
Definition: aviobuf.c:46
avio_print_string_array
void avio_print_string_array(AVIOContext *s, const char *strings[])
Write a NULL terminated array of strings to the context.
Definition: aviobuf.c:1315
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:79
GET_UTF8
#define GET_UTF8(val, GET_BYTE, ERROR)
Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
Definition: common.h:469
flush_buffer
static void flush_buffer(AVIOContext *s)
Definition: aviobuf.c:184
avassert.h
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:1015
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
avio_write_marker
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
Mark the written bytestream as a specific type.
Definition: aviobuf.c:482
avio_flush
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:244
ff_read_string_to_bprint_overwrite
int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, 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:881
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_read_callback.c:41
ffurl_open_whitelist
int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist, URLContext *parent)
Create an URLContext for accessing to the resource indicated by url, and open it.
Definition: avio.c:306
FFIOContext::bytes_read
int64_t bytes_read
Bytes read statistic.
Definition: avio_internal.h:52
avio_wb32
void avio_wb32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:386
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:256
ffio_read_size
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:683
ff_avio_class
const AVClass ff_avio_class
Definition: aviobuf.c:67
avio_close_dyn_buf
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition: aviobuf.c:1520
ffio_init_context
void ffio_init_context(FFIOContext *ctx, 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, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Definition: aviobuf.c:81
DynBuffer::pos
int pos
Definition: aviobuf.c:1385
ffio_fill
void ffio_fill(AVIOContext *s, int b, int64_t count)
Definition: aviobuf.c:208
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:693
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AVIO_FLAG_WRITE
#define AVIO_FLAG_WRITE
write-only
Definition: avio.h:624
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
ctx
AVFormatContext * ctx
Definition: movenc.c:48
avio_context_free
void avio_context_free(AVIOContext **ps)
Free the supplied IO context and everything associated with it.
Definition: aviobuf.c:147
if
if(ret)
Definition: filter_design.txt:179
ffurl_accept
int ffurl_accept(URLContext *s, URLContext **c)
Accept an URLContext c on an URLContext s.
Definition: avio.c:226
av_realloc_f
#define av_realloc_f(p, o, n)
Definition: tableprint_vlc.h:32
internal.h
opts
AVDictionary * opts
Definition: movenc.c:50
ffio_limit
int ffio_limit(AVIOContext *s, int size)
Definition: aviobuf.c:1085
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:633
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
ff_avio_options
static const AVOption ff_avio_options[]
Definition: aviobuf.c:62
NULL
#define NULL
Definition: coverity.c:32
DynBuffer
Definition: aviobuf.c:1384
AVIO_DATA_MARKER_TRAILER
@ AVIO_DATA_MARKER_TRAILER
Trailer data, which doesn't contain actual content, but only for finalizing the output file.
Definition: avio.h:145
PUT_UTF16
#define PUT_UTF16(val, tmp, PUT_16BIT)
Definition: common.h:556
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:73
avio_printf
int avio_printf(AVIOContext *s, const char *fmt,...)
Definition: aviobuf.c:1303
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
read_string_to_bprint
static int64_t read_string_to_bprint(AVIOContext *s, AVBPrint *bp, FFBPrintReadStringMode mode, int64_t max_len)
Definition: aviobuf.c:820
seek
static void BS_FUNC() seek(BSCTX *bc, unsigned pos)
Seek to the given bit position.
Definition: bitstream_template.h:399
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1719
SHORT_SEEK_THRESHOLD
#define SHORT_SEEK_THRESHOLD
Do seeks within this distance ahead of the current buffer by skipping data instead of calling the pro...
Definition: aviobuf.c:44
avio_vprintf
int avio_vprintf(AVIOContext *s, const char *fmt, va_list ap)
Writes a formatted string to the context taking a va_list.
Definition: aviobuf.c:1287
read_packet_wrapper
static int read_packet_wrapper(AVIOContext *s, uint8_t *buf, int size)
Definition: aviobuf.c:519
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
avio_pause
int avio_pause(AVIOContext *s, int pause)
Pause and resume playing - only meaningful if using a network streaming protocol (e....
Definition: aviobuf.c:1321
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:419
avio_rb24
unsigned int avio_rb24(AVIOContext *s)
Definition: aviobuf.c:775
dyn_packet_buf_write
static int dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size)
Definition: aviobuf.c:1423
options
const OptionDef options[]
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:767
ffio_realloc_buf
int ffio_realloc_buf(AVIOContext *s, int buf_size)
Reallocate a given buffer for AVIOContext.
Definition: aviobuf.c:1127
AVIOContext
Bytestream IO Context.
Definition: avio.h:166
ff_read_line_to_bprint_overwrite
int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp)
Read a whole line of text from AVIOContext to an AVBPrint buffer overwriting its contents.
Definition: aviobuf.c:876
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
ffio_free_dyn_buf
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
Definition: aviobuf.c:1548
size
int size
Definition: twinvq_data.h:10344
avio.h
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:1047
av_reallocp
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Definition: mem.c:186
avio_open
int avio_open(AVIOContext **s, const char *filename, int flags)
Create and initialize a AVIOContext for accessing the resource indicated by url.
Definition: aviobuf.c:1215
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
AVIO_SEEKABLE_TIME
#define AVIO_SEEKABLE_TIME
Seeking by timestamp with avio_seek_time() is possible.
Definition: avio.h:46
dyn_buf_write
static int dyn_buf_write(void *opaque, uint8_t *buf, int buf_size)
Definition: aviobuf.c:1391
avio_rl16
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:735
avio_rl64
uint64_t avio_rl64(AVIOContext *s)
Definition: aviobuf.c:759
ffio_rewind_with_probe_data
int ffio_rewind_with_probe_data(AVIOContext *s, unsigned char **bufp, int buf_size)
Rewind the AVIOContext using the specified buffer containing the first buf_size bytes of the file.
Definition: aviobuf.c:1172
AVIO_DATA_MARKER_SYNC_POINT
@ AVIO_DATA_MARKER_SYNC_POINT
A point in the output bytestream where a decoder can start decoding (i.e.
Definition: avio.h:127
avio_close
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
Definition: aviobuf.c:1247
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:563
AVIOContext::write_packet
int(* write_packet)(void *opaque, uint8_t *buf, int buf_size)
Definition: avio.h:241
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
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
avio_open2
int avio_open2(AVIOContext **s, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Create and initialize a AVIOContext for accessing the resource indicated by url.
Definition: aviobuf.c:1241
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:751
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:222
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:252
ffurl_get_short_seek
int ffurl_get_short_seek(URLContext *h)
Return the current short seek threshold value for this URL.
Definition: avio.c:650
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:612
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
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:1480
bprint.h
URLContext
Definition: url.h:37
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
avio_internal.h
PUT_STR16
#define PUT_STR16(type, big_endian)
Definition: aviobuf.c:435
FFBPrintReadLine
@ FFBPrintReadLine
Definition: aviobuf.c:817
internal.h
ffio_read_varlen
uint64_t ffio_read_varlen(AVIOContext *bc)
Definition: aviobuf.c:937
read_string_to_bprint_overwrite
static int64_t read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp, FFBPrintReadStringMode mode, int64_t max_len)
Definition: aviobuf.c:859
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
url.h
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:254
ff_get_line
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
Definition: aviobuf.c:790
GET_STR16
#define GET_STR16(type, read)
Definition: aviobuf.c:905
len
int len
Definition: vorbis_enc_data.h:426
int_cb
const AVIOInterruptCB int_cb
Definition: ffmpeg.c:500
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
DynBuffer::io_buffer_size
int io_buffer_size
Definition: aviobuf.c:1387
write_packet
static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt)
Definition: ffmpeg_mux.c:61
avio_wb64
void avio_wb64(AVIOContext *s, uint64_t val)
Definition: aviobuf.c:452
AVIO_DATA_MARKER_UNKNOWN
@ AVIO_DATA_MARKER_UNKNOWN
This is any, unlabelled data.
Definition: avio.h:140
avio_get_str
int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
Read a string from pb into buf.
Definition: aviobuf.c:887
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
pos
unsigned int pos
Definition: spdifenc.c:413
dict.h
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
ff_crc04C11DB7_update
unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:586
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:624
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
ffurl_read
int ffurl_read(URLContext *h, unsigned char *buf, int size)
Read up to size bytes from the resource accessed by h, and store the read bytes in buf.
Definition: avio.c:401
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
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:392
url_resetbuf
static int url_resetbuf(AVIOContext *s, int flags)
Definition: aviobuf.c:1158
av_vbprintf
void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg)
Append a formatted string to a print buffer.
Definition: bprint.c:117
mode
mode
Definition: ebur128.h:83
defs.h
av_bprint_clear
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
Definition: bprint.c:227
AVIO_DATA_MARKER_HEADER
@ AVIO_DATA_MARKER_HEADER
Header data; this needs to be present for the stream to be decodeable.
Definition: avio.h:120
ffurl_write
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
Definition: avio.c:415
ff_crcA001_update
unsigned long ff_crcA001_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition: aviobuf.c:598
DynBuffer::size
int size
Definition: aviobuf.c:1385
AVSEEK_FORCE
#define AVSEEK_FORCE
Passing this flag as the "whence" parameter to a seek function causes it to seek by any means (like r...
Definition: avio.h:482
AVIO_FLAG_DIRECT
#define AVIO_FLAG_DIRECT
Use direct mode.
Definition: avio.h:650
AV_CRC_32_IEEE_LE
@ AV_CRC_32_IEEE_LE
Definition: crc.h:53
AVIO_FLAG_READ
#define AVIO_FLAG_READ
read-only
Definition: avio.h:623
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:270
avio_alloc_context
AVIOContext * avio_alloc_context(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, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Allocate and initialize an AVIOContext for buffered I/O.
Definition: aviobuf.c:130
ffio_fdopen
int ffio_fdopen(AVIOContext **s, URLContext *h)
Create and initialize a AVIOContext for accessing the resource referenced by the URLContext h.
Definition: aviobuf.c:948
avio_open_dyn_buf
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition: aviobuf.c:1475
avio_wb16
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:464
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
ffurl_handshake
int ffurl_handshake(URLContext *c)
Perform one step of the protocol handshake to accept a new client.
Definition: avio.c:234
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
DynBuffer::allocated_size
int allocated_size
Definition: aviobuf.c:1385
set_buf_size
static int set_buf_size(AVIOContext *s, int buf_size)
Definition: aviobuf.c:1111
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:782
d
d
Definition: ffmpeg_filter.c:156
convert_header.str
string str
Definition: convert_header.py:20
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
av_opt_get
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
Definition: opt.c:837
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
ffio_close_null_buf
int ffio_close_null_buf(AVIOContext *s)
Close a null buffer.
Definition: aviobuf.c:1580
h
h
Definition: vp9dsp_template.c:2038
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:229
avio_handshake
int avio_handshake(AVIOContext *c)
Perform one step of the protocol handshake to accept a new client.
Definition: aviobuf.c:1376
writeout
static void writeout(AVIOContext *s, const uint8_t *data, int len)
Definition: aviobuf.c:152
child_class_iterate
static const AVClass * child_class_iterate(void **iter)
Definition: aviobuf.c:52
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:344
avio_read_partial
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:705
int
int
Definition: ffmpeg_filter.c:156
av_bprint_append_data
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size)
Append data to a print buffer.
Definition: bprint.c:158
avio_wl64
void avio_wl64(AVIOContext *s, uint64_t val)
Definition: aviobuf.c:446
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:339
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:231
avio_rb64
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:929
FFBPrintReadStringMode
FFBPrintReadStringMode
Definition: aviobuf.c:815
avio_closep
int avio_closep(AVIOContext **s)
Close the resource accessed by the AVIOContext *s, free it and set the pointer pointing to it to NULL...
Definition: aviobuf.c:1280
AVIO_DATA_MARKER_FLUSH_POINT
@ AVIO_DATA_MARKER_FLUSH_POINT
A point in the output bytestream where the underlying AVIOContext might flush the buffer depending on...
Definition: avio.h:151