FFmpeg
Loading...
Searching...
No Matches
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"
26#include "libavutil/log.h"
27#include "libavutil/mem.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 <stdarg.h>
35
36#define IO_BUFFER_SIZE 32768
37
38/**
39 * Do seeks within this distance ahead of the current buffer by skipping
40 * data instead of calling the protocol seek function, for seekable
41 * protocols.
42 */
43#define SHORT_SEEK_THRESHOLD 32768
44
45static void fill_buffer(AVIOContext *s);
46static int url_resetbuf(AVIOContext *s, int flags);
47/** @warning must be called before any I/O */
48static int set_buf_size(AVIOContext *s, int buf_size);
49
51 unsigned char *buffer,
52 int buffer_size,
53 int write_flag,
54 void *opaque,
55 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
56 int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size),
57 int64_t (*seek)(void *opaque, int64_t offset, int whence))
58{
59 AVIOContext *const s = &ctx->pub;
60
61 memset(ctx, 0, sizeof(*ctx));
62
63 s->buffer = buffer;
64 ctx->orig_buffer_size =
65 s->buffer_size = buffer_size;
66 s->buf_ptr = buffer;
67 s->buf_ptr_max = buffer;
68 s->opaque = opaque;
69 s->direct = 0;
70
72
73 s->write_packet = write_packet;
74 s->read_packet = read_packet;
75 s->seek = seek;
76 s->pos = 0;
77 s->eof_reached = 0;
78 s->error = 0;
79 s->seekable = seek ? AVIO_SEEKABLE_NORMAL : 0;
80 s->min_packet_size = 0;
81 s->max_packet_size = 0;
82 s->update_checksum = NULL;
83 ctx->short_seek_threshold = SHORT_SEEK_THRESHOLD;
84
85 if (!read_packet && !write_flag) {
86 s->pos = buffer_size;
87 s->buf_end = s->buffer + buffer_size;
88 }
89 s->read_pause = NULL;
90 s->read_seek = NULL;
91
92 s->write_data_type = NULL;
93 s->ignore_boundary_point = 0;
94 ctx->current_type = AVIO_DATA_MARKER_UNKNOWN;
95 ctx->last_time = AV_NOPTS_VALUE;
96 ctx->short_seek_get = NULL;
97}
98
99void ffio_init_read_context(FFIOContext *s, const uint8_t *buffer, int buffer_size)
100{
101 ffio_init_context(s, (unsigned char*)buffer, buffer_size, 0, NULL, NULL, NULL, NULL);
102}
103
104void ffio_init_write_context(FFIOContext *s, uint8_t *buffer, int buffer_size)
105{
106 ffio_init_context(s, buffer, buffer_size, 1, NULL, NULL, NULL, NULL);
107}
108
110 unsigned char *buffer,
111 int buffer_size,
112 int write_flag,
113 void *opaque,
114 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
115 int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size),
116 int64_t (*seek)(void *opaque, int64_t offset, int whence))
117{
118 FFIOContext *s = av_malloc(sizeof(*s));
119 if (!s)
120 return NULL;
121 ffio_init_context(s, buffer, buffer_size, write_flag, opaque,
123 return &s->pub;
124}
125
127{
128 AVIOContext *s = *ps;
129 if (s) {
130 av_freep(&s->protocol_whitelist);
131 av_freep(&s->protocol_blacklist);
132 }
133 av_freep(ps);
134}
135
136static void writeout(AVIOContext *s, const uint8_t *data, int len)
137{
138 FFIOContext *const ctx = ffiocontext(s);
139 if (!s->error) {
140 int ret = 0;
141 if (s->write_data_type)
142 ret = s->write_data_type(s->opaque, data,
143 len,
144 ctx->current_type,
145 ctx->last_time);
146 else if (s->write_packet)
147 ret = s->write_packet(s->opaque, data, len);
148 if (ret < 0) {
149 s->error = ret;
150 } else {
151 ctx->bytes_written += len;
152 s->bytes_written = ctx->bytes_written;
153
154 if (s->pos + len > ctx->written_output_size) {
155 ctx->written_output_size = s->pos + len;
156 }
157 }
158 }
159 if (ctx->current_type == AVIO_DATA_MARKER_SYNC_POINT ||
160 ctx->current_type == AVIO_DATA_MARKER_BOUNDARY_POINT) {
161 ctx->current_type = AVIO_DATA_MARKER_UNKNOWN;
162 }
163 ctx->last_time = AV_NOPTS_VALUE;
164 ctx->writeout_count++;
165 s->pos += len;
166}
167
169{
170 s->buf_ptr_max = FFMAX(s->buf_ptr, s->buf_ptr_max);
171 if (s->write_flag && s->buf_ptr_max > s->buffer) {
172 writeout(s, s->buffer, s->buf_ptr_max - s->buffer);
173 if (s->update_checksum) {
174 s->checksum = s->update_checksum(s->checksum, s->checksum_ptr,
175 s->buf_ptr_max - s->checksum_ptr);
176 s->checksum_ptr = s->buffer;
177 }
178 }
179 s->buf_ptr = s->buf_ptr_max = s->buffer;
180 if (!s->write_flag)
181 s->buf_end = s->buffer;
182}
183
185{
186 av_assert2(b>=-128 && b<=255);
187 *s->buf_ptr++ = b;
188 if (s->buf_ptr >= s->buf_end)
190}
191
192void ffio_fill(AVIOContext *s, int b, int64_t count)
193{
194 while (count > 0) {
195 int len = FFMIN(s->buf_end - s->buf_ptr, count);
196 memset(s->buf_ptr, b, len);
197 s->buf_ptr += len;
198
199 if (s->buf_ptr >= s->buf_end)
201
202 count -= len;
203 }
204}
205
206void avio_write(AVIOContext *s, const unsigned char *buf, int size)
207{
208 if (size <= 0)
209 return;
210 if (s->direct && !s->update_checksum) {
211 avio_flush(s);
212 writeout(s, buf, size);
213 return;
214 }
215 do {
216 int len = FFMIN(s->buf_end - s->buf_ptr, size);
217 memcpy(s->buf_ptr, buf, len);
218 s->buf_ptr += len;
219
220 if (s->buf_ptr >= s->buf_end)
222
223 buf += len;
224 size -= len;
225 } while (size > 0);
226}
227
229{
230 int seekback = s->write_flag ? FFMIN(0, s->buf_ptr - s->buf_ptr_max) : 0;
232 if (seekback)
233 avio_seek(s, seekback, SEEK_CUR);
234}
235
237{
238 FFIOContext *const ctx = ffiocontext(s);
239 int64_t offset1;
240 int64_t pos;
241 int buffer_size;
242 int short_seek;
243 whence &= ~AVSEEK_FORCE; // force flag does nothing
244
245 if(!s)
246 return AVERROR(EINVAL);
247
248 if ((whence & AVSEEK_SIZE))
249 return s->seek ? s->seek(s->opaque, offset, AVSEEK_SIZE) : AVERROR(ENOSYS);
250
251 buffer_size = s->buf_end - s->buffer;
252 // pos is the absolute position that the beginning of s->buffer corresponds to in the file
253 pos = s->pos - (s->write_flag ? 0 : buffer_size);
254
255 if (whence != SEEK_CUR && whence != SEEK_SET)
256 return AVERROR(EINVAL);
257
258 if (whence == SEEK_CUR) {
259 offset1 = pos + (s->buf_ptr - s->buffer);
260 if (offset == 0)
261 return offset1;
262 if (offset > INT64_MAX - offset1)
263 return AVERROR(EINVAL);
264 offset += offset1;
265 }
266 if (offset < 0)
267 return AVERROR(EINVAL);
268
269 short_seek = ctx->short_seek_threshold;
270 if (ctx->short_seek_get) {
271 int tmp = ctx->short_seek_get(s->opaque);
272 short_seek = FFMAX(tmp, short_seek);
273 }
274
275 offset1 = offset - pos; // "offset1" is the relative offset from the beginning of s->buffer
276 s->buf_ptr_max = FFMAX(s->buf_ptr_max, s->buf_ptr);
277 if ((!s->direct || !s->seek) &&
278 offset1 >= 0 && offset1 <= (s->write_flag ? s->buf_ptr_max - s->buffer : buffer_size)) {
279 /* can do the seek inside the buffer */
280 s->buf_ptr = s->buffer + offset1;
281 } else if ((!(s->seekable & AVIO_SEEKABLE_NORMAL) ||
282 offset1 <= buffer_size + short_seek) &&
283 !s->write_flag && offset1 >= 0 &&
284 (!s->direct || !s->seek)) {
285 while(s->pos < offset && !s->eof_reached)
286 fill_buffer(s);
287 if (s->eof_reached)
288 return AVERROR_EOF;
289 s->buf_ptr = s->buf_end - (s->pos - offset);
290 } else if(!s->write_flag && offset1 < 0 && -offset1 < buffer_size>>1 && s->seek && offset > 0) {
291 int64_t res;
292
293 pos -= FFMIN(buffer_size>>1, pos);
294 if ((res = s->seek(s->opaque, pos, SEEK_SET)) < 0)
295 return res;
296 s->buf_end =
297 s->buf_ptr = s->buffer;
298 s->pos = pos;
299 s->eof_reached = 0;
300 fill_buffer(s);
301 return avio_seek(s, offset, SEEK_SET);
302 } else {
303 int64_t res;
304 if (s->write_flag) {
306 }
307 if (!s->seek)
308 return AVERROR(EPIPE);
309 if ((res = s->seek(s->opaque, offset, SEEK_SET)) < 0)
310 return res;
311 ctx->seek_count++;
312 if (!s->write_flag)
313 s->buf_end = s->buffer;
314 s->checksum_ptr = s->buf_ptr = s->buf_ptr_max = s->buffer;
315 s->pos = offset;
316 }
317 s->eof_reached = 0;
318 return offset;
319}
320
322{
323 return avio_seek(s, offset, SEEK_CUR);
324}
325
327{
328 FFIOContext *const ctx = ffiocontext(s);
330
331 if (!s)
332 return AVERROR(EINVAL);
333
334 if (ctx->written_output_size)
335 return ctx->written_output_size;
336
337 if (!s->seek)
338 return AVERROR(ENOSYS);
339 size = s->seek(s->opaque, 0, AVSEEK_SIZE);
340 if (size < 0) {
341 if ((size = s->seek(s->opaque, -1, SEEK_END)) < 0)
342 return size;
343 size++;
344 s->seek(s->opaque, s->pos, SEEK_SET);
345 }
346 return size;
347}
348
350{
351 if(!s)
352 return 0;
353 if(s->eof_reached){
354 s->eof_reached=0;
355 fill_buffer(s);
356 }
357 return s->eof_reached;
358}
359
360void avio_wl32(AVIOContext *s, unsigned int val)
361{
362 avio_w8(s, (uint8_t) val );
363 avio_w8(s, (uint8_t)(val >> 8 ));
364 avio_w8(s, (uint8_t)(val >> 16));
365 avio_w8(s, val >> 24 );
366}
367
368void avio_wb32(AVIOContext *s, unsigned int val)
369{
370 avio_w8(s, val >> 24 );
371 avio_w8(s, (uint8_t)(val >> 16));
372 avio_w8(s, (uint8_t)(val >> 8 ));
373 avio_w8(s, (uint8_t) val );
374}
375
376int avio_put_str(AVIOContext *s, const char *str)
377{
378 int len = 1;
379 if (str) {
380 len += strlen(str);
381 avio_write(s, (const unsigned char *) str, len);
382 } else
383 avio_w8(s, 0);
384 return len;
385}
386
387static inline int put_str16(AVIOContext *s, const char *str, const int be)
388{
389 const uint8_t *q = str;
390 int ret = 0;
391 int err = 0;
392
393 while (*q) {
394 uint32_t ch;
395 uint16_t tmp16;
396
397 GET_UTF8(ch, *q++, goto invalid;)
398 PUT_UTF16(ch, tmp16, be ? avio_wb16(s, tmp16) : avio_wl16(s, tmp16);
399 ret += 2;)
400 continue;
401invalid:
402 av_log(s, AV_LOG_ERROR, "Invalid UTF8 sequence in avio_put_str16%s\n", be ? "be" : "le");
403 err = AVERROR(EINVAL);
404 if (!*(q-1))
405 break;
406 }
407 if (be)
408 avio_wb16(s, 0);
409 else
410 avio_wl16(s, 0);
411 if (err)
412 return err;
413 ret += 2;
414 return ret;
415}
416
417#define PUT_STR16(type, big_endian) \
418int avio_put_str16 ## type(AVIOContext *s, const char *str) \
419{ \
420return put_str16(s, str, big_endian); \
421}
422
423PUT_STR16(le, 0)
424PUT_STR16(be, 1)
425
426#undef PUT_STR16
427
428void avio_wl64(AVIOContext *s, uint64_t val)
429{
430 avio_wl32(s, (uint32_t)(val & 0xffffffff));
431 avio_wl32(s, (uint32_t)(val >> 32));
432}
433
434void avio_wb64(AVIOContext *s, uint64_t val)
435{
436 avio_wb32(s, (uint32_t)(val >> 32));
437 avio_wb32(s, (uint32_t)(val & 0xffffffff));
438}
439
440void avio_wl16(AVIOContext *s, unsigned int val)
441{
442 avio_w8(s, (uint8_t)val);
443 avio_w8(s, (int)val >> 8);
444}
445
446void avio_wb16(AVIOContext *s, unsigned int val)
447{
448 avio_w8(s, (int)val >> 8);
449 avio_w8(s, (uint8_t)val);
450}
451
452void avio_wl24(AVIOContext *s, unsigned int val)
453{
454 avio_wl16(s, val & 0xffff);
455 avio_w8(s, (int)val >> 16);
456}
457
458void avio_wb24(AVIOContext *s, unsigned int val)
459{
460 avio_wb16(s, (int)val >> 8);
461 avio_w8(s, (uint8_t)val);
462}
463
465{
466 FFIOContext *const ctx = ffiocontext(s);
468 if (s->buf_ptr - s->buffer >= s->min_packet_size)
469 avio_flush(s);
470 return;
471 }
472 if (!s->write_data_type)
473 return;
474 // If ignoring boundary points, just treat it as unknown
475 if (type == AVIO_DATA_MARKER_BOUNDARY_POINT && s->ignore_boundary_point)
477 // Avoid unnecessary flushes if we are already in non-header/trailer
478 // data and setting the type to unknown
480 (ctx->current_type != AVIO_DATA_MARKER_HEADER &&
481 ctx->current_type != AVIO_DATA_MARKER_TRAILER))
482 return;
483
484 switch (type) {
487 // For header/trailer, ignore a new marker of the same type;
488 // consecutive header/trailer markers can be merged.
489 if (type == ctx->current_type)
490 return;
491 break;
492 }
493
494 // If we've reached here, we have a new, noteworthy marker.
495 // Flush the previous data and mark the start of the new data.
496 avio_flush(s);
497 ctx->current_type = type;
498 ctx->last_time = time;
499}
500
501static int read_packet_wrapper(AVIOContext *s, uint8_t *buf, int size)
502{
503 int ret;
504
505 if (!s->read_packet)
506 return AVERROR(EINVAL);
507 ret = s->read_packet(s->opaque, buf, size);
508 av_assert2(ret || s->max_packet_size);
509 return ret;
510}
511
512/* Input stream */
513
515{
516 FFIOContext *const ctx = (FFIOContext *)s;
517 int max_buffer_size = s->max_packet_size ?
518 s->max_packet_size : IO_BUFFER_SIZE;
519 uint8_t *dst = s->buf_end - s->buffer + max_buffer_size <= s->buffer_size ?
520 s->buf_end : s->buffer;
521 int len = s->buffer_size - (dst - s->buffer);
522
523 if (s->error == AVERROR(EAGAIN)) {
524 s->error = 0;
525 s->eof_reached = 0;
526 }
527
528 /* can't fill the buffer without read_packet, just set EOF if appropriate */
529 if (!s->read_packet && s->buf_ptr >= s->buf_end)
530 s->eof_reached = 1;
531
532 /* no need to do anything if EOF already reached */
533 if (s->eof_reached)
534 return;
535
536 if (s->update_checksum && dst == s->buffer) {
537 if (s->buf_end > s->checksum_ptr)
538 s->checksum = s->update_checksum(s->checksum, s->checksum_ptr,
539 s->buf_end - s->checksum_ptr);
540 s->checksum_ptr = s->buffer;
541 }
542
543 /* make buffer smaller in case it ended up large after probing */
544 if (s->read_packet && ctx->orig_buffer_size &&
545 s->buffer_size > ctx->orig_buffer_size && len >= ctx->orig_buffer_size) {
546 if (dst == s->buffer && s->buf_ptr != dst) {
547 int ret = set_buf_size(s, ctx->orig_buffer_size);
548 if (ret < 0)
549 av_log(s, AV_LOG_WARNING, "Failed to decrease buffer size\n");
550
551 s->checksum_ptr = dst = s->buffer;
552 }
553 len = ctx->orig_buffer_size;
554 }
555
557 if (len == AVERROR_EOF) {
558 /* do not modify buffer if EOF reached so that a seek back can
559 be done without rereading data */
560 s->eof_reached = 1;
561 } else if (len < 0) {
562 s->eof_reached = 1;
563 s->error= len;
564 } else {
565 s->pos += len;
566 s->buf_ptr = dst;
567 s->buf_end = dst + len;
569 s->bytes_read = ffiocontext(s)->bytes_read;
570 }
571}
572
573unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf,
574 unsigned int len)
575{
576 return av_crc(av_crc_get_table(AV_CRC_32_IEEE), checksum, buf, len);
577}
578
579unsigned long ff_crcEDB88320_update(unsigned long checksum, const uint8_t *buf,
580 unsigned int len)
581{
582 return av_crc(av_crc_get_table(AV_CRC_32_IEEE_LE), checksum, buf, len);
583}
584
585unsigned long ff_crcA001_update(unsigned long checksum, const uint8_t *buf,
586 unsigned int len)
587{
588 return av_crc(av_crc_get_table(AV_CRC_16_ANSI_LE), checksum, buf, len);
589}
590
592{
593 s->checksum = s->update_checksum(s->checksum, s->checksum_ptr,
594 s->buf_ptr - s->checksum_ptr);
595 s->update_checksum = NULL;
596 return s->checksum;
597}
598
600 unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len),
601 unsigned long checksum)
602{
603 s->update_checksum = update_checksum;
604 if (s->update_checksum) {
605 s->checksum = checksum;
606 s->checksum_ptr = s->buf_ptr;
607 }
608}
609
610/* XXX: put an inline version */
612{
613 if (s->buf_ptr >= s->buf_end)
614 fill_buffer(s);
615 if (s->buf_ptr < s->buf_end)
616 return *s->buf_ptr++;
617 return 0;
618}
619
620int avio_read(AVIOContext *s, unsigned char *buf, int size)
621{
622 int len, size1;
623
624 size1 = size;
625 while (size > 0) {
626 len = FFMIN(s->buf_end - s->buf_ptr, size);
627 if (len == 0 || s->write_flag) {
628 if((s->direct || size > s->buffer_size) && !s->update_checksum && s->read_packet) {
629 // bypass the buffer and read data directly into buf
630 if (s->error == AVERROR(EAGAIN)) {
631 s->error = 0;
632 s->eof_reached = 0;
633 }
634 len = read_packet_wrapper(s, buf, size);
635 if (len == AVERROR_EOF) {
636 /* do not modify buffer if EOF reached so that a seek back can
637 be done without rereading data */
638 s->eof_reached = 1;
639 break;
640 } else if (len < 0) {
641 s->eof_reached = 1;
642 s->error= len;
643 break;
644 } else {
645 s->pos += len;
647 s->bytes_read = ffiocontext(s)->bytes_read;
648 size -= len;
649 buf += len;
650 // reset the buffer
651 s->buf_ptr = s->buffer;
652 s->buf_end = s->buffer/* + len*/;
653 }
654 } else {
655 fill_buffer(s);
656 len = s->buf_end - s->buf_ptr;
657 if (len == 0)
658 break;
659 }
660 } else {
661 memcpy(buf, s->buf_ptr, len);
662 buf += len;
663 s->buf_ptr += len;
664 size -= len;
665 }
666 }
667 if (size1 == size) {
668 if (s->error) return s->error;
669 if (avio_feof(s)) return AVERROR_EOF;
670 }
671 return size1 - size;
672}
673
674int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
675{
676 int ret = avio_read(s, buf, size);
677 if (ret == size)
678 return ret;
679 if (ret < 0 && ret != AVERROR_EOF)
680 return ret;
681 return AVERROR_INVALIDDATA;
682}
683
684int ffio_read_indirect(AVIOContext *s, unsigned char *buf, int size, const unsigned char **data)
685{
686 if (s->buf_end - s->buf_ptr >= size && !s->write_flag) {
687 *data = s->buf_ptr;
688 s->buf_ptr += size;
689 return size;
690 } else {
691 *data = buf;
692 return avio_read(s, buf, size);
693 }
694}
695
696int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
697{
698 int len;
699
700 if (size < 0)
701 return AVERROR(EINVAL);
702
703 if (s->read_packet && s->write_flag) {
704 len = read_packet_wrapper(s, buf, size);
705 if (len > 0)
706 s->pos += len;
707 return len;
708 }
709
710 len = s->buf_end - s->buf_ptr;
711 if (len == 0) {
712 fill_buffer(s);
713 len = s->buf_end - s->buf_ptr;
714 }
715 if (len > size)
716 len = size;
717 memcpy(buf, s->buf_ptr, len);
718 s->buf_ptr += len;
719 if (!len) {
720 if (s->error) return s->error;
721 if (avio_feof(s)) return AVERROR_EOF;
722 }
723 return len;
724}
725
726#define AVIO_READER(name, type, bytes, load, read1, shift1, read2, shift2) \
727type name(AVIOContext *s) \
728{ \
729 type val; \
730 if (s->buf_end - s->buf_ptr >= bytes) { \
731 val = load(s->buf_ptr); \
732 s->buf_ptr += bytes; \
733 } else { \
734 val = (type)read1(s) << shift1; \
735 val |= (type)read2(s) << shift2; \
736 } \
737 return val; \
738}
739
740AVIO_READER(avio_rl16, unsigned int, 2, AV_RL16, avio_r8, 0, avio_r8, 8)
741AVIO_READER(avio_rl24, unsigned int, 3, AV_RL24, avio_rl16, 0, avio_r8, 16)
742AVIO_READER(avio_rl32, unsigned int, 4, AV_RL32, avio_rl16, 0, avio_rl16, 16)
743AVIO_READER(avio_rl64, uint64_t, 8, AV_RL64, avio_rl32, 0, avio_rl32, 32)
744AVIO_READER(avio_rb16, unsigned int, 2, AV_RB16, avio_r8, 8, avio_r8, 0)
745AVIO_READER(avio_rb24, unsigned int, 3, AV_RB24, avio_rb16, 8, avio_r8, 0)
746AVIO_READER(avio_rb32, unsigned int, 4, AV_RB32, avio_rb16, 16, avio_rb16, 0)
747AVIO_READER(avio_rb64, uint64_t, 8, AV_RB64, avio_rb32, 32, avio_rb32, 0)
748int ff_get_line(AVIOContext *s, char *buf, int maxlen)
749{
750 int i = 0;
751 char c;
752
753 do {
754 c = avio_r8(s);
755 if (c && i < maxlen-1)
756 buf[i++] = c;
757 } while (c != '\n' && c != '\r' && c);
758 if (c == '\r' && avio_r8(s) != '\n' && !avio_feof(s))
759 avio_skip(s, -1);
760
761 buf[i] = 0;
762 return i;
763}
764
765int ff_get_chomp_line(AVIOContext *s, char *buf, int maxlen)
766{
767 int len = ff_get_line(s, buf, maxlen);
768 while (len > 0 && av_isspace(buf[len - 1]))
769 buf[--len] = '\0';
770 return len;
771}
772
777
780 int64_t max_len)
781{
782 int len, end;
783 int64_t read = 0;
784 char tmp[1024];
785 char c;
786
787 if (!max_len)
788 return 0;
789
790 do {
791 len = 0;
792 do {
793 c = avio_r8(s);
794 end = ((mode == FFBPrintReadLine && (c == '\r' || c == '\n')) ||
795 c == '\0');
796 if (!end)
797 tmp[len++] = c;
798 } while (!end && len < sizeof(tmp) &&
799 ((max_len < 0) || (read + len < max_len)));
801 read += len;
802 } while (!end && ((max_len < 0) || (read < max_len)));
803
804 if (mode == FFBPrintReadLine &&
805 c == '\r' && avio_r8(s) != '\n' && !avio_feof(s))
806 avio_skip(s, -1);
807
808 if (!c && s->error)
809 return s->error;
810
811 if (!c && !read && avio_feof(s))
812 return AVERROR_EOF;
813
814 return read;
815}
816
819 int64_t max_len)
820{
821 int64_t ret;
822
823 av_bprint_clear(bp);
824 ret = read_string_to_bprint(s, bp, mode, max_len);
825 if (ret < 0)
826 return ret;
827
828 if (!av_bprint_is_complete(bp))
829 return AVERROR(ENOMEM);
830
831 return bp->len;
832}
833
838
844
845int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
846{
847 int i;
848
849 if (buflen <= 0)
850 return AVERROR(EINVAL);
851 // reserve 1 byte for terminating 0
852 buflen = FFMIN(buflen - 1, maxlen);
853 for (i = 0; i < buflen; i++)
854 if (!(buf[i] = avio_r8(s)))
855 return i + 1;
856 buf[i] = 0;
857 for (; i < maxlen; i++)
858 if (!avio_r8(s))
859 return i + 1;
860 return maxlen;
861}
862
863#define GET_STR16(type, read) \
864 int avio_get_str16 ##type(AVIOContext *pb, int maxlen, char *buf, int buflen)\
865{\
866 char* q = buf;\
867 int ret = 0;\
868 if (buflen <= 0) \
869 return AVERROR(EINVAL); \
870 while (ret + 1 < maxlen) {\
871 uint8_t tmp;\
872 uint32_t ch;\
873 GET_UTF16(ch, (ret += 2) <= maxlen ? read(pb) : 0, break;)\
874 if (!ch)\
875 break;\
876 PUT_UTF8(ch, tmp, if (q - buf < buflen - 1) *q++ = tmp;)\
877 }\
878 *q = 0;\
879 return ret;\
880}\
881
884
885#undef GET_STR16
886
888 uint64_t val = 0;
889 int tmp;
890
891 do{
892 tmp = avio_r8(bc);
893 val= (val<<7) + (tmp&127);
894 }while(tmp&128);
895 return val;
896}
897
899 int more, i = 0;
900 unsigned leb = 0;
901
902 do {
903 int byte = avio_r8(s);
904 unsigned bits = byte & 0x7f;
905 more = byte & 0x80;
906 if (i <= 4)
907 leb |= bits << (i * 7);
908 if (++i == 8)
909 break;
910 } while (more);
911
912 return leb;
913}
914
916{
917 int len;
918 uint8_t byte;
919
920 len = (av_log2(val) + 7) / 7;
921
922 for (int i = 0; i < len; i++) {
923 byte = val >> (7 * i) & 0x7f;
924 if (i < len - 1)
925 byte |= 0x80;
926
927 avio_w8(s, byte);
928 }
929}
930
931void ffio_write_lines(AVIOContext *s, const unsigned char *buf, int size,
932 const unsigned char *ending)
933{
934 int ending_len = ending ? strlen(ending) : 1;
935 if (!ending)
936 ending = "\n";
937 if (size < 0)
938 size = strlen(buf);
939
940 while (size > 0) {
941 size_t len = 0;
942 char last = 0;
943 for (; len < size; len++) {
944 last = buf[len];
945 if (last == '\r' || last == '\n')
946 break;
947 }
948
949 avio_write(s, buf, len);
950 avio_write(s, ending, ending_len);
951
952 buf += len + 1;
953 size -= len + 1;
954
955 if (size > 0 && last == '\r' && buf[0] == '\n') {
956 buf++;
957 size--;
958 }
959 }
960}
961
963{
964 const char *opts[] = {
965 "headers", "user_agent", "cookies", "http_proxy", "referer", "rw_timeout", "icy", "prefer_libcurl", NULL };
966 const char **opt = opts;
967 uint8_t *buf = NULL;
968 int ret = 0;
969
970 while (*opt) {
971 if (av_opt_get(pb, *opt, AV_OPT_SEARCH_CHILDREN, &buf) >= 0) {
972 if (buf[0] != '\0') {
973 ret = av_dict_set(avio_opts, *opt, buf, AV_DICT_DONT_STRDUP_VAL);
974 if (ret < 0)
975 return ret;
976 } else {
977 av_freep(&buf);
978 }
979 }
980 opt++;
981 }
982
983 return ret;
984}
985
987{
988 if (s->update_checksum && s->buf_ptr > s->checksum_ptr) {
989 s->checksum = s->update_checksum(s->checksum, s->checksum_ptr,
990 s->buf_ptr - s->checksum_ptr);
991 }
992}
993
995{
996 uint8_t *buffer;
997 int max_buffer_size = s->max_packet_size ?
998 s->max_packet_size : IO_BUFFER_SIZE;
999 ptrdiff_t filled = s->buf_end - s->buf_ptr;
1000
1001 if (buf_size <= s->buf_end - s->buf_ptr)
1002 return 0;
1003
1004 if (buf_size > INT_MAX - max_buffer_size)
1005 return AVERROR(EINVAL);
1006
1007 buf_size += max_buffer_size - 1;
1008
1009 if (buf_size + s->buf_ptr - s->buffer <= s->buffer_size || s->seekable || !s->read_packet)
1010 return 0;
1011 av_assert0(!s->write_flag);
1012
1013 if (buf_size <= s->buffer_size) {
1015 memmove(s->buffer, s->buf_ptr, filled);
1016 } else {
1017 buffer = av_malloc(buf_size);
1018 if (!buffer)
1019 return AVERROR(ENOMEM);
1021 memcpy(buffer, s->buf_ptr, filled);
1022 av_free(s->buffer);
1023 s->buffer = buffer;
1024 s->buffer_size = buf_size;
1025 }
1026 s->buf_ptr = s->buffer;
1027 s->buf_end = s->buffer + filled;
1028 s->checksum_ptr = s->buffer;
1029 return 0;
1030}
1031
1033{
1034 FFIOContext *const ctx = ffiocontext(s);
1035 if (ctx->maxsize >= 0) {
1037 int64_t remaining = ctx->maxsize - pos;
1038 if (remaining < size) {
1039 int64_t newsize = avio_size(s);
1040 if (!ctx->maxsize || ctx->maxsize < newsize)
1041 ctx->maxsize = newsize - !newsize;
1042 if (pos > ctx->maxsize && ctx->maxsize >= 0)
1043 ctx->maxsize = AVERROR(EIO);
1044 if (ctx->maxsize >= 0)
1045 remaining = ctx->maxsize - pos;
1046 }
1047
1048 if (ctx->maxsize >= 0 && remaining < size && size > 1) {
1049 av_log(NULL, remaining ? AV_LOG_ERROR : AV_LOG_DEBUG,
1050 "Truncating packet of size %d to %"PRId64"\n",
1051 size, remaining + !remaining);
1052 size = remaining + !remaining;
1053 }
1054 }
1055 return size;
1056}
1057
1058static int set_buf_size(AVIOContext *s, int buf_size)
1059{
1060 uint8_t *buffer;
1061 buffer = av_malloc(buf_size);
1062 if (!buffer)
1063 return AVERROR(ENOMEM);
1064
1065 av_free(s->buffer);
1066 s->buffer = buffer;
1068 s->buffer_size = buf_size;
1069 s->buf_ptr = s->buf_ptr_max = buffer;
1070 url_resetbuf(s, s->write_flag ? AVIO_FLAG_WRITE : AVIO_FLAG_READ);
1071 return 0;
1072}
1073
1074int ffio_realloc_buf(AVIOContext *s, int buf_size)
1075{
1076 uint8_t *buffer;
1077 int data_size;
1078
1079 if (!s->buffer_size)
1080 return set_buf_size(s, buf_size);
1081
1082 if (buf_size <= s->buffer_size)
1083 return 0;
1084
1085 buffer = av_malloc(buf_size);
1086 if (!buffer)
1087 return AVERROR(ENOMEM);
1088
1089 data_size = s->write_flag ? (s->buf_ptr - s->buffer) : (s->buf_end - s->buf_ptr);
1090 if (data_size > 0)
1091 memcpy(buffer, s->write_flag ? s->buffer : s->buf_ptr, data_size);
1092 av_free(s->buffer);
1093 s->buffer = buffer;
1094 ffiocontext(s)->orig_buffer_size = buf_size;
1095 s->buffer_size = buf_size;
1096 s->buf_ptr = s->write_flag ? (s->buffer + data_size) : s->buffer;
1097 if (s->write_flag)
1098 s->buf_ptr_max = s->buffer + data_size;
1099
1100 s->buf_end = s->write_flag ? (s->buffer + s->buffer_size) : (s->buf_ptr + data_size);
1101
1102 return 0;
1103}
1104
1106{
1108
1109 if (flags & AVIO_FLAG_WRITE) {
1110 s->buf_end = s->buffer + s->buffer_size;
1111 s->write_flag = 1;
1112 } else {
1113 s->buf_end = s->buffer;
1114 s->write_flag = 0;
1115 }
1116 return 0;
1117}
1118
1119int ffio_rewind_with_probe_data(AVIOContext *s, unsigned char **bufp, int buf_size)
1120{
1121 int64_t buffer_start;
1122 int buffer_size;
1123 int overlap, new_size, alloc_size;
1124 uint8_t *buf = *bufp;
1125
1126 if (s->write_flag) {
1127 av_freep(bufp);
1128 return AVERROR(EINVAL);
1129 }
1130
1131 buffer_size = s->buf_end - s->buffer;
1132
1133 /* the buffers must touch or overlap */
1134 if ((buffer_start = s->pos - buffer_size) > buf_size) {
1135 av_freep(bufp);
1136 return AVERROR(EINVAL);
1137 }
1138
1139 overlap = buf_size - buffer_start;
1140 new_size = buf_size + buffer_size - overlap;
1141
1142 alloc_size = FFMAX(s->buffer_size, new_size);
1143 if (alloc_size > buf_size)
1144 if (!(buf = (*bufp) = av_realloc_f(buf, 1, alloc_size)))
1145 return AVERROR(ENOMEM);
1146
1147 if (new_size > buf_size) {
1148 memcpy(buf + buf_size, s->buffer + overlap, buffer_size - overlap);
1149 buf_size = new_size;
1150 }
1151
1152 av_free(s->buffer);
1153 s->buf_ptr = s->buffer = buf;
1154 s->buffer_size = alloc_size;
1155 s->pos = buf_size;
1156 s->buf_end = s->buf_ptr + buf_size;
1157 s->eof_reached = 0;
1158
1159 return 0;
1160}
1161
1162int avio_vprintf(AVIOContext *s, const char *fmt, va_list ap)
1163{
1164 AVBPrint bp;
1165
1166 av_bprint_init(&bp, 0, INT_MAX);
1167 av_vbprintf(&bp, fmt, ap);
1168 if (!av_bprint_is_complete(&bp)) {
1170 s->error = AVERROR(ENOMEM);
1171 return AVERROR(ENOMEM);
1172 }
1173 avio_write(s, bp.str, bp.len);
1175 return bp.len;
1176}
1177
1178int avio_printf(AVIOContext *s, const char *fmt, ...)
1179{
1180 va_list ap;
1181 int ret;
1182
1183 va_start(ap, fmt);
1184 ret = avio_vprintf(s, fmt, ap);
1185 va_end(ap);
1186
1187 return ret;
1188}
1189
1190void avio_print_string_array(AVIOContext *s, const char *const strings[])
1191{
1192 for(; *strings; strings++)
1193 avio_write(s, (const unsigned char *)*strings, strlen(*strings));
1194}
1195
1196int avio_pause(AVIOContext *s, int pause)
1197{
1198 if (!s->read_pause)
1199 return AVERROR(ENOSYS);
1200 return s->read_pause(s->opaque, pause);
1201}
1202
1204 int64_t timestamp, int flags)
1205{
1206 int64_t ret;
1207 if (!s->read_seek)
1208 return AVERROR(ENOSYS);
1209 ret = s->read_seek(s->opaque, stream_index, timestamp, flags);
1210 if (ret >= 0) {
1211 int64_t pos;
1212 s->buf_ptr = s->buf_end; // Flush buffer
1213 pos = s->seek(s->opaque, 0, SEEK_CUR);
1214 if (pos >= 0)
1215 s->pos = pos;
1216 else if (pos != AVERROR(ENOSYS))
1217 ret = pos;
1218 }
1219 return ret;
1220}
1221
1222int avio_read_to_bprint(AVIOContext *h, AVBPrint *pb, size_t max_size)
1223{
1224 int ret;
1225 char buf[1024];
1226 while (max_size) {
1227 ret = avio_read(h, buf, FFMIN(max_size, sizeof(buf)));
1228 if (ret == AVERROR_EOF)
1229 return 0;
1230 if (ret <= 0)
1231 return ret;
1232 av_bprint_append_data(pb, buf, ret);
1233 if (!av_bprint_is_complete(pb))
1234 return AVERROR(ENOMEM);
1235 max_size -= ret;
1236 }
1237 return 0;
1238}
1239
1240/* output in a dynamic buffer */
1241
1242typedef struct DynBuffer {
1244 uint8_t *buffer;
1246 uint8_t io_buffer[1];
1247} DynBuffer;
1248
1249static int dyn_buf_write(void *opaque, const uint8_t *buf, int buf_size)
1250{
1251 DynBuffer *d = opaque;
1252 unsigned new_size;
1253
1254 /* reallocate buffer if needed */
1255 new_size = (unsigned)d->pos + buf_size;
1256 if (new_size < d->pos || new_size > INT_MAX)
1257 return AVERROR(ERANGE);
1258 if (new_size > d->allocated_size) {
1259 unsigned new_allocated_size = d->allocated_size ? d->allocated_size
1260 : new_size;
1261 int err;
1262 while (new_size > new_allocated_size)
1263 new_allocated_size += new_allocated_size / 2 + 1;
1264
1265 new_allocated_size = FFMIN(new_allocated_size, INT_MAX);
1266
1267 if ((err = av_reallocp(&d->buffer, new_allocated_size)) < 0) {
1268 d->allocated_size = 0;
1269 d->size = 0;
1270 return err;
1271 }
1272 d->allocated_size = new_allocated_size;
1273 }
1274 memcpy(d->buffer + d->pos, buf, buf_size);
1275 d->pos = new_size;
1276 if (d->pos > d->size)
1277 d->size = d->pos;
1278 return buf_size;
1279}
1280
1281static int dyn_packet_buf_write(void *opaque, const uint8_t *buf, int buf_size)
1282{
1283 unsigned char buf1[4];
1284 int ret;
1285
1286 /* packetized write: output the header */
1287 AV_WB32(buf1, buf_size);
1288 ret = dyn_buf_write(opaque, buf1, 4);
1289 if (ret < 0)
1290 return ret;
1291
1292 /* then the data */
1293 return dyn_buf_write(opaque, buf, buf_size);
1294}
1295
1296static int64_t dyn_buf_seek(void *opaque, int64_t offset, int whence)
1297{
1298 DynBuffer *d = opaque;
1299
1300 if (whence == SEEK_CUR)
1301 offset += d->pos;
1302 else if (whence == SEEK_END)
1303 offset += d->size;
1304 if (offset < 0)
1305 return AVERROR(EINVAL);
1306 if (offset > INT_MAX)
1307 return AVERROR(ERANGE);
1308 d->pos = offset;
1309 return 0;
1310}
1311
1312static int url_open_dyn_buf_internal(AVIOContext **s, int max_packet_size)
1313{
1314 struct { FFIOContext pb; DynBuffer d; } *ret;
1315 DynBuffer *d;
1316 unsigned io_buffer_size = max_packet_size ? max_packet_size : 1024;
1317
1318 if (sizeof(*ret) + io_buffer_size < io_buffer_size)
1319 return AVERROR(ERANGE);
1320 ret = av_mallocz(sizeof(*ret) + io_buffer_size);
1321 if (!ret)
1322 return AVERROR(ENOMEM);
1323 d = &ret->d;
1324 d->io_buffer_size = io_buffer_size;
1326 max_packet_size ? dyn_packet_buf_write : dyn_buf_write,
1327 max_packet_size ? NULL : dyn_buf_seek);
1328 *s = &ret->pb.pub;
1329 (*s)->max_packet_size = max_packet_size;
1330 return 0;
1331}
1332
1334{
1335 return url_open_dyn_buf_internal(s, 0);
1336}
1337
1338int ffio_open_dyn_packet_buf(AVIOContext **s, int max_packet_size)
1339{
1340 if (max_packet_size <= 0)
1341 return AVERROR(EINVAL);
1342 return url_open_dyn_buf_internal(s, max_packet_size);
1343}
1344
1345int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
1346{
1347 DynBuffer *d;
1348
1349 if (!s) {
1350 *pbuffer = NULL;
1351 return 0;
1352 }
1353 d = s->opaque;
1354
1355 if (!s->error && !d->size) {
1356 *pbuffer = d->io_buffer;
1357 return FFMAX(s->buf_ptr, s->buf_ptr_max) - s->buffer;
1358 }
1359
1360 avio_flush(s);
1361
1362 *pbuffer = d->buffer;
1363
1364 return d->size;
1365}
1366
1368{
1369 DynBuffer *d = s->opaque;
1370 int max_packet_size = s->max_packet_size;
1371
1373 1, d, NULL, s->write_packet, s->seek);
1374 s->max_packet_size = max_packet_size;
1375 d->pos = d->size = 0;
1376}
1377
1378int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
1379{
1380 DynBuffer *d;
1381 int size;
1382 int padding = 0;
1383
1384 if (!s) {
1385 *pbuffer = NULL;
1386 return 0;
1387 }
1388
1389 /* don't attempt to pad fixed-size packet buffers */
1390 if (!s->max_packet_size) {
1393 }
1394
1395 avio_flush(s);
1396
1397 d = s->opaque;
1398 *pbuffer = d->buffer;
1399 size = d->size;
1400
1402
1403 return size - padding;
1404}
1405
1407{
1408 DynBuffer *d;
1409
1410 if (!*s)
1411 return;
1412
1413 d = (*s)->opaque;
1414 av_free(d->buffer);
1416}
1417
1418static int null_buf_write(void *opaque, const uint8_t *buf, int buf_size)
1419{
1420 DynBuffer *d = opaque;
1421
1422 if ((unsigned)d->pos + (unsigned)buf_size > INT_MAX)
1423 return AVERROR(ERANGE);
1424 d->pos += buf_size;
1425 if (d->pos > d->size)
1426 d->size = d->pos;
1427 return buf_size;
1428}
1429
1431{
1433 if (ret >= 0) {
1434 AVIOContext *pb = *s;
1436 }
1437 return ret;
1438}
1439
1441{
1442 DynBuffer *d = s->opaque;
1443 int size;
1444
1445 avio_flush(s);
1446
1447 size = s->error ? s->error : d->size;
1448
1450
1451 return size;
1452}
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:97
static double val(void *priv, double ch)
Definition aeval.c:77
static AVFormatContext * ctx
static AVDictionary * opts
#define SHORT_SEEK_THRESHOLD
Definition async.c:49
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition avassert.h:68
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
#define IO_BUFFER_SIZE
Definition avio.c:40
Buffered I/O operations.
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition avio.h:41
uint64_t avio_rb64(AVIOContext *s)
#define AVIO_FLAG_READ
read-only
Definition avio.h:630
unsigned int avio_rb16(AVIOContext *s)
#define AVSEEK_SIZE
Passing this as the "whence" parameter to a seek function causes it to return the filesize without se...
Definition avio.h:481
AVIODataMarkerType
Different data types that can be returned via the AVIO write_data_type callback.
Definition avio.h:110
@ 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:127
@ AVIO_DATA_MARKER_TRAILER
Trailer data, which doesn't contain actual content, but only for finalizing the output file.
Definition avio.h:139
@ AVIO_DATA_MARKER_HEADER
Header data; this needs to be present for the stream to be decodeable.
Definition avio.h:114
@ AVIO_DATA_MARKER_UNKNOWN
This is any, unlabelled data.
Definition avio.h:134
@ AVIO_DATA_MARKER_FLUSH_POINT
A point in the output bytestream where the underlying AVIOContext might flush the buffer depending on...
Definition avio.h:145
@ AVIO_DATA_MARKER_SYNC_POINT
A point in the output bytestream where a decoder can start decoding (i.e.
Definition avio.h:121
#define AVIO_FLAG_WRITE
write-only
Definition avio.h:631
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition avio.h:507
unsigned int avio_rl16(AVIOContext *s)
unsigned int avio_rl32(AVIOContext *s)
unsigned int avio_rl24(AVIOContext *s)
unsigned int avio_rb24(AVIOContext *s)
unsigned int avio_rb32(AVIOContext *s)
int avio_r8(AVIOContext *s)
Definition aviobuf.c:611
uint64_t avio_rl64(AVIOContext *s)
#define AVSEEK_FORCE
OR'ing this flag into the "whence" parameter to a seek function causes it to seek by any means (like ...
Definition avio.h:489
static av_always_inline FFIOContext * ffiocontext(AVIOContext *ctx)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
void avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type)
Mark the written bytestream as a specific type.
Definition aviobuf.c:464
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition aviobuf.c:236
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:599
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, const uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Definition aviobuf.c:50
void avio_wl64(AVIOContext *s, uint64_t val)
Definition aviobuf.c:428
static int set_buf_size(AVIOContext *s, int buf_size)
Definition aviobuf.c:1058
int avio_pause(AVIOContext *s, int pause)
Pause and resume playing - only meaningful if using a network streaming protocol (e....
Definition aviobuf.c:1196
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
Definition aviobuf.c:1406
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:684
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:839
unsigned long ff_crcA001_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition aviobuf.c:585
void avio_wl32(AVIOContext *s, unsigned int val)
Definition aviobuf.c:360
void avio_wl16(AVIOContext *s, unsigned int val)
Definition aviobuf.c:440
int avio_put_str(AVIOContext *s, const char *str)
Write a NULL-terminated string.
Definition aviobuf.c:376
unsigned long ffio_get_checksum(AVIOContext *s)
Definition aviobuf.c:591
void avio_w8(AVIOContext *s, int b)
Definition aviobuf.c:184
void avio_wb32(AVIOContext *s, unsigned int val)
Definition aviobuf.c:368
#define AVIO_READER(name, type, bytes, load, read1, shift1, read2, shift2)
Definition aviobuf.c:726
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:1162
void avio_wb16(AVIOContext *s, unsigned int val)
Definition aviobuf.c:446
static void writeout(AVIOContext *s, const uint8_t *data, int len)
Definition aviobuf.c:136
static void flush_buffer(AVIOContext *s)
Definition aviobuf.c:168
static int dyn_buf_write(void *opaque, const uint8_t *buf, int buf_size)
Definition aviobuf.c:1249
static int read_packet_wrapper(AVIOContext *s, uint8_t *buf, int size)
Definition aviobuf.c:501
static int64_t read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp, FFBPrintReadStringMode mode, int64_t max_len)
Definition aviobuf.c:817
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition aviobuf.c:326
void ffio_reset_dyn_buf(AVIOContext *s)
Reset a dynamic buffer.
Definition aviobuf.c:1367
static int64_t dyn_buf_seek(void *opaque, int64_t offset, int whence)
Definition aviobuf.c:1296
int avio_printf(AVIOContext *s, const char *fmt,...)
Definition aviobuf.c:1178
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition aviobuf.c:349
void avio_context_free(AVIOContext **ps)
Free the supplied IO context and everything associated with it.
Definition aviobuf.c:126
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition aviobuf.c:696
void ffio_write_leb(AVIOContext *s, unsigned val)
Definition aviobuf.c:915
static void fill_buffer(AVIOContext *s)
Definition aviobuf.c:514
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:1119
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition aviobuf.c:994
int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
Read a string from pb into buf.
Definition aviobuf.c:845
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
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:834
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:765
static int64_t read_string_to_bprint(AVIOContext *s, AVBPrint *bp, FFBPrintReadStringMode mode, int64_t max_len)
Definition aviobuf.c:778
#define GET_STR16(type, read)
Definition aviobuf.c:863
int ffio_open_null_buf(AVIOContext **s)
Open a write-only fake memory stream.
Definition aviobuf.c:1430
static int dyn_packet_buf_write(void *opaque, const uint8_t *buf, int buf_size)
Definition aviobuf.c:1281
void avio_wb24(AVIOContext *s, unsigned int val)
Definition aviobuf.c:458
void ffio_fill(AVIOContext *s, int b, int64_t count)
Definition aviobuf.c:192
unsigned long ff_crcEDB88320_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition aviobuf.c:579
static void update_checksum(AVIOContext *s)
Definition aviobuf.c:986
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition aviobuf.c:1378
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:1203
uint64_t ffio_read_varlen(AVIOContext *bc)
Definition aviobuf.c:887
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:1222
void avio_wb64(AVIOContext *s, uint64_t val)
Definition aviobuf.c:434
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, const 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:109
void avio_wl24(AVIOContext *s, unsigned int val)
Definition aviobuf.c:452
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition aviobuf.c:321
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:1338
int ffio_realloc_buf(AVIOContext *s, int buf_size)
Reallocate a given buffer for AVIOContext.
Definition aviobuf.c:1074
static int url_open_dyn_buf_internal(AVIOContext **s, int max_packet_size)
Definition aviobuf.c:1312
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
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition aviobuf.c:674
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition aviobuf.c:620
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:898
int ffio_close_null_buf(AVIOContext *s)
Close a null buffer.
Definition aviobuf.c:1440
void avio_print_string_array(AVIOContext *s, const char *const strings[])
Write a NULL terminated array of strings to the context.
Definition aviobuf.c:1190
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition aviobuf.c:206
FFBPrintReadStringMode
Definition aviobuf.c:773
@ FFBPrintReadString
Definition aviobuf.c:774
@ FFBPrintReadLine
Definition aviobuf.c:775
int ff_get_line(AVIOContext *s, char *buf, int maxlen)
Read a whole line of text from AVIOContext.
Definition aviobuf.c:748
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition aviobuf.c:228
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition aviobuf.c:1333
int ffio_limit(AVIOContext *s, int size)
Definition aviobuf.c:1032
unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf, unsigned int len)
Definition aviobuf.c:573
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:962
#define PUT_STR16(type, big_endian)
Definition aviobuf.c:417
int avio_r8(AVIOContext *s)
Definition aviobuf.c:611
int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition aviobuf.c:1345
static int url_resetbuf(AVIOContext *s, int flags)
Definition aviobuf.c:1105
static int null_buf_write(void *opaque, const uint8_t *buf, int buf_size)
Definition aviobuf.c:1418
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:931
static int put_str16(AVIOContext *s, const char *str, const int be)
Definition aviobuf.c:387
static void BS_FUNC seek(BSCTX *bc, unsigned pos)
Seek to the given bit position.
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.
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition bprint.c:68
AVBPrint public header.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_WB16 unsigned int_TMPL byte
Definition bytestream.h:99
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#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:477
#define PUT_UTF16(val, tmp, PUT_16BIT)
Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
Definition common.h:564
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
Public header for CRC hash function implementation.
Misc types and constants that do not belong anywhere else.
Public dictionary API.
static const uint8_t bits[8]
Definition fastaudio.c:100
static int write_packet(Muxer *mux, OutputStream *ost, AVPacket *pkt)
Definition ffmpeg_mux.c:203
int ret
Definition ffplay.c:391
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition bprint.h:218
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition bprint.c:234
void av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size)
Append data to a print buffer.
Definition bprint.c:147
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
Definition bprint.c:226
void av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg)
Append a formatted string to a print buffer.
Definition bprint.c:98
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition crc.c:389
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:421
@ AV_CRC_32_IEEE
Definition crc.h:52
@ AV_CRC_32_IEEE_LE
Definition crc.h:53
@ AV_CRC_16_ANSI_LE
Definition crc.h:54
#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
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:87
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
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:289
static av_const int av_isspace(int c)
Locale-independent conversion of ASCII isspace.
Definition avstring.h:218
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
Definition opt.c:1295
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition opt.h:604
#define b
Definition input.c:43
#define av_log2
Definition intmath.h:84
#define AV_RL24(x)
#define AV_WB32(p, v)
#define AV_RL64(p)
#define AV_RL32(p)
#define AV_RB32(p)
#define AV_RB64(p)
#define AV_RL16(p)
#define AV_RB24(x)
#define AV_RB16(p)
uint32_t type
Definition jpegmpfenc.c:80
unsigned offset
Definition libaomenc.c:763
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
Memory handling functions.
const char data[16]
Definition mxf.c:149
#define av_malloc(s)
Definition ops_static.c:52
AVOptions.
unsigned int pos
Definition spdifenc.c:431
Bytestream IO Context.
Definition avio.h:160
int(* write_packet)(void *opaque, const uint8_t *buf, int buf_size)
Definition avio.h:235
uint8_t * buffer
Definition aviobuf.c:1244
int allocated_size
Definition aviobuf.c:1243
int io_buffer_size
Definition aviobuf.c:1245
uint8_t io_buffer[1]
Definition aviobuf.c:1246
int64_t bytes_read
Bytes read statistic.
int orig_buffer_size
Original buffer size used after probing to ensure seekback and to reset the buffer size.
Definition swscale.c:71
#define av_free(p)
#define av_mallocz(s)
#define av_realloc_f(p, o, n)
#define av_freep(p)
#define av_log(a,...)
static uint8_t tmp[40]
Definition aes_ctr.c:52
static char buffer[20]
Definition seek.c:32
int size
int len
static double c[64]