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 "avio.h"
40 #include "demux.h"
41 #include "mux.h"
42 #include "internal.h"
43 
45 {
46  AVStream *st = *pst;
47  FFStream *const sti = ffstream(st);
48 
49  if (!st)
50  return;
51 
52 #if FF_API_AVSTREAM_SIDE_DATA
54  for (int i = 0; i < st->nb_side_data; i++)
55  av_freep(&st->side_data[i].data);
56  av_freep(&st->side_data);
58 #endif
59 
60  if (st->attached_pic.data)
62 
63  av_parser_close(sti->parser);
65  av_bsf_free(&sti->bsfc);
66  av_freep(&sti->index_entries);
67  av_freep(&sti->probe_data.buf);
68 
70 
71  if (sti->info) {
73  av_freep(&sti->info);
74  }
75 
76  av_dict_free(&st->metadata);
78  av_freep(&st->priv_data);
79 
80  av_freep(pst);
81 }
82 
84 {
85  AVStreamGroup *stg = *pstg;
86 
87  if (!stg)
88  return;
89 
90  av_freep(&stg->streams);
91  av_dict_free(&stg->metadata);
92  av_freep(&stg->priv_data);
93  switch (stg->type) {
96  break;
97  }
100  break;
101  }
105  av_freep(&stg->params.tile_grid);
106  break;
108  av_opt_free(stg->params.lcevc);
109  av_freep(&stg->params.lcevc);
110  break;
111  default:
112  break;
113  }
114 
115  av_freep(pstg);
116 }
117 
119 {
120  av_assert0(s->nb_streams>0);
121  av_assert0(s->streams[ s->nb_streams - 1 ] == st);
122 
123  ff_free_stream(&s->streams[ --s->nb_streams ]);
124 }
125 
127 {
128  av_assert0(s->nb_stream_groups > 0);
129  av_assert0(s->stream_groups[ s->nb_stream_groups - 1 ] == stg);
130 
131  ff_free_stream_group(&s->stream_groups[ --s->nb_stream_groups ]);
132 }
133 
134 /* XXX: suppress the packet queue */
136 {
137  FFFormatContext *const si = ffformatcontext(s);
141 
142  si->raw_packet_buffer_size = 0;
143 }
144 
146 {
147  FFFormatContext *si;
148 
149  if (!s)
150  return;
151  si = ffformatcontext(s);
152 
153  if (s->oformat && ffofmt(s->oformat)->deinit && si->initialized)
154  ffofmt(s->oformat)->deinit(s);
155 
156  av_opt_free(s);
157  if (s->iformat && s->iformat->priv_class && s->priv_data)
158  av_opt_free(s->priv_data);
159  if (s->oformat && s->oformat->priv_class && s->priv_data)
160  av_opt_free(s->priv_data);
161 
162  for (unsigned i = 0; i < s->nb_streams; i++)
163  ff_free_stream(&s->streams[i]);
164  for (unsigned i = 0; i < s->nb_stream_groups; i++)
165  ff_free_stream_group(&s->stream_groups[i]);
166  s->nb_stream_groups = 0;
167  s->nb_streams = 0;
168 
169  for (unsigned i = 0; i < s->nb_programs; i++) {
170  av_dict_free(&s->programs[i]->metadata);
171  av_freep(&s->programs[i]->stream_index);
172  av_freep(&s->programs[i]);
173  }
174  s->nb_programs = 0;
175 
176  av_freep(&s->programs);
177  av_freep(&s->priv_data);
178  while (s->nb_chapters--) {
179  av_dict_free(&s->chapters[s->nb_chapters]->metadata);
180  av_freep(&s->chapters[s->nb_chapters]);
181  }
182  av_freep(&s->chapters);
183  av_dict_free(&s->metadata);
184  av_dict_free(&si->id3v2_meta);
185  av_packet_free(&si->pkt);
187  av_freep(&s->streams);
188  av_freep(&s->stream_groups);
190  av_freep(&s->url);
191  av_free(s);
192 }
193 
194 #if FF_API_AVSTREAM_SIDE_DATA
196 uint8_t *av_stream_get_side_data(const AVStream *st,
197  enum AVPacketSideDataType type, size_t *size)
198 {
199  for (int i = 0; i < st->nb_side_data; i++) {
200  if (st->side_data[i].type == type) {
201  if (size)
202  *size = st->side_data[i].size;
203  return st->side_data[i].data;
204  }
205  }
206  if (size)
207  *size = 0;
208  return NULL;
209 }
210 
211 int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
212  uint8_t *data, size_t size)
213 {
214  AVPacketSideData *sd, *tmp;
215 
216  for (int i = 0; i < st->nb_side_data; i++) {
217  sd = &st->side_data[i];
218 
219  if (sd->type == type) {
220  av_freep(&sd->data);
221  sd->data = data;
222  sd->size = size;
223  return 0;
224  }
225  }
226 
227  if (st->nb_side_data + 1U > FFMIN(INT_MAX, SIZE_MAX / sizeof(*tmp)))
228  return AVERROR(ERANGE);
229 
230  tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp));
231  if (!tmp) {
232  return AVERROR(ENOMEM);
233  }
234 
235  st->side_data = tmp;
236  st->nb_side_data++;
237 
238  sd = &st->side_data[st->nb_side_data - 1];
239  sd->type = type;
240  sd->data = data;
241  sd->size = size;
242 
243  return 0;
244 }
245 
246 uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type,
247  size_t size)
248 {
249  int ret;
250  uint8_t *data = av_malloc(size);
251 
252  if (!data)
253  return NULL;
254 
255  ret = av_stream_add_side_data(st, type, data, size);
256  if (ret < 0) {
257  av_freep(&data);
258  return NULL;
259  }
260 
261  return data;
262 }
264 #endif
265 
266 /**
267  * Copy all stream parameters from source to destination stream, with the
268  * exception of the index field, which is usually set by avformat_new_stream().
269  *
270  * @param dst pointer to destination AVStream
271  * @param src pointer to source AVStream
272  * @return >=0 on success, AVERROR code on error
273  */
275 {
276  int ret;
277 
278  dst->id = src->id;
279  dst->time_base = src->time_base;
280  dst->start_time = src->start_time;
281  dst->duration = src->duration;
282  dst->nb_frames = src->nb_frames;
283  dst->disposition = src->disposition;
284  dst->discard = src->discard;
285  dst->sample_aspect_ratio = src->sample_aspect_ratio;
286  dst->avg_frame_rate = src->avg_frame_rate;
287  dst->event_flags = src->event_flags;
288  dst->r_frame_rate = src->r_frame_rate;
289  dst->pts_wrap_bits = src->pts_wrap_bits;
290 
291  av_dict_free(&dst->metadata);
292  ret = av_dict_copy(&dst->metadata, src->metadata, 0);
293  if (ret < 0)
294  return ret;
295 
296  ret = avcodec_parameters_copy(dst->codecpar, src->codecpar);
297  if (ret < 0)
298  return ret;
299 
300  av_packet_unref(&dst->attached_pic);
301  if (src->attached_pic.data) {
302  ret = av_packet_ref(&dst->attached_pic, &src->attached_pic);
303  if (ret < 0)
304  return ret;
305  }
306 
307  return 0;
308 }
309 
311 {
312  AVStream *st;
313  int ret;
314 
315  st = avformat_new_stream(dst_ctx, NULL);
316  if (!st)
317  return NULL;
318 
319  ret = stream_params_copy(st, src);
320  if (ret < 0) {
321  ff_remove_stream(dst_ctx, st);
322  return NULL;
323  }
324 
325  return st;
326 }
327 
329 {
330  switch(type) {
331  case AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT: return "IAMF Audio Element";
332  case AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION: return "IAMF Mix Presentation";
333  case AV_STREAM_GROUP_PARAMS_TILE_GRID: return "Tile Grid";
334  case AV_STREAM_GROUP_PARAMS_LCEVC: return "LCEVC (Split video and enhancement)";
335  }
336  return NULL;
337 }
338 
340 {
342  int ret;
343 
344  av_log(ac, AV_LOG_TRACE, "new_program: id=0x%04x\n", id);
345 
346  for (unsigned i = 0; i < ac->nb_programs; i++)
347  if (ac->programs[i]->id == id)
348  program = ac->programs[i];
349 
350  if (!program) {
351  program = av_mallocz(sizeof(*program));
352  if (!program)
353  return NULL;
355  if (ret < 0) {
356  av_free(program);
357  return NULL;
358  }
359  program->discard = AVDISCARD_NONE;
360  program->pmt_version = -1;
361  program->id = id;
362  program->pts_wrap_reference = AV_NOPTS_VALUE;
363  program->pts_wrap_behavior = AV_PTS_WRAP_IGNORE;
364  program->start_time =
365  program->end_time = AV_NOPTS_VALUE;
366  }
367  return program;
368 }
369 
370 void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
371 {
373  void *tmp;
374 
375  if (idx >= ac->nb_streams) {
376  av_log(ac, AV_LOG_ERROR, "stream index %d is not valid\n", idx);
377  return;
378  }
379 
380  for (unsigned i = 0; i < ac->nb_programs; i++) {
381  if (ac->programs[i]->id != progid)
382  continue;
383  program = ac->programs[i];
384  for (unsigned j = 0; j < program->nb_stream_indexes; j++)
385  if (program->stream_index[j] == idx)
386  return;
387 
388  tmp = av_realloc_array(program->stream_index, program->nb_stream_indexes+1, sizeof(unsigned int));
389  if (!tmp)
390  return;
391  program->stream_index = tmp;
392  program->stream_index[program->nb_stream_indexes++] = idx;
393  return;
394  }
395 }
396 
398 {
399  for (unsigned i = 0; i < ic->nb_programs; i++) {
400  if (ic->programs[i] == last) {
401  last = NULL;
402  } else {
403  if (!last)
404  for (unsigned j = 0; j < ic->programs[i]->nb_stream_indexes; j++)
405  if (ic->programs[i]->stream_index[j] == s)
406  return ic->programs[i];
407  }
408  }
409  return NULL;
410 }
411 
413 {
414  int best_stream = 0;
415  int best_score = INT_MIN;
416 
417  if (s->nb_streams <= 0)
418  return -1;
419  for (unsigned i = 0; i < s->nb_streams; i++) {
420  const AVStream *const st = s->streams[i];
421  const FFStream *const sti = cffstream(st);
422  int score = 0;
423  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
425  score -= 400;
426  if (st->codecpar->width && st->codecpar->height)
427  score += 50;
428  score+= 25;
429  }
430  if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
431  if (st->codecpar->sample_rate)
432  score += 50;
433  }
434  if (sti->codec_info_nb_frames)
435  score += 12;
436 
437  if (st->discard != AVDISCARD_ALL)
438  score += 200;
439 
440  if (score > best_score) {
441  best_score = score;
442  best_stream = i;
443  }
444  }
445  return best_stream;
446 }
447 
449  int wanted_stream_nb, int related_stream,
450  const AVCodec **decoder_ret, int flags)
451 {
452  int nb_streams = ic->nb_streams;
454  int best_count = -1, best_multiframe = -1, best_disposition = -1;
455  int count, multiframe, disposition;
456  int64_t best_bitrate = -1;
458  unsigned *program = NULL;
459  const AVCodec *decoder = NULL, *best_decoder = NULL;
460 
461  if (related_stream >= 0 && wanted_stream_nb < 0) {
462  AVProgram *p = av_find_program_from_stream(ic, NULL, related_stream);
463  if (p) {
464  program = p->stream_index;
466  }
467  }
468  for (unsigned i = 0; i < nb_streams; i++) {
469  int real_stream_index = program ? program[i] : i;
470  AVStream *st = ic->streams[real_stream_index];
471  AVCodecParameters *par = st->codecpar;
472  if (par->codec_type != type)
473  continue;
474  if (wanted_stream_nb >= 0 && real_stream_index != wanted_stream_nb)
475  continue;
476  if (type == AVMEDIA_TYPE_AUDIO && !(par->ch_layout.nb_channels && par->sample_rate))
477  continue;
478  if (decoder_ret) {
479  decoder = ff_find_decoder(ic, st, par->codec_id);
480  if (!decoder) {
481  if (ret < 0)
483  continue;
484  }
485  }
487  + !! (st->disposition & AV_DISPOSITION_DEFAULT);
488  count = ffstream(st)->codec_info_nb_frames;
489  bitrate = par->bit_rate;
490  multiframe = FFMIN(5, count);
491  if ((best_disposition > disposition) ||
492  (best_disposition == disposition && best_multiframe > multiframe) ||
493  (best_disposition == disposition && best_multiframe == multiframe && best_bitrate > bitrate) ||
494  (best_disposition == disposition && best_multiframe == multiframe && best_bitrate == bitrate && best_count >= count))
495  continue;
496  best_disposition = disposition;
497  best_count = count;
498  best_bitrate = bitrate;
499  best_multiframe = multiframe;
500  ret = real_stream_index;
501  best_decoder = decoder;
502  if (program && i == nb_streams - 1 && ret < 0) {
503  program = NULL;
504  nb_streams = ic->nb_streams;
505  /* no related stream found, try again with everything */
506  i = 0;
507  }
508  }
509  if (decoder_ret)
510  *decoder_ret = best_decoder;
511  return ret;
512 }
513 
514 /**
515  * Matches a stream specifier (but ignores requested index).
516  *
517  * @param indexptr set to point to the requested stream index if there is one
518  *
519  * @return <0 on error
520  * 0 if st is NOT a matching stream
521  * >0 if st is a matching stream
522  */
523 static int match_stream_specifier(const AVFormatContext *s, const AVStream *st,
524  const char *spec, const char **indexptr,
525  const AVStreamGroup **g, const AVProgram **p)
526 {
527  int match = 1; /* Stores if the specifier matches so far. */
528  while (*spec) {
529  if (*spec <= '9' && *spec >= '0') { /* opt:index */
530  if (indexptr)
531  *indexptr = spec;
532  return match;
533  } else if (*spec == 'v' || *spec == 'a' || *spec == 's' || *spec == 'd' ||
534  *spec == 't' || *spec == 'V') { /* opt:[vasdtV] */
535  enum AVMediaType type;
536  int nopic = 0;
537 
538  switch (*spec++) {
539  case 'v': type = AVMEDIA_TYPE_VIDEO; break;
540  case 'a': type = AVMEDIA_TYPE_AUDIO; break;
541  case 's': type = AVMEDIA_TYPE_SUBTITLE; break;
542  case 'd': type = AVMEDIA_TYPE_DATA; break;
543  case 't': type = AVMEDIA_TYPE_ATTACHMENT; break;
544  case 'V': type = AVMEDIA_TYPE_VIDEO; nopic = 1; break;
545  default: av_assert0(0);
546  }
547  if (*spec && *spec++ != ':') /* If we are not at the end, then another specifier must follow. */
548  return AVERROR(EINVAL);
549 
550  if (type != st->codecpar->codec_type)
551  match = 0;
552  if (nopic && (st->disposition & AV_DISPOSITION_ATTACHED_PIC))
553  match = 0;
554  } else if (*spec == 'g' && *(spec + 1) == ':') {
555  int64_t group_idx = -1, group_id = -1;
556  int found = 0;
557  char *endptr;
558  spec += 2;
559  if (*spec == '#' || (*spec == 'i' && *(spec + 1) == ':')) {
560  spec += 1 + (*spec == 'i');
561  group_id = strtol(spec, &endptr, 0);
562  if (spec == endptr || (*endptr && *endptr++ != ':'))
563  return AVERROR(EINVAL);
564  spec = endptr;
565  } else {
566  group_idx = strtol(spec, &endptr, 0);
567  /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
568  if (spec == endptr || (*endptr && *endptr++ != ':'))
569  return AVERROR(EINVAL);
570  spec = endptr;
571  }
572  if (match) {
573  if (group_id > 0) {
574  for (unsigned i = 0; i < s->nb_stream_groups; i++) {
575  if (group_id == s->stream_groups[i]->id) {
576  group_idx = i;
577  break;
578  }
579  }
580  }
581  if (group_idx < 0 || group_idx >= s->nb_stream_groups)
582  return AVERROR(EINVAL);
583  for (unsigned j = 0; j < s->stream_groups[group_idx]->nb_streams; j++) {
584  if (st->index == s->stream_groups[group_idx]->streams[j]->index) {
585  found = 1;
586  if (g)
587  *g = s->stream_groups[group_idx];
588  break;
589  }
590  }
591  }
592  if (!found)
593  match = 0;
594  } else if (*spec == 'p' && *(spec + 1) == ':') {
595  int prog_id;
596  int found = 0;
597  char *endptr;
598  spec += 2;
599  prog_id = strtol(spec, &endptr, 0);
600  /* Disallow empty id and make sure that if we are not at the end, then another specifier must follow. */
601  if (spec == endptr || (*endptr && *endptr++ != ':'))
602  return AVERROR(EINVAL);
603  spec = endptr;
604  if (match) {
605  for (unsigned i = 0; i < s->nb_programs; i++) {
606  if (s->programs[i]->id != prog_id)
607  continue;
608 
609  for (unsigned j = 0; j < s->programs[i]->nb_stream_indexes; j++) {
610  if (st->index == s->programs[i]->stream_index[j]) {
611  found = 1;
612  if (p)
613  *p = s->programs[i];
614  i = s->nb_programs;
615  break;
616  }
617  }
618  }
619  }
620  if (!found)
621  match = 0;
622  } else if (*spec == '#' ||
623  (*spec == 'i' && *(spec + 1) == ':')) {
624  int stream_id;
625  char *endptr;
626  spec += 1 + (*spec == 'i');
627  stream_id = strtol(spec, &endptr, 0);
628  if (spec == endptr || *endptr) /* Disallow empty id and make sure we are at the end. */
629  return AVERROR(EINVAL);
630  return match && (stream_id == st->id);
631  } else if (*spec == 'm' && *(spec + 1) == ':') {
632  const AVDictionaryEntry *tag;
633  char *key, *val;
634  int ret;
635 
636  if (match) {
637  spec += 2;
638  val = strchr(spec, ':');
639 
640  key = val ? av_strndup(spec, val - spec) : av_strdup(spec);
641  if (!key)
642  return AVERROR(ENOMEM);
643 
644  tag = av_dict_get(st->metadata, key, NULL, 0);
645  if (tag) {
646  if (!val || !strcmp(tag->value, val + 1))
647  ret = 1;
648  else
649  ret = 0;
650  } else
651  ret = 0;
652 
653  av_freep(&key);
654  }
655  return match && ret;
656  } else if (*spec == 'u' && *(spec + 1) == '\0') {
657  const AVCodecParameters *par = st->codecpar;
658  int val;
659  switch (par->codec_type) {
660  case AVMEDIA_TYPE_AUDIO:
661  val = par->sample_rate && par->ch_layout.nb_channels;
662  if (par->format == AV_SAMPLE_FMT_NONE)
663  return 0;
664  break;
665  case AVMEDIA_TYPE_VIDEO:
666  val = par->width && par->height;
667  if (par->format == AV_PIX_FMT_NONE)
668  return 0;
669  break;
671  val = 0;
672  break;
673  default:
674  val = 1;
675  break;
676  }
677  return match && (par->codec_id != AV_CODEC_ID_NONE && val != 0);
678  } else {
679  return AVERROR(EINVAL);
680  }
681  }
682 
683  return match;
684 }
685 
687  const char *spec)
688 {
689  int ret, index;
690  char *endptr;
691  const char *indexptr = NULL;
692  const AVStreamGroup *g = NULL;
693  const AVProgram *p = NULL;
694  int nb_streams;
695 
696  ret = match_stream_specifier(s, st, spec, &indexptr, &g, &p);
697  if (ret < 0)
698  goto error;
699 
700  if (!indexptr)
701  return ret;
702 
703  index = strtol(indexptr, &endptr, 0);
704  if (*endptr) { /* We can't have anything after the requested index. */
705  ret = AVERROR(EINVAL);
706  goto error;
707  }
708 
709  /* This is not really needed but saves us a loop for simple stream index specifiers. */
710  if (spec == indexptr)
711  return (index == st->index);
712 
713  /* If we requested a matching stream index, we have to ensure st is that. */
714  nb_streams = g ? g->nb_streams : (p ? p->nb_stream_indexes : s->nb_streams);
715  for (int i = 0; i < nb_streams && index >= 0; i++) {
716  unsigned idx = g ? g->streams[i]->index : (p ? p->stream_index[i] : i);
717  const AVStream *candidate = s->streams[idx];
718  ret = match_stream_specifier(s, candidate, spec, NULL, NULL, NULL);
719  if (ret < 0)
720  goto error;
721  if (ret > 0 && index-- == 0 && st == candidate)
722  return 1;
723  }
724  return 0;
725 
726 error:
727  if (ret == AVERROR(EINVAL))
728  av_log(s, AV_LOG_ERROR, "Invalid stream specifier: %s.\n", spec);
729  return ret;
730 }
731 
733 {
734  AVRational undef = {0, 1};
735  AVRational stream_sample_aspect_ratio = stream ? stream->sample_aspect_ratio : undef;
736  AVRational codec_sample_aspect_ratio = stream && stream->codecpar ? stream->codecpar->sample_aspect_ratio : undef;
737  AVRational frame_sample_aspect_ratio = frame ? frame->sample_aspect_ratio : codec_sample_aspect_ratio;
738 
739  av_reduce(&stream_sample_aspect_ratio.num, &stream_sample_aspect_ratio.den,
740  stream_sample_aspect_ratio.num, stream_sample_aspect_ratio.den, INT_MAX);
741  if (stream_sample_aspect_ratio.num <= 0 || stream_sample_aspect_ratio.den <= 0)
742  stream_sample_aspect_ratio = undef;
743 
744  av_reduce(&frame_sample_aspect_ratio.num, &frame_sample_aspect_ratio.den,
745  frame_sample_aspect_ratio.num, frame_sample_aspect_ratio.den, INT_MAX);
746  if (frame_sample_aspect_ratio.num <= 0 || frame_sample_aspect_ratio.den <= 0)
747  frame_sample_aspect_ratio = undef;
748 
749  if (stream_sample_aspect_ratio.num)
750  return stream_sample_aspect_ratio;
751  else
752  return frame_sample_aspect_ratio;
753 }
754 
756 {
757  AVRational fr = st->r_frame_rate;
759  AVRational avg_fr = st->avg_frame_rate;
760 
761  if (avg_fr.num > 0 && avg_fr.den > 0 && fr.num > 0 && fr.den > 0 &&
762  av_q2d(avg_fr) < 70 && av_q2d(fr) > 210) {
763  fr = avg_fr;
764  }
765 
766  if (desc && (desc->props & AV_CODEC_PROP_FIELDS)) {
767  const AVCodecContext *const avctx = ffstream(st)->avctx;
768  AVRational codec_fr = avctx->framerate;
769 
770  if ( codec_fr.num > 0 && codec_fr.den > 0 &&
771  (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))
772  fr = codec_fr;
773  }
774 
775  return fr;
776 }
777 
778 #if FF_API_INTERNAL_TIMING
779 int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
780  AVStream *ost, const AVStream *ist,
781  enum AVTimebaseSource copy_tb)
782 {
784  const AVCodecContext *const dec_ctx = cffstream(ist)->avctx;
785 
786  AVRational mul = (AVRational){ desc && (desc->props & AV_CODEC_PROP_FIELDS) ? 2 : 1, 1 };
787  AVRational dec_ctx_framerate = dec_ctx ? dec_ctx->framerate : (AVRational){ 0, 0 };
788  AVRational dec_ctx_tb = dec_ctx_framerate.num ? av_inv_q(av_mul_q(dec_ctx_framerate, mul))
789  : (ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO ? (AVRational){0, 1}
790  : ist->time_base);
791  AVRational enc_tb = ist->time_base;
792 #if FF_API_TICKS_PER_FRAME
794  int ticks_per_frame = dec_ctx ? dec_ctx->ticks_per_frame : 1;
796 #endif
797 
798  /*
799  * Avi is a special case here because it supports variable fps but
800  * having the fps and timebase differe significantly adds quite some
801  * overhead
802  */
803  if (!strcmp(ofmt->name, "avi")) {
804 #if FF_API_R_FRAME_RATE
805  if (copy_tb == AVFMT_TBCF_AUTO && ist->r_frame_rate.num
806  && av_q2d(ist->r_frame_rate) >= av_q2d(ist->avg_frame_rate)
807  && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(ist->time_base)
808  && 0.5/av_q2d(ist->r_frame_rate) > av_q2d(dec_ctx_tb)
809  && av_q2d(ist->time_base) < 1.0/500 && av_q2d(dec_ctx_tb) < 1.0/500
810  || copy_tb == AVFMT_TBCF_R_FRAMERATE) {
811  enc_tb.num = ist->r_frame_rate.den;
812  enc_tb.den = 2*ist->r_frame_rate.num;
813  } else
814 #endif
815  if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate.num &&
816  av_q2d(av_inv_q(dec_ctx_framerate)) > 2*av_q2d(ist->time_base)
817  && av_q2d(ist->time_base) < 1.0/500
818  || (copy_tb == AVFMT_TBCF_DECODER &&
819  (dec_ctx_framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) {
820  enc_tb = dec_ctx_tb;
821  enc_tb.den *= 2;
822 #if FF_API_TICKS_PER_FRAME
823  enc_tb.num *= ticks_per_frame;
824 #endif
825  }
826  } else if (!(ofmt->flags & AVFMT_VARIABLE_FPS)
827  && !av_match_name(ofmt->name, "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v")) {
828  if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate.num
829  && av_q2d(av_inv_q(dec_ctx_framerate)) > av_q2d(ist->time_base)
830  && av_q2d(ist->time_base) < 1.0/500
831  || (copy_tb == AVFMT_TBCF_DECODER &&
832  (dec_ctx_framerate.num || ist->codecpar->codec_type == AVMEDIA_TYPE_AUDIO))) {
833  enc_tb = dec_ctx_tb;
834 #if FF_API_TICKS_PER_FRAME
835  enc_tb.num *= ticks_per_frame;
836 #endif
837  }
838  }
839 
840  if (ost->codecpar->codec_tag == AV_RL32("tmcd")
841  && dec_ctx_tb.num < dec_ctx_tb.den
842  && dec_ctx_tb.num > 0
843  && 121LL*dec_ctx_tb.num > dec_ctx_tb.den) {
844  enc_tb = dec_ctx_tb;
845  }
846 
847  av_reduce(&ffstream(ost)->transferred_mux_tb.num,
848  &ffstream(ost)->transferred_mux_tb.den,
849  enc_tb.num, enc_tb.den, INT_MAX);
850 
851  return 0;
852 }
853 
854 AVRational av_stream_get_codec_timebase(const AVStream *st)
855 {
856  return cffstream(st)->avctx ? cffstream(st)->avctx->time_base : cffstream(st)->transferred_mux_tb;
857 }
858 #endif
859 
860 void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
861  unsigned int pts_num, unsigned int pts_den)
862 {
863  FFStream *const sti = ffstream(st);
864  AVRational new_tb;
865  if (av_reduce(&new_tb.num, &new_tb.den, pts_num, pts_den, INT_MAX)) {
866  if (new_tb.num != pts_num)
868  "st:%d removing common factor %d from timebase\n",
869  st->index, pts_num / new_tb.num);
870  } else
872  "st:%d has too large timebase, reducing\n", st->index);
873 
874  if (new_tb.num <= 0 || new_tb.den <= 0) {
876  "Ignoring attempt to set invalid timebase %d/%d for st:%d\n",
877  new_tb.num, new_tb.den,
878  st->index);
879  return;
880  }
881  st->time_base = new_tb;
882  if (sti->avctx)
883  sti->avctx->pkt_timebase = new_tb;
884  st->pts_wrap_bits = pts_wrap_bits;
885 }
886 
888  enum AVCodecID codec_id)
889 {
890  switch (st->codecpar->codec_type) {
891  case AVMEDIA_TYPE_VIDEO:
892  if (s->video_codec) return s->video_codec;
893  break;
894  case AVMEDIA_TYPE_AUDIO:
895  if (s->audio_codec) return s->audio_codec;
896  break;
898  if (s->subtitle_codec) return s->subtitle_codec;
899  break;
900  }
901 
903 }
904 
906 {
907 #define OFF(field) offsetof(AVFormatContext, field)
908  static const unsigned offsets[] = {
909  OFF(codec_whitelist), OFF(format_whitelist),
910  OFF(protocol_whitelist), OFF(protocol_blacklist),
911  };
912 #undef OFF
913  av_assert0(!dst->codec_whitelist &&
914  !dst->format_whitelist &&
915  !dst->protocol_whitelist &&
916  !dst->protocol_blacklist);
917  for (unsigned i = 0; i < FF_ARRAY_ELEMS(offsets); i++) {
918  const char *src_str = *(char *const*)((const char*)src + offsets[i]);
919 
920  if (src_str) {
921  char *dst_str = av_strdup(src_str);
922  if (!dst_str) {
923  av_log(dst, AV_LOG_ERROR, "Failed to duplicate black/whitelist\n");
924  return AVERROR(ENOMEM);
925  }
926 
927  *(char **)((char*)dst + offsets[i]) = dst_str;
928  }
929  }
930  return 0;
931 }
932 
934 {
936  if (!d)
937  return 0;
938  if ((d->type == AVMEDIA_TYPE_VIDEO || d->type == AVMEDIA_TYPE_AUDIO) &&
940  return 0;
941  return 1;
942 }
943 
945 {
946  av_assert0(url);
947  av_freep(&s->url);
948  s->url = url;
949 }
950 
952 {
953  int ret = 0;
954  if (*pb)
955  ret = s->io_close2(s, *pb);
956  *pb = NULL;
957  return ret;
958 }
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
iamf.h
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:429
AVCodec
AVCodec.
Definition: codec.h:187
AVStreamGroupParamsType
AVStreamGroupParamsType
Definition: avformat.h:1110
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:73
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
AVStreamGroup::params
union AVStreamGroup::@363 params
Group type-specific parameters.
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
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:47
AVOutputFormat::name
const char * name
Definition: avformat.h:510
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:51
AVStreamGroup::tile_grid
struct AVStreamGroupTileGrid * tile_grid
Definition: avformat.h:1156
AV_STREAM_GROUP_PARAMS_LCEVC
@ AV_STREAM_GROUP_PARAMS_LCEVC
Definition: avformat.h:1115
AVProgram::nb_stream_indexes
unsigned int nb_stream_indexes
Definition: avformat.h:1216
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:448
FFStream::bsfc
struct AVBSFContext * bsfc
bitstream filter to run on stream
Definition: internal.h:211
ff_find_decoder
const AVCodec * ff_find_decoder(AVFormatContext *s, const AVStream *st, enum AVCodecID codec_id)
Definition: avformat.c:887
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
FFStream::bsf
struct AVBSFContext * bsf
Definition: internal.h:231
ffformatcontext
static av_always_inline FFFormatContext * ffformatcontext(AVFormatContext *s)
Definition: internal.h:188
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:773
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:674
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:819
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:397
av_div_q
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition: rational.c:88
int64_t
long long int64_t
Definition: coverity.c:34
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:621
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:389
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1355
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:390
AVPacket::data
uint8_t * data
Definition: packet.h:539
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:837
data
const char data[16]
Definition: mxf.c:148
FFFormatContext::initialized
int initialized
Whether or not avformat_init_output has already been called.
Definition: internal.h:160
av_iamf_mix_presentation_free
void av_iamf_mix_presentation_free(AVIAMFMixPresentation **pmix_presentation)
Free an AVIAMFMixPresentation and all its contents.
Definition: iamf.c:534
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1488
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
cffstream
static const av_always_inline FFStream * cffstream(const AVStream *st)
Definition: internal.h:424
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:321
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
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
FFStream::codec_desc
const struct AVCodecDescriptor * codec_desc
Definition: internal.h:412
OFF
#define OFF(field)
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:566
AVPacketSideData::size
size_t size
Definition: packet.h:392
ff_remove_stream
void ff_remove_stream(AVFormatContext *s, AVStream *st)
Remove a stream from its AVFormatContext and free it.
Definition: avformat.c:118
ff_free_stream_group
void ff_free_stream_group(AVStreamGroup **pstg)
Frees a stream group without modifying the corresponding AVFormatContext.
Definition: avformat.c:83
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:860
bsf.h
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:419
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:274
avformat_stream_group_name
const char * avformat_stream_group_name(enum AVStreamGroupParamsType type)
Definition: avformat.c:328
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:336
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1915
FFStream::avctx
struct AVCodecContext * avctx
The codec context used by avformat_find_stream_info, the parser, etc.
Definition: internal.h:221
AVDISCARD_NONE
@ AVDISCARD_NONE
discard nothing
Definition: defs.h:215
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:339
AV_PTS_WRAP_IGNORE
#define AV_PTS_WRAP_IGNORE
Options for behavior on timestamp wrap detection.
Definition: avformat.h:737
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
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:846
avassert.h
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:206
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
AVProgram::id
int id
Definition: avformat.h:1212
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:62
AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
@ AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
Definition: avformat.h:1113
FFFormatContext::parse_queue
PacketList parse_queue
Packets split by the parser get queued here.
Definition: internal.h:113
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
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:98
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
format
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 format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
AVCodecParameters::sample_aspect_ratio
AVRational sample_aspect_ratio
Video only.
Definition: codec_par.h:144
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1487
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:202
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:134
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:40
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:201
AVPacketSideData::data
uint8_t * data
Definition: packet.h:391
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:732
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:392
ffofmt
static const FFOutputFormat * ffofmt(const AVOutputFormat *fmt)
Definition: mux.h:167
nb_streams
static int nb_streams
Definition: ffprobe.c:384
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:394
key
const char * key
Definition: hwcontext_opencl.c:189
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
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:596
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:221
AVFormatContext
Format I/O context.
Definition: avformat.h:1287
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:771
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:787
NULL
#define NULL
Definition: coverity.c:32
av_program_add_stream_index
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
Definition: avformat.c:370
avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **ppar)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: codec_par.c:66
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:905
AVPacketSideData::type
enum AVPacketSideDataType type
Definition: packet.h:393
FFOutputFormat::deinit
void(* deinit)(AVFormatContext *)
Deinitialize format.
Definition: mux.h:154
AVProgram::stream_index
unsigned int * stream_index
Definition: avformat.h:1215
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:828
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:437
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
index
int index
Definition: gxfenc.c:90
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:184
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:1007
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1343
FFFormatContext::id3v2_meta
AVDictionary * id3v2_meta
ID3v2 tag useful for MP3 demuxing.
Definition: internal.h:170
AVOutputFormat::flags
int flags
can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:529
AV_STREAM_GROUP_PARAMS_TILE_GRID
@ AV_STREAM_GROUP_PARAMS_TILE_GRID
Definition: avformat.h:1114
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:550
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVMediaType
AVMediaType
Definition: avutil.h:199
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:686
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:127
FFStream
Definition: internal.h:193
ff_free_stream
void ff_free_stream(AVStream **pst)
Frees a stream without modifying the corresponding AVFormatContext.
Definition: avformat.c:44
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
AVCodecContext::pkt_timebase
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition: avcodec.h:557
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
size
int size
Definition: twinvq_data.h:10344
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:248
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:1154
ff_format_io_close
int ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition: avformat.c:951
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:200
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:826
frame.h
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
The stream is intended for hearing impaired audiences.
Definition: avformat.h:658
AVStreamGroup::lcevc
struct AVStreamGroupLCEVC * lcevc
Definition: avformat.h:1157
FFFormatContext::raw_packet_buffer_size
int raw_packet_buffer_size
Sum of the size of packets in raw_packet_buffer, in bytes.
Definition: internal.h:138
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:223
AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
@ AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
Definition: avformat.h:1112
AVStreamGroup::streams
AVStream ** streams
A list of streams in the group.
Definition: avformat.h:1188
AVStreamGroup::iamf_mix_presentation
struct AVIAMFMixPresentation * iamf_mix_presentation
Definition: avformat.h:1155
FFStream::probe_data
AVProbeData probe_data
Definition: internal.h:370
FFStream::extract_extradata
struct FFStream::@383 extract_extradata
FFStreamInfo::duration_error
double(* duration_error)[2][MAX_STD_TIMEBASES]
Definition: demux.h:144
FFFormatContext::raw_packet_buffer
PacketList raw_packet_buffer
Raw packets from the demuxer, prior to parsing and decoding.
Definition: internal.h:109
ff_is_intra_only
int ff_is_intra_only(enum AVCodecID id)
Definition: avformat.c:933
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVOutputFormat
Definition: avformat.h:509
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVStreamGroupTileGrid::offsets
struct AVStreamGroupTileGrid::@362 * offsets
An nb_tiles sized array of offsets in pixels from the topleft edge of the canvas, indicating where ea...
AVCodecParameters::height
int height
Definition: codec_par.h:135
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:205
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_find_default_stream_index
int av_find_default_stream_index(AVFormatContext *s)
Definition: avformat.c:412
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1211
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
demux.h
avcodec.h
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:817
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:523
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
The stream is intended for visually impaired audiences.
Definition: avformat.h:662
tag
uint32_t tag
Definition: movenc.c:1879
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:760
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:748
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:755
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:264
AVStreamGroup::metadata
AVDictionary * metadata
Metadata that applies to the whole group.
Definition: avformat.h:1168
avformat.h
id
enum AVCodecID id
Definition: dts2pts.c:367
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
U
#define U(x)
Definition: vpx_arith.h:37
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
AVStreamGroup
Definition: avformat.h:1121
AVCodecContext
main external API structure.
Definition: avcodec.h:451
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:754
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:135
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:126
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:345
avformat_free_context
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
Definition: avformat.c:145
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:914
AVCodecContext::ticks_per_frame
attribute_deprecated int ticks_per_frame
For some codecs, the time base is closer to the field rate than the frame rate.
Definition: avcodec.h:582
AVPacketSideDataType
AVPacketSideDataType
Definition: packet.h:41
FFStream::info
struct FFStreamInfo * info
Stream information used internally by avformat_find_stream_info()
Definition: internal.h:247
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:249
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:72
AVERROR_DECODER_NOT_FOUND
#define AVERROR_DECODER_NOT_FOUND
Decoder not found.
Definition: error.h:54
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
AVStreamGroup::type
enum AVStreamGroupParamsType type
Group type.
Definition: avformat.h:1148
packet_internal.h
FFFormatContext::pkt
AVPacket * pkt
Used to hold temporary packets for the generic demuxing code.
Definition: internal.h:134
AVCodecParameters::format
int format
Definition: codec_par.h:92
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
AVDictionaryEntry
Definition: dict.h:89
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
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:310
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
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:237
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:97
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
FFStream::parser
struct AVCodecParserContext * parser
Definition: internal.h:387
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3741
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:923
codec_desc.h
AVStreamGroup::priv_data
void * priv_data
Definition: avformat.h:1127
ff_format_set_url
void ff_format_set_url(AVFormatContext *s, char *url)
Set AVFormatContext url field to the provided pointer.
Definition: avformat.c:944
src
#define src
Definition: vp8dsp.c:248
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:106
av_parser_close
void av_parser_close(AVCodecParserContext *s)
Definition: parser.c:193
mux.h