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.tref);
107  av_freep(&stg->params.tref);
108  break;
113  break;
114  default:
115  break;
116  }
117 
118  av_freep(pstg);
119 }
120 
122 {
123  av_assert0(s->nb_streams>0);
124  av_assert0(s->streams[ s->nb_streams - 1 ] == st);
125 
126  ff_free_stream(&s->streams[ --s->nb_streams ]);
127 }
128 
130 {
131  av_assert0(s->nb_stream_groups > 0);
132  av_assert0(s->stream_groups[ s->nb_stream_groups - 1 ] == stg);
133 
134  ff_free_stream_group(&s->stream_groups[ --s->nb_stream_groups ]);
135 }
136 
137 /* XXX: suppress the packet queue */
139 {
140  FormatContextInternal *const fci = ff_fc_internal(s);
141  FFFormatContext *const si = &fci->fc;
145 
146  fci->raw_packet_buffer_size = 0;
147 }
148 
150 {
152  FFFormatContext *si;
153 
154  if (!s)
155  return;
156  fci = ff_fc_internal(s);
157  si = &fci->fc;
158 
159  if (s->oformat && ffofmt(s->oformat)->deinit && fci->initialized)
160  ffofmt(s->oformat)->deinit(s);
161 
162  av_opt_free(s);
163  if (s->iformat && s->iformat->priv_class && s->priv_data)
164  av_opt_free(s->priv_data);
165  if (s->oformat && s->oformat->priv_class && s->priv_data)
166  av_opt_free(s->priv_data);
167 
168  for (unsigned i = 0; i < s->nb_streams; i++)
169  ff_free_stream(&s->streams[i]);
170  for (unsigned i = 0; i < s->nb_stream_groups; i++)
171  ff_free_stream_group(&s->stream_groups[i]);
172  s->nb_stream_groups = 0;
173  s->nb_streams = 0;
174 
175  for (unsigned i = 0; i < s->nb_programs; i++) {
176  av_dict_free(&s->programs[i]->metadata);
177  av_freep(&s->programs[i]->stream_index);
178  av_freep(&s->programs[i]);
179  }
180  s->nb_programs = 0;
181 
182  av_freep(&s->programs);
183  av_freep(&s->priv_data);
184  while (s->nb_chapters--) {
185  av_dict_free(&s->chapters[s->nb_chapters]->metadata);
186  av_freep(&s->chapters[s->nb_chapters]);
187  }
188  av_freep(&s->chapters);
189  av_dict_free(&s->metadata);
190  av_dict_free(&si->id3v2_meta);
191  av_packet_free(&si->pkt);
194  av_freep(&s->streams);
195  av_freep(&s->stream_groups);
196  if (s->iformat)
198  av_freep(&s->url);
199  av_freep(&s->name);
200  av_free(s);
201 }
202 
203 /**
204  * Copy all stream parameters from source to destination stream, with the
205  * exception of the index field, which is usually set by avformat_new_stream().
206  *
207  * @param dst pointer to destination AVStream
208  * @param src pointer to source AVStream
209  * @return >=0 on success, AVERROR code on error
210  */
212 {
213  int ret;
214 
215  dst->id = src->id;
216  dst->time_base = src->time_base;
217  dst->start_time = src->start_time;
218  dst->duration = src->duration;
219  dst->nb_frames = src->nb_frames;
220  dst->disposition = src->disposition;
221  dst->discard = src->discard;
222  dst->sample_aspect_ratio = src->sample_aspect_ratio;
223  dst->avg_frame_rate = src->avg_frame_rate;
224  dst->event_flags = src->event_flags;
225  dst->r_frame_rate = src->r_frame_rate;
226  dst->pts_wrap_bits = src->pts_wrap_bits;
227 
228  av_dict_free(&dst->metadata);
229  ret = av_dict_copy(&dst->metadata, src->metadata, 0);
230  if (ret < 0)
231  return ret;
232 
233  ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
234  if (ret < 0)
235  return ret;
236 
237  av_packet_unref(&dst->attached_pic);
238  if (src->attached_pic.data) {
239  ret = av_packet_ref(&dst->attached_pic, &src->attached_pic);
240  if (ret < 0)
241  return ret;
242  }
243 
244  return 0;
245 }
246 
248 {
249  AVStream *st;
250  int ret;
251 
252  st = avformat_new_stream(dst_ctx, NULL);
253  if (!st)
254  return NULL;
255 
256  ret = stream_params_copy(st, src);
257  if (ret < 0) {
258  ff_remove_stream(dst_ctx, st);
259  return NULL;
260  }
261 
262  return st;
263 }
264 
266 {
267  switch(type) {
268  case AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT: return "IAMF Audio Element";
269  case AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION: return "IAMF Mix Presentation";
270  case AV_STREAM_GROUP_PARAMS_TILE_GRID: return "Tile Grid";
271  case AV_STREAM_GROUP_PARAMS_LCEVC: return "LCEVC (Split video and enhancement)";
272  case AV_STREAM_GROUP_PARAMS_TREF: return "Track Reference";
273  case AV_STREAM_GROUP_PARAMS_DOLBY_VISION: return "Dolby Vision (Split base and enhancement layer)";
274  }
275  return NULL;
276 }
277 
279 {
281  int ret;
282 
283  av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
284 
285  for (unsigned i = 0; i < ac->nb_programs; i++)
286  if (ac->programs[i]->id == id)
287  program = ac->programs[i];
288 
289  if (!program) {
290  program = av_mallocz(sizeof(*program));
291  if (!program)
292  return NULL;
294  if (ret < 0) {
295  av_free(program);
296  return NULL;
297  }
298  program->discard = AVDISCARD_NONE;
299  program->pmt_version = -1;
300  program->id = id;
301  program->pts_wrap_reference = AV_NOPTS_VALUE;
302  program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
303  program->start_time =
304  program->end_time = AV_NOPTS_VALUE;
305  }
306  return program;
307 }
308 
309 int av_program_add_stream_index2(AVFormatContext *ac, int progid, unsigned idx)
310 {
312  void *tmp;
313 
314  if (idx >= ac->nb_streams) {
315  av_log(ac, AV_LOG_ERROR, "stream index %d is greater than stream count %d\n", idx, ac->nb_streams);
316  return AVERROR(EINVAL);
317  }
318 
319  for (unsigned i = 0; i < ac->nb_programs; i++) {
320  if (ac->programs[i]->id != progid)
321  continue;
322  program = ac->programs[i];
323  for (unsigned j = 0; j < program->nb_stream_indexes; j++)
324  if (program->stream_index[j] == idx)
325  return 0;
326 
327  tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
328  if (!tmp)
329  return AVERROR(ENOMEM);
330  program->stream_index = tmp;
331  program->stream_index[program->nb_stream_indexes++] = idx;
332  return 0;
333  }
334 
335  av_log(ac, AV_LOG_ERROR, "no program with id %d found\n", progid);
336  return AVERROR(EINVAL);
337 }
338 
339 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
340 {
341  av_program_add_stream_index2(ac, progid, idx);
342  return;
343 }
344 
346 {
347  const AVProgram *src_prog = NULL;
348  AVProgram *dst_prog = NULL;
349  int ret, idx = -1, match = -1;
350  int overwrite = flags & AVFMT_PROGCOPY_OVERWRITE;
351 
353  return AVERROR(EINVAL);
355  match = 0;
357  match = 1;
358 
359  for (unsigned i = 0; i < src->nb_programs; i++) {
360  if (src->programs[i]->id == progid) {
361  if (src_prog) {
362  av_log(dst, AV_LOG_ERROR, "multiple programs found in source with same id 0x%04x. Not copying.\n", progid);
363  return AVERROR(EINVAL);
364  } else {
365  src_prog = src->programs[i];
366  }
367  }
368  }
369 
370  if (!src_prog) {
371  av_log(dst, AV_LOG_ERROR, "source program not found: id=0x%04x\n", progid);
372  return AVERROR(EINVAL);
373  }
374 
375  for (unsigned i = 0; i < dst->nb_programs; i++) {
376  if (dst->programs[i]->id == progid) {
377  if (idx > -1) {
378  av_log(dst, AV_LOG_ERROR, "multiple programs found in target with same id 0x%04x. Not copying.\n", progid);
379  return AVERROR(EINVAL);
380  } else {
381  idx = i;
382  }
383  }
384  }
385 
386  if (idx >= 0 && !overwrite)
387  return AVERROR(EEXIST);
388 
389  av_log(dst, AV_LOG_TRACE, "%s program: id=0x%04x\n", idx >= 0 ? "overwriting" : "copying", progid);
390 
391  if (idx >= 0) {
392  dst_prog = dst->programs[idx];
393  av_dict_free(&dst_prog->metadata);
394  av_freep(&dst_prog->stream_index);
395  dst_prog->nb_stream_indexes = 0;
396  } else {
397  dst_prog = av_new_program(dst, progid);
398  if (!dst_prog)
399  return AVERROR(ENOMEM);
400  }
401 
402  /* public fields */
403  dst_prog->id = src_prog->id;
404  dst_prog->flags = src_prog->flags;
405  dst_prog->discard = src_prog->discard;
406  dst_prog->program_num = src_prog->program_num;
407  dst_prog->pmt_pid = src_prog->pmt_pid;
408  dst_prog->pcr_pid = src_prog->pcr_pid;
409  dst_prog->pmt_version = src_prog->pmt_version;
410 
411  if (match == -1 && src->nb_streams) {
412  match = 0;
413  for (unsigned i = 0; i < src->nb_streams && !match; i++) {
414  int src_id = src->streams[i]->id;
415  if (!src_id) {
416  match = 1;
417  break;
418  }
419  for (unsigned j=i+1; j < src->nb_streams; j++) {
420  int sib_id = src->streams[j]->id;
421  if (src_id == sib_id) {
422  match = 1;
423  break;
424  }
425  }
426  }
427  }
428 
429  for (unsigned i = 0; i < dst->nb_streams; i++) {
430  int dst_val = match ? i : dst->streams[i]->id;
431 
432  for (unsigned j = 0; j < src_prog->nb_stream_indexes; j++) {
433  int src_val = match ? src_prog->stream_index[j] : src->streams[src_prog->stream_index[j]]->id;
434 
435  if (dst_val == src_val) {
436  ret = av_program_add_stream_index2(dst, dst_prog->id, i);
437  if (ret < 0)
438  return ret;
439  }
440  }
441  }
442 
443  ret = av_dict_copy(&dst_prog->metadata, src_prog->metadata, 0);
444  if (ret < 0)
445  return ret;
446 
447  return 0;
448 }
449 
451 {
452  for (unsigned i = 0; i < ic->nb_programs; i++) {
453  if (ic->programs[i] == last) {
454  last = NULL;
455  } else {
456  if (!last)
457  for (unsigned j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
458  if (ic->programs[i]->stream_index[j] == s)
459  return ic->programs[i];
460  }
461  }
462  return NULL;
463 }
464 
466 {
467  int best_stream = 0;
468  int best_score = INT_MIN;
469 
470  if (s->nb_streams <= 0)
471  return -1;
472  for (unsigned i = 0; i < s->nb_streams; i++) {
473  const AVStream *const st = s->streams[i];
474  const FFStream *const sti = cffstream(st);
475  int score = 0;
476  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
478  score -= 400;
479  if (st->codecpar->width && st->codecpar->height)
480  score += 50;
481  score+= 25;
482  }
483  if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
484  if (st->codecpar->sample_rate)
485  score += 50;
486  }
487  if (sti->codec_info_nb_frames)
488  score += 12;
489 
490  if (st->discard != AVDISCARD_ALL)
491  score += 200;
492 
493  if (score > best_score) {
494  best_score = score;
495  best_stream = i;
496  }
497  }
498  return best_stream;
499 }
500 
502  int wanted_stream_nb, int related_stream,
503  const AVCodec **decoder_ret, int flags)
504 {
505  int nb_streams = ic->nb_streams;
507  int best_count = -1, best_multiframe = -1, best_disposition = -1;
508  int count, multiframe, disposition;
509  int64_t best_bitrate = -1;
511  unsigned *program = NULL;
512  const AVCodec *decoder = NULL, *best_decoder = NULL;
513 
514  if (related_stream >= 0 && wanted_stream_nb < 0) {
515  AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
516  if (p) {
517  program = p->stream_index;
518  nb_streams = p->nb_stream_indexes;
519  }
520  }
521  for (unsigned i = 0; i < nb_streams; i++) {
522  int real_stream_index = program ? program[i] : i;
523  AVStream *st = ic->streams[real_stream_index];
524  AVCodecParameters *par = st->codecpar;
525  if (par->codec_type != type)
526  continue;
527  if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
528  continue;
529  if (type == AVMEDIA_TYPE_AUDIO && !(par->ch_layout.nb_channels && par->sample_rate))
530  continue;
531  if (decoder_ret) {
532  decoder = ff_find_decoder(ic, st, par->codec_id);
533  if (!decoder) {
534  if (ret < 0)
536  continue;
537  }
538  }
540  + !! (st->disposition & AV_DISPOSITION_DEFAULT);
541  count = ffstream(st)->codec_info_nb_frames;
542  bitrate = par->bit_rate;
543  multiframe = FFMIN(5, count);
544  if ((best_disposition > disposition) ||
545  (best_disposition == disposition && best_multiframe > multiframe) ||
546  (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
547  (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
548  continue;
549  best_disposition = disposition;
550  best_count = count;
551  best_bitrate = bitrate;
552  best_multiframe = multiframe;
553  ret = real_stream_index;
554  best_decoder = decoder;
555  if (program && i == nb_streams - 1 && ret < 0) {
556  program = NULL;
557  nb_streams = ic->nb_streams;
558  /* no related stream found, try again with everything */
559  i = 0;
560  }
561  }
562  if (decoder_ret)
563  *decoder_ret = best_decoder;
564  return ret;
565 }
566 
567 /**
568  * Matches a stream specifier (but ignores requested index).
569  *
570  * @param indexptr set to point to the requested stream index if there is one
571  *
572  * @return <0 on error
573  * 0 if st is NOT a matching stream
574  * >0 if st is a matching stream
575  */
576 static int match_stream_specifier(const AVFormatContext *s, const AVStream *st,
577  const char *spec, const char **indexptr,
578  const AVStreamGroup **g, const AVProgram **p)
579 {
580  int match = 1; /* Stores if the specifier matches so far. */
581  while (*spec) {
582  if (*spec <= '9' && *spec >= '0') { /* opt:index */
583  if (indexptr)
584  *indexptr = spec;
585  return match;
586  } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
587  *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
588  enum AVMediaType type;
589  int nopic = 0;
590 
591  switch (*spec++) {
592  case 'v': type = AVMEDIA_TYPE_VIDEO; break;
593  case 'a': type = AVMEDIA_TYPE_AUDIO; break;
594  case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
595  case 'd': type = AVMEDIA_TYPE_DATA; break;
596  case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
597  case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
598  default: av_assert0(0);
599  }
600  if (*spec && *spec++ != ':') /* If we are not at the end, then another specifier must follow. */
601  return AVERROR(EINVAL);
602 
603  if (type != st->codecpar->codec_type)
604  match = 0;
605  if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
606  match = 0;
607  } else if (*spec == 'g' && *(spec + 1) == ':') {
608  int64_t group_idx = -1, group_id = -1;
609  int found = 0;
610  char *endptr;
611  spec += 2;
612  if (*spec == '#' || (*spec == 'i' && *(spec + 1) == ':')) {
613  spec += 1 + (*spec == 'i');
614  group_id = strtol(spec, &endptr, 0);
615  if (spec == endptr || (*endptr && *endptr++ != ':'))
616  return AVERROR(EINVAL);
617  spec = endptr;
618  } else {
619  group_idx = strtol(spec, &endptr, 0);
620  /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
621  if (spec == endptr || (*endptr && *endptr++ != ':'))
622  return AVERROR(EINVAL);
623  spec = endptr;
624  }
625  if (match) {
626  if (group_id > 0) {
627  for (unsigned i = 0; i < s->nb_stream_groups; i++) {
628  if (group_id == s->stream_groups[i]->id) {
629  group_idx = i;
630  break;
631  }
632  }
633  }
634  if (group_idx < 0 || group_idx >= s->nb_stream_groups)
635  return AVERROR(EINVAL);
636  for (unsigned j = 0; j < s->stream_groups[group_idx]->nb_streams; j++) {
637  if (st->index == s->stream_groups[group_idx]->streams[j]->index) {
638  found = 1;
639  if (g)
640  *g = s->stream_groups[group_idx];
641  break;
642  }
643  }
644  }
645  if (!found)
646  match = 0;
647  } else if (*spec == 'p' && *(spec + 1) == ':') {
648  int prog_id;
649  int found = 0;
650  char *endptr;
651  spec += 2;
652  prog_id = strtol(spec, &endptr, 0);
653  /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
654  if (spec == endptr || (*endptr && *endptr++ != ':'))
655  return AVERROR(EINVAL);
656  spec = endptr;
657  if (match) {
658  for (unsigned i = 0; i < s->nb_programs; i++) {
659  if (s->programs[i]->id != prog_id)
660  continue;
661 
662  for (unsigned j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
663  if (st->index == s->programs[i]->stream_index[j]) {
664  found = 1;
665  if (p)
666  *p = s->programs[i];
667  i = s->nb_programs;
668  break;
669  }
670  }
671  }
672  }
673  if (!found)
674  match = 0;
675  } else if (*spec == '#' ||
676  (*spec == 'i' && *(spec + 1) == ':')) {
677  int stream_id;
678  char *endptr;
679  spec += 1 + (*spec == 'i');
680  stream_id = strtol(spec, &endptr, 0);
681  if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */
682  return AVERROR(EINVAL);
683  return match && (stream_id == st->id);
684  } else if (*spec == 'm' && *(spec + 1) == ':') {
685  const AVDictionaryEntry *tag;
686  char *key, *val;
687  int ret;
688 
689  if (match) {
690  spec += 2;
691  val = strchr(spec, ':');
692 
693  key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
694  if (!key)
695  return AVERROR(ENOMEM);
696 
697  tag = av_dict_get(st->metadata, key, NULL, 0);
698  if (tag) {
699  if (!val || !strcmp(tag->value, val + 1))
700  ret = 1;
701  else
702  ret = 0;
703  } else
704  ret = 0;
705 
706  av_freep(&key);
707  }
708  return match && ret;
709  } else if (*spec == 'u' && *(spec + 1) == '\0') {
710  const AVCodecParameters *par = st->codecpar;
711  int val;
712  switch (par->codec_type) {
713  case AVMEDIA_TYPE_AUDIO:
714  val = par->sample_rate && par->ch_layout.nb_channels;
715  if (par->format == AV_SAMPLE_FMT_NONE)
716  return 0;
717  break;
718  case AVMEDIA_TYPE_VIDEO:
719  val = par->width && par->height;
720  if (par->format == AV_PIX_FMT_NONE)
721  return 0;
722  break;
724  val = 0;
725  break;
726  default:
727  val = 1;
728  break;
729  }
730  return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
731  } else {
732  return AVERROR(EINVAL);
733  }
734  }
735 
736  return match;
737 }
738 
740  const char *spec)
741 {
742  int ret, index;
743  char *endptr;
744  const char *indexptr = NULL;
745  const AVStreamGroup *g = NULL;
746  const AVProgram *p = NULL;
747  int nb_streams;
748 
749  ret = match_stream_specifier(s, st, spec, &indexptr, &g, &p);
750  if (ret < 0)
751  goto error;
752 
753  if (!indexptr)
754  return ret;
755 
756  index = strtol(indexptr, &endptr, 0);
757  if (*endptr) { /* We can't have anything after the requested index. */
758  ret = AVERROR(EINVAL);
759  goto error;
760  }
761 
762  /* This is not really needed but saves us a loop for simple stream index specifiers. */
763  if (spec == indexptr)
764  return (index == st->index);
765 
766  /* If we requested a matching stream index, we have to ensure st is that. */
767  nb_streams = g ? g->nb_streams : (p ? p->nb_stream_indexes : s->nb_streams);
768  for (int i = 0; i < nb_streams && index >= 0; i++) {
769  unsigned idx = g ? g->streams[i]->index : (p ? p->stream_index[i] : i);
770  const AVStream *candidate = s->streams[idx];
771  ret = match_stream_specifier(s, candidate, spec, NULL, NULL, NULL);
772  if (ret < 0)
773  goto error;
774  if (ret > 0 && index-- == 0 && st == candidate)
775  return 1;
776  }
777  return 0;
778 
779 error:
780  if (ret == AVERROR(EINVAL))
781  av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
782  return ret;
783 }
784 
786 {
787  AVRational undef = {0, 1};
788  AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
789  AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
790  AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
791 
792  av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
793  stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
794  if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
795  stream_sample_aspect_ratio = undef;
796 
797  av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
798  frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
799  if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
800  frame_sample_aspect_ratio = undef;
801 
802  if (stream_sample_aspect_ratio.num)
803  return stream_sample_aspect_ratio;
804  else
805  return frame_sample_aspect_ratio;
806 }
807 
809 {
810  AVRational fr = st->r_frame_rate;
812  AVRational avg_fr = st->avg_frame_rate;
813 
814  if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
815  av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
816  fr = avg_fr;
817  }
818 
819  if (desc && (desc->props & AV_CODEC_PROP_FIELDS)) {
820  const AVCodecContext *const avctx = ffstream(st)->avctx;
821  AVRational codec_fr = avctx->framerate;
822 
823  if ( codec_fr.num > 0 && codec_fr.den > 0 &&
824  (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))
825  fr = codec_fr;
826  }
827 
828  return fr;
829 }
830 
831 #if FF_API_INTERNAL_TIMING
832 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
833  AVStream *ost, const AVStream *ist,
834  enum AVTimebaseSource copy_tb)
835 {
837  const AVCodecContext *const dec_ctx = cffstream(ist)->avctx;
838 
839  AVRational mul = (AVRational){ desc && (desc->props & AV_CODEC_PROP_FIELDS) ? 2 : 1, 1 };
840  AVRational dec_ctx_framerate = dec_ctx ? dec_ctx->framerate : (AVRational){ 0, 0 };
841  AVRational dec_ctx_tb = dec_ctx_framerate.num ? av_inv_q(av_mul_q(dec_ctx_framerate, mul))
842  : (ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO ? (AVRational){0, 1}
843  : ist->time_base);
844  AVRational enc_tb = ist->time_base;
845 
846  /*
847  * Avi is a special case here because it supports variable fps but
848  * having the fps and timebase differe significantly adds quite some
849  * overhead
850  */
851  if (!strcmp(ofmt->name, "avi")) {
852 #if FF_API_R_FRAME_RATE
853  if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
854  && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
855  && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
856  && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx_tb)
857  && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx_tb) < 1.0/500
858  || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
859  enc_tb.num = ist->r_frame_rate.den;
860  enc_tb.den = 2*ist->r_frame_rate.num;
861  } else
862 #endif
863  if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate.num &&
864  av_q2d(av_inv_q(dec_ctx_framerate)) > 2*av_q2d(ist->time_base)
865  && av_q2d(ist->time_base) < 1.0/500
866  || (copy_tb == AVFMT_TBCF_DECODER &&
867  (dec_ctx_framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) {
868  enc_tb = dec_ctx_tb;
869  enc_tb.den *= 2;
870  }
871  } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
872  && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
873  if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate.num
874  && av_q2d(av_inv_q(dec_ctx_framerate)) > av_q2d(ist->time_base)
875  && av_q2d(ist->time_base) < 1.0/500
876  || (copy_tb == AVFMT_TBCF_DECODER &&
877  (dec_ctx_framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) {
878  enc_tb = dec_ctx_tb;
879  }
880  }
881 
882  if (ost->codecpar->codec_tag == AV_RL32("tmcd")
883  && dec_ctx_tb.num < dec_ctx_tb.den
884  && dec_ctx_tb.num > 0
885  && 121LL*dec_ctx_tb.num > dec_ctx_tb.den) {
886  enc_tb = dec_ctx_tb;
887  }
888 
889  av_reduce(&ffstream(ost)->transferred_mux_tb.num,
890  &ffstream(ost)->transferred_mux_tb.den,
891  enc_tb.num, enc_tb.den, INT_MAX);
892 
893  return 0;
894 }
895 
896 AVRational av_stream_get_codec_timebase(const AVStream *st)
897 {
898  return cffstream(st)->avctx ? cffstream(st)->avctx->time_base : cffstream(st)->transferred_mux_tb;
899 }
900 #endif
901 
902 void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
903  unsigned int pts_num, unsigned int pts_den)
904 {
905  FFStream *const sti = ffstream(st);
906  AVRational new_tb;
907  if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
908  if (new_tb.num != pts_num)
910  "st:%d removing common factor %d from timebase\n",
911  st->index, pts_num / new_tb.num);
912  } else
914  "st:%d has too large timebase, reducing\n", st->index);
915 
916  if (new_tb.num <= 0 || new_tb.den <= 0) {
918  "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
919  new_tb.num, new_tb.den,
920  st->index);
921  return;
922  }
923  st->time_base = new_tb;
924  if (sti->avctx)
925  sti->avctx->pkt_timebase = new_tb;
926  st->pts_wrap_bits = pts_wrap_bits;
927 }
928 
930  enum AVCodecID codec_id)
931 {
932  switch (st->codecpar->codec_type) {
933  case AVMEDIA_TYPE_VIDEO:
934  if (s->video_codec) return s->video_codec;
935  break;
936  case AVMEDIA_TYPE_AUDIO:
937  if (s->audio_codec) return s->audio_codec;
938  break;
940  if (s->subtitle_codec) return s->subtitle_codec;
941  break;
942  }
943 
945 }
946 
948 {
949 #define OFF(field) offsetof(AVFormatContext, field)
950  static const unsigned offsets[] = {
951  OFF(codec_whitelist), OFF(format_whitelist),
952  OFF(protocol_whitelist), OFF(protocol_blacklist),
953  };
954 #undef OFF
955  av_assert0(!dst->codec_whitelist &&
956  !dst->format_whitelist &&
957  !dst->protocol_whitelist &&
958  !dst->protocol_blacklist);
959  for (unsigned i = 0; i < FF_ARRAY_ELEMS(offsets); i++) {
960  const char *src_str = *(char *const*)((const char*)src + offsets[i]);
961 
962  if (src_str) {
963  char *dst_str = av_strdup(src_str);
964  if (!dst_str) {
965  av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
966  return AVERROR(ENOMEM);
967  }
968 
969  *(char **)((char*)dst + offsets[i]) = dst_str;
970  }
971  }
972  return 0;
973 }
974 
976 {
978  if (!d)
979  return 0;
980  if ((d->type == AVMEDIA_TYPE_VIDEO || d->type == AVMEDIA_TYPE_AUDIO) &&
982  return 0;
983  return 1;
984 }
985 
987 {
988  av_assert0(url);
989  av_freep(&s->url);
990  s->url = url;
991 }
992 
994 {
995  URLComponents uc;
996  av_assert0(url);
997  char proto[64];
998 
999  int ret = ff_url_decompose(&uc, url, NULL);
1000  if (ret < 0)
1001  return ret;
1002  av_strlcpy(proto, uc.scheme, FFMIN(sizeof(proto), uc.url_component_end_scheme - uc.scheme));
1003 
1004  if (s->protocol_whitelist && av_match_list(proto, s->protocol_whitelist, ',') <= 0) {
1005  av_log(s, AV_LOG_ERROR, "Protocol '%s' not on whitelist '%s'!\n", proto, s->protocol_whitelist);
1006  return AVERROR(EINVAL);
1007  }
1008 
1009  if (s->protocol_blacklist && av_match_list(proto, s->protocol_blacklist, ',') > 0) {
1010  av_log(s, AV_LOG_ERROR, "Protocol '%s' on blacklist '%s'!\n", proto, s->protocol_blacklist);
1011  return AVERROR(EINVAL);
1012  }
1013 
1014  char *urldup = av_strdup(url);
1015  if (!urldup)
1016  return AVERROR(ENOMEM);
1017 
1018  av_freep(&s->url);
1019  s->url = urldup;
1020  return 0;
1021 }
1022 
1023 
1025 {
1026  int ret = 0;
1027  if (*pb)
1028  ret = s->io_close2(s, *pb);
1029  *pb = NULL;
1030  return ret;
1031 }
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
flags
const SwsFlags flags[]
Definition: swscale.c:85
iamf.h
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:434
AVCodec
AVCodec.
Definition: codec.h:172
AVStreamGroupParamsType
AVStreamGroupParamsType
Definition: avformat.h:1127
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:508
AVStreamGroup::params
union AVStreamGroup::@450 params
Group type-specific parameters.
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:1175
AV_STREAM_GROUP_PARAMS_LCEVC
@ AV_STREAM_GROUP_PARAMS_LCEVC
Definition: avformat.h:1132
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1243
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:501
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:929
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:772
AVFMT_VARIABLE_FPS
#define AVFMT_VARIABLE_FPS
Format allows variable fps.
Definition: avformat.h:482
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:673
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:818
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:450
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:1249
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:620
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:466
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1382
AVPacket::data
uint8_t * data
Definition: packet.h:603
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:836
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:1512
AVStreamGroup::tref
struct AVStreamGroupTREF * tref
Definition: avformat.h:1184
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:1240
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:1247
FFStream::codec_desc
const struct AVCodecDescriptor * codec_desc
Definition: internal.h:355
OFF
#define OFF(field)
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:563
ff_remove_stream
void ff_remove_stream(AVFormatContext *s, AVStream *st)
Remove a stream from its AVFormatContext and free it.
Definition: avformat.c:121
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:2129
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:902
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:211
avformat_stream_group_name
const char * avformat_stream_group_name(enum AVStreamGroupParamsType type)
Definition: avformat.c:265
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:1241
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:278
AV_PTS_WRAP_IGNORE
#define AV_PTS_WRAP_IGNORE
Options for behavior on timestamp wrap detection.
Definition: avformat.h:736
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
AV_STREAM_GROUP_PARAMS_DOLBY_VISION
@ AV_STREAM_GROUP_PARAMS_DOLBY_VISION
Definition: avformat.h:1134
AVFMT_PROGCOPY_MATCH_BY_INDEX
#define AVFMT_PROGCOPY_MATCH_BY_INDEX
match streams using stream index
Definition: avformat.h:2128
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:845
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:1239
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:1130
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:993
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
FFStream::extract_extradata
struct FFStream::@480 extract_extradata
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:1511
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:454
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:785
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:345
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:309
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:734
AVStreamGroup::layered_video
struct AVStreamGroupLayeredVideo * layered_video
Definition: avformat.h:1176
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:611
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1314
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:770
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:786
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:339
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:1057
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:947
FFOutputFormat::deinit
void(* deinit)(AVFormatContext *)
Deinitialize format.
Definition: mux.h:154
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1242
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:827
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:442
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:2127
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:1370
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_EXPERIMENTAL, AVFMT_GLOBALHEADER,...
Definition: avformat.h:527
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:1131
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:547
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:739
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
AV_STREAM_GROUP_PARAMS_TREF
@ AV_STREAM_GROUP_PARAMS_TREF
Definition: avformat.h:1133
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:554
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:1173
AVStreamGroupTileGrid::offsets
struct AVStreamGroupTileGrid::@449 * offsets
An nb_tiles sized array of offsets in pixels from the topleft edge of the canvas, indicating where ea...
ff_format_io_close
int ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition: avformat.c:1024
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:1246
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:825
frame.h
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition: avformat.h:657
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:1129
AVStreamGroup::streams
AVStream ** streams
A list of streams in the group.
Definition: avformat.h:1215
AVStreamGroup::iamf_mix_presentation
struct AVIAMFMixPresentation * iamf_mix_presentation
Definition: avformat.h:1174
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:1062
ff_is_intra_only
int ff_is_intra_only(enum AVCodecID id)
Definition: avformat.c:975
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVOutputFormat
Definition: avformat.h:507
AVCodecParameters::height
int height
The height of the video frame in pixels.
Definition: codec_par.h:150
AVProgram::metadata
AVDictionary * metadata
Definition: avformat.h:1244
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:465
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1238
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:816
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:576
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition: avformat.h:661
tag
uint32_t tag
Definition: movenc.c:2054
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:759
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:747
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:808
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:1195
avformat.h
id
enum AVCodecID id
Definition: dts2pts.c:578
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:1140
AVCodecContext
main external API structure.
Definition: avcodec.h:443
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:753
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:138
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:129
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:149
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:881
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:1167
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:247
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:3903
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:890
codec_desc.h
AVStreamGroup::priv_data
void * priv_data
Definition: avformat.h:1146
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:1248
ff_format_set_url
void ff_format_set_url(AVFormatContext *s, char *url)
Set AVFormatContext url field to the provided pointer.
Definition: avformat.c:986
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