FFmpeg
Loading...
Searching...
No Matches
avformat.c
Go to the documentation of this file.
1/*
2 * Various functions used by both muxers and demuxers
3 * Copyright (c) 2000, 2001, 2002 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 "config_components.h"
23
24#include <math.h>
25#include "libavutil/avassert.h"
26#include "libavutil/avstring.h"
28#include "libavutil/frame.h"
29#include "libavutil/iamf.h"
30#include "libavutil/mem.h"
31#include "libavutil/opt.h"
32#include "libavutil/pixfmt.h"
33#include "libavutil/samplefmt.h"
34#include "libavcodec/avcodec.h"
35#include "libavcodec/codec.h"
36#include "libavcodec/bsf.h"
38#include "packet_internal.h"
39#include "avformat.h"
40#include "avformat_internal.h"
41#include "avio.h"
42#include "demux.h"
43#include "mux.h"
44#include "internal.h"
45#include "url.h"
46
48{
49 AVStream *st = *pst;
50 FFStream *const sti = ffstream(st);
51
52 if (!st)
53 return;
54
55 if (st->attached_pic.data)
57
60 av_bsf_free(&sti->bsfc);
62 av_freep(&sti->probe_data.buf);
63
65
67
68 if (sti->info) {
70 av_freep(&sti->info);
71 }
72
75 av_freep(&st->priv_data);
76
77 av_freep(pst);
78}
79
81{
82 AVStreamGroup *stg = *pstg;
83
84 if (!stg)
85 return;
86
87#if FF_API_STREAM_GROUP_ENTRIES
89 av_freep(&stg->streams);
91#endif
92 for (int i = 0; i < stg->nb_entries; i++)
93 av_freep(&stg->entries[i]);
94 av_freep(&stg->entries);
96 &stg->nb_coded_side_data);
98 av_freep(&stg->priv_data);
99 switch (stg->type) {
102 break;
103 }
106 break;
107 }
111#if FF_API_STREAM_GROUP_ENTRIES
113 av_packet_side_data_free(&stg->params.tile_grid->coded_side_data,
114 &stg->params.tile_grid->nb_coded_side_data);
116#endif
118 break;
120 av_opt_free(stg->params.tref);
121 av_freep(&stg->params.tref);
122 break;
129 break;
130 default:
131 break;
132 }
133
134 av_freep(pstg);
135}
136
138{
139 av_assert0(s->nb_streams>0);
140 av_assert0(s->streams[ s->nb_streams - 1 ] == st);
141
142 ff_free_stream(&s->streams[ --s->nb_streams ]);
143}
144
146{
147 av_assert0(s->nb_stream_groups > 0);
148 av_assert0(s->stream_groups[ s->nb_stream_groups - 1 ] == stg);
149
150 ff_free_stream_group(&s->stream_groups[ --s->nb_stream_groups ]);
151}
152
153/* XXX: suppress the packet queue */
164
166{
168 FFFormatContext *si;
169
170 if (!s)
171 return;
172 fci = ff_fc_internal(s);
173 si = &fci->fc;
174
175 if (s->oformat && ffofmt(s->oformat)->deinit && fci->initialized)
176 ffofmt(s->oformat)->deinit(s);
177
178 av_opt_free(s);
179 if (s->iformat && s->iformat->priv_class && s->priv_data)
180 av_opt_free(s->priv_data);
181 if (s->oformat && s->oformat->priv_class && s->priv_data)
182 av_opt_free(s->priv_data);
183
184 for (unsigned i = 0; i < s->nb_streams; i++)
185 ff_free_stream(&s->streams[i]);
186 for (unsigned i = 0; i < s->nb_stream_groups; i++)
187 ff_free_stream_group(&s->stream_groups[i]);
188 s->nb_stream_groups = 0;
189 s->nb_streams = 0;
190
191 for (unsigned i = 0; i < s->nb_programs; i++) {
192 av_dict_free(&s->programs[i]->metadata);
193 av_freep(&s->programs[i]->stream_index);
194 av_freep(&s->programs[i]);
195 }
196 s->nb_programs = 0;
197
198 av_freep(&s->programs);
199 av_freep(&s->priv_data);
200 while (s->nb_chapters--) {
201 av_dict_free(&s->chapters[s->nb_chapters]->metadata);
202 av_freep(&s->chapters[s->nb_chapters]);
203 }
204 av_freep(&s->chapters);
205 av_dict_free(&s->metadata);
207#if CONFIG_LIBCURL_PROTOCOL
209#endif
210 av_packet_free(&si->pkt);
213 av_freep(&s->streams);
214 av_freep(&s->stream_groups);
215 if (s->iformat)
217 av_freep(&s->url);
218 av_freep(&s->name);
219 av_free(s);
220}
221
222/**
223 * Copy all stream parameters from source to destination stream, with the
224 * exception of the index field, which is usually set by avformat_new_stream().
225 *
226 * @param dst pointer to destination AVStream
227 * @param src pointer to source AVStream
228 * @return >=0 on success, AVERROR code on error
229 */
231{
232 int ret;
233
234 dst->id = src->id;
235 dst->time_base = src->time_base;
236 dst->start_time = src->start_time;
237 dst->duration = src->duration;
238 dst->nb_frames = src->nb_frames;
239 dst->disposition = src->disposition;
240 dst->discard = src->discard;
241 dst->sample_aspect_ratio = src->sample_aspect_ratio;
242 dst->avg_frame_rate = src->avg_frame_rate;
243 dst->event_flags = src->event_flags;
244 dst->r_frame_rate = src->r_frame_rate;
245 dst->pts_wrap_bits = src->pts_wrap_bits;
246
247 av_dict_free(&dst->metadata);
248 ret = av_dict_copy(&dst->metadata, src->metadata, 0);
249 if (ret < 0)
250 return ret;
251
252 ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
253 if (ret < 0)
254 return ret;
255
256 av_packet_unref(&dst->attached_pic);
257 if (src->attached_pic.data) {
258 ret = av_packet_ref(&dst->attached_pic, &src->attached_pic);
259 if (ret < 0)
260 return ret;
261 }
262
263 return 0;
264}
265
267{
268 AVStream *st;
269 int ret;
270
271 st = avformat_new_stream(dst_ctx, NULL);
272 if (!st)
273 return NULL;
274
276 if (ret < 0) {
277 ff_remove_stream(dst_ctx, st);
278 return NULL;
279 }
280
281 return st;
282}
283
285{
286 switch(type) {
287 case AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT: return "IAMF Audio Element";
288 case AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION: return "IAMF Mix Presentation";
289 case AV_STREAM_GROUP_PARAMS_TILE_GRID: return "Tile Grid";
290 case AV_STREAM_GROUP_PARAMS_LCEVC: return "LCEVC (Split video and enhancement)";
291 case AV_STREAM_GROUP_PARAMS_TREF: return "Track Reference";
292 case AV_STREAM_GROUP_PARAMS_DOLBY_VISION: return "Dolby Vision (Split base and enhancement layer)";
293 case AV_STREAM_GROUP_PARAMS_GAIN_MAP: return "Gain Map (Split base rendition and gain map)";
294 case AV_STREAM_GROUP_PARAMS_ALPHA: return "Alpha (Split color and alpha channels)";
295 }
296 return NULL;
297}
298
300{
301 FFFormatContext *const si = ffformatcontext(ac);
302 AVProgram *program = NULL;
303 int ret;
304
305 av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
306
307 if (!ac->nb_programs) {
308 si->program_ids_monotonic = 1;
309 } else if (!si->program_ids_monotonic || ac->programs[ac->nb_programs - 1]->id >= id) {
310 for (unsigned i = 0; i < ac->nb_programs; i++)
311 if (ac->programs[i]->id == id)
312 program = ac->programs[i];
313 if (!program)
314 si->program_ids_monotonic = 0;
315 }
316
317 if (!program) {
318 program = av_mallocz(sizeof(*program));
319 if (!program)
320 return NULL;
321 ret = av_dynarray_add_nofree(&ac->programs, &ac->nb_programs, program);
322 if (ret < 0) {
323 av_free(program);
324 return NULL;
325 }
326 program->discard = AVDISCARD_NONE;
327 program->pmt_version = -1;
328 program->id = id;
331 program->start_time =
332 program->end_time = AV_NOPTS_VALUE;
333 }
334 return program;
335}
336
337int av_program_add_stream_index2(AVFormatContext *ac, int progid, unsigned idx)
338{
339 AVProgram *program = NULL;
340 void *tmp;
341
342 if (idx >= ac->nb_streams) {
343 av_log(ac, AV_LOG_ERROR, "stream index %d is greater than stream count %d\n", idx, ac->nb_streams);
344 return AVERROR(EINVAL);
345 }
346
347 for (unsigned i = 0; i < ac->nb_programs; i++) {
348 if (ac->programs[i]->id != progid)
349 continue;
350 program = ac->programs[i];
351 for (unsigned j = 0; j < program->nb_stream_indexes; j++)
352 if (program->stream_index[j] == idx)
353 return 0;
354
355 tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
356 if (!tmp)
357 return AVERROR(ENOMEM);
358 program->stream_index = tmp;
359 program->stream_index[program->nb_stream_indexes++] = idx;
360 return 0;
361 }
362
363 av_log(ac, AV_LOG_ERROR, "no program with id %d found\n", progid);
364 return AVERROR(EINVAL);
365}
366
367void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
368{
369 av_program_add_stream_index2(ac, progid, idx);
370 return;
371}
372
374{
375 const AVProgram *src_prog = NULL;
376 AVProgram *dst_prog = NULL;
377 int ret, idx = -1, match = -1;
378 int overwrite = flags & AVFMT_PROGCOPY_OVERWRITE;
379
381 return AVERROR(EINVAL);
383 match = 0;
385 match = 1;
386
387 for (unsigned i = 0; i < src->nb_programs; i++) {
388 if (src->programs[i]->id == progid) {
389 if (src_prog) {
390 av_log(dst, AV_LOG_ERROR, "multiple programs found in source with same id 0x%04x. Not copying.\n", progid);
391 return AVERROR(EINVAL);
392 } else {
393 src_prog = src->programs[i];
394 }
395 }
396 }
397
398 if (!src_prog) {
399 av_log(dst, AV_LOG_ERROR, "source program not found: id=0x%04x\n", progid);
400 return AVERROR(EINVAL);
401 }
402
403 for (unsigned i = 0; i < dst->nb_programs; i++) {
404 if (dst->programs[i]->id == progid) {
405 if (idx > -1) {
406 av_log(dst, AV_LOG_ERROR, "multiple programs found in target with same id 0x%04x. Not copying.\n", progid);
407 return AVERROR(EINVAL);
408 } else {
409 idx = i;
410 }
411 }
412 }
413
414 if (idx >= 0 && !overwrite)
415 return AVERROR(EEXIST);
416
417 av_log(dst, AV_LOG_TRACE, "%s program: id=0x%04x\n", idx >= 0 ? "overwriting" : "copying", progid);
418
419 if (idx >= 0) {
420 dst_prog = dst->programs[idx];
421 av_dict_free(&dst_prog->metadata);
422 av_freep(&dst_prog->stream_index);
423 dst_prog->nb_stream_indexes = 0;
424 } else {
425 dst_prog = av_new_program(dst, progid);
426 if (!dst_prog)
427 return AVERROR(ENOMEM);
428 }
429
430 /* public fields */
431 dst_prog->id = src_prog->id;
432 dst_prog->flags = src_prog->flags;
433 dst_prog->discard = src_prog->discard;
434 dst_prog->program_num = src_prog->program_num;
435 dst_prog->pmt_pid = src_prog->pmt_pid;
436 dst_prog->pcr_pid = src_prog->pcr_pid;
437 dst_prog->pmt_version = src_prog->pmt_version;
438
439 if (match == -1 && src->nb_streams) {
440 match = 0;
441 for (unsigned i = 0; i < src->nb_streams && !match; i++) {
442 int src_id = src->streams[i]->id;
443 if (!src_id) {
444 match = 1;
445 break;
446 }
447 for (unsigned j=i+1; j < src->nb_streams; j++) {
448 int sib_id = src->streams[j]->id;
449 if (src_id == sib_id) {
450 match = 1;
451 break;
452 }
453 }
454 }
455 }
456
457 for (unsigned i = 0; i < dst->nb_streams; i++) {
458 int dst_val = match ? i : dst->streams[i]->id;
459
460 for (unsigned j = 0; j < src_prog->nb_stream_indexes; j++) {
461 int src_val = match ? src_prog->stream_index[j] : src->streams[src_prog->stream_index[j]]->id;
462
463 if (dst_val == src_val) {
464 ret = av_program_add_stream_index2(dst, dst_prog->id, i);
465 if (ret < 0)
466 return ret;
467 }
468 }
469 }
470
471 ret = av_dict_copy(&dst_prog->metadata, src_prog->metadata, 0);
472 if (ret < 0)
473 return ret;
474
475 return 0;
476}
477
479{
480 for (unsigned i = 0; i < ic->nb_programs; i++) {
481 if (ic->programs[i] == last) {
482 last = NULL;
483 } else {
484 if (!last)
485 for (unsigned j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
486 if (ic->programs[i]->stream_index[j] == s)
487 return ic->programs[i];
488 }
489 }
490 return NULL;
491}
492
494{
495 int best_stream = 0;
496 int best_score = INT_MIN;
497
498 if (s->nb_streams <= 0)
499 return -1;
500 for (unsigned i = 0; i < s->nb_streams; i++) {
501 const AVStream *const st = s->streams[i];
502 const FFStream *const sti = cffstream(st);
503 int score = 0;
506 score -= 400;
507 if (st->codecpar->width && st->codecpar->height)
508 score += 50;
509 score+= 25;
510 }
512 if (st->codecpar->sample_rate)
513 score += 50;
514 }
515 if (sti->codec_info_nb_frames)
516 score += 12;
517
518 if (st->discard != AVDISCARD_ALL)
519 score += 200;
520
521 if (score > best_score) {
522 best_score = score;
523 best_stream = i;
524 }
525 }
526 return best_stream;
527}
528
530 int wanted_stream_nb, int related_stream,
531 const AVCodec **decoder_ret, int flags)
532{
533 int nb_streams = ic->nb_streams;
535 int best_count = -1, best_multiframe = -1, best_disposition = -1;
536 int count, multiframe, disposition;
537 int64_t best_bitrate = -1;
539 unsigned *program = NULL;
540 const AVCodec *decoder = NULL, *best_decoder = NULL;
541
542 if (related_stream >= 0 && wanted_stream_nb < 0) {
543 AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
544 if (p) {
545 program = p->stream_index;
546 nb_streams = p->nb_stream_indexes;
547 }
548 }
549 for (unsigned i = 0; i < nb_streams; i++) {
550 int real_stream_index = program ? program[i] : i;
551 AVStream *st = ic->streams[real_stream_index];
552 AVCodecParameters *par = st->codecpar;
554 if (par->codec_type != type)
555 continue;
556 if (desc && (desc->props & AV_CODEC_PROP_ENHANCEMENT))
557 continue;
558 if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
559 continue;
560 if (type == AVMEDIA_TYPE_AUDIO && !(par->ch_layout.nb_channels && par->sample_rate))
561 continue;
562 if (decoder_ret) {
563 decoder = ff_find_decoder(ic, st, par->codec_id);
564 if (!decoder) {
565 if (ret < 0)
567 continue;
568 }
569 }
572 count = ffstream(st)->codec_info_nb_frames;
573 bitrate = par->bit_rate;
574 multiframe = FFMIN(5, count);
575 if ((best_disposition > disposition) ||
576 (best_disposition == disposition && best_multiframe > multiframe) ||
577 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
578 (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
579 continue;
580 best_disposition = disposition;
581 best_count = count;
582 best_bitrate = bitrate;
583 best_multiframe = multiframe;
584 ret = real_stream_index;
585 best_decoder = decoder;
586 if (program && i == nb_streams - 1 && ret < 0) {
587 program = NULL;
589 /* no related stream found, try again with everything */
590 i = 0;
591 }
592 }
593 if (decoder_ret)
594 *decoder_ret = best_decoder;
595 return ret;
596}
597
598/**
599 * Matches a stream specifier (but ignores requested index).
600 *
601 * @param indexptr set to point to the requested stream index if there is one
602 *
603 * @return <0 on error
604 * 0 if st is NOT a matching stream
605 * >0 if st is a matching stream
606 */
608 const char *spec, const char **indexptr,
609 const AVStreamGroup **g, const AVProgram **p)
610{
611 int match = 1; /* Stores if the specifier matches so far. */
612 while (*spec) {
613 if (*spec <= '9' && *spec >= '0') { /* opt:index */
614 if (indexptr)
615 *indexptr = spec;
616 return match;
617 } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
618 *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
619 enum AVMediaType type;
620 int nopic = 0;
621
622 switch (*spec++) {
623 case 'v': type = AVMEDIA_TYPE_VIDEO; break;
624 case 'a': type = AVMEDIA_TYPE_AUDIO; break;
625 case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
626 case 'd': type = AVMEDIA_TYPE_DATA; break;
627 case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
628 case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
629 default: av_assert0(0);
630 }
631 if (*spec && *spec++ != ':') /* If we are not at the end, then another specifier must follow. */
632 return AVERROR(EINVAL);
633
634 if (type != st->codecpar->codec_type)
635 match = 0;
636 if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
637 match = 0;
638 } else if (*spec == 'g' && *(spec + 1) == ':') {
639 int64_t group_idx = -1, group_id = -1;
640 int found = 0;
641 char *endptr;
642 spec += 2;
643 if (*spec == '#' || (*spec == 'i' && *(spec + 1) == ':')) {
644 spec += 1 + (*spec == 'i');
645 group_id = strtol(spec, &endptr, 0);
646 if (spec == endptr || (*endptr && *endptr++ != ':'))
647 return AVERROR(EINVAL);
648 spec = endptr;
649 } else {
650 group_idx = strtol(spec, &endptr, 0);
651 /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
652 if (spec == endptr || (*endptr && *endptr++ != ':'))
653 return AVERROR(EINVAL);
654 spec = endptr;
655 }
656 if (match) {
657 if (group_id > 0) {
658 for (unsigned i = 0; i < s->nb_stream_groups; i++) {
659 if (group_id == s->stream_groups[i]->id) {
660 group_idx = i;
661 break;
662 }
663 }
664 }
665 if (group_idx < 0 || group_idx >= s->nb_stream_groups)
666 return AVERROR(EINVAL);
667 for (unsigned j = 0; j < s->stream_groups[group_idx]->nb_entries; j++) {
668 if (s->stream_groups[group_idx]->entries[j]->type != AV_STREAM_GROUP_ENTRY_STREAM)
669 continue;
670 if (st->index == s->stream_groups[group_idx]->entries[j]->stream->index) {
671 found = 1;
672 if (g)
673 *g = s->stream_groups[group_idx];
674 break;
675 }
676 }
677 }
678 if (!found)
679 match = 0;
680 } else if (*spec == 'p' && *(spec + 1) == ':') {
681 int prog_id;
682 int found = 0;
683 char *endptr;
684 spec += 2;
685 prog_id = strtol(spec, &endptr, 0);
686 /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
687 if (spec == endptr || (*endptr && *endptr++ != ':'))
688 return AVERROR(EINVAL);
689 spec = endptr;
690 if (match) {
691 for (unsigned i = 0; i < s->nb_programs; i++) {
692 if (s->programs[i]->id != prog_id)
693 continue;
694
695 for (unsigned j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
696 if (st->index == s->programs[i]->stream_index[j]) {
697 found = 1;
698 if (p)
699 *p = s->programs[i];
700 i = s->nb_programs;
701 break;
702 }
703 }
704 }
705 }
706 if (!found)
707 match = 0;
708 } else if (*spec == '#' ||
709 (*spec == 'i' && *(spec + 1) == ':')) {
710 int stream_id;
711 char *endptr;
712 spec += 1 + (*spec == 'i');
713 stream_id = strtol(spec, &endptr, 0);
714 if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */
715 return AVERROR(EINVAL);
716 return match && (stream_id == st->id);
717 } else if (*spec == 'm' && *(spec + 1) == ':') {
718 const AVDictionaryEntry *tag;
719 int ret;
720
721 if (match) {
722 spec += 2;
723 const char *val = strchr(spec, ':');
724
725 char *key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
726 if (!key)
727 return AVERROR(ENOMEM);
728
729 tag = av_dict_get(st->metadata, key, NULL, 0);
730 if (tag) {
731 if (!val || !strcmp(tag->value, val + 1))
732 ret = 1;
733 else
734 ret = 0;
735 } else
736 ret = 0;
737
738 av_freep(&key);
739 }
740 return match && ret;
741 } else if (*spec == 'u' && *(spec + 1) == '\0') {
742 const AVCodecParameters *par = st->codecpar;
743 int val;
744 switch (par->codec_type) {
746 val = par->sample_rate && par->ch_layout.nb_channels;
747 if (par->format == AV_SAMPLE_FMT_NONE)
748 return 0;
749 break;
751 val = par->width && par->height;
752 if (par->format == AV_PIX_FMT_NONE)
753 return 0;
754 break;
756 val = 0;
757 break;
758 default:
759 val = 1;
760 break;
761 }
762 return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
763 } else {
764 return AVERROR(EINVAL);
765 }
766 }
767
768 return match;
769}
770
772 const char *spec)
773{
774 int ret, index;
775 char *endptr;
776 const char *indexptr = NULL;
777 const AVStreamGroup *g = NULL;
778 const AVProgram *p = NULL;
779 int nb_streams;
780
781 ret = match_stream_specifier(s, st, spec, &indexptr, &g, &p);
782 if (ret < 0)
783 goto error;
784
785 if (!indexptr)
786 return ret;
787
788 index = strtol(indexptr, &endptr, 0);
789 if (*endptr) { /* We can't have anything after the requested index. */
790 ret = AVERROR(EINVAL);
791 goto error;
792 }
793
794 /* This is not really needed but saves us a loop for simple stream index specifiers. */
795 if (spec == indexptr)
796 return (index == st->index);
797
798 /* If we requested a matching stream index, we have to ensure st is that. */
799 nb_streams = g ? g->nb_entries : (p ? p->nb_stream_indexes : s->nb_streams);
800 for (int i = 0; i < nb_streams && index >= 0; i++) {
801 if (g && g->entries[i]->type != AV_STREAM_GROUP_ENTRY_STREAM)
802 continue;
803 unsigned idx = g ? g->entries[i]->stream->index : (p ? p->stream_index[i] : i);
804 const AVStream *candidate = s->streams[idx];
805 ret = match_stream_specifier(s, candidate, spec, NULL, NULL, NULL);
806 if (ret < 0)
807 goto error;
808 if (ret > 0 && index-- == 0 && st == candidate)
809 return 1;
810 }
811 return 0;
812
813error:
814 if (ret == AVERROR(EINVAL))
815 av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
816 return ret;
817}
818
820{
821 AVRational undef = {0, 1};
822 AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
823 AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
824 AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
825
826 av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
827 stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
828 if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
829 stream_sample_aspect_ratio = undef;
830
831 av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
832 frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
833 if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
834 frame_sample_aspect_ratio = undef;
835
836 if (stream_sample_aspect_ratio.num)
837 return stream_sample_aspect_ratio;
838 else
839 return frame_sample_aspect_ratio;
840}
841
843{
844 AVRational fr = st->r_frame_rate;
846 AVRational avg_fr = st->avg_frame_rate;
847
848 if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
849 av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
850 fr = avg_fr;
851 }
852
853 if (desc && (desc->props & AV_CODEC_PROP_FIELDS)) {
854 const AVCodecContext *const avctx = ffstream(st)->avctx;
855 AVRational codec_fr = avctx->framerate;
856
857 if ( codec_fr.num > 0 && codec_fr.den > 0 &&
858 (fr.num == 0 || av_q2d(codec_fr) < av_q2d(fr)*0.7 && fabs(1.0 - av_q2d(av_div_q(avg_fr, fr))) > 0.1))
859 fr = codec_fr;
860 }
861
862 return fr;
863}
864
865void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
866 unsigned int pts_num, unsigned int pts_den)
867{
868 FFStream *const sti = ffstream(st);
869 AVRational new_tb;
870 if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
871 if (new_tb.num != pts_num)
873 "st:%d removing common factor %d from timebase\n",
874 st->index, pts_num / new_tb.num);
875 } else
877 "st:%d has too large timebase, reducing\n", st->index);
878
879 if (new_tb.num <= 0 || new_tb.den <= 0) {
881 "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
882 new_tb.num, new_tb.den,
883 st->index);
884 return;
885 }
886 st->time_base = new_tb;
887 if (sti->avctx)
888 sti->avctx->pkt_timebase = new_tb;
889 st->pts_wrap_bits = pts_wrap_bits;
890}
891
893 enum AVCodecID codec_id)
894{
895 switch (st->codecpar->codec_type) {
897 if (s->video_codec) return s->video_codec;
898 break;
900 if (s->audio_codec) return s->audio_codec;
901 break;
903 if (s->subtitle_codec) return s->subtitle_codec;
904 break;
905 }
906
908}
909
911{
912#define OFF(field) offsetof(AVFormatContext, field)
913 static const unsigned offsets[] = {
914 OFF(codec_whitelist), OFF(format_whitelist),
915 OFF(protocol_whitelist), OFF(protocol_blacklist),
916 };
917#undef OFF
918 av_assert0(!dst->codec_whitelist &&
919 !dst->format_whitelist &&
920 !dst->protocol_whitelist &&
921 !dst->protocol_blacklist);
922 for (unsigned i = 0; i < FF_ARRAY_ELEMS(offsets); i++) {
923 const char *src_str = *(char *const*)((const char*)src + offsets[i]);
924
925 if (src_str) {
926 char *dst_str = av_strdup(src_str);
927 if (!dst_str) {
928 av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
929 return AVERROR(ENOMEM);
930 }
931
932 *(char **)((char*)dst + offsets[i]) = dst_str;
933 }
934 }
935 if (src->recursion_limit <= 0) {
936 av_log(dst, AV_LOG_ERROR, "Too deep recursion\n");
937 return AVERROR_INVALIDDATA;
938 }
939 dst->recursion_limit = src->recursion_limit - 1;
940 return 0;
941}
942
944{
946 if (!d)
947 return 0;
948 if ((d->type == AVMEDIA_TYPE_VIDEO || d->type == AVMEDIA_TYPE_AUDIO) &&
950 return 0;
951 return 1;
952}
953
955{
956 av_assert0(url);
957 av_freep(&s->url);
958 s->url = url;
959}
960
962{
963 URLComponents uc;
964 av_assert0(url);
965 char proto[64];
966
967 int ret = ff_url_decompose(&uc, url, NULL);
968 if (ret < 0)
969 return ret;
970 av_strlcpy(proto, uc.scheme, FFMIN(sizeof(proto), uc.url_component_end_scheme - uc.scheme));
971
972 if (s->protocol_whitelist && av_match_list(proto, s->protocol_whitelist, ',') <= 0) {
973 av_log(s, AV_LOG_ERROR, "Protocol '%s' not on whitelist '%s'!\n", proto, s->protocol_whitelist);
974 return AVERROR(EINVAL);
975 }
976
977 if (s->protocol_blacklist && av_match_list(proto, s->protocol_blacklist, ',') > 0) {
978 av_log(s, AV_LOG_ERROR, "Protocol '%s' on blacklist '%s'!\n", proto, s->protocol_blacklist);
979 return AVERROR(EINVAL);
980 }
981
982 char *urldup = av_strdup(url);
983 if (!urldup)
984 return AVERROR(ENOMEM);
985
986 av_freep(&s->url);
987 s->url = urldup;
988 return 0;
989}
990
991
993{
994 int ret = 0;
995 if (*pb)
996 ret = s->io_close2(s, *pb);
997 *pb = NULL;
998 return ret;
999}
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 const char *const format[]
Definition af_aiir.c:445
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
void ff_flush_packet_queue(AVFormatContext *s)
Definition avformat.c:154
int ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition avformat.c:992
int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
Copies the whilelists from one context to the other.
Definition avformat.c:910
int ff_is_intra_only(enum AVCodecID id)
Definition avformat.c:943
static int match_stream_specifier(const AVFormatContext *s, const AVStream *st, const char *spec, const char **indexptr, const AVStreamGroup **g, const AVProgram **p)
Matches a stream specifier (but ignores requested index).
Definition avformat.c:607
int ff_format_check_set_url(AVFormatContext *s, const char *url)
Set AVFormatContext url field to a av_strdup of the provided pointer.
Definition avformat.c:961
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition avformat.c:865
static int stream_params_copy(AVStream *dst, const AVStream *src)
Copy all stream parameters from source to destination stream, with the exception of the index field,...
Definition avformat.c:230
void ff_remove_stream(AVFormatContext *s, AVStream *st)
Remove a stream from its AVFormatContext and free it.
Definition avformat.c:137
int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream, const AVCodec **decoder_ret, int flags)
Definition avformat.c:529
void ff_free_stream(AVStream **pst)
Frees a stream without modifying the corresponding AVFormatContext.
Definition avformat.c:47
void ff_format_set_url(AVFormatContext *s, char *url)
Set AVFormatContext url field to the provided pointer.
Definition avformat.c:954
void ff_free_stream_group(AVStreamGroup **pstg)
Frees a stream group without modifying the corresponding AVFormatContext.
Definition avformat.c:80
int av_program_add_stream_index2(AVFormatContext *ac, int progid, unsigned idx)
Definition avformat.c:337
void ff_remove_stream_group(AVFormatContext *s, AVStreamGroup *stg)
Remove a stream group from its AVFormatContext and free it.
Definition avformat.c:145
AVStream * ff_stream_clone(AVFormatContext *dst_ctx, const AVStream *src)
Create a new stream and copy to it all parameters from a source stream, with the exception of the ind...
Definition avformat.c:266
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
Definition avformat.c:367
#define OFF(field)
const AVCodec * ff_find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
Definition avformat.c:892
Main libavformat public API header.
@ AV_STREAM_GROUP_ENTRY_STREAM
Definition avformat.h:1173
#define AV_PTS_WRAP_IGNORE
Options for behavior on timestamp wrap detection.
Definition avformat.h:757
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition avformat.h:678
AVStreamGroupParamsType
Definition avformat.h:1157
@ AV_STREAM_GROUP_PARAMS_DOLBY_VISION
Definition avformat.h:1164
@ AV_STREAM_GROUP_PARAMS_TREF
Definition avformat.h:1163
@ AV_STREAM_GROUP_PARAMS_ALPHA
Definition avformat.h:1166
@ AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
Definition avformat.h:1160
@ AV_STREAM_GROUP_PARAMS_TILE_GRID
Definition avformat.h:1161
@ AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
Definition avformat.h:1159
@ AV_STREAM_GROUP_PARAMS_LCEVC
Definition avformat.h:1162
@ AV_STREAM_GROUP_PARAMS_GAIN_MAP
Definition avformat.h:1165
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition avformat.h:682
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition avformat.h:694
#define AV_DISPOSITION_DEFAULT
The stream should be chosen by default among other streams of the same type, unless the user has expl...
Definition avformat.h:641
static av_always_inline FormatContextInternal * ff_fc_internal(AVFormatContext *s)
Buffered I/O operations.
#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
Public libavutil channel layout APIs header.
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Definition codec_par.c:107
void avcodec_parameters_free(AVCodecParameters **ppar)
Definition codec_par.c:67
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static __device__ float fabs(float a)
static AVFrame * frame
enum AVCodecID id
Definition dts2pts.c:607
const char * key
int ret
Definition ffplay.c:391
static unsigned int nb_streams
Definition ffprobe.c:390
reference-counted frame API
void av_bsf_free(AVBSFContext **pctx)
Free a bitstream filter context and everything associated with it; write NULL into the supplied point...
Definition bsf.c:47
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
#define AV_CODEC_PROP_FIELDS
Video codec supports separate coding of fields in interlaced frames.
Definition codec_desc.h:97
#define AV_CODEC_PROP_INTRA_ONLY
Codec uses only intra compression.
Definition codec_desc.h:72
const AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID.
Definition allcodecs.c:998
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition codec_id.h:47
#define AV_CODEC_PROP_ENHANCEMENT
Video codec contains enhancement information meant to be applied to other existing frames,...
Definition codec_desc.h:105
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
Definition options.c:168
@ AV_CODEC_ID_NONE
Definition codec_id.h:48
@ AVDISCARD_ALL
discard all
Definition defs.h:246
@ AVDISCARD_NONE
discard nothing
Definition defs.h:240
void av_packet_side_data_free(AVPacketSideData **psd, int *pnb_sd)
Convenience function to free all the side data stored in an array, and the array itself.
Definition packet.c:659
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition packet.c:74
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:435
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
Definition packet.c:443
void av_parser_close(AVCodecParserContext *s)
Definition parser.c:203
#define AVFMT_PROGCOPY_MATCH_BY_INDEX
match streams using stream index
Definition avformat.h:2267
const char * avformat_stream_group_name(enum AVStreamGroupParamsType type)
Definition avformat.c:284
AVProgram * av_new_program(AVFormatContext *ac, int id)
Definition avformat.c:299
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
int av_program_copy(AVFormatContext *dst, const AVFormatContext *src, int progid, int flags)
Copy an AVProgram from one AVFormatContext to another.
Definition avformat.c:373
#define AVFMT_PROGCOPY_MATCH_BY_ID
match streams using stream id
Definition avformat.h:2266
#define AVFMT_PROGCOPY_OVERWRITE
overwrite pre-existing program having same ID
Definition avformat.h:2268
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
Definition avformat.c:165
AVProgram * av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
Find the programs which belong to a given stream.
Definition avformat.c:478
AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *frame)
Guess the frame rate, based on both the container and codec information.
Definition avformat.c:842
int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
Check if the stream st contained in s is matched by the stream specifier spec.
Definition avformat.c:771
int av_find_default_stream_index(AVFormatContext *s)
Definition avformat.c:493
AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
Guess the sample aspect ratio of a frame, based on both the stream and the frame aspect ratio.
Definition avformat.c:819
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition dict.c:236
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition dict.c:61
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition dict.c:250
#define AVERROR_DECODER_NOT_FOUND
Decoder not found.
Definition error.h:54
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR_STREAM_NOT_FOUND
Stream not found.
Definition error.h:67
#define AVERROR(e)
Definition error.h:45
void av_iamf_audio_element_free(AVIAMFAudioElement **paudio_element)
Free an AVIAMFAudioElement and all its contents.
Definition iamf.c:338
void av_iamf_mix_presentation_free(AVIAMFMixPresentation **pmix_presentation)
Free an AVIAMFMixPresentation and all its contents.
Definition iamf.c:536
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition log.h:236
#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_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition rational.h:104
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition rational.c:88
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
Definition mem.c:419
char * av_strndup(const char *s, size_t len)
Duplicate a substring of a string.
Definition mem.c:390
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition mem.c:318
AVMediaType
Definition avutil.h:198
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition avutil.h:204
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AVMEDIA_TYPE_SUBTITLE
Definition avutil.h:203
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition avutil.h:202
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition avutil.h:199
@ AV_SAMPLE_FMT_NONE
Definition samplefmt.h:56
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition avstring.c:85
int av_match_list(const char *name, const char *list, char separator)
Check if a name is in a list.
Definition avstring.c:443
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition opt.c:2033
int index
Definition gxfenc.c:90
static const int offsets[]
Definition hevc_pel.c:34
enum MPFType type
Definition jpegmpfenc.c:55
static const chunk_decoder decoder[8]
Definition dfa.c:331
static av_always_inline FFStream * ffstream(AVStream *st)
Definition internal.h:384
static av_always_inline const FFStream * cffstream(const AVStream *st)
Definition internal.h:389
void ff_curl_loop_free(struct CurlLoop **loop)
Release a libcurl event loop and set *loop to NULL.
Definition libcurl.c:1114
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition internal.h:135
void ff_packet_list_free(PacketList *list)
Wipe the list and unref all the packets in it.
Immersive Audio Model and Formats API header.
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition internal.h:71
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition internal.h:72
const char * desc
Definition libsvtav1.c:83
#define FFMIN(a, b)
Definition macros.h:49
Memory handling functions.
uint32_t tag
Definition movenc.c:2128
static const FFOutputFormat * ffofmt(const AVOutputFormat *fmt)
Definition mux.h:167
#define av_strdup(s)
Definition ops_static.c:55
AVOptions.
pixel format definitions
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
#define FF_ARRAY_ELEMS(a)
int nb_channels
Number of channels in this layout.
main external API structure.
Definition avcodec.h:443
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition avcodec.h:554
AVRational framerate
Definition avcodec.h:563
This struct describes the properties of a single codec described by an AVCodecID.
Definition codec_desc.h:38
int props
Codec properties, a combination of AV_CODEC_PROP_* flags.
Definition codec_desc.h:54
enum AVMediaType type
Definition codec_desc.h:40
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
int height
The height of the video frame in pixels.
Definition codec_par.h:150
AVChannelLayout ch_layout
The channel layout and number of channels.
Definition codec_par.h:207
int width
The width of the video frame in pixels.
Definition codec_par.h:143
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition codec_par.h:99
enum AVMediaType codec_type
General type of the encoded data.
Definition codec_par.h:53
AVRational sample_aspect_ratio
The aspect ratio (width/height) which a single pixel should have when displayed.
Definition codec_par.h:161
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition codec_par.h:57
int sample_rate
The number of audio samples per second.
Definition codec_par.h:213
AVCodec.
Definition codec.h:175
Format I/O context.
Definition avformat.h:1401
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition avformat.h:1457
AVProgram ** programs
Definition avformat.h:1615
unsigned int nb_programs
Definition avformat.h:1614
AVStream ** streams
A list of all streams in the file.
Definition avformat.h:1469
This structure describes decoded (raw) audio or video data.
Definition frame.h:479
Bytestream IO Context.
Definition avio.h:160
uint8_t * data
Definition packet.h:610
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition avformat.h:475
New fields can be added to the end with minor version bumps.
Definition avformat.h:1325
int pmt_pid
Definition avformat.h:1334
unsigned int nb_stream_indexes
Definition avformat.h:1330
int64_t start_time
Definition avformat.h:1345
int program_num
Definition avformat.h:1333
int64_t end_time
Definition avformat.h:1346
unsigned int * stream_index
Definition avformat.h:1329
int pcr_pid
Definition avformat.h:1335
int64_t pts_wrap_reference
reference dts for wrap detection
Definition avformat.h:1348
enum AVDiscard discard
selects which program to discard and which to feed to the caller
Definition avformat.h:1328
int pts_wrap_behavior
behavior on wrap detection
Definition avformat.h:1349
int pmt_version
Definition avformat.h:1336
AVDictionary * metadata
Definition avformat.h:1331
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
struct AVStreamGroupTileGrid::@036353327352337314037001273105074056331305251354 * offsets
An nb_tiles sized array of offsets in pixels from the topleft edge of the canvas, indicating where ea...
unsigned int nb_entries
Number of elements in AVStreamGroup.entries.
Definition avformat.h:1286
enum AVStreamGroupParamsType type
Group type.
Definition avformat.h:1212
struct AVIAMFMixPresentation * iamf_mix_presentation
Definition avformat.h:1219
AVStreamGroupEntry ** entries
A list of streams or child groups in the group.
Definition avformat.h:1299
struct AVStreamGroupTileGrid * tile_grid
Definition avformat.h:1220
void * priv_data
Definition avformat.h:1191
struct AVStreamGroupTREF * tref
Definition avformat.h:1229
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition avformat.h:1312
AVDictionary * metadata
Metadata that applies to the whole group.
Definition avformat.h:1240
union AVStreamGroup::@313244315204024013007202273061153315146016101155 params
Group type-specific parameters.
struct AVIAMFAudioElement * iamf_audio_element
Definition avformat.h:1218
AVPacketSideData * coded_side_data
Additional data associated with the group.
Definition avformat.h:1307
struct AVStreamGroupLayeredVideo * layered_video
Definition avformat.h:1221
Stream structure.
Definition avformat.h:768
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:791
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition avformat.h:846
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition avformat.h:839
AVDictionary * metadata
Definition avformat.h:848
void * priv_data
Definition avformat.h:793
int id
Format-specific stream ID.
Definition avformat.h:780
int index
stream index in AVFormatContext
Definition avformat.h:774
int pts_wrap_bits
Number of bits in timestamps.
Definition avformat.h:911
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
Definition avformat.h:866
AVRational avg_frame_rate
Average framerate.
Definition avformat.h:857
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition avformat.h:807
AVRational r_frame_rate
Real base framerate of the stream.
Definition avformat.h:902
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition avformat.h:837
PacketList packet_buffer
This buffer is only needed when packets were already buffered but not decoded, for example to get the...
Definition internal.h:86
AVDictionary * id3v2_meta
ID3v2 tag useful for MP3 demuxing.
Definition internal.h:118
struct CurlLoop * curl_loop
Shared libcurl event loop, created on demand on the first use.
Definition internal.h:132
int program_ids_monotonic
Set if program ids are strictly monotonic.
Definition internal.h:125
AVPacket * parse_pkt
The generic code uses this as a temporary packet to parse packets or for muxing, especially flushing.
Definition internal.h:104
AVPacket * pkt
Used to hold temporary packets for the generic demuxing code.
Definition internal.h:111
void(* deinit)(AVFormatContext *)
Deinitialize format.
Definition mux.h:154
double(* duration_error)[2][MAX_STD_TIMEBASES]
Definition demux.h:206
struct AVCodecContext * avctx
The codec context used by avformat_find_stream_info, the parser, etc.
Definition internal.h:168
struct AVBSFContext * bsfc
bitstream filter to run on stream
Definition internal.h:158
AVProbeData probe_data
Definition internal.h:324
struct AVBSFContext * bsf
Definition internal.h:178
const struct AVCodecDescriptor * codec_desc
Definition internal.h:381
struct AVCodecParserContext * parser
Definition internal.h:341
struct FFStreamInfo * info
Stream information used internally by avformat_find_stream_info()
Definition internal.h:194
AVPacket * parse_pkt
The generic code uses this as a temporary packet to parse packets or for muxing, especially flushing.
Definition internal.h:356
struct FFStream::@143263315346311247247365102337045232073206113210 extract_extradata
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition internal.h:196
int codec_info_nb_frames
Number of frames that have been demuxed during avformat_find_stream_info()
Definition internal.h:361
PacketList parse_queue
Packets split by the parser get queued here.
PacketList raw_packet_buffer
Raw packets from the demuxer, prior to parsing and decoding.
int raw_packet_buffer_size
Sum of the size of packets in raw_packet_buffer, in bytes.
int initialized
Whether or not avformat_init_output has already been called.
const char * scheme
possibly including lavf-specific options
Definition url.h:364
#define av_free(p)
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
static void error(const char *err)
static uint8_t tmp[40]
Definition aes_ctr.c:52
int64_t bitrate
Definition av1_levels.c:47
#define src
Definition vp8dsp.c:248
int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
Parse an URL to find the components.
Definition url.c:91
unbuffered private I/O API
enum AVCodecID codec_id
const char * g
Definition vf_curves.c:128