FFmpeg
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 <math.h>
23 #include "libavutil/avassert.h"
24 #include "libavutil/avstring.h"
26 #include "libavutil/frame.h"
27 #include "libavutil/iamf.h"
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/mem.h"
30 #include "libavutil/opt.h"
31 #include "libavutil/pixfmt.h"
32 #include "libavutil/samplefmt.h"
33 #include "libavcodec/avcodec.h"
34 #include "libavcodec/codec.h"
35 #include "libavcodec/bsf.h"
36 #include "libavcodec/codec_desc.h"
38 #include "avformat.h"
39 #include "avformat_internal.h"
40 #include "avio.h"
41 #include "demux.h"
42 #include "mux.h"
43 #include "internal.h"
44 #include "url.h"
45 
47 {
48  AVStream *st = *pst;
49  FFStream *const sti = ffstream(st);
50 
51  if (!st)
52  return;
53 
54  if (st->attached_pic.data)
56 
57  av_parser_close(sti->parser);
59  av_bsf_free(&sti->bsfc);
60  av_freep(&sti->index_entries);
61  av_freep(&sti->probe_data.buf);
62 
64 
66 
67  if (sti->info) {
69  av_freep(&sti->info);
70  }
71 
72  av_dict_free(&st->metadata);
74  av_freep(&st->priv_data);
75 
76  av_freep(pst);
77 }
78 
80 {
81  AVStreamGroup *stg = *pstg;
82 
83  if (!stg)
84  return;
85 
86  av_freep(&stg->streams);
87  av_dict_free(&stg->metadata);
88  av_freep(&stg->priv_data);
89  switch (stg->type) {
92  break;
93  }
96  break;
97  }
103  av_freep(&stg->params.tile_grid);
104  break;
106  av_opt_free(stg->params.lcevc);
107  av_freep(&stg->params.lcevc);
108  break;
109  default:
110  break;
111  }
112 
113  av_freep(pstg);
114 }
115 
117 {
118  av_assert0(s->nb_streams>0);
119  av_assert0(s->streams[ s->nb_streams - 1 ] == st);
120 
121  ff_free_stream(&s->streams[ --s->nb_streams ]);
122 }
123 
125 {
126  av_assert0(s->nb_stream_groups > 0);
127  av_assert0(s->stream_groups[ s->nb_stream_groups - 1 ] == stg);
128 
129  ff_free_stream_group(&s->stream_groups[ --s->nb_stream_groups ]);
130 }
131 
132 /* XXX: suppress the packet queue */
134 {
135  FormatContextInternal *const fci = ff_fc_internal(s);
136  FFFormatContext *const si = &fci->fc;
140 
141  fci->raw_packet_buffer_size = 0;
142 }
143 
145 {
147  FFFormatContext *si;
148 
149  if (!s)
150  return;
151  fci = ff_fc_internal(s);
152  si = &fci->fc;
153 
154  if (s->oformat && ffofmt(s->oformat)->deinit && fci->initialized)
155  ffofmt(s->oformat)->deinit(s);
156 
157  av_opt_free(s);
158  if (s->iformat && s->iformat->priv_class && s->priv_data)
159  av_opt_free(s->priv_data);
160  if (s->oformat && s->oformat->priv_class && s->priv_data)
161  av_opt_free(s->priv_data);
162 
163  for (unsigned i = 0; i < s->nb_streams; i++)
164  ff_free_stream(&s->streams[i]);
165  for (unsigned i = 0; i < s->nb_stream_groups; i++)
166  ff_free_stream_group(&s->stream_groups[i]);
167  s->nb_stream_groups = 0;
168  s->nb_streams = 0;
169 
170  for (unsigned i = 0; i < s->nb_programs; i++) {
171  av_dict_free(&s->programs[i]->metadata);
172  av_freep(&s->programs[i]->stream_index);
173  av_freep(&s->programs[i]);
174  }
175  s->nb_programs = 0;
176 
177  av_freep(&s->programs);
178  av_freep(&s->priv_data);
179  while (s->nb_chapters--) {
180  av_dict_free(&s->chapters[s->nb_chapters]->metadata);
181  av_freep(&s->chapters[s->nb_chapters]);
182  }
183  av_freep(&s->chapters);
184  av_dict_free(&s->metadata);
185  av_dict_free(&si->id3v2_meta);
186  av_packet_free(&si->pkt);
189  av_freep(&s->streams);
190  av_freep(&s->stream_groups);
191  if (s->iformat)
193  av_freep(&s->url);
194  av_freep(&s->name);
195  av_free(s);
196 }
197 
198 /**
199  * Copy all stream parameters from source to destination stream, with the
200  * exception of the index field, which is usually set by avformat_new_stream().
201  *
202  * @param dst pointer to destination AVStream
203  * @param src pointer to source AVStream
204  * @return >=0 on success, AVERROR code on error
205  */
207 {
208  int ret;
209 
210  dst->id = src->id;
211  dst->time_base = src->time_base;
212  dst->start_time = src->start_time;
213  dst->duration = src->duration;
214  dst->nb_frames = src->nb_frames;
215  dst->disposition = src->disposition;
216  dst->discard = src->discard;
217  dst->sample_aspect_ratio = src->sample_aspect_ratio;
218  dst->avg_frame_rate = src->avg_frame_rate;
219  dst->event_flags = src->event_flags;
220  dst->r_frame_rate = src->r_frame_rate;
221  dst->pts_wrap_bits = src->pts_wrap_bits;
222 
223  av_dict_free(&dst->metadata);
224  ret = av_dict_copy(&dst->metadata, src->metadata, 0);
225  if (ret < 0)
226  return ret;
227 
228  ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
229  if (ret < 0)
230  return ret;
231 
232  av_packet_unref(&dst->attached_pic);
233  if (src->attached_pic.data) {
234  ret = av_packet_ref(&dst->attached_pic, &src->attached_pic);
235  if (ret < 0)
236  return ret;
237  }
238 
239  return 0;
240 }
241 
243 {
244  AVStream *st;
245  int ret;
246 
247  st = avformat_new_stream(dst_ctx, NULL);
248  if (!st)
249  return NULL;
250 
251  ret = stream_params_copy(st, src);
252  if (ret < 0) {
253  ff_remove_stream(dst_ctx, st);
254  return NULL;
255  }
256 
257  return st;
258 }
259 
261 {
262  switch(type) {
263  case AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT: return "IAMF Audio Element";
264  case AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION: return "IAMF Mix Presentation";
265  case AV_STREAM_GROUP_PARAMS_TILE_GRID: return "Tile Grid";
266  case AV_STREAM_GROUP_PARAMS_LCEVC: return "LCEVC (Split video and enhancement)";
267  }
268  return NULL;
269 }
270 
272 {
274  int ret;
275 
276  av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
277 
278  for (unsigned i = 0; i < ac->nb_programs; i++)
279  if (ac->programs[i]->id == id)
280  program = ac->programs[i];
281 
282  if (!program) {
283  program = av_mallocz(sizeof(*program));
284  if (!program)
285  return NULL;
287  if (ret < 0) {
288  av_free(program);
289  return NULL;
290  }
291  program->discard = AVDISCARD_NONE;
292  program->pmt_version = -1;
293  program->id = id;
294  program->pts_wrap_reference = AV_NOPTS_VALUE;
295  program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
296  program->start_time =
297  program->end_time = AV_NOPTS_VALUE;
298  }
299  return program;
300 }
301 
302 int av_program_add_stream_index2(AVFormatContext *ac, int progid, unsigned idx)
303 {
305  void *tmp;
306 
307  if (idx >= ac->nb_streams) {
308  av_log(ac, AV_LOG_ERROR, "stream index %d is greater than stream count %d\n", idx, ac->nb_streams);
309  return AVERROR(EINVAL);
310  }
311 
312  for (unsigned i = 0; i < ac->nb_programs; i++) {
313  if (ac->programs[i]->id != progid)
314  continue;
315  program = ac->programs[i];
316  for (unsigned j = 0; j < program->nb_stream_indexes; j++)
317  if (program->stream_index[j] == idx)
318  return 0;
319 
320  tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
321  if (!tmp)
322  return AVERROR(ENOMEM);
323  program->stream_index = tmp;
324  program->stream_index[program->nb_stream_indexes++] = idx;
325  return 0;
326  }
327 
328  av_log(ac, AV_LOG_ERROR, "no program with id %d found\n", progid);
329  return AVERROR(EINVAL);
330 }
331 
332 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
333 {
334  av_program_add_stream_index2(ac, progid, idx);
335  return;
336 }
337 
339 {
340  const AVProgram *src_prog = NULL;
341  AVProgram *dst_prog = NULL;
342  int ret, idx = -1, match = -1;
343  int overwrite = flags & AVFMT_PROGCOPY_OVERWRITE;
344 
346  return AVERROR(EINVAL);
348  match = 0;
350  match = 1;
351 
352  for (unsigned i = 0; i < src->nb_programs; i++) {
353  if (src->programs[i]->id == progid) {
354  if (src_prog) {
355  av_log(dst, AV_LOG_ERROR, "multiple programs found in source with same id 0x%04x. Not copying.\n", progid);
356  return AVERROR(EINVAL);
357  } else {
358  src_prog = src->programs[i];
359  }
360  }
361  }
362 
363  if (!src_prog) {
364  av_log(dst, AV_LOG_ERROR, "source program not found: id=0x%04x\n", progid);
365  return AVERROR(EINVAL);
366  }
367 
368  for (unsigned i = 0; i < dst->nb_programs; i++) {
369  if (dst->programs[i]->id == progid) {
370  if (idx > -1) {
371  av_log(dst, AV_LOG_ERROR, "multiple programs found in target with same id 0x%04x. Not copying.\n", progid);
372  return AVERROR(EINVAL);
373  } else {
374  idx = i;
375  }
376  }
377  }
378 
379  if (idx >= 0 && !overwrite)
380  return AVERROR(EEXIST);
381 
382  av_log(dst, AV_LOG_TRACE, "%s program: id=0x%04x\n", idx >= 0 ? "overwriting" : "copying", progid);
383 
384  if (idx >= 0) {
385  dst_prog = dst->programs[idx];
386  av_dict_free(&dst_prog->metadata);
387  av_freep(&dst_prog->stream_index);
388  dst_prog->nb_stream_indexes = 0;
389  } else {
390  dst_prog = av_new_program(dst, progid);
391  if (!dst_prog)
392  return AVERROR(ENOMEM);
393  }
394 
395  /* public fields */
396  dst_prog->id = src_prog->id;
397  dst_prog->flags = src_prog->flags;
398  dst_prog->discard = src_prog->discard;
399  dst_prog->program_num = src_prog->program_num;
400  dst_prog->pmt_pid = src_prog->pmt_pid;
401  dst_prog->pcr_pid = src_prog->pcr_pid;
402  dst_prog->pmt_version = src_prog->pmt_version;
403 
404  if (match == -1 && src->nb_streams) {
405  match = 0;
406  for (unsigned i = 0; i < src->nb_streams && !match; i++) {
407  int src_id = src->streams[i]->id;
408  if (!src_id) {
409  match = 1;
410  break;
411  }
412  for (unsigned j=i+1; j < src->nb_streams; j++) {
413  int sib_id = src->streams[j]->id;
414  if (src_id == sib_id) {
415  match = 1;
416  break;
417  }
418  }
419  }
420  }
421 
422  for (unsigned i = 0; i < dst->nb_streams; i++) {
423  int dst_val = match ? i : dst->streams[i]->id;
424 
425  for (unsigned j = 0; j < src_prog->nb_stream_indexes; j++) {
426  int src_val = match ? src_prog->stream_index[j] : src->streams[src_prog->stream_index[j]]->id;
427 
428  if (dst_val == src_val) {
429  ret = av_program_add_stream_index2(dst, dst_prog->id, i);
430  if (ret < 0)
431  return ret;
432  }
433  }
434  }
435 
436  ret = av_dict_copy(&dst_prog->metadata, src_prog->metadata, 0);
437  if (ret < 0)
438  return ret;
439 
440  return 0;
441 }
442 
444 {
445  for (unsigned i = 0; i < ic->nb_programs; i++) {
446  if (ic->programs[i] == last) {
447  last = NULL;
448  } else {
449  if (!last)
450  for (unsigned j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
451  if (ic->programs[i]->stream_index[j] == s)
452  return ic->programs[i];
453  }
454  }
455  return NULL;
456 }
457 
459 {
460  int best_stream = 0;
461  int best_score = INT_MIN;
462 
463  if (s->nb_streams <= 0)
464  return -1;
465  for (unsigned i = 0; i < s->nb_streams; i++) {
466  const AVStream *const st = s->streams[i];
467  const FFStream *const sti = cffstream(st);
468  int score = 0;
469  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
471  score -= 400;
472  if (st->codecpar->width && st->codecpar->height)
473  score += 50;
474  score+= 25;
475  }
476  if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
477  if (st->codecpar->sample_rate)
478  score += 50;
479  }
480  if (sti->codec_info_nb_frames)
481  score += 12;
482 
483  if (st->discard != AVDISCARD_ALL)
484  score += 200;
485 
486  if (score > best_score) {
487  best_score = score;
488  best_stream = i;
489  }
490  }
491  return best_stream;
492 }
493 
495  int wanted_stream_nb, int related_stream,
496  const AVCodec **decoder_ret, int flags)
497 {
498  int nb_streams = ic->nb_streams;
500  int best_count = -1, best_multiframe = -1, best_disposition = -1;
501  int count, multiframe, disposition;
502  int64_t best_bitrate = -1;
504  unsigned *program = NULL;
505  const AVCodec *decoder = NULL, *best_decoder = NULL;
506 
507  if (related_stream >= 0 && wanted_stream_nb < 0) {
508  AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
509  if (p) {
510  program = p->stream_index;
511  nb_streams = p->nb_stream_indexes;
512  }
513  }
514  for (unsigned i = 0; i < nb_streams; i++) {
515  int real_stream_index = program ? program[i] : i;
516  AVStream *st = ic->streams[real_stream_index];
517  AVCodecParameters *par = st->codecpar;
518  if (par->codec_type != type)
519  continue;
520  if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
521  continue;
522  if (type == AVMEDIA_TYPE_AUDIO && !(par->ch_layout.nb_channels && par->sample_rate))
523  continue;
524  if (decoder_ret) {
525  decoder = ff_find_decoder(ic, st, par->codec_id);
526  if (!decoder) {
527  if (ret < 0)
529  continue;
530  }
531  }
533  + !! (st->disposition & AV_DISPOSITION_DEFAULT);
534  count = ffstream(st)->codec_info_nb_frames;
535  bitrate = par->bit_rate;
536  multiframe = FFMIN(5, count);
537  if ((best_disposition > disposition) ||
538  (best_disposition == disposition && best_multiframe > multiframe) ||
539  (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
540  (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
541  continue;
542  best_disposition = disposition;
543  best_count = count;
544  best_bitrate = bitrate;
545  best_multiframe = multiframe;
546  ret = real_stream_index;
547  best_decoder = decoder;
548  if (program && i == nb_streams - 1 && ret < 0) {
549  program = NULL;
550  nb_streams = ic->nb_streams;
551  /* no related stream found, try again with everything */
552  i = 0;
553  }
554  }
555  if (decoder_ret)
556  *decoder_ret = best_decoder;
557  return ret;
558 }
559 
560 /**
561  * Matches a stream specifier (but ignores requested index).
562  *
563  * @param indexptr set to point to the requested stream index if there is one
564  *
565  * @return <0 on error
566  * 0 if st is NOT a matching stream
567  * >0 if st is a matching stream
568  */
569 static int match_stream_specifier(const AVFormatContext *s, const AVStream *st,
570  const char *spec, const char **indexptr,
571  const AVStreamGroup **g, const AVProgram **p)
572 {
573  int match = 1; /* Stores if the specifier matches so far. */
574  while (*spec) {
575  if (*spec <= '9' && *spec >= '0') { /* opt:index */
576  if (indexptr)
577  *indexptr = spec;
578  return match;
579  } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
580  *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
581  enum AVMediaType type;
582  int nopic = 0;
583 
584  switch (*spec++) {
585  case 'v': type = AVMEDIA_TYPE_VIDEO; break;
586  case 'a': type = AVMEDIA_TYPE_AUDIO; break;
587  case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
588  case 'd': type = AVMEDIA_TYPE_DATA; break;
589  case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
590  case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
591  default: av_assert0(0);
592  }
593  if (*spec && *spec++ != ':') /* If we are not at the end, then another specifier must follow. */
594  return AVERROR(EINVAL);
595 
596  if (type != st->codecpar->codec_type)
597  match = 0;
598  if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
599  match = 0;
600  } else if (*spec == 'g' && *(spec + 1) == ':') {
601  int64_t group_idx = -1, group_id = -1;
602  int found = 0;
603  char *endptr;
604  spec += 2;
605  if (*spec == '#' || (*spec == 'i' && *(spec + 1) == ':')) {
606  spec += 1 + (*spec == 'i');
607  group_id = strtol(spec, &endptr, 0);
608  if (spec == endptr || (*endptr && *endptr++ != ':'))
609  return AVERROR(EINVAL);
610  spec = endptr;
611  } else {
612  group_idx = strtol(spec, &endptr, 0);
613  /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
614  if (spec == endptr || (*endptr && *endptr++ != ':'))
615  return AVERROR(EINVAL);
616  spec = endptr;
617  }
618  if (match) {
619  if (group_id > 0) {
620  for (unsigned i = 0; i < s->nb_stream_groups; i++) {
621  if (group_id == s->stream_groups[i]->id) {
622  group_idx = i;
623  break;
624  }
625  }
626  }
627  if (group_idx < 0 || group_idx >= s->nb_stream_groups)
628  return AVERROR(EINVAL);
629  for (unsigned j = 0; j < s->stream_groups[group_idx]->nb_streams; j++) {
630  if (st->index == s->stream_groups[group_idx]->streams[j]->index) {
631  found = 1;
632  if (g)
633  *g = s->stream_groups[group_idx];
634  break;
635  }
636  }
637  }
638  if (!found)
639  match = 0;
640  } else if (*spec == 'p' && *(spec + 1) == ':') {
641  int prog_id;
642  int found = 0;
643  char *endptr;
644  spec += 2;
645  prog_id = strtol(spec, &endptr, 0);
646  /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
647  if (spec == endptr || (*endptr && *endptr++ != ':'))
648  return AVERROR(EINVAL);
649  spec = endptr;
650  if (match) {
651  for (unsigned i = 0; i < s->nb_programs; i++) {
652  if (s->programs[i]->id != prog_id)
653  continue;
654 
655  for (unsigned j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
656  if (st->index == s->programs[i]->stream_index[j]) {
657  found = 1;
658  if (p)
659  *p = s->programs[i];
660  i = s->nb_programs;
661  break;
662  }
663  }
664  }
665  }
666  if (!found)
667  match = 0;
668  } else if (*spec == '#' ||
669  (*spec == 'i' && *(spec + 1) == ':')) {
670  int stream_id;
671  char *endptr;
672  spec += 1 + (*spec == 'i');
673  stream_id = strtol(spec, &endptr, 0);
674  if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */
675  return AVERROR(EINVAL);
676  return match && (stream_id == st->id);
677  } else if (*spec == 'm' && *(spec + 1) == ':') {
678  const AVDictionaryEntry *tag;
679  char *key, *val;
680  int ret;
681 
682  if (match) {
683  spec += 2;
684  val = strchr(spec, ':');
685 
686  key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
687  if (!key)
688  return AVERROR(ENOMEM);
689 
690  tag = av_dict_get(st->metadata, key, NULL, 0);
691  if (tag) {
692  if (!val || !strcmp(tag->value, val + 1))
693  ret = 1;
694  else
695  ret = 0;
696  } else
697  ret = 0;
698 
699  av_freep(&key);
700  }
701  return match && ret;
702  } else if (*spec == 'u' && *(spec + 1) == '\0') {
703  const AVCodecParameters *par = st->codecpar;
704  int val;
705  switch (par->codec_type) {
706  case AVMEDIA_TYPE_AUDIO:
707  val = par->sample_rate && par->ch_layout.nb_channels;
708  if (par->format == AV_SAMPLE_FMT_NONE)
709  return 0;
710  break;
711  case AVMEDIA_TYPE_VIDEO:
712  val = par->width && par->height;
713  if (par->format == AV_PIX_FMT_NONE)
714  return 0;
715  break;
717  val = 0;
718  break;
719  default:
720  val = 1;
721  break;
722  }
723  return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
724  } else {
725  return AVERROR(EINVAL);
726  }
727  }
728 
729  return match;
730 }
731 
733  const char *spec)
734 {
735  int ret, index;
736  char *endptr;
737  const char *indexptr = NULL;
738  const AVStreamGroup *g = NULL;
739  const AVProgram *p = NULL;
740  int nb_streams;
741 
742  ret = match_stream_specifier(s, st, spec, &indexptr, &g, &p);
743  if (ret < 0)
744  goto error;
745 
746  if (!indexptr)
747  return ret;
748 
749  index = strtol(indexptr, &endptr, 0);
750  if (*endptr) { /* We can't have anything after the requested index. */
751  ret = AVERROR(EINVAL);
752  goto error;
753  }
754 
755  /* This is not really needed but saves us a loop for simple stream index specifiers. */
756  if (spec == indexptr)
757  return (index == st->index);
758 
759  /* If we requested a matching stream index, we have to ensure st is that. */
760  nb_streams = g ? g->nb_streams : (p ? p->nb_stream_indexes : s->nb_streams);
761  for (int i = 0; i < nb_streams && index >= 0; i++) {
762  unsigned idx = g ? g->streams[i]->index : (p ? p->stream_index[i] : i);
763  const AVStream *candidate = s->streams[idx];
764  ret = match_stream_specifier(s, candidate, spec, NULL, NULL, NULL);
765  if (ret < 0)
766  goto error;
767  if (ret > 0 && index-- == 0 && st == candidate)
768  return 1;
769  }
770  return 0;
771 
772 error:
773  if (ret == AVERROR(EINVAL))
774  av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
775  return ret;
776 }
777 
779 {
780  AVRational undef = {0, 1};
781  AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
782  AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
783  AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
784 
785  av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
786  stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
787  if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
788  stream_sample_aspect_ratio = undef;
789 
790  av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
791  frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
792  if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
793  frame_sample_aspect_ratio = undef;
794 
795  if (stream_sample_aspect_ratio.num)
796  return stream_sample_aspect_ratio;
797  else
798  return frame_sample_aspect_ratio;
799 }
800 
802 {
803  AVRational fr = st->r_frame_rate;
805  AVRational avg_fr = st->avg_frame_rate;
806 
807  if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
808  av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
809  fr = avg_fr;
810  }
811 
812  if (desc && (desc->props & AV_CODEC_PROP_FIELDS)) {
813  const AVCodecContext *const avctx = ffstream(st)->avctx;
814  AVRational codec_fr = avctx->framerate;
815 
816  if ( codec_fr.num > 0 && codec_fr.den > 0 &&
817  (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))
818  fr = codec_fr;
819  }
820 
821  return fr;
822 }
823 
824 #if FF_API_INTERNAL_TIMING
825 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
826  AVStream *ost, const AVStream *ist,
827  enum AVTimebaseSource copy_tb)
828 {
830  const AVCodecContext *const dec_ctx = cffstream(ist)->avctx;
831 
832  AVRational mul = (AVRational){ desc && (desc->props & AV_CODEC_PROP_FIELDS) ? 2 : 1, 1 };
833  AVRational dec_ctx_framerate = dec_ctx ? dec_ctx->framerate : (AVRational){ 0, 0 };
834  AVRational dec_ctx_tb = dec_ctx_framerate.num ? av_inv_q(av_mul_q(dec_ctx_framerate, mul))
835  : (ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO ? (AVRational){0, 1}
836  : ist->time_base);
837  AVRational enc_tb = ist->time_base;
838 
839  /*
840  * Avi is a special case here because it supports variable fps but
841  * having the fps and timebase differe significantly adds quite some
842  * overhead
843  */
844  if (!strcmp(ofmt->name, "avi")) {
845 #if FF_API_R_FRAME_RATE
846  if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
847  && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
848  && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
849  && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx_tb)
850  && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx_tb) < 1.0/500
851  || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
852  enc_tb.num = ist->r_frame_rate.den;
853  enc_tb.den = 2*ist->r_frame_rate.num;
854  } else
855 #endif
856  if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate.num &&
857  av_q2d(av_inv_q(dec_ctx_framerate)) > 2*av_q2d(ist->time_base)
858  && av_q2d(ist->time_base) < 1.0/500
859  || (copy_tb == AVFMT_TBCF_DECODER &&
860  (dec_ctx_framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) {
861  enc_tb = dec_ctx_tb;
862  enc_tb.den *= 2;
863  }
864  } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
865  && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
866  if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate.num
867  && av_q2d(av_inv_q(dec_ctx_framerate)) > av_q2d(ist->time_base)
868  && av_q2d(ist->time_base) < 1.0/500
869  || (copy_tb == AVFMT_TBCF_DECODER &&
870  (dec_ctx_framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) {
871  enc_tb = dec_ctx_tb;
872  }
873  }
874 
875  if (ost->codecpar->codec_tag == AV_RL32("tmcd")
876  && dec_ctx_tb.num < dec_ctx_tb.den
877  && dec_ctx_tb.num > 0
878  && 121LL*dec_ctx_tb.num > dec_ctx_tb.den) {
879  enc_tb = dec_ctx_tb;
880  }
881 
882  av_reduce(&ffstream(ost)->transferred_mux_tb.num,
883  &ffstream(ost)->transferred_mux_tb.den,
884  enc_tb.num, enc_tb.den, INT_MAX);
885 
886  return 0;
887 }
888 
889 AVRational av_stream_get_codec_timebase(const AVStream *st)
890 {
891  return cffstream(st)->avctx ? cffstream(st)->avctx->time_base : cffstream(st)->transferred_mux_tb;
892 }
893 #endif
894 
895 void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
896  unsigned int pts_num, unsigned int pts_den)
897 {
898  FFStream *const sti = ffstream(st);
899  AVRational new_tb;
900  if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
901  if (new_tb.num != pts_num)
903  "st:%d removing common factor %d from timebase\n",
904  st->index, pts_num / new_tb.num);
905  } else
907  "st:%d has too large timebase, reducing\n", st->index);
908 
909  if (new_tb.num <= 0 || new_tb.den <= 0) {
911  "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
912  new_tb.num, new_tb.den,
913  st->index);
914  return;
915  }
916  st->time_base = new_tb;
917  if (sti->avctx)
918  sti->avctx->pkt_timebase = new_tb;
919  st->pts_wrap_bits = pts_wrap_bits;
920 }
921 
923  enum AVCodecID codec_id)
924 {
925  switch (st->codecpar->codec_type) {
926  case AVMEDIA_TYPE_VIDEO:
927  if (s->video_codec) return s->video_codec;
928  break;
929  case AVMEDIA_TYPE_AUDIO:
930  if (s->audio_codec) return s->audio_codec;
931  break;
933  if (s->subtitle_codec) return s->subtitle_codec;
934  break;
935  }
936 
938 }
939 
941 {
942 #define OFF(field) offsetof(AVFormatContext, field)
943  static const unsigned offsets[] = {
944  OFF(codec_whitelist), OFF(format_whitelist),
945  OFF(protocol_whitelist), OFF(protocol_blacklist),
946  };
947 #undef OFF
948  av_assert0(!dst->codec_whitelist &&
949  !dst->format_whitelist &&
950  !dst->protocol_whitelist &&
951  !dst->protocol_blacklist);
952  for (unsigned i = 0; i < FF_ARRAY_ELEMS(offsets); i++) {
953  const char *src_str = *(char *const*)((const char*)src + offsets[i]);
954 
955  if (src_str) {
956  char *dst_str = av_strdup(src_str);
957  if (!dst_str) {
958  av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
959  return AVERROR(ENOMEM);
960  }
961 
962  *(char **)((char*)dst + offsets[i]) = dst_str;
963  }
964  }
965  return 0;
966 }
967 
969 {
971  if (!d)
972  return 0;
973  if ((d->type == AVMEDIA_TYPE_VIDEO || d->type == AVMEDIA_TYPE_AUDIO) &&
975  return 0;
976  return 1;
977 }
978 
980 {
981  av_assert0(url);
982  av_freep(&s->url);
983  s->url = url;
984 }
985 
987 {
988  URLComponents uc;
989  av_assert0(url);
990  char proto[64];
991 
992  int ret = ff_url_decompose(&uc, url, NULL);
993  if (ret < 0)
994  return ret;
995  av_strlcpy(proto, uc.scheme, FFMIN(sizeof(proto), uc.url_component_end_scheme - uc.scheme));
996 
997  if (s->protocol_whitelist && av_match_list(proto, s->protocol_whitelist, ',') <= 0) {
998  av_log(s, AV_LOG_ERROR, "Protocol '%s' not on whitelist '%s'!\n", proto, s->protocol_whitelist);
999  return AVERROR(EINVAL);
1000  }
1001 
1002  if (s->protocol_blacklist && av_match_list(proto, s->protocol_blacklist, ',') > 0) {
1003  av_log(s, AV_LOG_ERROR, "Protocol '%s' on blacklist '%s'!\n", proto, s->protocol_blacklist);
1004  return AVERROR(EINVAL);
1005  }
1006 
1007  char *urldup = av_strdup(url);
1008  if (!urldup)
1009  return AVERROR(ENOMEM);
1010 
1011  av_freep(&s->url);
1012  s->url = urldup;
1013  return 0;
1014 }
1015 
1016 
1018 {
1019  int ret = 0;
1020  if (*pb)
1021  ret = s->io_close2(s, *pb);
1022  *pb = NULL;
1023  return ret;
1024 }
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
flags
const SwsFlags flags[]
Definition: swscale.c:72
iamf.h
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:433
AVCodec
AVCodec.
Definition: codec.h:172
AVStreamGroupParamsType
AVStreamGroupParamsType
Definition: avformat.h:1086
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
program
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C program
Definition: undefined.txt:6
dec_ctx
static AVCodecContext * dec_ctx
Definition: decode_filter_audio.c:45
AVOutputFormat::name
const char * name
Definition: avformat.h:506
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:53
AVStreamGroup::tile_grid
struct AVStreamGroupTileGrid * tile_grid
Definition: avformat.h:1132
AV_STREAM_GROUP_PARAMS_LCEVC
@ AV_STREAM_GROUP_PARAMS_LCEVC
Definition: avformat.h:1091
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1192
av_find_best_stream
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:494
FFStream::bsfc
struct AVBSFContext * bsfc
bitstream filter to run on stream
Definition: internal.h:146
ff_find_decoder
const AVCodec * ff_find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
Definition: avformat.c:922
AVStreamGroupTileGrid::offsets
struct AVStreamGroupTileGrid::@446 * offsets
An nb_tiles sized array of offsets in pixels from the topleft edge of the canvas, indicating where ea...
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:49
FFStream::bsf
struct AVBSFContext * bsf
Definition: internal.h:166
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AVStream::priv_data
void * priv_data
Definition: avformat.h:769
AVFMT_VARIABLE_FPS
#define AVFMT_VARIABLE_FPS
Format allows variable fps.
Definition: avformat.h:481
AV_DISPOSITION_ATTACHED_PIC
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition: avformat.h:670
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:815
av_find_program_from_stream
AVProgram * av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
Find the programs which belong to a given stream.
Definition: avformat.c:443
av_div_q
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition: rational.c:88
AVProgram::pmt_version
int pmt_version
Definition: avformat.h:1198
int64_t
long long int64_t
Definition: coverity.c:34
URLComponents
Definition: url.h:359
AV_DISPOSITION_DEFAULT
#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:617
FormatContextInternal::raw_packet_buffer
PacketList raw_packet_buffer
Raw packets from the demuxer, prior to parsing and decoding.
Definition: avformat_internal.h:75
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:435
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1331
AVPacket::data
uint8_t * data
Definition: packet.h:595
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:833
av_iamf_mix_presentation_free
void av_iamf_mix_presentation_free(AVIAMFMixPresentation **pmix_presentation)
Free an AVIAMFMixPresentation and all its contents.
Definition: iamf.c:536
nb_streams
static unsigned int nb_streams
Definition: ffprobe.c:352
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1461
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:61
AVProgram::flags
int flags
Definition: avformat.h:1189
cffstream
static const av_always_inline FFStream * cffstream(const AVStream *st)
Definition: internal.h:367
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
codec_type
enum AVMediaType codec_type
Definition: rtp.c:37
av_bsf_free
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:52
ost
static AVStream * ost
Definition: vaapi_transcode.c:42
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: packet.c:74
FormatContextInternal
Definition: avformat_internal.h:33
AVProgram::pmt_pid
int pmt_pid
Definition: avformat.h:1196
FFStream::codec_desc
const struct AVCodecDescriptor * codec_desc
Definition: internal.h:355
OFF
#define OFF(field)
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:559
ff_remove_stream
void ff_remove_stream(AVFormatContext *s, AVStream *st)
Remove a stream from its AVFormatContext and free it.
Definition: avformat.c:116
ff_free_stream_group
void ff_free_stream_group(AVStreamGroup **pstg)
Frees a stream group without modifying the corresponding AVFormatContext.
Definition: avformat.c:79
AVFMT_PROGCOPY_OVERWRITE
#define AVFMT_PROGCOPY_OVERWRITE
overwrite pre-existing program having same ID
Definition: avformat.h:2073
decoder
static const chunk_decoder decoder[8]
Definition: dfa.c:331
avpriv_set_pts_info
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:895
bsf.h
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:362
stream_params_copy
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:206
avformat_stream_group_name
const char * avformat_stream_group_name(enum AVStreamGroupParamsType type)
Definition: avformat.c:260
samplefmt.h
av_iamf_audio_element_free
void av_iamf_audio_element_free(AVIAMFAudioElement **paudio_element)
Free an AVIAMFAudioElement and all its contents.
Definition: iamf.c:338
AVProgram::discard
enum AVDiscard discard
selects which program to discard and which to feed to the caller
Definition: avformat.h:1190
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1943
FFStream::avctx
struct AVCodecContext * avctx
The codec context used by avformat_find_stream_info, the parser, etc.
Definition: internal.h:156
AVDISCARD_NONE
@ AVDISCARD_NONE
discard nothing
Definition: defs.h:226
val
static double val(void *priv, double ch)
Definition: aeval.c:77
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
av_new_program
AVProgram * av_new_program(AVFormatContext *ac, int id)
Definition: avformat.c:271
AV_PTS_WRAP_IGNORE
#define AV_PTS_WRAP_IGNORE
Options for behavior on timestamp wrap detection.
Definition: avformat.h:733
av_reduce
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
AVFMT_PROGCOPY_MATCH_BY_INDEX
#define AVFMT_PROGCOPY_MATCH_BY_INDEX
match streams using stream index
Definition: avformat.h:2072
codec.h
AVRational::num
int num
Numerator.
Definition: rational.h:59
AVStream::attached_pic
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
Definition: avformat.h:842
avassert.h
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
AVProgram::id
int id
Definition: avformat.h:1188
av_dict_get
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:60
AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
@ AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
Definition: avformat.h:1089
AVCodecDescriptor
This struct describes the properties of a single codec described by an AVCodecID.
Definition: codec_desc.h:38
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
ff_format_check_set_url
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:986
FFFormatContext::packet_buffer
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
offsets
static const int offsets[]
Definition: hevc_pel.c:34
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
AVCodecParameters::sample_aspect_ratio
AVRational sample_aspect_ratio
The aspect ratio (width/height) which a single pixel should have when displayed.
Definition: codec_par.h:161
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1460
bitrate
int64_t bitrate
Definition: av1_levels.c:47
g
const char * g
Definition: vf_curves.c:128
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:453
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
AVCodecParameters::width
int width
The width of the video frame in pixels.
Definition: codec_par.h:143
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
AVCodecDescriptor::type
enum AVMediaType type
Definition: codec_desc.h:40
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
av_guess_sample_aspect_ratio
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:778
FFStream::codec_info_nb_frames
int codec_info_nb_frames
Number of frames that have been demuxed during avformat_find_stream_info()
Definition: internal.h:335
ffofmt
static const FFOutputFormat * ffofmt(const AVOutputFormat *fmt)
Definition: mux.h:167
av_program_copy
int av_program_copy(AVFormatContext *dst, const AVFormatContext *src, int progid, int flags)
Copy an AVProgram from one AVFormatContext to another.
Definition: avformat.c:338
FFStream::extract_extradata
struct FFStream::@477 extract_extradata
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:410
av_program_add_stream_index2
int av_program_add_stream_index2(AVFormatContext *ac, int progid, unsigned idx)
Definition: avformat.c:302
key
const char * key
Definition: hwcontext_opencl.c:189
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:202
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
av_packet_side_data_free
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:733
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
AVCodecDescriptor::props
int props
Codec properties, a combination of AV_CODEC_PROP_* flags.
Definition: codec_desc.h:54
FFFormatContext
Definition: internal.h:64
avpriv_packet_list_free
void avpriv_packet_list_free(PacketList *pkt_buf)
Wipe the list and unref all the packets in it.
Definition: packet.c:610
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1263
AV_CODEC_PROP_INTRA_ONLY
#define AV_CODEC_PROP_INTRA_ONLY
Codec uses only intra compression.
Definition: codec_desc.h:72
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
fabs
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:783
NULL
#define NULL
Definition: coverity.c:32
av_match_list
int av_match_list(const char *name, const char *list, char separator)
Check if a name is in a list.
Definition: avstring.c:445
av_program_add_stream_index
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
Definition: avformat.c:332
format
New swscale design to change SwsGraph is what coordinates multiple passes These can include cascaded scaling error diffusion and so on Or we could have separate passes for the vertical and horizontal scaling In between each SwsPass lies a fully allocated image buffer Graph passes may have different levels of e g we can have a single threaded error diffusion pass following a multi threaded scaling pass SwsGraph is internally recreated whenever the image format
Definition: swscale-v2.txt:14
AVStreamGroupTileGrid::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the grid.
Definition: avformat.h:1054
avcodec_free_context
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:164
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
ff_copy_whiteblacklists
int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
Copies the whilelists from one context to the other.
Definition: avformat.c:940
FFOutputFormat::deinit
void(* deinit)(AVFormatContext *)
Deinitialize format.
Definition: mux.h:154
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1191
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:824
av_packet_ref
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
Definition: packet.c:441
FormatContextInternal::fc
FFFormatContext fc
Definition: avformat_internal.h:34
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
The channel layout and number of channels.
Definition: codec_par.h:207
AVFMT_PROGCOPY_MATCH_BY_ID
#define AVFMT_PROGCOPY_MATCH_BY_ID
match streams using stream id
Definition: avformat.h:2071
index
int index
Definition: gxfenc.c:90
AVCodecParameters::sample_rate
int sample_rate
The number of audio samples per second.
Definition: codec_par.h:213
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
avcodec_find_decoder
const AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID.
Definition: allcodecs.c:1049
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1319
FFFormatContext::id3v2_meta
AVDictionary * id3v2_meta
ID3v2 tag useful for MP3 demuxing.
Definition: internal.h:118
AVOutputFormat::flags
int flags
can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:525
FormatContextInternal::raw_packet_buffer_size
int raw_packet_buffer_size
Sum of the size of packets in raw_packet_buffer, in bytes.
Definition: avformat_internal.h:80
AV_STREAM_GROUP_PARAMS_TILE_GRID
@ AV_STREAM_GROUP_PARAMS_TILE_GRID
Definition: avformat.h:1090
AVCodecContext::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avcodec.h:543
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVMediaType
AVMediaType
Definition: avutil.h:198
avformat_match_stream_specifier
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:732
FFFormatContext::parse_pkt
AVPacket * parse_pkt
The generic code uses this as a temporary packet to parse packets or for muxing, especially flushing.
Definition: internal.h:104
FFStream
Definition: internal.h:128
ff_free_stream
void ff_free_stream(AVStream **pst)
Frees a stream without modifying the corresponding AVFormatContext.
Definition: avformat.c:46
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AVCodecContext::pkt_timebase
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition: avcodec.h:550
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
avio.h
copy_tb
int copy_tb
Definition: ffmpeg_opt.c:69
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
AV_CODEC_PROP_FIELDS
#define AV_CODEC_PROP_FIELDS
Video codec supports separate coding of fields in interlaced frames.
Definition: codec_desc.h:97
AVStreamGroup::iamf_audio_element
struct AVIAMFAudioElement * iamf_audio_element
Definition: avformat.h:1130
ff_format_io_close
int ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition: avformat.c:1017
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:199
AVProgram::program_num
int program_num
Definition: avformat.h:1195
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:822
frame.h
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition: avformat.h:654
AVStreamGroup::lcevc
struct AVStreamGroupLCEVC * lcevc
Definition: avformat.h:1133
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:233
AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
@ AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
Definition: avformat.h:1088
AVStreamGroup::streams
AVStream ** streams
A list of streams in the group.
Definition: avformat.h:1164
AVStreamGroup::iamf_mix_presentation
struct AVIAMFMixPresentation * iamf_mix_presentation
Definition: avformat.h:1131
avformat_internal.h
FFStream::probe_data
AVProbeData probe_data
Definition: internal.h:298
FFStreamInfo::duration_error
double(* duration_error)[2][MAX_STD_TIMEBASES]
Definition: demux.h:197
AVStreamGroupTileGrid::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: avformat.h:1059
ff_is_intra_only
int ff_is_intra_only(enum AVCodecID id)
Definition: avformat.c:968
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVOutputFormat
Definition: avformat.h:505
AVCodecParameters::height
int height
The height of the video frame in pixels.
Definition: codec_par.h:150
AVProgram::metadata
AVDictionary * metadata
Definition: avformat.h:1193
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:204
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
url.h
av_find_default_stream_index
int av_find_default_stream_index(AVFormatContext *s)
Definition: avformat.c:458
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1187
AVStreamGroup::params
union AVStreamGroup::@447 params
Group type-specific parameters.
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
demux.h
avcodec.h
AVCodecParameters::avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:107
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:813
match_stream_specifier
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:569
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition: avformat.h:658
tag
uint32_t tag
Definition: movenc.c:2046
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:756
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
av_guess_frame_rate
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:801
pixfmt.h
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
AVStreamGroup::metadata
AVDictionary * metadata
Metadata that applies to the whole group.
Definition: avformat.h:1144
avformat.h
id
enum AVCodecID id
Definition: dts2pts.c:550
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
AVCodecParameters::avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **par)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: codec_par.c:67
av_dynarray_add_nofree
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
Definition: mem.c:315
URLComponents::scheme
const char * scheme
possibly including lavf-specific options
Definition: url.h:361
AVStreamGroup
Definition: avformat.h:1097
AVCodecContext
main external API structure.
Definition: avcodec.h:439
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:750
channel_layout.h
AVERROR_STREAM_NOT_FOUND
#define AVERROR_STREAM_NOT_FOUND
Stream not found.
Definition: error.h:67
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
ff_flush_packet_queue
void ff_flush_packet_queue(AVFormatContext *s)
Definition: avformat.c:133
ff_remove_stream_group
void ff_remove_stream_group(AVFormatContext *s, AVStreamGroup *stg)
Remove a stream group from its AVFormatContext and free it.
Definition: avformat.c:124
av_match_name
int av_match_name(const char *name, const char *names)
Match instances of a name in a comma-separated list of names.
Definition: avstring.c:346
avformat_free_context
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
Definition: avformat.c:144
ff_fc_internal
static av_always_inline FormatContextInternal * ff_fc_internal(AVFormatContext *s)
Definition: avformat_internal.h:100
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:878
FFStream::parse_pkt
AVPacket * parse_pkt
The generic code uses this as a temporary packet to parse packets or for muxing, especially flushing.
Definition: internal.h:330
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
FFStream::info
struct FFStreamInfo * info
Stream information used internally by avformat_find_stream_info()
Definition: internal.h:182
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:184
AVERROR_DECODER_NOT_FOUND
#define AVERROR_DECODER_NOT_FOUND
Decoder not found.
Definition: error.h:54
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
AVStreamGroup::type
enum AVStreamGroupParamsType type
Group type.
Definition: avformat.h:1124
packet_internal.h
av_strdup
#define av_strdup(s)
Definition: ops_asmgen.c:47
FFFormatContext::pkt
AVPacket * pkt
Used to hold temporary packets for the generic demuxing code.
Definition: internal.h:111
AVCodecParameters::format
int format
Definition: codec_par.h:94
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:57
ff_stream_clone
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:242
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_copy
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:247
av_strlcpy
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
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:99
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
FFStream::parser
struct AVCodecParserContext * parser
Definition: internal.h:315
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3888
avstring.h
av_strndup
char * av_strndup(const char *s, size_t len)
Duplicate a substring of a string.
Definition: mem.c:284
AVStream::pts_wrap_bits
int pts_wrap_bits
Number of bits in timestamps.
Definition: avformat.h:887
codec_desc.h
AVStreamGroup::priv_data
void * priv_data
Definition: avformat.h:1103
ff_url_decompose
int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
Parse an URL to find the components.
Definition: url.c:91
AVProgram::pcr_pid
int pcr_pid
Definition: avformat.h:1197
ff_format_set_url
void ff_format_set_url(AVFormatContext *s, char *url)
Set AVFormatContext url field to the provided pointer.
Definition: avformat.c:979
src
#define src
Definition: vp8dsp.c:248
FormatContextInternal::parse_queue
PacketList parse_queue
Packets split by the parser get queued here.
Definition: avformat_internal.h:85
FormatContextInternal::initialized
int initialized
Whether or not avformat_init_output has already been called.
Definition: avformat_internal.h:42
av_parser_close
void av_parser_close(AVCodecParserContext *s)
Definition: parser.c:207
mux.h