FFmpeg
ffmpeg_mux_init.c
Go to the documentation of this file.
1 /*
2  * Muxer/output file setup.
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <string.h>
22 
23 #include "cmdutils.h"
24 #include "ffmpeg.h"
25 #include "ffmpeg_mux.h"
26 #include "ffmpeg_sched.h"
27 #include "fopen_utf8.h"
28 
29 #include "libavformat/avformat.h"
30 #include "libavformat/avio.h"
31 
32 #include "libavcodec/avcodec.h"
33 
34 #include "libavfilter/avfilter.h"
35 
36 #include "libavutil/avassert.h"
37 #include "libavutil/avstring.h"
38 #include "libavutil/avutil.h"
39 #include "libavutil/bprint.h"
40 #include "libavutil/dict.h"
41 #include "libavutil/display.h"
42 #include "libavutil/getenv_utf8.h"
43 #include "libavutil/iamf.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/log.h"
46 #include "libavutil/mem.h"
47 #include "libavutil/opt.h"
48 #include "libavutil/parseutils.h"
49 #include "libavutil/pixdesc.h"
50 
51 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
52 
53 static int check_opt_bitexact(void *ctx, const AVDictionary *opts,
54  const char *opt_name, int flag)
55 {
56  const AVDictionaryEntry *e = av_dict_get(opts, opt_name, NULL, 0);
57 
58  if (e) {
59  const AVOption *o = av_opt_find(ctx, opt_name, NULL, 0, 0);
60  int val = 0;
61  if (!o)
62  return 0;
63  av_opt_eval_flags(ctx, o, e->value, &val);
64  return !!(val & flag);
65  }
66  return 0;
67 }
68 
70  MuxStream *ms, const AVCodec **enc)
71 {
72  OutputStream *ost = &ms->ost;
73  enum AVMediaType type = ost->type;
74  const char *codec_name = NULL;
75 
76  *enc = NULL;
77 
78  opt_match_per_stream_str(ost, &o->codec_names, s, ost->st, &codec_name);
79 
80  if (type != AVMEDIA_TYPE_VIDEO &&
83  if (codec_name && strcmp(codec_name, "copy")) {
84  const char *type_str = av_get_media_type_string(type);
86  "Encoder '%s' specified, but only '-codec copy' supported "
87  "for %s streams\n", codec_name, type_str);
88  return AVERROR(ENOSYS);
89  }
90  return 0;
91  }
92 
93  if (!codec_name) {
94  ms->par_in->codec_id = av_guess_codec(s->oformat, NULL, s->url, NULL, ost->type);
96  if (!*enc) {
97  av_log(ost, AV_LOG_FATAL, "Automatic encoder selection failed "
98  "Default encoder for format %s (codec %s) is "
99  "probably disabled. Please choose an encoder manually.\n",
100  s->oformat->name, avcodec_get_name(ms->par_in->codec_id));
102  }
103  } else if (strcmp(codec_name, "copy")) {
104  int ret = find_codec(ost, codec_name, ost->type, 1, enc);
105  if (ret < 0)
106  return ret;
107  ms->par_in->codec_id = (*enc)->id;
108  }
109 
110  return 0;
111 }
112 
113 static char *get_line(AVIOContext *s, AVBPrint *bprint)
114 {
115  char c;
116 
117  while ((c = avio_r8(s)) && c != '\n')
118  av_bprint_chars(bprint, c, 1);
119 
120  if (!av_bprint_is_complete(bprint))
121  return NULL;
122 
123  return bprint->str;
124 }
125 
126 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
127 {
128  int i, ret = -1;
129  char filename[1000];
130  char *env_avconv_datadir = getenv_utf8("AVCONV_DATADIR");
131  char *env_home = getenv_utf8("HOME");
132  const char *base[3] = { env_avconv_datadir,
133  env_home,
134  AVCONV_DATADIR,
135  };
136 
137  for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
138  if (!base[i])
139  continue;
140  if (codec_name) {
141  snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
142  i != 1 ? "" : "/.avconv", codec_name, preset_name);
143  ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
144  }
145  if (ret < 0) {
146  snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
147  i != 1 ? "" : "/.avconv", preset_name);
148  ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
149  }
150  }
151  freeenv_utf8(env_home);
152  freeenv_utf8(env_avconv_datadir);
153  return ret;
154 }
155 
156 typedef struct EncStatsFile {
157  char *path;
159 } EncStatsFile;
160 
163 
164 static int enc_stats_get_file(AVIOContext **io, const char *path)
165 {
166  EncStatsFile *esf;
167  int ret;
168 
169  for (int i = 0; i < nb_enc_stats_files; i++)
170  if (!strcmp(path, enc_stats_files[i].path)) {
171  *io = enc_stats_files[i].io;
172  return 0;
173  }
174 
176  if (ret < 0)
177  return ret;
178 
180 
181  ret = avio_open2(&esf->io, path, AVIO_FLAG_WRITE, &int_cb, NULL);
182  if (ret < 0) {
183  av_log(NULL, AV_LOG_ERROR, "Error opening stats file '%s': %s\n",
184  path, av_err2str(ret));
185  return ret;
186  }
187 
188  esf->path = av_strdup(path);
189  if (!esf->path)
190  return AVERROR(ENOMEM);
191 
192  *io = esf->io;
193 
194  return 0;
195 }
196 
198 {
199  for (int i = 0; i < nb_enc_stats_files; i++) {
200  av_freep(&enc_stats_files[i].path);
202  }
204  nb_enc_stats_files = 0;
205 }
206 
207 static int unescape(char **pdst, size_t *dst_len,
208  const char **pstr, char delim)
209 {
210  const char *str = *pstr;
211  char *dst;
212  size_t len, idx;
213 
214  *pdst = NULL;
215 
216  len = strlen(str);
217  if (!len)
218  return 0;
219 
220  dst = av_malloc(len + 1);
221  if (!dst)
222  return AVERROR(ENOMEM);
223 
224  for (idx = 0; *str; idx++, str++) {
225  if (str[0] == '\\' && str[1])
226  str++;
227  else if (*str == delim)
228  break;
229 
230  dst[idx] = *str;
231  }
232  if (!idx) {
233  av_freep(&dst);
234  return 0;
235  }
236 
237  dst[idx] = 0;
238 
239  *pdst = dst;
240  *dst_len = idx;
241  *pstr = str;
242 
243  return 0;
244 }
245 
246 static int enc_stats_init(OutputStream *ost, EncStats *es, int pre,
247  const char *path, const char *fmt_spec)
248 {
249  static const struct {
250  enum EncStatsType type;
251  const char *str;
252  unsigned pre_only:1;
253  unsigned post_only:1;
254  unsigned need_input_data:1;
255  } fmt_specs[] = {
256  { ENC_STATS_FILE_IDX, "fidx" },
257  { ENC_STATS_STREAM_IDX, "sidx" },
258  { ENC_STATS_FRAME_NUM, "n" },
259  { ENC_STATS_FRAME_NUM_IN, "ni", 0, 0, 1 },
260  { ENC_STATS_TIMEBASE, "tb" },
261  { ENC_STATS_TIMEBASE_IN, "tbi", 0, 0, 1 },
262  { ENC_STATS_PTS, "pts" },
263  { ENC_STATS_PTS_TIME, "t" },
264  { ENC_STATS_PTS_IN, "ptsi", 0, 0, 1 },
265  { ENC_STATS_PTS_TIME_IN, "ti", 0, 0, 1 },
266  { ENC_STATS_DTS, "dts", 0, 1 },
267  { ENC_STATS_DTS_TIME, "dt", 0, 1 },
268  { ENC_STATS_SAMPLE_NUM, "sn", 1 },
269  { ENC_STATS_NB_SAMPLES, "samp", 1 },
270  { ENC_STATS_PKT_SIZE, "size", 0, 1 },
271  { ENC_STATS_BITRATE, "br", 0, 1 },
272  { ENC_STATS_AVG_BITRATE, "abr", 0, 1 },
273  { ENC_STATS_KEYFRAME, "key", 0, 1 },
274  };
275  const char *next = fmt_spec;
276 
277  int ret;
278 
279  while (*next) {
281  char *val;
282  size_t val_len;
283 
284  // get the sequence up until next opening brace
285  ret = unescape(&val, &val_len, &next, '{');
286  if (ret < 0)
287  return ret;
288 
289  if (val) {
291  if (ret < 0) {
292  av_freep(&val);
293  return ret;
294  }
295 
296  c = &es->components[es->nb_components - 1];
297  c->type = ENC_STATS_LITERAL;
298  c->str = val;
299  c->str_len = val_len;
300  }
301 
302  if (!*next)
303  break;
304  next++;
305 
306  // get the part inside braces
307  ret = unescape(&val, &val_len, &next, '}');
308  if (ret < 0)
309  return ret;
310 
311  if (!val) {
313  "Empty formatting directive in: %s\n", fmt_spec);
314  return AVERROR(EINVAL);
315  }
316 
317  if (!*next) {
319  "Missing closing brace in: %s\n", fmt_spec);
320  ret = AVERROR(EINVAL);
321  goto fail;
322  }
323  next++;
324 
326  if (ret < 0)
327  goto fail;
328 
329  c = &es->components[es->nb_components - 1];
330 
331  for (size_t i = 0; i < FF_ARRAY_ELEMS(fmt_specs); i++) {
332  if (!strcmp(val, fmt_specs[i].str)) {
333  if ((pre && fmt_specs[i].post_only) || (!pre && fmt_specs[i].pre_only)) {
335  "Format directive '%s' may only be used %s-encoding\n",
336  val, pre ? "post" : "pre");
337  ret = AVERROR(EINVAL);
338  goto fail;
339  }
340 
341  c->type = fmt_specs[i].type;
342 
343  if (fmt_specs[i].need_input_data && !ost->ist) {
345  "Format directive '%s' is unavailable, because "
346  "this output stream has no associated input stream\n",
347  val);
348  }
349 
350  break;
351  }
352  }
353 
354  if (!c->type) {
355  av_log(NULL, AV_LOG_ERROR, "Invalid format directive: %s\n", val);
356  ret = AVERROR(EINVAL);
357  goto fail;
358  }
359 
360 fail:
361  av_freep(&val);
362  if (ret < 0)
363  return ret;
364  }
365 
366  ret = pthread_mutex_init(&es->lock, NULL);
367  if (ret)
368  return AVERROR(ret);
369  es->lock_initialized = 1;
370 
371  ret = enc_stats_get_file(&es->io, path);
372  if (ret < 0)
373  return ret;
374 
375  return 0;
376 }
377 
378 static const char *output_stream_item_name(void *obj)
379 {
380  const MuxStream *ms = obj;
381 
382  return ms->log_name;
383 }
384 
385 static const AVClass output_stream_class = {
386  .class_name = "OutputStream",
387  .version = LIBAVUTIL_VERSION_INT,
388  .item_name = output_stream_item_name,
389  .category = AV_CLASS_CATEGORY_MUXER,
390 };
391 
393 {
394  const char *type_str = av_get_media_type_string(type);
395  MuxStream *ms;
396 
397  ms = allocate_array_elem(&mux->of.streams, sizeof(*ms), &mux->of.nb_streams);
398  if (!ms)
399  return NULL;
400 
401  ms->ost.file = &mux->of;
402  ms->ost.index = mux->of.nb_streams - 1;
403  ms->ost.type = type;
404 
406 
407  ms->sch_idx = -1;
408  ms->sch_idx_enc = -1;
409 
410  snprintf(ms->log_name, sizeof(ms->log_name), "%cost#%d:%d",
411  type_str ? *type_str : '?', mux->of.index, ms->ost.index);
412 
413  return ms;
414 }
415 
417  OutputStream *ost, char **dst)
418 {
419  const char *filters = NULL;
420 #if FFMPEG_OPT_FILTER_SCRIPT
421  const char *filters_script = NULL;
422 
423  opt_match_per_stream_str(ost, &o->filter_scripts, oc, ost->st, &filters_script);
424 #endif
426 
427  if (!ost->ist) {
428  if (
430  filters_script ||
431 #endif
432  filters) {
434  "%s '%s' was specified for a stream fed from a complex "
435  "filtergraph. Simple and complex filtering cannot be used "
436  "together for the same stream.\n",
438  filters ? "Filtergraph" : "Filtergraph script",
439  filters ? filters : filters_script
440 #else
441  "Filtergraph", filters
442 #endif
443  );
444  return AVERROR(EINVAL);
445  }
446  return 0;
447  }
448 
449 #if FFMPEG_OPT_FILTER_SCRIPT
450  if (filters_script && filters) {
451  av_log(ost, AV_LOG_ERROR, "Both -filter and -filter_script set\n");
452  return AVERROR(EINVAL);
453  }
454 
455  if (filters_script)
456  *dst = read_file_to_string(filters_script);
457  else
458 #endif
459  if (filters)
460  *dst = av_strdup(filters);
461  else
462  *dst = av_strdup(ost->type == AVMEDIA_TYPE_VIDEO ? "null" : "anull");
463  return *dst ? 0 : AVERROR(ENOMEM);
464 }
465 
466 static int parse_matrix_coeffs(void *logctx, uint16_t *dest, const char *str)
467 {
468  const char *p = str;
469  for (int i = 0;; i++) {
470  dest[i] = atoi(p);
471  if (i == 63)
472  break;
473  p = strchr(p, ',');
474  if (!p) {
475  av_log(logctx, AV_LOG_FATAL,
476  "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
477  return AVERROR(EINVAL);
478  }
479  p++;
480  }
481 
482  return 0;
483 }
484 
486 {
487  for (; *formats != AV_PIX_FMT_NONE; formats++)
488  if (*formats == format)
489  return 1;
490  return 0;
491 }
492 
493 static enum AVPixelFormat
495 {
496  const enum AVPixelFormat *p;
498  //FIXME: This should check for AV_PIX_FMT_FLAG_ALPHA after PAL8 pixel format without alpha is implemented
499  int has_alpha = desc ? desc->nb_components % 2 == 0 : 0;
500  enum AVPixelFormat best= AV_PIX_FMT_NONE;
501  int ret;
502 
504  0, (const void **) &p, NULL);
505  if (ret < 0)
506  return AV_PIX_FMT_NONE;
507 
508  for (; *p != AV_PIX_FMT_NONE; p++) {
509  best = av_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL);
510  if (*p == target)
511  break;
512  }
513  if (*p == AV_PIX_FMT_NONE) {
514  if (target != AV_PIX_FMT_NONE)
516  "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
517  av_get_pix_fmt_name(target),
518  avctx->codec->name,
519  av_get_pix_fmt_name(best));
520  return best;
521  }
522  return target;
523 }
524 
525 static enum AVPixelFormat pix_fmt_parse(OutputStream *ost, const char *name)
526 {
527  const enum AVPixelFormat *fmts;
528  enum AVPixelFormat fmt;
529  int ret;
530 
531  fmt = av_get_pix_fmt(name);
532  if (fmt == AV_PIX_FMT_NONE) {
533  av_log(ost, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", name);
534  return AV_PIX_FMT_NONE;
535  }
536 
538  0, (const void **) &fmts, NULL);
539  if (ret < 0)
540  return AV_PIX_FMT_NONE;
541 
542  /* when the user specified-format is an alias for an endianness-specific
543  * one (e.g. rgb48 -> rgb48be/le), it gets translated into the native
544  * endianness by av_get_pix_fmt();
545  * the following code handles the case when the native endianness is not
546  * supported by the encoder, but the other one is */
547  if (fmts && !pixfmt_in_list(fmts, fmt)) {
548  const char *name_canonical = av_get_pix_fmt_name(fmt);
549  int len = strlen(name_canonical);
550 
551  if (strcmp(name, name_canonical) &&
552  (!strcmp(name_canonical + len - 2, "le") ||
553  !strcmp(name_canonical + len - 2, "be"))) {
554  char name_other[64];
555  enum AVPixelFormat fmt_other;
556 
557  snprintf(name_other, sizeof(name_other), "%s%ce",
558  name, name_canonical[len - 2] == 'l' ? 'b' : 'l');
559  fmt_other = av_get_pix_fmt(name_other);
560  if (fmt_other != AV_PIX_FMT_NONE && pixfmt_in_list(fmts, fmt_other)) {
561  av_log(ost, AV_LOG_VERBOSE, "Mapping pixel format %s->%s\n",
562  name, name_other);
563  fmt = fmt_other;
564  }
565  }
566  }
567 
568  if (fmts && !pixfmt_in_list(fmts, fmt))
569  fmt = choose_pixel_fmt(ost->enc->enc_ctx, fmt);
570 
571  return fmt;
572 }
573 
574 static int new_stream_video(Muxer *mux, const OptionsContext *o,
575  OutputStream *ost, int *keep_pix_fmt,
576  enum VideoSyncMethod *vsync_method)
577 {
578  MuxStream *ms = ms_from_ost(ost);
579  AVFormatContext *oc = mux->fc;
580  AVStream *st;
581  const char *frame_rate = NULL, *max_frame_rate = NULL, *frame_aspect_ratio = NULL;
582  int ret = 0;
583 
584  st = ost->st;
585 
586  opt_match_per_stream_str(ost, &o->frame_rates, oc, st, &frame_rate);
587  if (frame_rate && av_parse_video_rate(&ms->frame_rate, frame_rate) < 0) {
588  av_log(ost, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
589  return AVERROR(EINVAL);
590  }
591 
592  opt_match_per_stream_str(ost, &o->max_frame_rates, oc, st, &max_frame_rate);
593  if (max_frame_rate && av_parse_video_rate(&ms->max_frame_rate, max_frame_rate) < 0) {
594  av_log(ost, AV_LOG_FATAL, "Invalid maximum framerate value: %s\n", max_frame_rate);
595  return AVERROR(EINVAL);
596  }
597 
598  if (frame_rate && max_frame_rate) {
599  av_log(ost, AV_LOG_ERROR, "Only one of -fpsmax and -r can be set for a stream.\n");
600  return AVERROR(EINVAL);
601  }
602 
603  opt_match_per_stream_str(ost, &o->frame_aspect_ratios, oc, st, &frame_aspect_ratio);
604  if (frame_aspect_ratio) {
605  AVRational q;
606  if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
607  q.num <= 0 || q.den <= 0) {
608  av_log(ost, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
609  return AVERROR(EINVAL);
610  }
611  ost->frame_aspect_ratio = q;
612  }
613 
614  if (ost->enc) {
615  AVCodecContext *video_enc = ost->enc->enc_ctx;
616  const char *p = NULL, *fps_mode = NULL;
617  const char *frame_size = NULL;
618  const char *frame_pix_fmt = NULL;
619  const char *intra_matrix = NULL, *inter_matrix = NULL;
620  const char *chroma_intra_matrix = NULL;
621  int do_pass = 0;
622  int i;
623 
625  if (frame_size) {
626  ret = av_parse_video_size(&video_enc->width, &video_enc->height, frame_size);
627  if (ret < 0) {
628  av_log(ost, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
629  return AVERROR(EINVAL);
630  }
631  }
632 
633  opt_match_per_stream_str(ost, &o->frame_pix_fmts, oc, st, &frame_pix_fmt);
634  if (frame_pix_fmt && *frame_pix_fmt == '+') {
635  *keep_pix_fmt = 1;
636  if (!*++frame_pix_fmt)
637  frame_pix_fmt = NULL;
638  }
639  if (frame_pix_fmt) {
640  video_enc->pix_fmt = pix_fmt_parse(ost, frame_pix_fmt);
641  if (video_enc->pix_fmt == AV_PIX_FMT_NONE)
642  return AVERROR(EINVAL);
643  }
644 
645  opt_match_per_stream_str(ost, &o->intra_matrices, oc, st, &intra_matrix);
646  if (intra_matrix) {
647  if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64)))
648  return AVERROR(ENOMEM);
649 
650  ret = parse_matrix_coeffs(ost, video_enc->intra_matrix, intra_matrix);
651  if (ret < 0)
652  return ret;
653  }
654  opt_match_per_stream_str(ost, &o->chroma_intra_matrices, oc, st, &chroma_intra_matrix);
655  if (chroma_intra_matrix) {
656  if (!(video_enc->chroma_intra_matrix = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64)))
657  return AVERROR(ENOMEM);
658  ret = parse_matrix_coeffs(ost, video_enc->chroma_intra_matrix, chroma_intra_matrix);
659  if (ret < 0)
660  return ret;
661  }
662  opt_match_per_stream_str(ost, &o->inter_matrices, oc, st, &inter_matrix);
663  if (inter_matrix) {
664  if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64)))
665  return AVERROR(ENOMEM);
666  ret = parse_matrix_coeffs(ost, video_enc->inter_matrix, inter_matrix);
667  if (ret < 0)
668  return ret;
669  }
670 
671  opt_match_per_stream_str(ost, &o->rc_overrides, oc, st, &p);
672  for (i = 0; p; i++) {
673  int start, end, q;
674  int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
675  if (e != 3) {
676  av_log(ost, AV_LOG_FATAL, "error parsing rc_override\n");
677  return AVERROR(EINVAL);
678  }
679  video_enc->rc_override =
680  av_realloc_array(video_enc->rc_override,
681  i + 1, sizeof(RcOverride));
682  if (!video_enc->rc_override) {
683  av_log(ost, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
684  return AVERROR(ENOMEM);
685  }
686  video_enc->rc_override[i].start_frame = start;
687  video_enc->rc_override[i].end_frame = end;
688  if (q > 0) {
689  video_enc->rc_override[i].qscale = q;
690  video_enc->rc_override[i].quality_factor = 1.0;
691  }
692  else {
693  video_enc->rc_override[i].qscale = 0;
694  video_enc->rc_override[i].quality_factor = -q/100.0;
695  }
696  p = strchr(p, '/');
697  if (p) p++;
698  }
699  video_enc->rc_override_count = i;
700 
701  /* two pass mode */
702  opt_match_per_stream_int(ost, &o->pass, oc, st, &do_pass);
703  if (do_pass) {
704  if (do_pass & 1)
705  video_enc->flags |= AV_CODEC_FLAG_PASS1;
706  if (do_pass & 2)
707  video_enc->flags |= AV_CODEC_FLAG_PASS2;
708  }
709 
710  opt_match_per_stream_str(ost, &o->passlogfiles, oc, st, &ost->logfile_prefix);
711  if (ost->logfile_prefix &&
712  !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
713  return AVERROR(ENOMEM);
714 
715  if (do_pass) {
716  int ost_idx = -1;
717  char logfilename[1024];
718  FILE *f;
719 
720  /* compute this stream's global index */
721  for (int idx = 0; idx <= ost->file->index; idx++)
722  ost_idx += output_files[idx]->nb_streams;
723 
724  snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
725  ost->logfile_prefix ? ost->logfile_prefix :
726  DEFAULT_PASS_LOGFILENAME_PREFIX,
727  ost_idx);
728  if (!strcmp(video_enc->codec->name, "libx264") || !strcmp(video_enc->codec->name, "libvvenc")) {
729  if (av_opt_is_set_to_default_by_name(video_enc, "stats",
731  av_opt_set(video_enc, "stats", logfilename,
733  } else if (!strcmp(video_enc->codec->name, "libx265")) {
734  if (av_opt_is_set_to_default_by_name(video_enc, "x265-stats",
736  av_opt_set(video_enc, "x265-stats", logfilename,
738  } else {
739  if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
740  char *logbuffer = read_file_to_string(logfilename);
741 
742  if (!logbuffer) {
743  av_log(ost, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
744  logfilename);
745  return AVERROR(EIO);
746  }
747  video_enc->stats_in = logbuffer;
748  }
749  if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
750  f = fopen_utf8(logfilename, "wb");
751  if (!f) {
753  "Cannot write log file '%s' for pass-1 encoding: %s\n",
754  logfilename, strerror(errno));
755  return AVERROR(errno);
756  }
757  ost->logfile = f;
758  }
759  }
760  }
761 
762  opt_match_per_stream_int(ost, &o->force_fps, oc, st, &ms->force_fps);
763 
764 #if FFMPEG_OPT_TOP
765  ost->top_field_first = -1;
766  opt_match_per_stream_int(ost, &o->top_field_first, oc, st, &ost->top_field_first);
767  if (ost->top_field_first >= 0)
768  av_log(ost, AV_LOG_WARNING, "-top is deprecated, use the setfield filter instead\n");
769 #endif
770 
771 #if FFMPEG_OPT_VSYNC
772  *vsync_method = video_sync_method;
773 #else
774  *vsync_method = VSYNC_AUTO;
775 #endif
776  opt_match_per_stream_str(ost, &o->fps_mode, oc, st, &fps_mode);
777  if (fps_mode) {
778  ret = parse_and_set_vsync(fps_mode, vsync_method, ost->file->index, ost->index, 0);
779  if (ret < 0)
780  return ret;
781  }
782 
783  if ((ms->frame_rate.num || ms->max_frame_rate.num) &&
784  !(*vsync_method == VSYNC_AUTO ||
785  *vsync_method == VSYNC_CFR || *vsync_method == VSYNC_VSCFR)) {
786  av_log(ost, AV_LOG_FATAL, "One of -r/-fpsmax was specified "
787  "together a non-CFR -vsync/-fps_mode. This is contradictory.\n");
788  return AVERROR(EINVAL);
789  }
790 
791  if (*vsync_method == VSYNC_AUTO) {
792  if (ms->frame_rate.num || ms->max_frame_rate.num) {
793  *vsync_method = VSYNC_CFR;
794  } else if (!strcmp(oc->oformat->name, "avi")) {
795  *vsync_method = VSYNC_VFR;
796  } else {
797  *vsync_method = (oc->oformat->flags & AVFMT_VARIABLE_FPS) ?
798  ((oc->oformat->flags & AVFMT_NOTIMESTAMPS) ?
800  }
801 
802  if (ost->ist && *vsync_method == VSYNC_CFR) {
803  const InputFile *ifile = ost->ist->file;
804 
805  if (ifile->nb_streams == 1 && ifile->input_ts_offset == 0)
806  *vsync_method = VSYNC_VSCFR;
807  }
808 
809  if (*vsync_method == VSYNC_CFR && copy_ts) {
810  *vsync_method = VSYNC_VSCFR;
811  }
812  }
813 #if FFMPEG_OPT_VSYNC_DROP
814  if (*vsync_method == VSYNC_DROP)
815  ms->ts_drop = 1;
816 #endif
817  }
818 
819  return 0;
820 }
821 
822 static int new_stream_audio(Muxer *mux, const OptionsContext *o,
823  OutputStream *ost)
824 {
825  MuxStream *ms = ms_from_ost(ost);
826  AVFormatContext *oc = mux->fc;
827  AVStream *st = ost->st;
828 
829  if (ost->enc) {
830  AVCodecContext *audio_enc = ost->enc->enc_ctx;
831  int channels = 0;
832  const char *layout = NULL;
833  const char *sample_fmt = NULL;
834 
836  if (channels) {
838  audio_enc->ch_layout.nb_channels = channels;
839  }
840 
842  if (layout && av_channel_layout_from_string(&audio_enc->ch_layout, layout) < 0) {
843  av_log(ost, AV_LOG_FATAL, "Unknown channel layout: %s\n", layout);
844  return AVERROR(EINVAL);
845  }
846 
847  opt_match_per_stream_str(ost, &o->sample_fmts, oc, st, &sample_fmt);
848  if (sample_fmt &&
849  (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
850  av_log(ost, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
851  return AVERROR(EINVAL);
852  }
853 
854  opt_match_per_stream_int(ost, &o->audio_sample_rate, oc, st, &audio_enc->sample_rate);
855  opt_match_per_stream_str(ost, &o->apad, oc, st, &ms->apad);
856  }
857 
858  return 0;
859 }
860 
861 static int new_stream_subtitle(Muxer *mux, const OptionsContext *o,
862  OutputStream *ost)
863 {
864  AVStream *st;
865 
866  st = ost->st;
867 
868  if (ost->enc) {
869  AVCodecContext *subtitle_enc = ost->enc->enc_ctx;
870 
871  AVCodecDescriptor const *input_descriptor =
872  avcodec_descriptor_get(ost->ist->par->codec_id);
873  AVCodecDescriptor const *output_descriptor =
874  avcodec_descriptor_get(subtitle_enc->codec_id);
875  int input_props = 0, output_props = 0;
876 
877  const char *frame_size = NULL;
878 
880  if (frame_size) {
881  int ret = av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size);
882  if (ret < 0) {
883  av_log(ost, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
884  return ret;
885  }
886  }
887  if (input_descriptor)
888  input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
889  if (output_descriptor)
890  output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
891  if (input_props && output_props && input_props != output_props) {
893  "Subtitle encoding currently only possible from text to text "
894  "or bitmap to bitmap\n");
895  return AVERROR(EINVAL);
896  }
897  }
898 
899  return 0;
900 }
901 
902 static int
903 ost_bind_filter(const Muxer *mux, MuxStream *ms, OutputFilter *ofilter,
904  const OptionsContext *o,
905  AVRational enc_tb, enum VideoSyncMethod vsync_method,
906  int keep_pix_fmt, int autoscale, int threads_manual,
907  const ViewSpecifier *vs,
909 {
910  OutputStream *ost = &ms->ost;
911  AVCodecContext *enc_ctx = ost->enc->enc_ctx;
912  char name[16];
913  char *filters = NULL;
914  int ret;
915 
917  .enc = enc_ctx->codec,
918  .name = name,
919  .format = (ost->type == AVMEDIA_TYPE_VIDEO) ?
920  enc_ctx->pix_fmt : enc_ctx->sample_fmt,
921  .width = enc_ctx->width,
922  .height = enc_ctx->height,
923  .color_space = enc_ctx->colorspace,
924  .color_range = enc_ctx->color_range,
925  .alpha_mode = enc_ctx->alpha_mode,
926  .vsync_method = vsync_method,
927  .frame_rate = ms->frame_rate,
928  .max_frame_rate = ms->max_frame_rate,
929  .sample_rate = enc_ctx->sample_rate,
930  .ch_layout = enc_ctx->ch_layout,
931  .sws_opts = o->g->sws_dict,
932  .swr_opts = o->g->swr_opts,
933  .output_tb = enc_tb,
934  .trim_start_us = mux->of.start_time,
935  .trim_duration_us = mux->of.recording_time,
936  .ts_offset = mux->of.start_time == AV_NOPTS_VALUE ?
937  0 : mux->of.start_time,
938  .vs = vs,
939  .nb_threads = -1,
940 
941  .flags = OFILTER_FLAG_DISABLE_CONVERT * !!keep_pix_fmt |
942  OFILTER_FLAG_AUTOSCALE * !!autoscale |
944  };
945 
946  snprintf(name, sizeof(name), "#%d:%d", mux->of.index, ost->index);
947 
948  if (ost->type == AVMEDIA_TYPE_VIDEO) {
949  if (!keep_pix_fmt) {
952  (const void **) &opts.pix_fmts, NULL);
953  if (ret < 0)
954  return ret;
955  }
956  if (!ms->force_fps) {
959  (const void **) &opts.frame_rates, NULL);
960  if (ret < 0)
961  return ret;
962  }
965  (const void **) &opts.color_spaces, NULL);
966  if (ret < 0)
967  return ret;
970  (const void **) &opts.color_ranges, NULL);
971  if (ret < 0)
972  return ret;
975  (const void **) &opts.alpha_modes, NULL);
976  if (ret < 0)
977  return ret;
978  } else {
981  (const void **) &opts.sample_fmts, NULL);
982  if (ret < 0)
983  return ret;
986  (const void **) &opts.sample_rates, NULL);
987  if (ret < 0)
988  return ret;
991  (const void **) &opts.ch_layouts, NULL);
992  if (ret < 0)
993  return ret;
994  }
995 
996  if (threads_manual) {
997  ret = av_opt_get_int(enc_ctx, "threads", 0, &opts.nb_threads);
998  if (ret < 0)
999  return ret;
1000  }
1001 
1002  ret = ost_get_filters(o, mux->fc, ost, &filters);
1003  if (ret < 0)
1004  return ret;
1005 
1006  if (ofilter) {
1007  av_assert0(!filters);
1008  ost->filter = ofilter;
1009  ret = ofilter_bind_enc(ofilter, ms->sch_idx_enc, &opts);
1010  } else {
1011  ret = fg_create_simple(&ost->fg_simple, ost->ist, &filters,
1012  mux->sch, ms->sch_idx_enc, &opts);
1013  if (ret >= 0)
1014  ost->filter = ost->fg_simple->outputs[0];
1015 
1016  }
1017  if (ret < 0)
1018  return ret;
1019 
1020  *src = SCH_ENC(ms->sch_idx_enc);
1021 
1022  return 0;
1023 }
1024 
1025 static int streamcopy_init(const OptionsContext *o, const Muxer *mux,
1026  OutputStream *ost, AVDictionary **encoder_opts)
1027 {
1028  MuxStream *ms = ms_from_ost(ost);
1029 
1030  const InputStream *ist = ost->ist;
1031  const InputFile *ifile = ist->file;
1032 
1033  AVCodecParameters *par = ms->par_in;
1034  uint32_t codec_tag = par->codec_tag;
1035 
1036  AVCodecContext *codec_ctx = NULL;
1037 
1038  AVRational fr = ms->frame_rate;
1039 
1040  int ret = 0;
1041 
1042  const char *filters = NULL;
1043 #if FFMPEG_OPT_FILTER_SCRIPT
1044  const char *filters_script = NULL;
1045 
1046  opt_match_per_stream_str(ost, &o->filter_scripts, mux->fc, ost->st, &filters_script);
1047 #endif
1048  opt_match_per_stream_str(ost, &o->filters, mux->fc, ost->st, &filters);
1049 
1050  if (
1052  filters_script ||
1053 #endif
1054  filters) {
1056  "%s '%s' was specified, but codec copy was selected. "
1057  "Filtering and streamcopy cannot be used together.\n",
1059  filters ? "Filtergraph" : "Filtergraph script",
1060  filters ? filters : filters_script
1061 #else
1062  "Filtergraph", filters
1063 #endif
1064  );
1065  return AVERROR(EINVAL);
1066  }
1067 
1068  codec_ctx = avcodec_alloc_context3(NULL);
1069  if (!codec_ctx)
1070  return AVERROR(ENOMEM);
1071 
1072  ret = avcodec_parameters_to_context(codec_ctx, ist->par);
1073  if (ret >= 0)
1074  ret = av_opt_set_dict(codec_ctx, encoder_opts);
1075  if (ret < 0) {
1077  "Error setting up codec context options.\n");
1078  goto fail;
1079  }
1080 
1081  ret = avcodec_parameters_from_context(par, codec_ctx);
1082  if (ret < 0) {
1084  "Error getting reference codec parameters.\n");
1085  goto fail;
1086  }
1087 
1088  if (!codec_tag) {
1089  const struct AVCodecTag * const *ct = mux->fc->oformat->codec_tag;
1090  unsigned int codec_tag_tmp;
1091  if (!ct || av_codec_get_id (ct, par->codec_tag) == par->codec_id ||
1092  !av_codec_get_tag2(ct, par->codec_id, &codec_tag_tmp))
1093  codec_tag = par->codec_tag;
1094  }
1095 
1096  par->codec_tag = codec_tag;
1097 
1098  if (!fr.num)
1099  fr = ist->framerate;
1100 
1101  if (fr.num)
1102  ost->st->avg_frame_rate = fr;
1103  else
1104  ost->st->avg_frame_rate = ist->st->avg_frame_rate;
1105 
1106  // copy timebase while removing common factors
1107  if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0) {
1108  if (fr.num)
1109  ost->st->time_base = av_inv_q(fr);
1110  else
1111  ost->st->time_base = av_add_q(ist->st->time_base, (AVRational){0, 1});
1112  }
1113 
1114  if (!ms->copy_prior_start) {
1115  ms->ts_copy_start = (mux->of.start_time == AV_NOPTS_VALUE) ?
1116  0 : mux->of.start_time;
1117  if (copy_ts && ifile->start_time != AV_NOPTS_VALUE) {
1118  ms->ts_copy_start = FFMAX(ms->ts_copy_start,
1119  ifile->start_time + ifile->ts_offset);
1120  }
1121  }
1122 
1123  for (int i = 0; i < ist->st->codecpar->nb_coded_side_data; i++) {
1124  const AVPacketSideData *sd_src = &ist->st->codecpar->coded_side_data[i];
1125  AVPacketSideData *sd_dst;
1126 
1129  sd_src->type, sd_src->size, 0);
1130  if (!sd_dst) {
1131  ret = AVERROR(ENOMEM);
1132  goto fail;
1133  }
1134  memcpy(sd_dst->data, sd_src->data, sd_src->size);
1135  }
1136 
1137  switch (par->codec_type) {
1138  case AVMEDIA_TYPE_AUDIO:
1139  if ((par->block_align == 1 || par->block_align == 1152 || par->block_align == 576) &&
1140  par->codec_id == AV_CODEC_ID_MP3)
1141  par->block_align = 0;
1142  if (par->codec_id == AV_CODEC_ID_AC3)
1143  par->block_align = 0;
1144  break;
1145  case AVMEDIA_TYPE_VIDEO: {
1146  AVRational sar;
1147  if (ost->frame_aspect_ratio.num) { // overridden by the -aspect cli option
1148  sar =
1149  av_mul_q(ost->frame_aspect_ratio,
1150  (AVRational){ par->height, par->width });
1151  av_log(ost, AV_LOG_WARNING, "Overriding aspect ratio "
1152  "with stream copy may produce invalid files\n");
1153  }
1154  else if (ist->st->sample_aspect_ratio.num)
1155  sar = ist->st->sample_aspect_ratio;
1156  else
1157  sar = par->sample_aspect_ratio;
1158  ost->st->sample_aspect_ratio = par->sample_aspect_ratio = sar;
1159  ost->st->r_frame_rate = ist->st->r_frame_rate;
1160  break;
1161  }
1162  }
1163 
1164 fail:
1165  avcodec_free_context(&codec_ctx);
1166  return ret;
1167 }
1168 
1169 static int set_encoder_id(OutputStream *ost, const AVCodec *codec)
1170 {
1171  const char *cname = codec->name;
1172  uint8_t *encoder_string;
1173  int encoder_string_len;
1174 
1175  encoder_string_len = sizeof(LIBAVCODEC_IDENT) + strlen(cname) + 2;
1176  encoder_string = av_mallocz(encoder_string_len);
1177  if (!encoder_string)
1178  return AVERROR(ENOMEM);
1179 
1180  if (!ost->file->bitexact && !ost->bitexact)
1181  av_strlcpy(encoder_string, LIBAVCODEC_IDENT " ", encoder_string_len);
1182  else
1183  av_strlcpy(encoder_string, "Lavc ", encoder_string_len);
1184  av_strlcat(encoder_string, cname, encoder_string_len);
1185  av_dict_set(&ost->st->metadata, "encoder", encoder_string,
1187 
1188  return 0;
1189 }
1190 
1191 static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type,
1192  InputStream *ist, OutputFilter *ofilter, const ViewSpecifier *vs,
1193  OutputStream **post)
1194 {
1195  AVFormatContext *oc = mux->fc;
1196  MuxStream *ms;
1197  OutputStream *ost;
1198  const AVCodec *enc;
1199  AVStream *st;
1200  SchedulerNode src = { .type = SCH_NODE_TYPE_NONE };
1201  AVDictionary *encoder_opts = NULL;
1202  int ret = 0, keep_pix_fmt = 0, autoscale = 1;
1203  int threads_manual = 0;
1204  AVRational enc_tb = { 0, 0 };
1205  enum VideoSyncMethod vsync_method = VSYNC_AUTO;
1206  const char *bsfs = NULL, *time_base = NULL, *codec_tag = NULL;
1207  char *next;
1208  double qscale = -1;
1209 
1210  st = avformat_new_stream(oc, NULL);
1211  if (!st)
1212  return AVERROR(ENOMEM);
1213 
1214  ms = mux_stream_alloc(mux, type);
1215  if (!ms)
1216  return AVERROR(ENOMEM);
1217 
1218  // only streams with sources (i.e. not attachments)
1219  // are handled by the scheduler
1220  if (ist || ofilter) {
1222  if (ret < 0)
1223  return ret;
1224 
1225  ret = sch_add_mux_stream(mux->sch, mux->sch_idx);
1226  if (ret < 0)
1227  return ret;
1228 
1229  av_assert0(ret == mux->nb_sch_stream_idx - 1);
1230  mux->sch_stream_idx[ret] = ms->ost.index;
1231  ms->sch_idx = ret;
1232  }
1233 
1234  ost = &ms->ost;
1235 
1236  if (o->streamid) {
1237  AVDictionaryEntry *e;
1238  char idx[16], *p;
1239  snprintf(idx, sizeof(idx), "%d", ost->index);
1240 
1241  e = av_dict_get(o->streamid, idx, NULL, 0);
1242  if (e) {
1243  st->id = strtol(e->value, &p, 0);
1244  if (!e->value[0] || *p) {
1245  av_log(ost, AV_LOG_FATAL, "Invalid stream id: %s\n", e->value);
1246  return AVERROR(EINVAL);
1247  }
1248  }
1249  }
1250 
1252  if (!ms->par_in)
1253  return AVERROR(ENOMEM);
1254 
1256 
1257  ost->st = st;
1258  ost->ist = ist;
1259  ost->kf.ref_pts = AV_NOPTS_VALUE;
1260  ms->par_in->codec_type = type;
1261  st->codecpar->codec_type = type;
1262 
1263  ret = choose_encoder(o, oc, ms, &enc);
1264  if (ret < 0) {
1265  av_log(ost, AV_LOG_FATAL, "Error selecting an encoder\n");
1266  return ret;
1267  }
1268 
1269  if (enc) {
1271  ost->type == AVMEDIA_TYPE_SUBTITLE ? NULL : enc_open);
1272  if (ret < 0)
1273  return ret;
1274  ms->sch_idx_enc = ret;
1275 
1276  ret = enc_alloc(&ost->enc, enc, mux->sch, ms->sch_idx_enc, ost);
1277  if (ret < 0)
1278  return ret;
1279 
1280  av_strlcat(ms->log_name, "/", sizeof(ms->log_name));
1281  av_strlcat(ms->log_name, enc->name, sizeof(ms->log_name));
1282  } else {
1283  if (ofilter) {
1285  "Streamcopy requested for output stream fed "
1286  "from a complex filtergraph. Filtering and streamcopy "
1287  "cannot be used together.\n");
1288  return AVERROR(EINVAL);
1289  }
1290 
1291  av_strlcat(ms->log_name, "/copy", sizeof(ms->log_name));
1292  }
1293 
1294  av_log(ost, AV_LOG_VERBOSE, "Created %s stream from ",
1296  if (ist)
1297  av_log(ost, AV_LOG_VERBOSE, "input stream %d:%d",
1298  ist->file->index, ist->index);
1299  else if (ofilter)
1300  av_log(ost, AV_LOG_VERBOSE, "complex filtergraph %d:[%s]\n",
1301  ofilter->graph->index, ofilter->name);
1302  else if (type == AVMEDIA_TYPE_ATTACHMENT)
1303  av_log(ost, AV_LOG_VERBOSE, "attached file");
1304  else av_assert0(0);
1305  av_log(ost, AV_LOG_VERBOSE, "\n");
1306 
1307  ms->pkt = av_packet_alloc();
1308  if (!ms->pkt)
1309  return AVERROR(ENOMEM);
1310 
1311  if (ost->enc) {
1312  AVIOContext *s = NULL;
1313  char *buf = NULL, *arg = NULL;
1314  const char *enc_stats_pre = NULL, *enc_stats_post = NULL, *mux_stats = NULL;
1315  const char *enc_time_base = NULL, *preset = NULL;
1316 
1317  ret = filter_codec_opts(o->g->codec_opts, enc->id,
1318  oc, st, enc, &encoder_opts,
1319  &mux->enc_opts_used);
1320  if (ret < 0)
1321  goto fail;
1322 
1323  opt_match_per_stream_str(ost, &o->presets, oc, st, &preset);
1324  opt_match_per_stream_int(ost, &o->autoscale, oc, st, &autoscale);
1325  if (preset && (!(ret = get_preset_file_2(preset, enc->name, &s)))) {
1326  AVBPrint bprint;
1328  do {
1329  av_bprint_clear(&bprint);
1330  buf = get_line(s, &bprint);
1331  if (!buf) {
1332  ret = AVERROR(ENOMEM);
1333  break;
1334  }
1335 
1336  if (!buf[0] || buf[0] == '#')
1337  continue;
1338  if (!(arg = strchr(buf, '='))) {
1339  av_log(ost, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1340  ret = AVERROR(EINVAL);
1341  break;
1342  }
1343  *arg++ = 0;
1344  av_dict_set(&encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1345  } while (!s->eof_reached);
1346  av_bprint_finalize(&bprint, NULL);
1347  avio_closep(&s);
1348  }
1349  if (ret) {
1351  "Preset %s specified, but could not be opened.\n", preset);
1352  goto fail;
1353  }
1354 
1355  opt_match_per_stream_str(ost, &o->enc_stats_pre, oc, st, &enc_stats_pre);
1356  if (enc_stats_pre &&
1358  const char *format = "{fidx} {sidx} {n} {t}";
1359 
1361 
1362  ret = enc_stats_init(ost, &ost->enc_stats_pre, 1, enc_stats_pre, format);
1363  if (ret < 0)
1364  goto fail;
1365  }
1366 
1367  opt_match_per_stream_str(ost, &o->enc_stats_post, oc, st, &enc_stats_post);
1368  if (enc_stats_post &&
1370  const char *format = "{fidx} {sidx} {n} {t}";
1371 
1373 
1374  ret = enc_stats_init(ost, &ost->enc_stats_post, 0, enc_stats_post, format);
1375  if (ret < 0)
1376  goto fail;
1377  }
1378 
1379  opt_match_per_stream_str(ost, &o->mux_stats, oc, st, &mux_stats);
1380  if (mux_stats &&
1382  const char *format = "{fidx} {sidx} {n} {t}";
1383 
1385 
1386  ret = enc_stats_init(ost, &ms->stats, 0, mux_stats, format);
1387  if (ret < 0)
1388  goto fail;
1389  }
1390 
1391  opt_match_per_stream_str(ost, &o->enc_time_bases, oc, st, &enc_time_base);
1392  if (enc_time_base && type == AVMEDIA_TYPE_SUBTITLE)
1394  "-enc_time_base not supported for subtitles, ignoring\n");
1395  else if (enc_time_base) {
1396  AVRational q;
1397 
1398  if (!strcmp(enc_time_base, "demux")) {
1399  q = (AVRational){ ENC_TIME_BASE_DEMUX, 0 };
1400  } else if (!strcmp(enc_time_base, "filter")) {
1401  q = (AVRational){ ENC_TIME_BASE_FILTER, 0 };
1402  } else {
1403  ret = av_parse_ratio(&q, enc_time_base, INT_MAX, 0, NULL);
1404  if (ret < 0 || q.den <= 0
1406  || q.num < 0
1407 #endif
1408  ) {
1409  av_log(ost, AV_LOG_FATAL, "Invalid time base: %s\n", enc_time_base);
1410  ret = ret < 0 ? ret : AVERROR(EINVAL);
1411  goto fail;
1412  }
1413 #if FFMPEG_OPT_ENC_TIME_BASE_NUM
1414  if (q.num < 0)
1415  av_log(ost, AV_LOG_WARNING, "-enc_time_base -1 is deprecated,"
1416  " use -enc_time_base demux\n");
1417 #endif
1418  }
1419 
1420  enc_tb = q;
1421  }
1422 
1423  threads_manual = !!av_dict_get(encoder_opts, "threads", NULL, 0);
1424 
1425  ret = av_opt_set_dict2(ost->enc->enc_ctx, &encoder_opts, AV_OPT_SEARCH_CHILDREN);
1426  if (ret < 0) {
1427  av_log(ost, AV_LOG_ERROR, "Error applying encoder options: %s\n",
1428  av_err2str(ret));
1429  goto fail;
1430  }
1431 
1432  ret = check_avoptions(encoder_opts);
1433  if (ret < 0)
1434  goto fail;
1435 
1436  // default to automatic thread count
1437  if (!threads_manual)
1438  ost->enc->enc_ctx->thread_count = 0;
1439  } else {
1441  NULL, &encoder_opts,
1442  &mux->enc_opts_used);
1443  if (ret < 0)
1444  goto fail;
1445  }
1446 
1447 
1448  if (o->bitexact) {
1449  ost->bitexact = 1;
1450  } else if (ost->enc) {
1451  ost->bitexact = !!(ost->enc->enc_ctx->flags & AV_CODEC_FLAG_BITEXACT);
1452  }
1453 
1454  if (enc) {
1455  ret = set_encoder_id(ost, enc);
1456  if (ret < 0)
1457  return ret;
1458  }
1459 
1460  opt_match_per_stream_str(ost, &o->time_bases, oc, st, &time_base);
1461  if (time_base) {
1462  AVRational q;
1463  if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1464  q.num <= 0 || q.den <= 0) {
1465  av_log(ost, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1466  ret = AVERROR(EINVAL);
1467  goto fail;
1468  }
1469  st->time_base = q;
1470  }
1471 
1472  ms->max_frames = INT64_MAX;
1474  for (int i = 0; i < o->max_frames.nb_opt; i++) {
1475  char *p = o->max_frames.opt[i].specifier;
1476  if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1477  av_log(ost, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1478  break;
1479  }
1480  }
1481 
1482  ms->copy_prior_start = -1;
1484  opt_match_per_stream_str(ost, &o->bitstream_filters, oc, st, &bsfs);
1485  if (bsfs && *bsfs) {
1486  ret = av_bsf_list_parse_str(bsfs, &ms->bsf_ctx);
1487  if (ret < 0) {
1488  av_log(ost, AV_LOG_ERROR, "Error parsing bitstream filter sequence '%s': %s\n", bsfs, av_err2str(ret));
1489  goto fail;
1490  }
1491  }
1492 
1493  opt_match_per_stream_str(ost, &o->codec_tags, oc, st, &codec_tag);
1494  if (codec_tag) {
1495  uint32_t tag = strtol(codec_tag, &next, 0);
1496  if (*next) {
1497  uint8_t buf[4] = { 0 };
1498  memcpy(buf, codec_tag, FFMIN(sizeof(buf), strlen(codec_tag)));
1499  tag = AV_RL32(buf);
1500  }
1501  ost->st->codecpar->codec_tag = tag;
1502  ms->par_in->codec_tag = tag;
1503  if (ost->enc)
1504  ost->enc->enc_ctx->codec_tag = tag;
1505  }
1506 
1507  opt_match_per_stream_dbl(ost, &o->qscale, oc, st, &qscale);
1508  if (ost->enc && qscale >= 0) {
1509  ost->enc->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1510  ost->enc->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1511  }
1512 
1513  if (ms->sch_idx >= 0) {
1514  int max_muxing_queue_size = 128;
1515  int muxing_queue_data_threshold = 50 * 1024 * 1024;
1516 
1518  &max_muxing_queue_size);
1520  oc, st, &muxing_queue_data_threshold);
1521 
1522  sch_mux_stream_buffering(mux->sch, mux->sch_idx, ms->sch_idx,
1523  max_muxing_queue_size, muxing_queue_data_threshold);
1524  }
1525 
1527  &ost->bits_per_raw_sample);
1528 
1530  oc, st, &ost->fix_sub_duration_heartbeat);
1531 
1532  if (oc->oformat->flags & AVFMT_GLOBALHEADER && ost->enc)
1533  ost->enc->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1534  if (oc->oformat->flags & AVFMT_FIXED_FRAMESIZE && ost->enc)
1535  ost->enc->enc_ctx->flags2 |= AV_CODEC_FLAG2_FIXED_FRAME_SIZE;
1536 
1538  oc, st, &ms->copy_initial_nonkeyframes);
1539  switch (type) {
1540  case AVMEDIA_TYPE_VIDEO: ret = new_stream_video (mux, o, ost, &keep_pix_fmt, &vsync_method); break;
1541  case AVMEDIA_TYPE_AUDIO: ret = new_stream_audio (mux, o, ost); break;
1542  case AVMEDIA_TYPE_SUBTITLE: ret = new_stream_subtitle (mux, o, ost); break;
1543  }
1544  if (ret < 0)
1545  goto fail;
1546 
1547  if (ost->enc &&
1549  ret = ost_bind_filter(mux, ms, ofilter, o, enc_tb, vsync_method,
1550  keep_pix_fmt, autoscale, threads_manual, vs, &src);
1551  if (ret < 0)
1552  goto fail;
1553  } else if (ost->ist) {
1554  ret = ist_use(ost->ist, !!ost->enc, NULL, &src);
1555  if (ret < 0) {
1557  "Error binding an input stream\n");
1558  goto fail;
1559  }
1560  ms->sch_idx_src = src.idx;
1561 
1562  // src refers to a decoder for transcoding, demux stream otherwise
1563  if (ost->enc) {
1564  ret = sch_connect(mux->sch,
1565  src, SCH_ENC(ms->sch_idx_enc));
1566  if (ret < 0)
1567  goto fail;
1568  src = SCH_ENC(ms->sch_idx_enc);
1569  }
1570  }
1571 
1572  if (src.type != SCH_NODE_TYPE_NONE) {
1573  ret = sch_connect(mux->sch,
1574  src, SCH_MSTREAM(mux->sch_idx, ms->sch_idx));
1575  if (ret < 0)
1576  goto fail;
1577  } else {
1578  // only attachment streams don't have a source
1580  }
1581 
1582  if (ost->ist && !ost->enc) {
1583  ret = streamcopy_init(o, mux, ost, &encoder_opts);
1584  if (ret < 0)
1585  goto fail;
1586  }
1587 
1588  // copy estimated duration as a hint to the muxer
1589  if (ost->ist && ost->ist->st->duration > 0) {
1590  ms->stream_duration = ist->st->duration;
1591  ms->stream_duration_tb = ist->st->time_base;
1592  }
1593 
1594  if (post)
1595  *post = ost;
1596 
1597  ret = 0;
1598 
1599 fail:
1600  av_dict_free(&encoder_opts);
1601 
1602  return ret;
1603 }
1604 
1605 static int map_auto_video(Muxer *mux, const OptionsContext *o)
1606 {
1607  AVFormatContext *oc = mux->fc;
1608  InputStreamGroup *best_istg = NULL;
1609  InputStream *best_ist = NULL;
1610  int64_t best_score = 0;
1611  int qcr;
1612 
1613  /* video: highest resolution */
1615  return 0;
1616 
1617  qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
1618  for (int j = 0; j < nb_input_files; j++) {
1619  InputFile *ifile = input_files[j];
1620  InputStreamGroup *file_best_istg = NULL;
1621  InputStream *file_best_ist = NULL;
1622  int64_t file_best_score = 0;
1623  for (int i = 0; i < ifile->nb_stream_groups; i++) {
1624  InputStreamGroup *istg = ifile->stream_groups[i];
1625  int64_t score = 0;
1626 
1627  if (!istg->fg)
1628  continue;
1629 
1630  for (int j = 0; j < istg->stg->nb_streams; j++) {
1631  AVStream *st = istg->stg->streams[j];
1632 
1634  score = 100000000;
1635  break;
1636  }
1637  }
1638 
1639  switch (istg->stg->type) {
1641  const AVStreamGroupTileGrid *tg = istg->stg->params.tile_grid;
1642  score += tg->width * (int64_t)tg->height
1643  + 5000000*!!(istg->stg->disposition & AV_DISPOSITION_DEFAULT);
1644  break;
1645  }
1646  default:
1647  continue;
1648  }
1649 
1650  if (score > file_best_score) {
1651  file_best_score = score;
1652  file_best_istg = istg;
1653  }
1654  }
1655  for (int i = 0; i < ifile->nb_streams; i++) {
1656  InputStream *ist = ifile->streams[i];
1658  int64_t score;
1659 
1660  if (ist->user_set_discard == AVDISCARD_ALL ||
1662  (desc && (desc->props & AV_CODEC_PROP_ENHANCEMENT)))
1663  continue;
1664 
1665  score = ist->st->codecpar->width * (int64_t)ist->st->codecpar->height
1666  + 100000000 * !!(ist->st->event_flags & AVSTREAM_EVENT_FLAG_NEW_PACKETS)
1667  + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
1668  if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1669  score = 1;
1670 
1671  if (score > file_best_score) {
1672  if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1673  continue;
1674  file_best_score = score;
1675  file_best_ist = ist;
1676  file_best_istg = NULL;
1677  }
1678  }
1679  if (file_best_istg) {
1680  file_best_score -= 5000000*!!(file_best_istg->stg->disposition & AV_DISPOSITION_DEFAULT);
1681  if (file_best_score > best_score) {
1682  best_score = file_best_score;
1683  best_istg = file_best_istg;
1684  best_ist = NULL;
1685  }
1686  }
1687  if (file_best_ist) {
1688  if((qcr == MKTAG('A', 'P', 'I', 'C')) ||
1689  !(file_best_ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1690  file_best_score -= 5000000*!!(file_best_ist->st->disposition & AV_DISPOSITION_DEFAULT);
1691  if (file_best_score > best_score) {
1692  best_score = file_best_score;
1693  best_ist = file_best_ist;
1694  best_istg = NULL;
1695  }
1696  }
1697  }
1698  if (best_istg) {
1699  FilterGraph *fg = best_istg->fg;
1700  OutputFilter *ofilter = fg->outputs[0];
1701 
1702  av_assert0(fg->nb_outputs == 1);
1703  av_log(mux, AV_LOG_VERBOSE, "Creating output stream from stream group derived complex filtergraph %d.\n", fg->index);
1704 
1705  return ost_add(mux, o, AVMEDIA_TYPE_VIDEO, NULL, ofilter, NULL, NULL);
1706  }
1707  if (best_ist)
1708  return ost_add(mux, o, AVMEDIA_TYPE_VIDEO, best_ist, NULL, NULL, NULL);
1709 
1710  return 0;
1711 }
1712 
1713 static int map_auto_audio(Muxer *mux, const OptionsContext *o)
1714 {
1715  AVFormatContext *oc = mux->fc;
1716  InputStream *best_ist = NULL;
1717  int best_score = 0;
1718 
1719  /* audio: most channels */
1721  return 0;
1722 
1723  for (int j = 0; j < nb_input_files; j++) {
1724  InputFile *ifile = input_files[j];
1725  InputStream *file_best_ist = NULL;
1726  int file_best_score = 0;
1727  for (int i = 0; i < ifile->nb_streams; i++) {
1728  InputStream *ist = ifile->streams[i];
1729  int score;
1730 
1731  if (ist->user_set_discard == AVDISCARD_ALL ||
1733  continue;
1734 
1735  score = ist->st->codecpar->ch_layout.nb_channels
1736  + 100000000 * !!(ist->st->event_flags & AVSTREAM_EVENT_FLAG_NEW_PACKETS)
1737  + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
1738  if (score > file_best_score) {
1739  file_best_score = score;
1740  file_best_ist = ist;
1741  }
1742  }
1743  if (file_best_ist) {
1744  file_best_score -= 5000000*!!(file_best_ist->st->disposition & AV_DISPOSITION_DEFAULT);
1745  if (file_best_score > best_score) {
1746  best_score = file_best_score;
1747  best_ist = file_best_ist;
1748  }
1749  }
1750  }
1751  if (best_ist)
1752  return ost_add(mux, o, AVMEDIA_TYPE_AUDIO, best_ist, NULL, NULL, NULL);
1753 
1754  return 0;
1755 }
1756 
1757 static int map_auto_subtitle(Muxer *mux, const OptionsContext *o)
1758 {
1759  AVFormatContext *oc = mux->fc;
1760  const char *subtitle_codec_name = NULL;
1761 
1762  /* subtitles: pick first */
1765  return 0;
1766 
1767  for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist))
1768  if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1769  AVCodecDescriptor const *input_descriptor =
1770  avcodec_descriptor_get(ist->st->codecpar->codec_id);
1771  AVCodecDescriptor const *output_descriptor = NULL;
1772  AVCodec const *output_codec =
1774  int input_props = 0, output_props = 0;
1775  if (ist->user_set_discard == AVDISCARD_ALL)
1776  continue;
1777  if (output_codec)
1778  output_descriptor = avcodec_descriptor_get(output_codec->id);
1779  if (input_descriptor)
1780  input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1781  if (output_descriptor)
1782  output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1783  if (subtitle_codec_name ||
1784  input_props & output_props ||
1785  // Map dvb teletext which has neither property to any output subtitle encoder
1786  input_descriptor && output_descriptor &&
1787  (!input_descriptor->props ||
1788  !output_descriptor->props)) {
1789  return ost_add(mux, o, AVMEDIA_TYPE_SUBTITLE, ist, NULL, NULL, NULL);
1790  }
1791  }
1792 
1793  return 0;
1794 }
1795 
1796 static int map_auto_data(Muxer *mux, const OptionsContext *o)
1797 {
1798  AVFormatContext *oc = mux->fc;
1799  /* Data only if codec id match */
1801 
1802  if (codec_id == AV_CODEC_ID_NONE)
1803  return 0;
1804 
1805  for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist)) {
1806  if (ist->user_set_discard == AVDISCARD_ALL)
1807  continue;
1808  if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA &&
1809  ist->st->codecpar->codec_id == codec_id) {
1810  int ret = ost_add(mux, o, AVMEDIA_TYPE_DATA, ist, NULL, NULL, NULL);
1811  if (ret < 0)
1812  return ret;
1813  }
1814  }
1815 
1816  return 0;
1817 }
1818 
1819 static int map_manual(Muxer *mux, const OptionsContext *o, const StreamMap *map)
1820 {
1821  InputStream *ist;
1822  int ret;
1823 
1824  if (map->disabled)
1825  return 0;
1826 
1827  if (map->linklabel) {
1828  FilterGraph *fg;
1829  OutputFilter *ofilter = NULL;
1830  int j, k;
1831 
1832  for (j = 0; j < nb_filtergraphs; j++) {
1833  fg = filtergraphs[j];
1834  for (k = 0; k < fg->nb_outputs; k++) {
1835  const char *linklabel = fg->outputs[k]->linklabel;
1836  if (linklabel && !strcmp(linklabel, map->linklabel)) {
1837  ofilter = fg->outputs[k];
1838  goto loop_end;
1839  }
1840  }
1841  }
1842 loop_end:
1843  if (!ofilter) {
1844  av_log(mux, AV_LOG_FATAL, "Output with label '%s' does not exist "
1845  "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
1846  return AVERROR(EINVAL);
1847  }
1848 
1849  av_log(mux, AV_LOG_VERBOSE, "Creating output stream from an explicitly "
1850  "mapped complex filtergraph %d, output [%s]\n", fg->index, map->linklabel);
1851 
1852  ret = ost_add(mux, o, ofilter->type, NULL, ofilter, NULL, NULL);
1853  if (ret < 0)
1854  return ret;
1855  } else {
1856  const ViewSpecifier *vs = map->vs.type == VIEW_SPECIFIER_TYPE_NONE ?
1857  NULL : &map->vs;
1858 
1859  ist = input_files[map->file_index]->streams[map->stream_index];
1860  if (ist->user_set_discard == AVDISCARD_ALL) {
1861  av_log(mux, AV_LOG_FATAL, "Stream #%d:%d is disabled and cannot be mapped.\n",
1862  map->file_index, map->stream_index);
1863  return AVERROR(EINVAL);
1864  }
1866  return 0;
1868  return 0;
1870  return 0;
1871  if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
1872  return 0;
1873 
1874  if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_UNKNOWN &&
1877  "Cannot map stream #%d:%d - unsupported type.\n",
1878  map->file_index, map->stream_index);
1879  if (!ignore_unknown_streams) {
1880  av_log(mux, AV_LOG_FATAL,
1881  "If you want unsupported types ignored instead "
1882  "of failing, please use the -ignore_unknown option\n"
1883  "If you want them copied, please use -copy_unknown\n");
1884  return AVERROR(EINVAL);
1885  }
1886  return 0;
1887  }
1888 
1889  if (vs && ist->st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO) {
1890  av_log(mux, AV_LOG_ERROR,
1891  "View specifier given for mapping a %s input stream\n",
1893  return AVERROR(EINVAL);
1894  }
1895 
1896  ret = ost_add(mux, o, ist->st->codecpar->codec_type, ist, NULL, vs, NULL);
1897  if (ret < 0)
1898  return ret;
1899  }
1900 
1901  return 0;
1902 }
1903 
1904 static int of_add_attachments(Muxer *mux, const OptionsContext *o)
1905 {
1906  MuxStream *ms;
1907  OutputStream *ost;
1908  int err;
1909 
1910  for (int i = 0; i < o->nb_attachments; i++) {
1911  AVIOContext *pb;
1912  uint8_t *attachment;
1913  char *attachment_filename;
1914  const char *p;
1915  int64_t len;
1916 
1917  if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1918  av_log(mux, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1919  o->attachments[i]);
1920  return err;
1921  }
1922  if ((len = avio_size(pb)) <= 0) {
1923  av_log(mux, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1924  o->attachments[i]);
1925  err = len ? len : AVERROR_INVALIDDATA;
1926  goto read_fail;
1927  }
1928  if (len > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
1929  av_log(mux, AV_LOG_FATAL, "Attachment %s too large.\n",
1930  o->attachments[i]);
1931  err = AVERROR(ERANGE);
1932  goto read_fail;
1933  }
1934 
1935  attachment = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE);
1936  if (!attachment) {
1937  err = AVERROR(ENOMEM);
1938  goto read_fail;
1939  }
1940 
1941  err = avio_read(pb, attachment, len);
1942  if (err < 0)
1943  av_log(mux, AV_LOG_FATAL, "Error reading attachment file %s: %s\n",
1944  o->attachments[i], av_err2str(err));
1945  else if (err != len) {
1946  av_log(mux, AV_LOG_FATAL, "Could not read all %"PRId64" bytes for "
1947  "attachment file %s\n", len, o->attachments[i]);
1948  err = AVERROR(EIO);
1949  }
1950 
1951 read_fail:
1952  avio_closep(&pb);
1953  if (err < 0)
1954  return err;
1955 
1956  memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1957 
1958  av_log(mux, AV_LOG_VERBOSE, "Creating attachment stream from file %s\n",
1959  o->attachments[i]);
1960 
1961  attachment_filename = av_strdup(o->attachments[i]);
1962  if (!attachment_filename) {
1963  av_free(attachment);
1964  return AVERROR(ENOMEM);
1965  }
1966 
1967  err = ost_add(mux, o, AVMEDIA_TYPE_ATTACHMENT, NULL, NULL, NULL, &ost);
1968  if (err < 0) {
1969  av_free(attachment_filename);
1970  av_freep(&attachment);
1971  return err;
1972  }
1973 
1974  ms = ms_from_ost(ost);
1975 
1976  ost->attachment_filename = attachment_filename;
1977  ms->par_in->extradata = attachment;
1978  ms->par_in->extradata_size = len;
1979 
1980  p = strrchr(o->attachments[i], '/');
1981  av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1982  }
1983 
1984  return 0;
1985 }
1986 
1987 static int create_streams(Muxer *mux, const OptionsContext *o)
1988 {
1989  static int (* const map_func[])(Muxer *mux, const OptionsContext *o) = {
1994  };
1995 
1996  AVFormatContext *oc = mux->fc;
1997 
1998  int auto_disable =
1999  o->video_disable * (1 << AVMEDIA_TYPE_VIDEO) |
2000  o->audio_disable * (1 << AVMEDIA_TYPE_AUDIO) |
2002  o->data_disable * (1 << AVMEDIA_TYPE_DATA);
2003 
2004  int ret;
2005 
2006  /* create streams for all unlabeled output pads */
2007  for (int i = 0; i < nb_filtergraphs; i++) {
2008  FilterGraph *fg = filtergraphs[i];
2009  for (int j = 0; j < fg->nb_outputs; j++) {
2010  OutputFilter *ofilter = fg->outputs[j];
2011 
2012  if (ofilter->linklabel || ofilter->bound)
2013  continue;
2014 
2015  auto_disable |= 1 << ofilter->type;
2016 
2017  av_log(mux, AV_LOG_VERBOSE, "Creating output stream from unlabeled "
2018  "output of complex filtergraph %d.", fg->index);
2019  if (!o->nb_stream_maps)
2020  av_log(mux, AV_LOG_VERBOSE, " This overrides automatic %s mapping.",
2021  av_get_media_type_string(ofilter->type));
2022  av_log(mux, AV_LOG_VERBOSE, "\n");
2023 
2024  ret = ost_add(mux, o, ofilter->type, NULL, ofilter, NULL, NULL);
2025  if (ret < 0)
2026  return ret;
2027  }
2028  }
2029 
2030  if (!o->nb_stream_maps) {
2031  av_log(mux, AV_LOG_VERBOSE, "No explicit maps, mapping streams automatically...\n");
2032 
2033  /* pick the "best" stream of each type */
2034  for (int i = 0; i < FF_ARRAY_ELEMS(map_func); i++) {
2035  if (!map_func[i] || auto_disable & (1 << i))
2036  continue;
2037  ret = map_func[i](mux, o);
2038  if (ret < 0)
2039  return ret;
2040  }
2041  } else {
2042  av_log(mux, AV_LOG_VERBOSE, "Adding streams from explicit maps...\n");
2043 
2044  for (int i = 0; i < o->nb_stream_maps; i++) {
2045  ret = map_manual(mux, o, &o->stream_maps[i]);
2046  if (ret < 0)
2047  return ret;
2048  }
2049  }
2050 
2051  ret = of_add_attachments(mux, o);
2052  if (ret < 0)
2053  return ret;
2054 
2055  // setup fix_sub_duration_heartbeat mappings
2056  for (unsigned i = 0; i < oc->nb_streams; i++) {
2057  MuxStream *src = ms_from_ost(mux->of.streams[i]);
2058 
2059  if (!src->ost.fix_sub_duration_heartbeat)
2060  continue;
2061 
2062  for (unsigned j = 0; j < oc->nb_streams; j++) {
2063  MuxStream *dst = ms_from_ost(mux->of.streams[j]);
2064 
2065  if (src == dst || dst->ost.type != AVMEDIA_TYPE_SUBTITLE ||
2066  !dst->ost.enc || !dst->ost.ist || !dst->ost.ist->fix_sub_duration)
2067  continue;
2068 
2069  ret = sch_mux_sub_heartbeat_add(mux->sch, mux->sch_idx, src->sch_idx,
2070  dst->sch_idx_src);
2071 
2072  }
2073  }
2074 
2075  // handle -apad
2076  if (o->shortest) {
2077  int have_video = 0;
2078 
2079  for (unsigned i = 0; i < mux->of.nb_streams; i++)
2080  if (mux->of.streams[i]->type == AVMEDIA_TYPE_VIDEO) {
2081  have_video = 1;
2082  break;
2083  }
2084 
2085  for (unsigned i = 0; have_video && i < mux->of.nb_streams; i++) {
2086  MuxStream *ms = ms_from_ost(mux->of.streams[i]);
2087  OutputFilter *ofilter = ms->ost.filter;
2088 
2089  if (ms->ost.type != AVMEDIA_TYPE_AUDIO || !ms->apad || !ofilter)
2090  continue;
2091 
2092  ofilter->apad = av_strdup(ms->apad);
2093  if (!ofilter->apad)
2094  return AVERROR(ENOMEM);
2095  }
2096  }
2097  for (unsigned i = 0; i < mux->of.nb_streams; i++) {
2098  MuxStream *ms = ms_from_ost(mux->of.streams[i]);
2099  ms->apad = NULL;
2100  }
2101 
2102  if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2103  av_dump_format(oc, nb_output_files - 1, oc->url, 1);
2104  av_log(mux, AV_LOG_ERROR, "Output file does not contain any stream\n");
2105  return AVERROR(EINVAL);
2106  }
2107 
2108  return 0;
2109 }
2110 
2112  int64_t buf_size_us, int shortest)
2113 {
2114  OutputFile *of = &mux->of;
2115  int nb_av_enc = 0, nb_audio_fs = 0, nb_interleaved = 0;
2116  int limit_frames = 0, limit_frames_av_enc = 0;
2117 
2118 #define IS_AV_ENC(ost, type) \
2119  (ost->enc && (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO))
2120 #define IS_INTERLEAVED(type) (type != AVMEDIA_TYPE_ATTACHMENT)
2121 
2122  for (int i = 0; i < oc->nb_streams; i++) {
2123  OutputStream *ost = of->streams[i];
2124  MuxStream *ms = ms_from_ost(ost);
2125  enum AVMediaType type = ost->type;
2126 
2127  ms->sq_idx_mux = -1;
2128 
2129  nb_interleaved += IS_INTERLEAVED(type);
2130  nb_av_enc += IS_AV_ENC(ost, type);
2131  nb_audio_fs += (ost->enc && type == AVMEDIA_TYPE_AUDIO &&
2132  (!(ost->enc->enc_ctx->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) ||
2133  (ost->enc->enc_ctx->flags2 & AV_CODEC_FLAG2_FIXED_FRAME_SIZE)));
2134 
2135  limit_frames |= ms->max_frames < INT64_MAX;
2136  limit_frames_av_enc |= (ms->max_frames < INT64_MAX) && IS_AV_ENC(ost, type);
2137  }
2138 
2139  if (!((nb_interleaved > 1 && shortest) ||
2140  (nb_interleaved > 0 && limit_frames) ||
2141  nb_audio_fs))
2142  return 0;
2143 
2144  /* we use a sync queue before encoding when:
2145  * - 'shortest' is in effect and we have two or more encoded audio/video
2146  * streams
2147  * - at least one encoded audio/video stream is frame-limited, since
2148  * that has similar semantics to 'shortest'
2149  * - at least one audio encoder requires constant frame sizes
2150  *
2151  * Note that encoding sync queues are handled in the scheduler, because
2152  * different encoders run in different threads and need external
2153  * synchronization, while muxer sync queues can be handled inside the muxer
2154  */
2155  if ((shortest && nb_av_enc > 1) || limit_frames_av_enc || nb_audio_fs) {
2156  int sq_idx, ret;
2157 
2158  sq_idx = sch_add_sq_enc(mux->sch, buf_size_us, mux);
2159  if (sq_idx < 0)
2160  return sq_idx;
2161 
2162  for (int i = 0; i < oc->nb_streams; i++) {
2163  OutputStream *ost = of->streams[i];
2164  MuxStream *ms = ms_from_ost(ost);
2165  enum AVMediaType type = ost->type;
2166 
2167  if (!IS_AV_ENC(ost, type))
2168  continue;
2169 
2170  ret = sch_sq_add_enc(mux->sch, sq_idx, ms->sch_idx_enc,
2171  shortest || ms->max_frames < INT64_MAX,
2172  ms->max_frames);
2173  if (ret < 0)
2174  return ret;
2175  }
2176  }
2177 
2178  /* if there are any additional interleaved streams, then ALL the streams
2179  * are also synchronized before sending them to the muxer */
2180  if (nb_interleaved > nb_av_enc) {
2181  mux->sq_mux = sq_alloc(SYNC_QUEUE_PACKETS, buf_size_us, mux);
2182  if (!mux->sq_mux)
2183  return AVERROR(ENOMEM);
2184 
2185  mux->sq_pkt = av_packet_alloc();
2186  if (!mux->sq_pkt)
2187  return AVERROR(ENOMEM);
2188 
2189  for (int i = 0; i < oc->nb_streams; i++) {
2190  OutputStream *ost = of->streams[i];
2191  MuxStream *ms = ms_from_ost(ost);
2192  enum AVMediaType type = ost->type;
2193 
2194  if (!IS_INTERLEAVED(type))
2195  continue;
2196 
2197  ms->sq_idx_mux = sq_add_stream(mux->sq_mux,
2198  shortest || ms->max_frames < INT64_MAX);
2199  if (ms->sq_idx_mux < 0)
2200  return ms->sq_idx_mux;
2201 
2202  if (ms->max_frames != INT64_MAX)
2203  sq_limit_frames(mux->sq_mux, ms->sq_idx_mux, ms->max_frames);
2204  }
2205  }
2206 
2207 #undef IS_AV_ENC
2208 #undef IS_INTERLEAVED
2209 
2210  return 0;
2211 }
2212 
2213 static int of_parse_iamf_audio_element_layers(Muxer *mux, AVStreamGroup *stg, char *ptr)
2214 {
2215  AVIAMFAudioElement *audio_element = stg->params.iamf_audio_element;
2216  AVDictionary *dict = NULL;
2217  const char *token;
2218  int ret = 0;
2219 
2220  audio_element->demixing_info =
2222  audio_element->recon_gain_info =
2224 
2225  if (!audio_element->demixing_info ||
2226  !audio_element->recon_gain_info)
2227  return AVERROR(ENOMEM);
2228 
2229  /* process manually set layers and parameters */
2230  token = av_strtok(NULL, ",", &ptr);
2231  while (token) {
2232  const AVDictionaryEntry *e;
2233  int demixing = 0, recon_gain = 0;
2234  int layer = 0;
2235 
2236  if (ptr)
2237  ptr += strspn(ptr, " \n\t\r");
2238  if (av_strstart(token, "layer=", &token))
2239  layer = 1;
2240  else if (av_strstart(token, "demixing=", &token))
2241  demixing = 1;
2242  else if (av_strstart(token, "recon_gain=", &token))
2243  recon_gain = 1;
2244 
2245  av_dict_free(&dict);
2246  ret = av_dict_parse_string(&dict, token, "=", ":", 0);
2247  if (ret < 0) {
2248  av_log(mux, AV_LOG_ERROR, "Error parsing audio element specification %s\n", token);
2249  goto fail;
2250  }
2251 
2252  if (layer) {
2253  AVIAMFLayer *audio_layer = av_iamf_audio_element_add_layer(audio_element);
2254  if (!audio_layer) {
2255  av_log(mux, AV_LOG_ERROR, "Error adding layer to stream group %d\n", stg->index);
2256  ret = AVERROR(ENOMEM);
2257  goto fail;
2258  }
2259  av_opt_set_dict(audio_layer, &dict);
2260  } else if (demixing || recon_gain) {
2261  AVIAMFParamDefinition *param = demixing ? audio_element->demixing_info
2262  : audio_element->recon_gain_info;
2263  void *subblock = av_iamf_param_definition_get_subblock(param, 0);
2264 
2265  av_opt_set_dict(param, &dict);
2266  av_opt_set_dict(subblock, &dict);
2267  }
2268 
2269  // make sure that no entries are left in the dict
2270  e = NULL;
2271  if (e = av_dict_iterate(dict, e)) {
2272  av_log(mux, AV_LOG_FATAL, "Unknown layer key %s.\n", e->key);
2273  ret = AVERROR(EINVAL);
2274  goto fail;
2275  }
2276  token = av_strtok(NULL, ",", &ptr);
2277  }
2278 
2279 fail:
2280  av_dict_free(&dict);
2281  if (!ret && !audio_element->nb_layers) {
2282  av_log(mux, AV_LOG_ERROR, "No layer in audio element specification\n");
2283  ret = AVERROR(EINVAL);
2284  }
2285 
2286  return ret;
2287 }
2288 
2289 static int of_parse_iamf_submixes(Muxer *mux, AVStreamGroup *stg, char *ptr)
2290 {
2291  AVFormatContext *oc = mux->fc;
2293  AVDictionary *dict = NULL;
2294  const char *token;
2295  char *submix_str = NULL;
2296  int ret = 0;
2297 
2298  /* process manually set submixes */
2299  token = av_strtok(NULL, ",", &ptr);
2300  while (token) {
2301  AVIAMFSubmix *submix = NULL;
2302  const char *subtoken;
2303  char *subptr = NULL;
2304 
2305  if (ptr)
2306  ptr += strspn(ptr, " \n\t\r");
2307  if (!av_strstart(token, "submix=", &token)) {
2308  av_log(mux, AV_LOG_ERROR, "No submix in mix presentation specification \"%s\"\n", token);
2309  goto fail;
2310  }
2311 
2312  submix_str = av_strdup(token);
2313  if (!submix_str)
2314  goto fail;
2315 
2317  if (!submix) {
2318  av_log(mux, AV_LOG_ERROR, "Error adding submix to stream group %d\n", stg->index);
2319  ret = AVERROR(ENOMEM);
2320  goto fail;
2321  }
2322  submix->output_mix_config =
2324  if (!submix->output_mix_config) {
2325  ret = AVERROR(ENOMEM);
2326  goto fail;
2327  }
2328 
2329  subptr = NULL;
2330  subtoken = av_strtok(submix_str, "|", &subptr);
2331  while (subtoken) {
2332  const AVDictionaryEntry *e;
2333  int element = 0, layout = 0;
2334 
2335  if (subptr)
2336  subptr += strspn(subptr, " \n\t\r");
2337  if (av_strstart(subtoken, "element=", &subtoken))
2338  element = 1;
2339  else if (av_strstart(subtoken, "layout=", &subtoken))
2340  layout = 1;
2341 
2342  av_dict_free(&dict);
2343  ret = av_dict_parse_string(&dict, subtoken, "=", ":", 0);
2344  if (ret < 0) {
2345  av_log(mux, AV_LOG_ERROR, "Error parsing submix specification \"%s\"\n", subtoken);
2346  goto fail;
2347  }
2348 
2349  if (element) {
2350  AVIAMFSubmixElement *submix_element;
2351  char *endptr = NULL;
2352  int64_t idx = -1;
2353 
2354  if (e = av_dict_get(dict, "stg", NULL, 0))
2355  idx = strtoll(e->value, &endptr, 0);
2356  if (!endptr || *endptr || idx < 0 || idx >= oc->nb_stream_groups - 1 ||
2358  av_log(mux, AV_LOG_ERROR, "Invalid or missing stream group index in "
2359  "submix element specification \"%s\"\n", subtoken);
2360  ret = AVERROR(EINVAL);
2361  goto fail;
2362  }
2363  submix_element = av_iamf_submix_add_element(submix);
2364  if (!submix_element) {
2365  av_log(mux, AV_LOG_ERROR, "Error adding element to submix\n");
2366  ret = AVERROR(ENOMEM);
2367  goto fail;
2368  }
2369 
2370  submix_element->audio_element_id = oc->stream_groups[idx]->id;
2371 
2372  submix_element->element_mix_config =
2374  if (!submix_element->element_mix_config)
2375  ret = AVERROR(ENOMEM);
2376  av_dict_set(&dict, "stg", NULL, 0);
2377  av_opt_set_dict2(submix_element, &dict, AV_OPT_SEARCH_CHILDREN);
2378  } else if (layout) {
2379  AVIAMFSubmixLayout *submix_layout = av_iamf_submix_add_layout(submix);
2380  if (!submix_layout) {
2381  av_log(mux, AV_LOG_ERROR, "Error adding layout to submix\n");
2382  ret = AVERROR(ENOMEM);
2383  goto fail;
2384  }
2385  av_opt_set_dict(submix_layout, &dict);
2386  } else
2387  av_opt_set_dict2(submix, &dict, AV_OPT_SEARCH_CHILDREN);
2388 
2389  if (ret < 0) {
2390  goto fail;
2391  }
2392 
2393  // make sure that no entries are left in the dict
2394  e = NULL;
2395  while (e = av_dict_iterate(dict, e)) {
2396  av_log(mux, AV_LOG_FATAL, "Unknown submix key %s.\n", e->key);
2397  ret = AVERROR(EINVAL);
2398  goto fail;
2399  }
2400  subtoken = av_strtok(NULL, "|", &subptr);
2401  }
2402  av_freep(&submix_str);
2403 
2404  if (!submix->nb_elements) {
2405  av_log(mux, AV_LOG_ERROR, "No audio elements in submix specification \"%s\"\n", token);
2406  ret = AVERROR(EINVAL);
2407  }
2408  token = av_strtok(NULL, ",", &ptr);
2409  }
2410 
2411 fail:
2412  av_dict_free(&dict);
2413  av_free(submix_str);
2414 
2415  return ret;
2416 }
2417 
2418 static int of_serialize_options(Muxer *mux, void *obj, AVBPrint *bp)
2419 {
2420  char *ptr;
2421  int ret;
2422 
2424  &ptr, '=', ':');
2425  if (ret < 0) {
2426  av_log(mux, AV_LOG_ERROR, "Failed to serialize group\n");
2427  return ret;
2428  }
2429 
2430  av_bprintf(bp, "%s", ptr);
2431  ret = strlen(ptr);
2432  av_free(ptr);
2433 
2434  return ret;
2435 }
2436 
2437 #define SERIALIZE(parent, child) do { \
2438  ret = of_serialize_options(mux, parent->child, bp); \
2439  if (ret < 0) \
2440  return ret; \
2441 } while (0)
2442 
2443 #define SERIALIZE_LOOP_SUBBLOCK(obj) do { \
2444  for (int k = 0; k < obj->nb_subblocks; k++) { \
2445  ret = of_serialize_options(mux, \
2446  av_iamf_param_definition_get_subblock(obj, k), bp); \
2447  if (ret < 0) \
2448  return ret; \
2449  } \
2450 } while (0)
2451 
2452 #define SERIALIZE_LOOP(parent, child, suffix, separator) do { \
2453  for (int j = 0; j < parent->nb_## child ## suffix; j++) { \
2454  av_bprintf(bp, separator#child "="); \
2455  SERIALIZE(parent, child ## suffix[j]); \
2456  } \
2457 } while (0)
2458 
2460 {
2461  AVFormatContext *oc = mux->fc;
2462 
2463  for (unsigned i = 0; i < oc->nb_stream_groups; i++)
2464  if (oc->stream_groups[i]->id == id)
2465  return oc->stream_groups[i]->index;
2466 
2467  return AVERROR(EINVAL);
2468 }
2469 
2470 static int of_map_group(Muxer *mux, AVDictionary **dict, AVBPrint *bp, const char *map)
2471 {
2472  AVStreamGroup *stg;
2473  int ret, file_idx, stream_idx;
2474  char *ptr;
2475 
2476  file_idx = strtol(map, &ptr, 0);
2477  if (file_idx >= nb_input_files || file_idx < 0 || map == ptr) {
2478  av_log(mux, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2479  return AVERROR(EINVAL);
2480  }
2481 
2482  stream_idx = strtol(*ptr == '=' ? ptr + 1 : ptr, &ptr, 0);
2483  if (*ptr || stream_idx >= input_files[file_idx]->ctx->nb_stream_groups || stream_idx < 0) {
2484  av_log(mux, AV_LOG_ERROR, "Invalid input stream group index: %d.\n", stream_idx);
2485  return AVERROR(EINVAL);
2486  }
2487 
2488  stg = input_files[file_idx]->ctx->stream_groups[stream_idx];
2489  ret = of_serialize_options(mux, stg, bp);
2490  if (ret < 0)
2491  return ret;
2492 
2493  ret = av_dict_parse_string(dict, bp->str, "=", ":", 0);
2494  if (ret < 0)
2495  av_log(mux, AV_LOG_ERROR, "Error parsing mapped group specification %s\n", ptr);
2496  av_dict_set_int(dict, "type", stg->type, 0);
2497 
2498  av_bprint_clear(bp);
2499  switch(stg->type) {
2501  AVIAMFAudioElement *audio_element = stg->params.iamf_audio_element;
2502 
2503  if (audio_element->demixing_info) {
2504  AVIAMFParamDefinition *demixing_info = audio_element->demixing_info;
2505  av_bprintf(bp, ",demixing=");
2506  SERIALIZE(audio_element, demixing_info);
2507  if (ret && demixing_info->nb_subblocks)
2508  av_bprintf(bp, ":");
2509  SERIALIZE_LOOP_SUBBLOCK(demixing_info);
2510  }
2511  if (audio_element->recon_gain_info) {
2512  AVIAMFParamDefinition *recon_gain_info = audio_element->recon_gain_info;
2513  av_bprintf(bp, ",recon_gain=");
2514  SERIALIZE(audio_element, recon_gain_info);
2515  if (ret && recon_gain_info->nb_subblocks)
2516  av_bprintf(bp, ":");
2517  SERIALIZE_LOOP_SUBBLOCK(recon_gain_info);
2518  }
2519  SERIALIZE_LOOP(audio_element, layer, s, ",");
2520  break;
2521  }
2524 
2525  for (int i = 0; i < mix->nb_submixes; i++) {
2526  AVIAMFSubmix *submix = mix->submixes[i];
2527  AVIAMFParamDefinition *output_mix_config = submix->output_mix_config;
2528 
2529  av_bprintf(bp, ",submix=");
2530  SERIALIZE(mix, submixes[i]);
2531  if (ret && output_mix_config->nb_subblocks)
2532  av_bprintf(bp, ":");
2533  SERIALIZE_LOOP_SUBBLOCK(output_mix_config);
2534  for (int j = 0; j < submix->nb_elements; j++) {
2535  AVIAMFSubmixElement *element = submix->elements[j];
2536  AVIAMFParamDefinition *element_mix_config = element->element_mix_config;
2538 
2539  if (id < 0) {
2540  av_log(mux, AV_LOG_ERROR, "Invalid or missing stream group index in"
2541  "submix element");
2542  return id;
2543  }
2544 
2545  av_bprintf(bp, "|element=");
2546  SERIALIZE(submix, elements[j]);
2547  if (ret && element_mix_config->nb_subblocks)
2548  av_bprintf(bp, ":");
2549  SERIALIZE_LOOP_SUBBLOCK(element_mix_config);
2550  if (ret)
2551  av_bprintf(bp, ":");
2552  av_bprintf(bp, "stg=%"PRId64, id);
2553  }
2554  SERIALIZE_LOOP(submix, layout, s, "|");
2555  }
2556  break;
2557  }
2560  break;
2561  default:
2562  av_log(mux, AV_LOG_ERROR, "Unsupported mapped group type %d.\n", stg->type);
2563  ret = AVERROR(EINVAL);
2564  break;
2565  }
2566  return 0;
2567 }
2568 
2569 static int of_parse_group_token(Muxer *mux, const char *token, char *ptr)
2570 {
2571  AVFormatContext *oc = mux->fc;
2572  AVStreamGroup *stg;
2573  AVDictionary *dict = NULL, *tmp = NULL;
2574  char *mapped_string = NULL;
2575  const AVDictionaryEntry *e;
2576  const AVOption opts[] = {
2577  { "type", "Set group type", offsetof(AVStreamGroup, type), AV_OPT_TYPE_INT,
2578  { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, .unit = "type" },
2579  { "iamf_audio_element", NULL, 0, AV_OPT_TYPE_CONST,
2580  { .i64 = AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT }, .unit = "type" },
2581  { "iamf_mix_presentation", NULL, 0, AV_OPT_TYPE_CONST,
2582  { .i64 = AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION }, .unit = "type" },
2583  { "lcevc", NULL, 0, AV_OPT_TYPE_CONST,
2584  { .i64 = AV_STREAM_GROUP_PARAMS_LCEVC }, .unit = "type" },
2585  { "tref", NULL, 0, AV_OPT_TYPE_CONST,
2586  { .i64 = AV_STREAM_GROUP_PARAMS_TREF }, .unit = "type" },
2587  { NULL },
2588  };
2589  const AVClass class = {
2590  .class_name = "StreamGroupType",
2591  .item_name = av_default_item_name,
2592  .option = opts,
2593  .version = LIBAVUTIL_VERSION_INT,
2594  };
2595  const AVClass *pclass = &class;
2596  int type, ret;
2597 
2598  ret = av_dict_parse_string(&dict, token, "=", ":", AV_DICT_MULTIKEY);
2599  if (ret < 0) {
2600  av_log(mux, AV_LOG_ERROR, "Error parsing group specification %s\n", token);
2601  return ret;
2602  }
2603 
2604  av_dict_copy(&tmp, dict, 0);
2605  e = av_dict_get(dict, "map", NULL, 0);
2606  if (e) {
2607  AVBPrint bp;
2608 
2609  if (ptr) {
2610  av_log(mux, AV_LOG_ERROR, "Unexpected extra parameters when mapping a"
2611  " stream group\n");
2612  ret = AVERROR(EINVAL);
2613  goto end;
2614  }
2615 
2617  ret = of_map_group(mux, &tmp, &bp, e->value);
2618  if (ret < 0) {
2619  av_bprint_finalize(&bp, NULL);
2620  goto end;
2621  }
2622 
2623  av_bprint_finalize(&bp, &mapped_string);
2624  ptr = mapped_string;
2625  }
2626 
2627  // "type" is not a user settable AVOption in AVStreamGroup, so handle it here
2628  e = av_dict_get(tmp, "type", NULL, 0);
2629  if (!e) {
2630  av_log(mux, AV_LOG_ERROR, "No type specified for Stream Group in \"%s\"\n", token);
2631  ret = AVERROR(EINVAL);
2632  goto end;
2633  }
2634 
2635  ret = av_opt_eval_int(&pclass, opts, e->value, &type);
2637  ret = AVERROR(EINVAL);
2638  if (ret < 0) {
2639  av_log(mux, AV_LOG_ERROR, "Invalid group type \"%s\"\n", e->value);
2640  goto end;
2641  }
2642 
2643  stg = avformat_stream_group_create(oc, type, &tmp);
2644  if (!stg) {
2645  ret = AVERROR(ENOMEM);
2646  goto end;
2647  }
2648 
2649  e = NULL;
2650  while (e = av_dict_get(dict, "st", e, 0)) {
2651  char *endptr;
2652  int64_t idx = strtoll(e->value, &endptr, 0);
2653  if (*endptr || idx < 0 || idx >= oc->nb_streams) {
2654  av_log(mux, AV_LOG_ERROR, "Invalid stream index %"PRId64"\n", idx);
2655  ret = AVERROR(EINVAL);
2656  goto end;
2657  }
2658  ret = avformat_stream_group_add_stream(stg, oc->streams[idx]);
2659  if (ret < 0)
2660  goto end;
2661  OutputStream *ost = mux->of.streams[idx];
2664  ost->enc->enc_ctx->flags2 |= AV_CODEC_FLAG2_FIXED_FRAME_SIZE;
2665  }
2666  while (e = av_dict_get(dict, "stg", e, 0)) {
2667  char *endptr;
2668  int64_t idx = strtoll(e->value, &endptr, 0);
2669  if (*endptr || idx < 0 || idx >= oc->nb_stream_groups - 1) {
2670  av_log(mux, AV_LOG_ERROR, "Invalid stream group index %"PRId64"\n", idx);
2671  ret = AVERROR(EINVAL);
2672  goto end;
2673  }
2674  for (unsigned i = 0; i < oc->stream_groups[idx]->nb_streams; i++) {
2676  if (ret < 0)
2677  goto end;
2678  }
2679  }
2680 
2681  switch(type) {
2683  ret = of_parse_iamf_audio_element_layers(mux, stg, ptr);
2684  break;
2686  ret = of_parse_iamf_submixes(mux, stg, ptr);
2687  break;
2688  default:
2689  break;
2690  }
2691 
2692  if (ret < 0)
2693  goto end;
2694 
2695  // make sure that nothing but "st" and "stg" entries are left in the dict
2696  e = NULL;
2697  av_dict_set(&tmp, "map", NULL, 0);
2698  av_dict_set(&tmp, "type", NULL, 0);
2699  while (e = av_dict_iterate(tmp, e)) {
2700  if (!strcmp(e->key, "st") || !strcmp(e->key, "stg"))
2701  continue;
2702 
2703  av_log(mux, AV_LOG_FATAL, "Unknown group key %s.\n", e->key);
2704  ret = AVERROR(EINVAL);
2705  goto end;
2706  }
2707 
2708  ret = 0;
2709 end:
2710  av_free(mapped_string);
2711  av_dict_free(&dict);
2712  av_dict_free(&tmp);
2713 
2714  return ret;
2715 }
2716 
2717 static int of_add_groups(Muxer *mux, const OptionsContext *o)
2718 {
2719  /* process manually set groups */
2720  for (int i = 0; i < o->stream_groups.nb_opt; i++) {
2721  const char *token;
2722  char *str, *ptr = NULL;
2723  int ret = 0;
2724 
2725  str = av_strdup(o->stream_groups.opt[i].u.str);
2726  if (!str)
2727  return ret;
2728 
2729  token = av_strtok(str, ",", &ptr);
2730  if (token) {
2731  if (ptr)
2732  ptr += strspn(ptr, " \n\t\r");
2733  ret = of_parse_group_token(mux, token, ptr);
2734  }
2735 
2736  av_free(str);
2737  if (ret < 0)
2738  return ret;
2739  }
2740 
2741  return 0;
2742 }
2743 
2744 static int of_add_programs(Muxer *mux, const OptionsContext *o)
2745 {
2746  AVFormatContext *oc = mux->fc;
2747  /* process manually set programs */
2748  for (int i = 0; i < o->program.nb_opt; i++) {
2749  AVDictionary *dict = NULL;
2750  const AVDictionaryEntry *e;
2751  AVProgram *program;
2752  int ret, progid = i + 1;
2753 
2754  ret = av_dict_parse_string(&dict, o->program.opt[i].u.str, "=", ":",
2756  if (ret < 0) {
2757  av_log(mux, AV_LOG_ERROR, "Error parsing program specification %s\n",
2758  o->program.opt[i].u.str);
2759  return ret;
2760  }
2761 
2762  e = av_dict_get(dict, "program_num", NULL, 0);
2763  if (e) {
2764  progid = strtol(e->value, NULL, 0);
2765  av_dict_set(&dict, e->key, NULL, 0);
2766  }
2767 
2768  program = av_new_program(oc, progid);
2769  if (!program) {
2770  ret = AVERROR(ENOMEM);
2771  goto fail;
2772  }
2773 
2774  e = av_dict_get(dict, "title", NULL, 0);
2775  if (e) {
2776  av_dict_set(&program->metadata, e->key, e->value, 0);
2777  av_dict_set(&dict, e->key, NULL, 0);
2778  }
2779 
2780  e = NULL;
2781  while (e = av_dict_get(dict, "st", e, 0)) {
2782  int st_num = strtol(e->value, NULL, 0);
2783  av_program_add_stream_index(oc, progid, st_num);
2784  }
2785 
2786  // make sure that nothing but "st" entries are left in the dict
2787  e = NULL;
2788  while (e = av_dict_iterate(dict, e)) {
2789  if (!strcmp(e->key, "st"))
2790  continue;
2791 
2792  av_log(mux, AV_LOG_FATAL, "Unknown program key %s.\n", e->key);
2793  ret = AVERROR(EINVAL);
2794  goto fail;
2795  }
2796 
2797 fail:
2798  av_dict_free(&dict);
2799  if (ret < 0)
2800  return ret;
2801  }
2802 
2803  return 0;
2804 }
2805 
2806 /**
2807  * Parse a metadata specifier passed as 'arg' parameter.
2808  * @param arg metadata string to parse
2809  * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
2810  * @param index for type c/p, chapter/program index is written here
2811  * @param stream_spec for type s, the stream specifier is written here
2812  */
2813 static int parse_meta_type(void *logctx, const char *arg,
2814  char *type, int *index, const char **stream_spec)
2815 {
2816  if (*arg) {
2817  *type = *arg;
2818  switch (*arg) {
2819  case 'g':
2820  break;
2821  case 's':
2822  if (*(++arg) && *arg != ':') {
2823  av_log(logctx, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
2824  return AVERROR(EINVAL);
2825  }
2826  *stream_spec = *arg == ':' ? arg + 1 : "";
2827  break;
2828  case 'c':
2829  case 'p':
2830  if (*(++arg) == ':')
2831  *index = strtol(++arg, NULL, 0);
2832  break;
2833  default:
2834  av_log(logctx, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
2835  return AVERROR(EINVAL);
2836  }
2837  } else
2838  *type = 'g';
2839 
2840  return 0;
2841 }
2842 
2844  const OptionsContext *o)
2845 {
2846  for (int i = 0; i < o->metadata.nb_opt; i++) {
2847  AVDictionary **m;
2848  char type, *val;
2849  const char *stream_spec;
2850  int index = 0, ret = 0;
2851 
2852  val = strchr(o->metadata.opt[i].u.str, '=');
2853  if (!val) {
2854  av_log(of, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2855  o->metadata.opt[i].u.str);
2856  return AVERROR(EINVAL);
2857  }
2858  *val++ = 0;
2859 
2860  ret = parse_meta_type(of, o->metadata.opt[i].specifier, &type, &index, &stream_spec);
2861  if (ret < 0)
2862  return ret;
2863 
2864  if (type == 's') {
2865  for (int j = 0; j < oc->nb_streams; j++) {
2866  if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2867  av_dict_set(&oc->streams[j]->metadata, o->metadata.opt[i].u.str, *val ? val : NULL, 0);
2868  } else if (ret < 0)
2869  return ret;
2870  }
2871  } else {
2872  switch (type) {
2873  case 'g':
2874  m = &oc->metadata;
2875  break;
2876  case 'c':
2877  if (index < 0 || index >= oc->nb_chapters) {
2878  av_log(of, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2879  return AVERROR(EINVAL);
2880  }
2881  m = &oc->chapters[index]->metadata;
2882  break;
2883  case 'p':
2884  if (index < 0 || index >= oc->nb_programs) {
2885  av_log(of, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2886  return AVERROR(EINVAL);
2887  }
2888  m = &oc->programs[index]->metadata;
2889  break;
2890  default:
2891  av_log(of, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata.opt[i].specifier);
2892  return AVERROR(EINVAL);
2893  }
2894  av_dict_set(m, o->metadata.opt[i].u.str, *val ? val : NULL, 0);
2895  }
2896  }
2897 
2898  return 0;
2899 }
2900 
2901 static int copy_chapters(InputFile *ifile, OutputFile *ofile, AVFormatContext *os,
2902  int copy_metadata)
2903 {
2904  AVFormatContext *is = ifile->ctx;
2905  AVChapter **tmp;
2906 
2907  tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
2908  if (!tmp)
2909  return AVERROR(ENOMEM);
2910  os->chapters = tmp;
2911 
2912  for (int i = 0; i < is->nb_chapters; i++) {
2913  AVChapter *in_ch = is->chapters[i], *out_ch;
2914  int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
2915  int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
2916  AV_TIME_BASE_Q, in_ch->time_base);
2917  int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
2919 
2920 
2921  if (in_ch->end < ts_off)
2922  continue;
2923  if (rt != INT64_MAX && in_ch->start > rt + ts_off)
2924  break;
2925 
2926  out_ch = av_mallocz(sizeof(AVChapter));
2927  if (!out_ch)
2928  return AVERROR(ENOMEM);
2929 
2930  out_ch->id = in_ch->id;
2931  out_ch->time_base = in_ch->time_base;
2932  out_ch->start = FFMAX(0, in_ch->start - ts_off);
2933  out_ch->end = FFMIN(rt, in_ch->end - ts_off);
2934 
2935  if (copy_metadata)
2936  av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
2937 
2938  os->chapters[os->nb_chapters++] = out_ch;
2939  }
2940  return 0;
2941 }
2942 
2943 static int copy_metadata(Muxer *mux, AVFormatContext *ic,
2944  const char *outspec, const char *inspec,
2945  int *metadata_global_manual, int *metadata_streams_manual,
2946  int *metadata_chapters_manual)
2947 {
2948  AVFormatContext *oc = mux->fc;
2949  AVDictionary **meta_in = NULL;
2950  AVDictionary **meta_out = NULL;
2951  int i, ret = 0;
2952  char type_in, type_out;
2953  const char *istream_spec = NULL, *ostream_spec = NULL;
2954  int idx_in = 0, idx_out = 0;
2955 
2956  ret = parse_meta_type(mux, inspec, &type_in, &idx_in, &istream_spec);
2957  if (ret >= 0)
2958  ret = parse_meta_type(mux, outspec, &type_out, &idx_out, &ostream_spec);
2959  if (ret < 0)
2960  return ret;
2961 
2962  if (type_in == 'g' || type_out == 'g' || (!*outspec && !ic))
2963  *metadata_global_manual = 1;
2964  if (type_in == 's' || type_out == 's' || (!*outspec && !ic))
2965  *metadata_streams_manual = 1;
2966  if (type_in == 'c' || type_out == 'c' || (!*outspec && !ic))
2967  *metadata_chapters_manual = 1;
2968 
2969  /* ic is NULL when just disabling automatic mappings */
2970  if (!ic)
2971  return 0;
2972 
2973 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2974  if ((index) < 0 || (index) >= (nb_elems)) {\
2975  av_log(mux, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
2976  (desc), (index));\
2977  return AVERROR(EINVAL);\
2978  }
2979 
2980 #define SET_DICT(type, meta, context, index)\
2981  switch (type) {\
2982  case 'g':\
2983  meta = &context->metadata;\
2984  break;\
2985  case 'c':\
2986  METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
2987  meta = &context->chapters[index]->metadata;\
2988  break;\
2989  case 'p':\
2990  METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
2991  meta = &context->programs[index]->metadata;\
2992  break;\
2993  case 's':\
2994  break; /* handled separately below */ \
2995  default: av_assert0(0);\
2996  }\
2997 
2998  SET_DICT(type_in, meta_in, ic, idx_in);
2999  SET_DICT(type_out, meta_out, oc, idx_out);
3000 
3001  /* for input streams choose first matching stream */
3002  if (type_in == 's') {
3003  for (i = 0; i < ic->nb_streams; i++) {
3004  if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3005  meta_in = &ic->streams[i]->metadata;
3006  break;
3007  } else if (ret < 0)
3008  return ret;
3009  }
3010  if (!meta_in) {
3011  av_log(mux, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
3012  return AVERROR(EINVAL);
3013  }
3014  }
3015 
3016  if (type_out == 's') {
3017  for (i = 0; i < oc->nb_streams; i++) {
3018  if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3019  meta_out = &oc->streams[i]->metadata;
3020  av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3021  } else if (ret < 0)
3022  return ret;
3023  }
3024  } else
3025  av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3026 
3027  return 0;
3028 }
3029 
3030 static int copy_meta(Muxer *mux, const OptionsContext *o)
3031 {
3032  OutputFile *of = &mux->of;
3033  AVFormatContext *oc = mux->fc;
3034  int chapters_input_file = o->chapters_input_file;
3035  int metadata_global_manual = 0;
3036  int metadata_streams_manual = 0;
3037  int metadata_chapters_manual = 0;
3038  int ret;
3039 
3040  /* copy metadata */
3041  for (int i = 0; i < o->metadata_map.nb_opt; i++) {
3042  char *p;
3043  int in_file_index = strtol(o->metadata_map.opt[i].u.str, &p, 0);
3044 
3045  if (in_file_index >= nb_input_files) {
3046  av_log(mux, AV_LOG_FATAL, "Invalid input file index %d while "
3047  "processing metadata maps\n", in_file_index);
3048  return AVERROR(EINVAL);
3049  }
3050  ret = copy_metadata(mux,
3051  in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL,
3052  o->metadata_map.opt[i].specifier, *p ? p + 1 : p,
3053  &metadata_global_manual, &metadata_streams_manual,
3054  &metadata_chapters_manual);
3055  if (ret < 0)
3056  return ret;
3057  }
3058 
3059  /* copy chapters */
3060  if (chapters_input_file >= nb_input_files) {
3061  if (chapters_input_file == INT_MAX) {
3062  /* copy chapters from the first input file that has them*/
3063  chapters_input_file = -1;
3064  for (int i = 0; i < nb_input_files; i++)
3065  if (input_files[i]->ctx->nb_chapters) {
3066  chapters_input_file = i;
3067  break;
3068  }
3069  } else {
3070  av_log(mux, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
3071  chapters_input_file);
3072  return AVERROR(EINVAL);
3073  }
3074  }
3075  if (chapters_input_file >= 0)
3076  copy_chapters(input_files[chapters_input_file], of, oc,
3077  !metadata_chapters_manual);
3078 
3079  /* copy global metadata by default */
3080  if (!metadata_global_manual && nb_input_files){
3083  if (of->recording_time != INT64_MAX)
3084  av_dict_set(&oc->metadata, "duration", NULL, 0);
3085  av_dict_set(&oc->metadata, "creation_time", NULL, 0);
3086  av_dict_set(&oc->metadata, "company_name", NULL, 0);
3087  av_dict_set(&oc->metadata, "product_name", NULL, 0);
3088  av_dict_set(&oc->metadata, "product_version", NULL, 0);
3089  }
3090  if (!metadata_streams_manual)
3091  for (int i = 0; i < of->nb_streams; i++) {
3092  OutputStream *ost = of->streams[i];
3093 
3094  if (!ost->ist) /* this is true e.g. for attached files */
3095  continue;
3097  }
3098 
3099  return 0;
3100 }
3101 
3102 static int set_dispositions(Muxer *mux, const OptionsContext *o)
3103 {
3104  OutputFile *of = &mux->of;
3105  AVFormatContext *ctx = mux->fc;
3106 
3107  // indexed by type+1, because AVMEDIA_TYPE_UNKNOWN=-1
3108  int nb_streams[AVMEDIA_TYPE_NB + 1] = { 0 };
3109  int have_default[AVMEDIA_TYPE_NB + 1] = { 0 };
3110  int have_manual = 0;
3111  int ret = 0;
3112 
3113  const char **dispositions;
3114 
3115  dispositions = av_calloc(ctx->nb_streams, sizeof(*dispositions));
3116  if (!dispositions)
3117  return AVERROR(ENOMEM);
3118 
3119  // first, copy the input dispositions
3120  for (int i = 0; i < ctx->nb_streams; i++) {
3121  OutputStream *ost = of->streams[i];
3122 
3123  nb_streams[ost->type + 1]++;
3124 
3125  opt_match_per_stream_str(ost, &o->disposition, ctx, ost->st, &dispositions[i]);
3126 
3127  have_manual |= !!dispositions[i];
3128 
3129  if (ost->ist) {
3130  ost->st->disposition = ost->ist->st->disposition;
3131 
3133  have_default[ost->type + 1] = 1;
3134  }
3135  }
3136 
3137  if (have_manual) {
3138  // process manually set dispositions - they override the above copy
3139  for (int i = 0; i < ctx->nb_streams; i++) {
3140  OutputStream *ost = of->streams[i];
3141  const char *disp = dispositions[i];
3142 
3143  if (!disp)
3144  continue;
3145 
3146  ret = av_opt_set(ost->st, "disposition", disp, 0);
3147  if (ret < 0)
3148  goto finish;
3149  }
3150  } else {
3151  // For each media type with more than one stream, find a suitable stream to
3152  // mark as default, unless one is already marked default.
3153  // "Suitable" means the first of that type, skipping attached pictures.
3154  for (int i = 0; i < ctx->nb_streams; i++) {
3155  OutputStream *ost = of->streams[i];
3156  enum AVMediaType type = ost->type;
3157 
3158  if (nb_streams[type + 1] < 2 || have_default[type + 1] ||
3160  continue;
3161 
3163  have_default[type + 1] = 1;
3164  }
3165  }
3166 
3167 finish:
3168  av_freep(&dispositions);
3169 
3170  return ret;
3171 }
3172 
3173 static const char *const forced_keyframes_const_names[] = {
3174  "n",
3175  "n_forced",
3176  "prev_forced_n",
3177  "prev_forced_t",
3178  "t",
3179  NULL
3180 };
3181 
3182 static int compare_int64(const void *a, const void *b)
3183 {
3184  return FFDIFFSIGN(*(const int64_t *)a, *(const int64_t *)b);
3185 }
3186 
3188  const Muxer *mux, const char *spec)
3189 {
3190  const char *p;
3191  int n = 1, i, ret, size, index = 0;
3192  int64_t t, *pts;
3193 
3194  for (p = spec; *p; p++)
3195  if (*p == ',')
3196  n++;
3197  size = n;
3198  pts = av_malloc_array(size, sizeof(*pts));
3199  if (!pts)
3200  return AVERROR(ENOMEM);
3201 
3202  p = spec;
3203  for (i = 0; i < n; i++) {
3204  char *next = strchr(p, ',');
3205 
3206  if (next)
3207  *next++ = 0;
3208 
3209  if (strstr(p, "chapters") == p) {
3210  AVChapter * const *ch = mux->fc->chapters;
3211  unsigned int nb_ch = mux->fc->nb_chapters;
3212  int j;
3213 
3214  if (nb_ch > INT_MAX - size) {
3215  ret = AVERROR(ERANGE);
3216  goto fail;
3217  }
3218  size += nb_ch - 1;
3219  pts = av_realloc_f(pts, size, sizeof(*pts));
3220  if (!pts)
3221  return AVERROR(ENOMEM);
3222 
3223  if (p[8]) {
3224  ret = av_parse_time(&t, p + 8, 1);
3225  if (ret < 0) {
3227  "Invalid chapter time offset: %s\n", p + 8);
3228  goto fail;
3229  }
3230  } else
3231  t = 0;
3232 
3233  for (j = 0; j < nb_ch; j++) {
3234  const AVChapter *c = ch[j];
3235  av_assert1(index < size);
3236  pts[index++] = av_rescale_q(c->start, c->time_base,
3237  AV_TIME_BASE_Q) + t;
3238  }
3239 
3240  } else {
3241  av_assert1(index < size);
3242  ret = av_parse_time(&t, p, 1);
3243  if (ret < 0) {
3244  av_log(log, AV_LOG_ERROR, "Invalid keyframe time: %s\n", p);
3245  goto fail;
3246  }
3247 
3248  pts[index++] = t;
3249  }
3250 
3251  p = next;
3252  }
3253 
3254  av_assert0(index == size);
3255  qsort(pts, size, sizeof(*pts), compare_int64);
3256  kf->nb_pts = size;
3257  kf->pts = pts;
3258 
3259  return 0;
3260 fail:
3261  av_freep(&pts);
3262  return ret;
3263 }
3264 
3266 {
3267  for (int i = 0; i < mux->of.nb_streams; i++) {
3268  OutputStream *ost = mux->of.streams[i];
3269  const char *forced_keyframes = NULL;
3270 
3272  mux->fc, ost->st, &forced_keyframes);
3273 
3274  if (!(ost->type == AVMEDIA_TYPE_VIDEO &&
3275  ost->enc && forced_keyframes))
3276  continue;
3277 
3278  if (!strncmp(forced_keyframes, "expr:", 5)) {
3279  int ret = av_expr_parse(&ost->kf.pexpr, forced_keyframes + 5,
3281  if (ret < 0) {
3283  "Invalid force_key_frames expression '%s'\n", forced_keyframes + 5);
3284  return ret;
3285  }
3286  ost->kf.expr_const_values[FKF_N] = 0;
3287  ost->kf.expr_const_values[FKF_N_FORCED] = 0;
3288  ost->kf.expr_const_values[FKF_PREV_FORCED_N] = NAN;
3289  ost->kf.expr_const_values[FKF_PREV_FORCED_T] = NAN;
3290 
3291  // Don't parse the 'forced_keyframes' in case of 'keep-source-keyframes',
3292  // parse it only for static kf timings
3293  } else if (!strcmp(forced_keyframes, "source")) {
3294  ost->kf.type = KF_FORCE_SOURCE;
3295 #if FFMPEG_OPT_FORCE_KF_SOURCE_NO_DROP
3296  } else if (!strcmp(forced_keyframes, "source_no_drop")) {
3297  av_log(ost, AV_LOG_WARNING, "The 'source_no_drop' value for "
3298  "-force_key_frames is deprecated, use just 'source'\n");
3299  ost->kf.type = KF_FORCE_SOURCE;
3300 #endif
3301  } else if (!strcmp(forced_keyframes, "scd_metadata")) {
3302  ost->kf.type = KF_FORCE_SCD_METADATA;
3303  } else {
3304  int ret = parse_forced_key_frames(ost, &ost->kf, mux, forced_keyframes);
3305  if (ret < 0)
3306  return ret;
3307  }
3308  }
3309 
3310  return 0;
3311 }
3312 
3313 static const char *output_file_item_name(void *obj)
3314 {
3315  const Muxer *mux = obj;
3316 
3317  return mux->log_name;
3318 }
3319 
3320 static const AVClass output_file_class = {
3321  .class_name = "OutputFile",
3322  .version = LIBAVUTIL_VERSION_INT,
3323  .item_name = output_file_item_name,
3324  .category = AV_CLASS_CATEGORY_MUXER,
3325 };
3326 
3327 static Muxer *mux_alloc(void)
3328 {
3329  Muxer *mux = allocate_array_elem(&output_files, sizeof(*mux), &nb_output_files);
3330 
3331  if (!mux)
3332  return NULL;
3333 
3334  mux->of.class = &output_file_class;
3335  mux->of.index = nb_output_files - 1;
3336 
3337  snprintf(mux->log_name, sizeof(mux->log_name), "out#%d", mux->of.index);
3338 
3339  return mux;
3340 }
3341 
3342 int of_open(const OptionsContext *o, const char *filename, Scheduler *sch)
3343 {
3344  Muxer *mux;
3345  AVFormatContext *oc;
3346  int err;
3347  OutputFile *of;
3348 
3349  int64_t recording_time = o->recording_time;
3350  int64_t stop_time = o->stop_time;
3351 
3352  mux = mux_alloc();
3353  if (!mux)
3354  return AVERROR(ENOMEM);
3355 
3356  of = &mux->of;
3357 
3358  if (stop_time != INT64_MAX && recording_time != INT64_MAX) {
3359  stop_time = INT64_MAX;
3360  av_log(mux, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
3361  }
3362 
3363  if (stop_time != INT64_MAX && recording_time == INT64_MAX) {
3365  if (stop_time <= start_time) {
3366  av_log(mux, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
3367  return AVERROR(EINVAL);
3368  } else {
3369  recording_time = stop_time - start_time;
3370  }
3371  }
3372 
3373  of->recording_time = recording_time;
3374  of->start_time = o->start_time;
3375 
3376  mux->limit_filesize = o->limit_filesize;
3377  av_dict_copy(&mux->opts, o->g->format_opts, 0);
3378 
3379  if (!strcmp(filename, "-"))
3380  filename = "pipe:";
3381 
3382  err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3383  if (!oc) {
3384  av_log(mux, AV_LOG_FATAL, "Error initializing the muxer for %s: %s\n",
3385  filename, av_err2str(err));
3386  return err;
3387  }
3388  mux->fc = oc;
3389 
3390  av_strlcat(mux->log_name, "/", sizeof(mux->log_name));
3391  av_strlcat(mux->log_name, oc->oformat->name, sizeof(mux->log_name));
3392 
3393 
3394  if (recording_time != INT64_MAX)
3395  oc->duration = recording_time;
3396 
3397  oc->interrupt_callback = int_cb;
3398 
3399  if (o->bitexact) {
3400  oc->flags |= AVFMT_FLAG_BITEXACT;
3401  of->bitexact = 1;
3402  } else {
3403  of->bitexact = check_opt_bitexact(oc, mux->opts, "fflags",
3405  }
3406 
3407  err = sch_add_mux(sch, muxer_thread, mux_check_init, mux,
3408  !strcmp(oc->oformat->name, "rtp"), o->thread_queue_size);
3409  if (err < 0)
3410  return err;
3411  mux->sch = sch;
3412  mux->sch_idx = err;
3413 
3414  /* create all output streams for this file */
3415  err = create_streams(mux, o);
3416  if (err < 0)
3417  return err;
3418 
3419  /* check if all codec options have been used */
3420  err = check_avoptions_used(o->g->codec_opts, mux->enc_opts_used, mux, 0);
3421  av_dict_free(&mux->enc_opts_used);
3422  if (err < 0)
3423  return err;
3424 
3425  /* check filename in case of an image number is expected */
3427  av_log(mux, AV_LOG_FATAL,
3428  "Output filename '%s' does not contain a numeric pattern like "
3429  "'%%d', which is required by output format '%s'.\n",
3430  oc->url, oc->oformat->name);
3431  return AVERROR(EINVAL);
3432  }
3433 
3434  if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3435  /* test if it already exists to avoid losing precious files */
3436  err = assert_file_overwrite(filename);
3437  if (err < 0)
3438  return err;
3439 
3440  /* open the file */
3441  if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
3442  &oc->interrupt_callback,
3443  &mux->opts)) < 0) {
3444  av_log(mux, AV_LOG_FATAL, "Error opening output %s: %s\n",
3445  filename, av_err2str(err));
3446  return err;
3447  }
3448  } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename)) {
3449  err = assert_file_overwrite(filename);
3450  if (err < 0)
3451  return err;
3452  }
3453 
3454  if (o->mux_preload) {
3455  av_dict_set_int(&mux->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
3456  }
3457  oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3458 
3459  /* copy metadata and chapters from input files */
3460  err = copy_meta(mux, o);
3461  if (err < 0)
3462  return err;
3463 
3464  err = of_add_groups(mux, o);
3465  if (err < 0)
3466  return err;
3467 
3468  err = of_add_programs(mux, o);
3469  if (err < 0)
3470  return err;
3471 
3472  err = of_add_metadata(of, oc, o);
3473  if (err < 0)
3474  return err;
3475 
3476  err = set_dispositions(mux, o);
3477  if (err < 0) {
3478  av_log(mux, AV_LOG_FATAL, "Error setting output stream dispositions\n");
3479  return err;
3480  }
3481 
3482  // parse forced keyframe specifications;
3483  // must be done after chapters are created
3484  err = process_forced_keyframes(mux, o);
3485  if (err < 0) {
3486  av_log(mux, AV_LOG_FATAL, "Error processing forced keyframes\n");
3487  return err;
3488  }
3489 
3491  o->shortest);
3492  if (err < 0) {
3493  av_log(mux, AV_LOG_FATAL, "Error setting up output sync queues\n");
3494  return err;
3495  }
3496 
3497  of->url = filename;
3498 
3499  /* initialize streamcopy streams. */
3500  for (int i = 0; i < of->nb_streams; i++) {
3501  OutputStream *ost = of->streams[i];
3502 
3503  if (!ost->enc) {
3504  err = of_stream_init(of, ost, NULL);
3505  if (err < 0)
3506  return err;
3507  }
3508  }
3509 
3510  return 0;
3511 }
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:605
formats
formats
Definition: signature.h:47
KeyframeForceCtx::pts
int64_t * pts
Definition: ffmpeg.h:622
MuxStream::ost
OutputStream ost
Definition: ffmpeg_mux.h:37
iamf.h
fopen_utf8
static FILE * fopen_utf8(const char *path, const char *mode)
Definition: fopen_utf8.h:66
map_manual
static int map_manual(Muxer *mux, const OptionsContext *o, const StreamMap *map)
Definition: ffmpeg_mux_init.c:1819
SYNC_QUEUE_PACKETS
@ SYNC_QUEUE_PACKETS
Definition: sync_queue.h:29
AVCodec
AVCodec.
Definition: codec.h:172
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
AVIAMFSubmix::elements
AVIAMFSubmixElement ** elements
Array of submix elements.
Definition: iamf.h:568
av_codec_get_id
enum AVCodecID av_codec_get_id(const struct AVCodecTag *const *tags, unsigned int tag)
Get the AVCodecID for the given codec tag tag.
MuxStream::copy_initial_nonkeyframes
int copy_initial_nonkeyframes
Definition: ffmpeg_mux.h:81
MuxStream::sch_idx_enc
int sch_idx_enc
Definition: ffmpeg_mux.h:56
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AVIAMFAudioElement::nb_layers
unsigned int nb_layers
Number of layers, or channel groups, in the Audio Element.
Definition: iamf.h:371
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
InputFile::start_time
int64_t start_time
Definition: ffmpeg.h:543
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:71
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
Muxer::fc
AVFormatContext * fc
Definition: ffmpeg_mux.h:101
AVFormatContext::stream_groups
AVStreamGroup ** stream_groups
A list of all stream groups in the file.
Definition: avformat.h:1371
name
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 default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
OptionsContext::stop_time
int64_t stop_time
Definition: ffmpeg.h:192
ost_get_filters
static int ost_get_filters(const OptionsContext *o, AVFormatContext *oc, OutputStream *ost, char **dst)
Definition: ffmpeg_mux_init.c:416
AVStreamGroup::id
int64_t id
Group type-specific group ID.
Definition: avformat.h:1136
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:464
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
OutputFilter::graph
struct FilterGraph * graph
Definition: ffmpeg.h:393
FKF_PREV_FORCED_T
@ FKF_PREV_FORCED_T
Definition: ffmpeg.h:560
InputFile::nb_stream_groups
int nb_stream_groups
Definition: ffmpeg.h:553
OptionsContext::force_fps
SpecifierOptList force_fps
Definition: ffmpeg.h:216
AVCodecContext::alpha_mode
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition: avcodec.h:1950
OptionsContext::forced_key_frames
SpecifierOptList forced_key_frames
Definition: ffmpeg.h:214
ist_use
int ist_use(InputStream *ist, int decoding_needed, const ViewSpecifier *vs, SchedulerNode *src)
Definition: ffmpeg_demux.c:938
VSYNC_VFR
@ VSYNC_VFR
Definition: ffmpeg.h:70
mix
static int mix(int c0, int c1)
Definition: 4xm.c:717
ms_from_ost
static MuxStream * ms_from_ost(OutputStream *ost)
Definition: ffmpeg_mux.h:126
AVOutputFormat::name
const char * name
Definition: avformat.h:508
AVChapter::metadata
AVDictionary * metadata
Definition: avformat.h:1247
av_bprint_is_complete
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Definition: bprint.h:218
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
nb_input_files
int nb_input_files
Definition: ffmpeg.c:109
opt.h
of_serialize_options
static int of_serialize_options(Muxer *mux, void *obj, AVBPrint *bp)
Definition: ffmpeg_mux_init.c:2418
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:1152
LIBAVCODEC_IDENT
#define LIBAVCODEC_IDENT
Definition: version.h:43
AV_STREAM_GROUP_PARAMS_LCEVC
@ AV_STREAM_GROUP_PARAMS_LCEVC
Definition: avformat.h:1110
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:671
MuxStream::sch_idx
int sch_idx
Definition: ffmpeg_mux.h:55
KF_FORCE_SCD_METADATA
@ KF_FORCE_SCD_METADATA
Definition: ffmpeg.h:613
AVSTREAM_EVENT_FLAG_NEW_PACKETS
#define AVSTREAM_EVENT_FLAG_NEW_PACKETS
Definition: avformat.h:871
check_avoptions
int check_avoptions(AVDictionary *m)
Definition: cmdutils.c:1605
ENC_STATS_PTS
@ ENC_STATS_PTS
Definition: ffmpeg.h:576
OutputFilter::apad
char * apad
Definition: ffmpeg.h:406
Muxer::sch_stream_idx
int * sch_stream_idx
Definition: ffmpeg_mux.h:107
ENC_STATS_FRAME_NUM_IN
@ ENC_STATS_FRAME_NUM_IN
Definition: ffmpeg.h:573
elements
static const ElemCat * elements[ELEMENT_COUNT]
Definition: signature.h:565
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1040
FKF_PREV_FORCED_N
@ FKF_PREV_FORCED_N
Definition: ffmpeg.h:559
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
is
The official guide to swscale for confused that is
Definition: swscale.txt:28
AVFormatContext::nb_chapters
unsigned int nb_chapters
Number of chapters in AVChapter array.
Definition: avformat.h:1384
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:49
Muxer::nb_sch_stream_idx
int nb_sch_stream_idx
Definition: ffmpeg_mux.h:108
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
enc_open
int enc_open(void *opaque, const AVFrame *frame)
Definition: ffmpeg_enc.c:184
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
AVFMT_VARIABLE_FPS
#define AVFMT_VARIABLE_FPS
Format allows variable fps.
Definition: avformat.h:482
av_iamf_param_definition_alloc
AVIAMFParamDefinition * av_iamf_param_definition_alloc(enum AVIAMFParamDefinitionType type, unsigned int nb_subblocks, size_t *out_size)
Allocates memory for AVIAMFParamDefinition, plus an array of.
Definition: iamf.c:159
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
ENC_STATS_DTS
@ ENC_STATS_DTS
Definition: ffmpeg.h:580
sq_limit_frames
void sq_limit_frames(SyncQueue *sq, unsigned int stream_idx, uint64_t frames)
Limit the number of output frames for stream with index stream_idx to max_frames.
Definition: sync_queue.c:628
pthread_mutex_init
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
Definition: os2threads.h:104
AV_CODEC_CONFIG_SAMPLE_RATE
@ AV_CODEC_CONFIG_SAMPLE_RATE
int, terminated by 0
Definition: avcodec.h:2562
of_parse_iamf_audio_element_layers
static int of_parse_iamf_audio_element_layers(Muxer *mux, AVStreamGroup *stg, char *ptr)
Definition: ffmpeg_mux_init.c:2213
KeyframeForceCtx::nb_pts
int nb_pts
Definition: ffmpeg.h:623
AV_CODEC_FLAG_QSCALE
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
Definition: avcodec.h:213
AVFMT_NOTIMESTAMPS
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:479
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
int64_t
long long int64_t
Definition: coverity.c:34
InputStream::user_set_discard
int user_set_discard
Definition: ffmpeg.h:492
FFMPEG_OPT_ENC_TIME_BASE_NUM
#define FFMPEG_OPT_ENC_TIME_BASE_NUM
Definition: ffmpeg.h:57
OptionsContext::bits_per_raw_sample
SpecifierOptList bits_per_raw_sample
Definition: ffmpeg.h:256
ENC_STATS_AVG_BITRATE
@ ENC_STATS_AVG_BITRATE
Definition: ffmpeg.h:586
AVCodecContext::intra_matrix
uint16_t * intra_matrix
custom intra quantization matrix Must be allocated with the av_malloc() family of functions,...
Definition: avcodec.h:960
OptionsContext::audio_ch_layouts
SpecifierOptList audio_ch_layouts
Definition: ffmpeg.h:155
OptionsContext::qscale
SpecifierOptList qscale
Definition: ffmpeg.h:213
AVStreamGroup::disposition
int disposition
Stream group disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:1195
ist_iter
InputStream * ist_iter(InputStream *prev)
Definition: ffmpeg.c:387
normalize.log
log
Definition: normalize.py:21
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
OptionsContext::nb_attachments
int nb_attachments
Definition: ffmpeg.h:187
OutputFile::start_time
int64_t start_time
start time in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:716
avcodec_find_encoder
const AVCodec * avcodec_find_encoder(enum AVCodecID id)
Find a registered encoder with a matching codec ID.
Definition: allcodecs.c:1044
InputFile::index
int index
Definition: ffmpeg.h:532
OptionsContext::presets
SpecifierOptList presets
Definition: ffmpeg.h:231
pixdesc.h
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1352
OptionsContext::mux_max_delay
float mux_max_delay
Definition: ffmpeg.h:195
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:416
subtitle_codec_name
static const char * subtitle_codec_name
Definition: ffplay.c:342
ENC_STATS_LITERAL
@ ENC_STATS_LITERAL
Definition: ffmpeg.h:569
OptionsContext::subtitle_disable
int subtitle_disable
Definition: ffmpeg.h:202
AV_CODEC_CONFIG_COLOR_RANGE
@ AV_CODEC_CONFIG_COLOR_RANGE
AVColorRange, terminated by AVCOL_RANGE_UNSPECIFIED.
Definition: avcodec.h:2565
OptionsContext::passlogfiles
SpecifierOptList passlogfiles
Definition: ffmpeg.h:244
AVOption
AVOption.
Definition: opt.h:429
OutputStream::index
int index
Definition: ffmpeg.h:657
streamcopy_init
static int streamcopy_init(const OptionsContext *o, const Muxer *mux, OutputStream *ost, AVDictionary **encoder_opts)
Definition: ffmpeg_mux_init.c:1025
b
#define b
Definition: input.c:43
ofilter_bind_enc
int ofilter_bind_enc(OutputFilter *ofilter, unsigned sched_idx_enc, const OutputFilterOptions *opts)
Definition: ffmpeg_filter.c:812
FilterGraph::index
int index
Definition: ffmpeg.h:416
choose_pixel_fmt
static enum AVPixelFormat choose_pixel_fmt(const AVCodecContext *avctx, enum AVPixelFormat target)
Definition: ffmpeg_mux_init.c:494
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:836
AVChapter::start
int64_t start
Definition: avformat.h:1246
Muxer::of
OutputFile of
Definition: ffmpeg_mux.h:96
MuxStream::force_fps
int force_fps
Definition: ffmpeg_mux.h:90
RcOverride::qscale
int qscale
Definition: avcodec.h:196
ffmpeg.h
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
base
uint8_t base
Definition: vp3data.h:128
freeenv_utf8
static void freeenv_utf8(char *var)
Definition: getenv_utf8.h:72
nb_streams
static unsigned int nb_streams
Definition: ffprobe.c:352
OptionGroup::swr_opts
AVDictionary * swr_opts
Definition: cmdutils.h:350
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1482
AVIAMFParamDefinition
Parameters as defined in section 3.6.1 of IAMF.
Definition: iamf.h:193
OptionsContext::bitexact
int bitexact
Definition: ffmpeg.h:198
ViewSpecifier
Definition: ffmpeg.h:129
get_stream_group_index_from_id
static int64_t get_stream_group_index_from_id(Muxer *mux, int64_t id)
Definition: ffmpeg_mux_init.c:2459
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:61
video_disable
static int video_disable
Definition: ffplay.c:317
AVDictionary
Definition: dict.c:32
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:324
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AV_CODEC_CONFIG_PIX_FORMAT
@ AV_CODEC_CONFIG_PIX_FORMAT
AVPixelFormat, terminated by AV_PIX_FMT_NONE.
Definition: avcodec.h:2560
MuxStream::copy_prior_start
int copy_prior_start
Definition: ffmpeg_mux.h:82
OptionsContext::format
const char * format
Definition: ffmpeg.h:152
parse_forced_key_frames
static int parse_forced_key_frames(void *log, KeyframeForceCtx *kf, const Muxer *mux, const char *spec)
Definition: ffmpeg_mux_init.c:3187
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
enc_stats_init
static int enc_stats_init(OutputStream *ost, EncStats *es, int pre, const char *path, const char *fmt_spec)
Definition: ffmpeg_mux_init.c:246
ost_add
static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type, InputStream *ist, OutputFilter *ofilter, const ViewSpecifier *vs, OutputStream **post)
Definition: ffmpeg_mux_init.c:1191
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:326
ost
static AVStream * ost
Definition: vaapi_transcode.c:42
parse_matrix_coeffs
static int parse_matrix_coeffs(void *logctx, uint16_t *dest, const char *str)
Definition: ffmpeg_mux_init.c:466
OptionsContext::frame_pix_fmts
SpecifierOptList frame_pix_fmts
Definition: ffmpeg.h:161
set_dispositions
static int set_dispositions(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:3102
av_opt_serialize
int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer, const char key_val_sep, const char pairs_sep)
Serialize object's options.
Definition: opt.c:2766
MuxStream::ts_copy_start
int64_t ts_copy_start
Definition: ffmpeg_mux.h:66
OutputStream::file
struct OutputFile * file
Definition: ffmpeg.h:655
AVOutputFormat::subtitle_codec
enum AVCodecID subtitle_codec
default subtitle codec
Definition: avformat.h:520
MuxStream::stream_duration_tb
AVRational stream_duration_tb
Definition: ffmpeg_mux.h:73
ENC_STATS_TIMEBASE_IN
@ ENC_STATS_TIMEBASE_IN
Definition: ffmpeg.h:575
AV_CODEC_FLAG_GLOBAL_HEADER
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
Definition: avcodec.h:318
get_preset_file_2
static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
Definition: ffmpeg_mux_init.c:126
OutputFile::nb_streams
int nb_streams
Definition: ffmpeg.h:713
av_filename_number_test
int av_filename_number_test(const char *filename)
Check whether filename actually is a numbered sequence generator.
Definition: utils.c:121
av_expr_parse
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
Definition: eval.c:735
Muxer
Definition: ffmpeg_mux.h:95
InputStream
Definition: ffmpeg.h:483
OptionsContext::chapters_input_file
int chapters_input_file
Definition: ffmpeg.h:189
AVPacketSideData::size
size_t size
Definition: packet.h:418
OutputFilterOptions
Definition: ffmpeg.h:311
EncStatsFile
Definition: ffmpeg_mux_init.c:156
AVFormatContext::interrupt_callback
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
Definition: avformat.h:1554
map_auto_subtitle
static int map_auto_subtitle(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1757
OptionsContext::max_frame_rates
SpecifierOptList max_frame_rates
Definition: ffmpeg.h:159
AV_OPT_SERIALIZE_SEARCH_CHILDREN
#define AV_OPT_SERIALIZE_SEARCH_CHILDREN
Serialize options in possible children of the given object.
Definition: opt.h:1127
finish
static void finish(void)
Definition: movenc.c:374
fopen_utf8.h
av_iamf_mix_presentation_add_submix
AVIAMFSubmix * av_iamf_mix_presentation_add_submix(AVIAMFMixPresentation *mix_presentation)
Allocate a submix and add it to a given AVIAMFMixPresentation.
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:452
of_parse_group_token
static int of_parse_group_token(Muxer *mux, const char *token, char *ptr)
Definition: ffmpeg_mux_init.c:2569
InputStreamGroup
Definition: ffmpeg.h:517
OptionsContext::g
OptionGroup * g
Definition: ffmpeg.h:146
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:1055
mux_alloc
static Muxer * mux_alloc(void)
Definition: ffmpeg_mux_init.c:3327
opt_match_per_stream_int
void opt_match_per_stream_int(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, int *out)
OptionsContext::enc_stats_pre_fmt
SpecifierOptList enc_stats_pre_fmt
Definition: ffmpeg.h:260
fail
#define fail()
Definition: checkasm.h:225
AVFMT_FIXED_FRAMESIZE
#define AVFMT_FIXED_FRAMESIZE
Format wants fixed size audio frames..
Definition: avformat.h:499
AVStreamGroupTileGrid
AVStreamGroupTileGrid holds information on how to combine several independent images on a single canv...
Definition: avformat.h:954
OptionsContext::mux_stats_fmt
SpecifierOptList mux_stats_fmt
Definition: ffmpeg.h:262
AVIAMFSubmixLayout
Submix layout as defined in section 3.7.6 of IAMF.
Definition: iamf.h:517
sch_add_mux_stream
int sch_add_mux_stream(Scheduler *sch, unsigned mux_idx)
Add a muxed stream for a previously added muxer.
Definition: ffmpeg_sched.c:694
SCH_NODE_TYPE_NONE
@ SCH_NODE_TYPE_NONE
Definition: ffmpeg_sched.h:94
copy_meta
static int copy_meta(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:3030
AV_BPRINT_SIZE_AUTOMATIC
#define AV_BPRINT_SIZE_AUTOMATIC
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:500
AVChapter
Definition: avformat.h:1243
val
static double val(void *priv, double ch)
Definition: aeval.c:77
SCH_ENC
#define SCH_ENC(encoder)
Definition: ffmpeg_sched.h:123
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
pts
static int64_t pts
Definition: transcode_aac.c:644
OptionsContext
Definition: ffmpeg.h:145
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:825
av_new_program
AVProgram * av_new_program(AVFormatContext *ac, int id)
Definition: avformat.c:276
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:462
Muxer::sq_pkt
AVPacket * sq_pkt
Definition: ffmpeg_mux.h:121
AVStream::duration
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition: avformat.h:806
av_codec_get_tag2
int av_codec_get_tag2(const struct AVCodecTag *const *tags, enum AVCodecID id, unsigned int *tag)
Get the codec tag for the given codec id.
AV_OPT_SERIALIZE_SKIP_DEFAULTS
#define AV_OPT_SERIALIZE_SKIP_DEFAULTS
Serialize options that are not set to default values only.
Definition: opt.h:1125
enc_stats_files
static EncStatsFile * enc_stats_files
Definition: ffmpeg_mux_init.c:161
new_stream_video
static int new_stream_video(Muxer *mux, const OptionsContext *o, OutputStream *ost, int *keep_pix_fmt, enum VideoSyncMethod *vsync_method)
Definition: ffmpeg_mux_init.c:574
AVRational::num
int num
Numerator.
Definition: rational.h:59
OutputFilter::bound
int bound
Definition: ffmpeg.h:403
InputFile
Definition: ffmpeg.h:529
FFDIFFSIGN
#define FFDIFFSIGN(x, y)
Comparator.
Definition: macros.h:45
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:79
AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
Subblocks are of struct type AVIAMFReconGain.
Definition: iamf.h:181
OptionsContext::recording_time
int64_t recording_time
Definition: ffmpeg.h:191
OptionsContext::nb_stream_maps
int nb_stream_maps
Definition: ffmpeg.h:185
OptionsContext::audio_disable
int audio_disable
Definition: ffmpeg.h:201
check_stream_specifier
int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
Check if the given stream matches a stream specifier.
Definition: cmdutils.c:1338
preset
preset
Definition: vf_curves.c:47
avassert.h
RcOverride::quality_factor
float quality_factor
Definition: avcodec.h:197
MuxStream::log_name
char log_name[32]
Definition: ffmpeg_mux.h:46
opt_match_per_stream_int64
void opt_match_per_stream_int64(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, int64_t *out)
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AVFormatContext::metadata
AVDictionary * metadata
Metadata that applies to the whole file.
Definition: avformat.h:1516
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
OptionGroup::codec_opts
AVDictionary * codec_opts
Definition: cmdutils.h:347
av_dump_format
void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)
Print detailed information about the input or output format, such as duration, bitrate,...
Definition: dump.c:855
AVStreamGroup::params
union AVStreamGroup::@448 params
Group type-specific parameters.
AVCodecTag
Definition: internal.h:42
ENC_STATS_PTS_IN
@ ENC_STATS_PTS_IN
Definition: ffmpeg.h:578
OptionsContext::metadata
SpecifierOptList metadata
Definition: ffmpeg.h:208
SpecifierOptList::nb_opt
int nb_opt
Definition: cmdutils.h:185
OptionsContext::filters
SpecifierOptList filters
Definition: ffmpeg.h:234
choose_encoder
static int choose_encoder(const OptionsContext *o, AVFormatContext *s, MuxStream *ms, const AVCodec **enc)
Definition: ffmpeg_mux_init.c:69
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
avformat_query_codec
int avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id, int std_compliance)
Test if the given container can store a codec.
Definition: mux_utils.c:32
av_iamf_submix_add_layout
AVIAMFSubmixLayout * av_iamf_submix_add_layout(AVIAMFSubmix *submix)
Allocate a submix layout and add it to a given AVIAMFSubmix.
AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
@ AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
Definition: avformat.h:1108
output_stream_class
static const AVClass output_stream_class
Definition: ffmpeg_mux_init.c:385
VSYNC_VSCFR
@ VSYNC_VSCFR
Definition: ffmpeg.h:71
EncStats::components
EncStatsComponent * components
Definition: ffmpeg.h:598
of_parse_iamf_submixes
static int of_parse_iamf_submixes(Muxer *mux, AVStreamGroup *stg, char *ptr)
Definition: ffmpeg_mux_init.c:2289
avcodec_alloc_context3
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
Definition: options.c:149
assert_file_overwrite
int assert_file_overwrite(const char *filename)
Definition: ffmpeg_opt.c:840
AVChapter::end
int64_t end
chapter start/end time in time_base units
Definition: avformat.h:1246
SpecifierOpt::specifier
char * specifier
Definition: cmdutils.h:169
AVCodecDescriptor
This struct describes the properties of a single codec described by an AVCodecID.
Definition: codec_desc.h:38
mux_stream_alloc
static MuxStream * mux_stream_alloc(Muxer *mux, enum AVMediaType type)
Definition: ffmpeg_mux_init.c:392
AV_CODEC_CONFIG_SAMPLE_FORMAT
@ AV_CODEC_CONFIG_SAMPLE_FORMAT
AVSampleFormat, terminated by AV_SAMPLE_FMT_NONE.
Definition: avcodec.h:2563
intreadwrite.h
sch_add_mux
int sch_add_mux(Scheduler *sch, SchThreadFunc func, int(*init)(void *), void *arg, int sdp_auto, unsigned thread_queue_size)
Add a muxer to the scheduler.
Definition: ffmpeg_sched.c:670
OptionsContext::intra_matrices
SpecifierOptList intra_matrices
Definition: ffmpeg.h:224
s
#define s(width, name)
Definition: cbs_vp9.c:198
AVCodecContext::stats_in
char * stats_in
pass2 encoding statistics input buffer Concatenated stuff from stats_out of pass1 should be placed he...
Definition: avcodec.h:1338
MuxStream::pkt
AVPacket * pkt
Definition: ffmpeg_mux.h:51
OptionsContext::stream_groups
SpecifierOptList stream_groups
Definition: ffmpeg.h:252
FilterGraph::outputs
OutputFilter ** outputs
Definition: ffmpeg.h:420
enc_stats_get_file
static int enc_stats_get_file(AVIOContext **io, const char *path)
Definition: ffmpeg_mux_init.c:164
of_add_groups
static int of_add_groups(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:2717
InputStream::framerate
AVRational framerate
Definition: ffmpeg.h:504
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1435
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
output_file_class
static const AVClass output_file_class
Definition: ffmpeg_mux_init.c:3320
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1481
RcOverride
Definition: avcodec.h:193
AVFormatContext::chapters
AVChapter ** chapters
Definition: avformat.h:1385
ENC_STATS_FILE_IDX
@ ENC_STATS_FILE_IDX
Definition: ffmpeg.h:570
AVDictionaryEntry::key
char * key
Definition: dict.h:91
frame_size
int frame_size
Definition: mxfenc.c:2489
OptionsContext::limit_filesize
int64_t limit_filesize
Definition: ffmpeg.h:193
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_iamf_param_definition_get_subblock
static av_always_inline void * av_iamf_param_definition_get_subblock(const AVIAMFParamDefinition *par, unsigned int idx)
Get the subblock at the specified.
Definition: iamf.h:260
VIEW_SPECIFIER_TYPE_NONE
@ VIEW_SPECIFIER_TYPE_NONE
Definition: ffmpeg.h:118
AV_CHANNEL_ORDER_UNSPEC
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
Definition: channel_layout.h:119
OptionsContext::autoscale
SpecifierOptList autoscale
Definition: ffmpeg.h:255
OutputFilter::linklabel
uint8_t * linklabel
Definition: ffmpeg.h:404
av_strtok
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
Definition: avstring.c:179
get_line
static char * get_line(AVIOContext *s, AVBPrint *bprint)
Definition: ffmpeg_mux_init.c:113
filters
#define filters(fmt, type, inverse, clp, inverset, clip, one, clip_fn, packed)
Definition: af_crystalizer.c:55
ENC_STATS_BITRATE
@ ENC_STATS_BITRATE
Definition: ffmpeg.h:585
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
AVMEDIA_TYPE_NB
@ AVMEDIA_TYPE_NB
Definition: avutil.h:205
output_stream_item_name
static const char * output_stream_item_name(void *obj)
Definition: ffmpeg_mux_init.c:378
of_add_metadata
static int of_add_metadata(OutputFile *of, AVFormatContext *oc, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:2843
AVIO_FLAG_WRITE
#define AVIO_FLAG_WRITE
write-only
Definition: avio.h:618
OptionsContext::sample_fmts
SpecifierOptList sample_fmts
Definition: ffmpeg.h:212
AVStreamGroup::index
unsigned int index
Group index in AVFormatContext.
Definition: avformat.h:1128
AVPacketSideData::data
uint8_t * data
Definition: packet.h:417
ignore_unknown_streams
int ignore_unknown_streams
Definition: ffmpeg_opt.c:89
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
RcOverride::start_frame
int start_frame
Definition: avcodec.h:194
channels
channels
Definition: aptx.h:31
OFILTER_FLAG_AUTOSCALE
@ OFILTER_FLAG_AUTOSCALE
Definition: ffmpeg.h:306
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
KF_FORCE_SOURCE
@ KF_FORCE_SOURCE
Definition: ffmpeg.h:608
encoder_thread
int encoder_thread(void *arg)
Definition: ffmpeg_enc.c:863
OptionsContext::shortest
int shortest
Definition: ffmpeg.h:197
AVOutputFormat::codec_tag
const struct AVCodecTag *const * codec_tag
List of supported codec_id-codec_tag pairs, ordered by "better choice first".
Definition: avformat.h:533
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:410
AVCodecParameters::nb_coded_side_data
int nb_coded_side_data
Amount of entries in coded_side_data.
Definition: codec_par.h:88
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
InputStreamGroup::stg
AVStreamGroup * stg
Definition: ffmpeg.h:526
NAN
#define NAN
Definition: mathematics.h:115
MuxStream::max_frames
int64_t max_frames
Definition: ffmpeg_mux.h:61
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
AVFMT_NEEDNUMBER
#define AVFMT_NEEDNUMBER
Needs 'd' in filename.
Definition: avformat.h:470
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:453
Muxer::limit_filesize
int64_t limit_filesize
Definition: ffmpeg_mux.h:116
arg
const char * arg
Definition: jacosubdec.c:65
AVCodecDescriptor::props
int props
Codec properties, a combination of AV_CODEC_PROP_* flags.
Definition: codec_desc.h:54
if
if(ret)
Definition: filter_design.txt:179
pixfmt_in_list
static int pixfmt_in_list(const enum AVPixelFormat *formats, enum AVPixelFormat format)
Definition: ffmpeg_mux_init.c:485
sq_add_stream
int sq_add_stream(SyncQueue *sq, int limiting)
Add a new stream to the sync queue.
Definition: sync_queue.c:598
OptionsContext::start_time
int64_t start_time
Definition: ffmpeg.h:149
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:232
AVFormatContext
Format I/O context.
Definition: avformat.h:1284
av_realloc_f
#define av_realloc_f(p, o, n)
Definition: tableprint_vlc.h:33
MuxStream::max_frame_rate
AVRational max_frame_rate
Definition: ffmpeg_mux.h:89
ENC_STATS_KEYFRAME
@ ENC_STATS_KEYFRAME
Definition: ffmpeg.h:587
OptionGroup::format_opts
AVDictionary * format_opts
Definition: cmdutils.h:348
opts
static AVDictionary * opts
Definition: movenc.c:51
new_stream_subtitle
static int new_stream_subtitle(Muxer *mux, const OptionsContext *o, OutputStream *ost)
Definition: ffmpeg_mux_init.c:861
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:770
AVCodecParameters::avcodec_parameters_to_context
int avcodec_parameters_to_context(AVCodecContext *codec, const struct AVCodecParameters *par)
Fill the codec context based on the values from the supplied codec parameters.
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
OutputFilter::name
uint8_t * name
Definition: ffmpeg.h:394
parse_meta_type
static int parse_meta_type(void *logctx, const char *arg, char *type, int *index, const char **stream_spec)
Parse a metadata specifier passed as 'arg' parameter.
Definition: ffmpeg_mux_init.c:2813
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_program_add_stream_index
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
Definition: avformat.c:337
MuxStream::frame_rate
AVRational frame_rate
Definition: ffmpeg_mux.h:88
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
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:681
InputStream::st
AVStream * st
Definition: ffmpeg.h:491
AV_DICT_MULTIKEY
#define AV_DICT_MULTIKEY
Allow to store several equal keys in the dictionary.
Definition: dict.h:84
AV_CODEC_CONFIG_FRAME_RATE
@ AV_CODEC_CONFIG_FRAME_RATE
AVRational, terminated by {0, 0}.
Definition: avcodec.h:2561
MuxStream::sch_idx_src
int sch_idx_src
Definition: ffmpeg_mux.h:57
OptionsContext::audio_channels
SpecifierOptList audio_channels
Definition: ffmpeg.h:156
map_auto_video
static int map_auto_video(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1605
nb_enc_stats_files
static int nb_enc_stats_files
Definition: ffmpeg_mux_init.c:162
sch_add_enc
int sch_add_enc(Scheduler *sch, SchThreadFunc func, void *ctx, int(*open_cb)(void *opaque, const AVFrame *frame))
Definition: ffmpeg_sched.c:837
ENC_STATS_PTS_TIME
@ ENC_STATS_PTS_TIME
Definition: ffmpeg.h:577
OptionsContext::fix_sub_duration_heartbeat
SpecifierOptList fix_sub_duration_heartbeat
Definition: ffmpeg.h:241
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
OFILTER_FLAG_AUDIO_24BIT
@ OFILTER_FLAG_AUDIO_24BIT
Definition: ffmpeg.h:305
EncStats::lock
pthread_mutex_t lock
Definition: ffmpeg.h:603
OptionsContext::copy_prior_start
SpecifierOptList copy_prior_start
Definition: ffmpeg.h:233
AVPacketSideData::type
enum AVPacketSideDataType type
Definition: packet.h:419
filter_codec_opts
int filter_codec_opts(const AVDictionary *opts, enum AVCodecID codec_id, AVFormatContext *s, AVStream *st, const AVCodec *codec, AVDictionary **dst, AVDictionary **opts_used)
Filter out options for given codec.
Definition: cmdutils.c:1423
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1326
AV_CODEC_PROP_BITMAP_SUB
#define AV_CODEC_PROP_BITMAP_SUB
Subtitle codec is bitmap based Decoded AVSubtitle data can be read from the AVSubtitleRect->pict fiel...
Definition: codec_desc.h:111
parseutils.h
AVIAMFLayer
A layer defining a Channel Layout in the Audio Element.
Definition: iamf.h:294
EncStats
Definition: ffmpeg.h:597
OptionsContext::program
SpecifierOptList program
Definition: ffmpeg.h:251
EncStatsFile::io
AVIOContext * io
Definition: ffmpeg_mux_init.c:158
getenv_utf8
static char * getenv_utf8(const char *varname)
Definition: getenv_utf8.h:67
copy_unknown_streams
int copy_unknown_streams
Definition: ffmpeg_opt.c:90
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:827
OptionsContext::frame_aspect_ratios
SpecifierOptList frame_aspect_ratios
Definition: ffmpeg.h:217
MuxStream::bsf_ctx
AVBSFContext * bsf_ctx
Definition: ffmpeg_mux.h:48
MuxStream::par_in
AVCodecParameters * par_in
Codec parameters for packets submitted to the muxer (i.e.
Definition: ffmpeg_mux.h:43
AV_CODEC_CAP_VARIABLE_FRAME_SIZE
#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE
Audio encoder supports receiving a different number of samples in each call.
Definition: codec.h:113
av_parse_time
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
Parse timestr and return in *time a corresponding number of microseconds.
Definition: parseutils.c:592
of_stream_init
int of_stream_init(OutputFile *of, OutputStream *ost, const AVCodecContext *enc_ctx)
Definition: ffmpeg_mux.c:611
AV_DICT_DONT_OVERWRITE
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
Definition: dict.h:81
av_parse_ratio
int av_parse_ratio(AVRational *q, const char *str, int max, int log_offset, void *log_ctx)
Parse str and store the parsed ratio in q.
Definition: parseutils.c:45
OptionsContext::max_frames
SpecifierOptList max_frames
Definition: ffmpeg.h:209
Muxer::log_name
char log_name[32]
Definition: ffmpeg_mux.h:99
av_opt_get_int
int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val)
Definition: opt.c:1263
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
The channel layout and number of channels.
Definition: codec_par.h:207
OutputFile::index
int index
Definition: ffmpeg.h:708
OutputFile::class
const AVClass * class
Definition: ffmpeg.h:706
FFMPEG_OPT_FILTER_SCRIPT
#define FFMPEG_OPT_FILTER_SCRIPT
Definition: ffmpeg.h:62
ENC_STATS_PTS_TIME_IN
@ ENC_STATS_PTS_TIME_IN
Definition: ffmpeg.h:579
FilterGraph::nb_outputs
int nb_outputs
Definition: ffmpeg.h:421
copy_metadata
static int copy_metadata(Muxer *mux, AVFormatContext *ic, const char *outspec, const char *inspec, int *metadata_global_manual, int *metadata_streams_manual, int *metadata_chapters_manual)
Definition: ffmpeg_mux_init.c:2943
AV_OPT_FLAG_ENCODING_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition: opt.h:352
index
int index
Definition: gxfenc.c:90
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
find_codec
int find_codec(void *logctx, const char *name, enum AVMediaType type, int encoder, const AVCodec **codec)
Definition: ffmpeg_opt.c:807
InputStream::par
AVCodecParameters * par
Codec parameters - to be used by the decoding/streamcopy code.
Definition: ffmpeg.h:499
input_files
InputFile ** input_files
Definition: ffmpeg.c:108
OutputFile::streams
OutputStream ** streams
Definition: ffmpeg.h:712
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
Scheduler
Definition: ffmpeg_sched.c:278
AVIAMFSubmixElement::audio_element_id
unsigned int audio_element_id
The id of the Audio Element this submix element references.
Definition: iamf.h:455
avformat_stream_group_add_stream
int avformat_stream_group_add_stream(AVStreamGroup *stg, AVStream *st)
Add an already allocated stream to a stream group.
Definition: options.c:547
FilterGraph
Definition: ffmpeg.h:414
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:75
AVIAMFSubmix
Submix layout as defined in section 3.7 of IAMF.
Definition: iamf.h:559
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1340
ENC_TIME_BASE_DEMUX
@ ENC_TIME_BASE_DEMUX
Definition: ffmpeg.h:78
of_add_programs
static int of_add_programs(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:2744
AVOutputFormat::flags
int flags
can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_EXPERIMENTAL, AVFMT_GLOBALHEADER,...
Definition: avformat.h:527
AV_STREAM_GROUP_PARAMS_TILE_GRID
@ AV_STREAM_GROUP_PARAMS_TILE_GRID
Definition: avformat.h:1109
parse_and_set_vsync
int parse_and_set_vsync(const char *arg, enum VideoSyncMethod *vsync_var, int file_idx, int st_idx, int is_global)
Definition: ffmpeg_opt.c:362
avcodec_get_supported_config
int avcodec_get_supported_config(const AVCodecContext *avctx, const AVCodec *codec, enum AVCodecConfig config, unsigned flags, const void **out, int *out_num)
Retrieve a list of all supported values for a given configuration type.
Definition: avcodec.c:831
AV_CODEC_CONFIG_CHANNEL_LAYOUT
@ AV_CODEC_CONFIG_CHANNEL_LAYOUT
AVChannelLayout, terminated by {0}.
Definition: avcodec.h:2564
VideoSyncMethod
VideoSyncMethod
Definition: ffmpeg.h:66
av_get_exact_bits_per_sample
int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
Definition: utils.c:454
av_opt_find
const AVOption * av_opt_find(void *obj, const char *name, const char *unit, int opt_flags, int search_flags)
Look for an option in an object.
Definition: opt.c:1985
OptionsContext::apad
SpecifierOptList apad
Definition: ffmpeg.h:248
OptionsContext::enc_stats_post_fmt
SpecifierOptList enc_stats_post_fmt
Definition: ffmpeg.h:261
OutputStream::filter
OutputFilter * filter
Definition: ffmpeg.h:684
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVCodecContext::rc_override
RcOverride * rc_override
Definition: avcodec.h:1281
OptionsContext::thread_queue_size
int thread_queue_size
Definition: ffmpeg.h:171
AVMediaType
AVMediaType
Definition: avutil.h:198
Muxer::sq_mux
SyncQueue * sq_mux
Definition: ffmpeg_mux.h:120
AV_STREAM_GROUP_PARAMS_TREF
@ AV_STREAM_GROUP_PARAMS_TREF
Definition: avformat.h:1111
InputStreamGroup::fg
FilterGraph * fg
Definition: ffmpeg.h:525
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
MuxStream::apad
const char * apad
Definition: ffmpeg_mux.h:92
OptionsContext::enc_stats_pre
SpecifierOptList enc_stats_pre
Definition: ffmpeg.h:257
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
output_files
OutputFile ** output_files
Definition: ffmpeg.c:111
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
start_time
static int64_t start_time
Definition: ffplay.c:328
AVFormatContext::url
char * url
input or output URL.
Definition: avformat.h:1400
EncStatsType
EncStatsType
Definition: ffmpeg.h:568
Muxer::sch
Scheduler * sch
Definition: ffmpeg_mux.h:103
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1047
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
StreamMap
Definition: ffmpeg.h:135
ENC_STATS_NB_SAMPLES
@ ENC_STATS_NB_SAMPLES
Definition: ffmpeg.h:583
size
int size
Definition: twinvq_data.h:10344
copy_ts
int copy_ts
Definition: ffmpeg_opt.c:67
AV_CODEC_CONFIG_ALPHA_MODE
@ AV_CODEC_CONFIG_ALPHA_MODE
AVAlphaMode, terminated by AVALPHA_MODE_UNSPECIFIED.
Definition: avcodec.h:2567
avio.h
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
AVStreamGroup::iamf_audio_element
struct AVIAMFAudioElement * iamf_audio_element
Definition: avformat.h:1150
AVStream::event_flags
int event_flags
Flags indicating events happening on the stream, a combination of AVSTREAM_EVENT_FLAG_*.
Definition: avformat.h:858
OptionsContext::streamid
AVDictionary * streamid
Definition: ffmpeg.h:206
enc_alloc
int enc_alloc(Encoder **penc, const AVCodec *codec, Scheduler *sch, unsigned sch_idx, void *log_parent)
Definition: ffmpeg_enc.c:99
OptionsContext::pass
SpecifierOptList pass
Definition: ffmpeg.h:243
OutputStream::type
enum AVMediaType type
Definition: ffmpeg.h:652
OutputFile::url
const char * url
Definition: ffmpeg.h:710
setup_sync_queues
static int setup_sync_queues(Muxer *mux, AVFormatContext *oc, int64_t buf_size_us, int shortest)
Definition: ffmpeg_mux_init.c:2111
AVFMT_NOFILE
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:469
AVCodecContext::chroma_intra_matrix
uint16_t * chroma_intra_matrix
custom intra quantization matrix
Definition: avcodec.h:976
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:199
Muxer::opts
AVDictionary * opts
Definition: ffmpeg_mux.h:110
AVStream::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:825
OptionsContext::disposition
SpecifierOptList disposition
Definition: ffmpeg.h:250
AVFMT_NOSTREAMS
#define AVFMT_NOSTREAMS
Format does not require any streams.
Definition: avformat.h:484
allocate_array_elem
void * allocate_array_elem(void *ptr, size_t elem_size, int *nb_elems)
Atomically add a new element to an array of pointers, i.e.
Definition: cmdutils.c:1540
of_enc_stats_close
void of_enc_stats_close(void)
Definition: ffmpeg_mux_init.c:197
MuxStream
Definition: ffmpeg_mux.h:36
AV_CODEC_FLAG_PASS2
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
Definition: avcodec.h:294
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:606
getenv_utf8.h
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
av_iamf_submix_add_element
AVIAMFSubmixElement * av_iamf_submix_add_element(AVIAMFSubmix *submix)
Allocate a submix element and add it to a given AVIAMFSubmix.
AVIAMFAudioElement
Information on how to combine one or more audio streams, as defined in section 3.6 of IAMF.
Definition: iamf.h:359
SpecifierOptList::opt
SpecifierOpt * opt
Definition: cmdutils.h:184
opt_match_per_stream_dbl
void opt_match_per_stream_dbl(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, double *out)
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:63
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_strstart
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
Definition: avstring.c:36
AVCodecParameters::avcodec_parameters_alloc
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
Definition: codec_par.c:57
AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
@ AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
Definition: avformat.h:1107
AVStreamGroup::streams
AVStream ** streams
A list of streams in the group.
Definition: avformat.h:1185
av_parse_video_size
int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str)
Parse str and put in width_ptr and height_ptr the detected values.
Definition: parseutils.c:150
Muxer::sch_idx
unsigned sch_idx
Definition: ffmpeg_mux.h:104
ENC_STATS_FRAME_NUM
@ ENC_STATS_FRAME_NUM
Definition: ffmpeg.h:572
KeyframeForceCtx
Definition: ffmpeg.h:616
OutputFilter::type
enum AVMediaType type
Definition: ffmpeg.h:408
AVStreamGroup::iamf_mix_presentation
struct AVIAMFMixPresentation * iamf_mix_presentation
Definition: avformat.h:1151
OptionsContext::chroma_intra_matrices
SpecifierOptList chroma_intra_matrices
Definition: ffmpeg.h:226
fg_create_simple
int fg_create_simple(FilterGraph **pfg, InputStream *ist, char **graph_desc, Scheduler *sch, unsigned sched_idx_enc, const OutputFilterOptions *opts)
Definition: ffmpeg_filter.c:1237
mux_check_init
int mux_check_init(void *arg)
Definition: ffmpeg_mux.c:555
AVCodec::id
enum AVCodecID id
Definition: codec.h:186
layout
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 layout
Definition: filter_design.txt:18
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:406
av_parse_video_rate
int av_parse_video_rate(AVRational *rate, const char *arg)
Parse str and store the detected values in *rate.
Definition: parseutils.c:181
of_open
int of_open(const OptionsContext *o, const char *filename, Scheduler *sch)
Definition: ffmpeg_mux_init.c:3342
av_channel_layout_from_string
int av_channel_layout_from_string(AVChannelLayout *channel_layout, const char *str)
Initialize a channel layout from a given string description.
Definition: channel_layout.c:313
bprint.h
AVStreamGroupTileGrid::width
int width
Width of the final image for presentation.
Definition: avformat.h:1039
map_auto_data
static int map_auto_data(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1796
AV_STREAM_GROUP_PARAMS_NONE
@ AV_STREAM_GROUP_PARAMS_NONE
Definition: avformat.h:1106
log.h
AVFMT_GLOBALHEADER
#define AVFMT_GLOBALHEADER
Format wants global header.
Definition: avformat.h:478
av_malloc
#define av_malloc(s)
Definition: ops_asmgen.c:44
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
RcOverride::end_frame
int end_frame
Definition: avcodec.h:195
OptionsContext::frame_rates
SpecifierOptList frame_rates
Definition: ffmpeg.h:158
AVChapter::id
int64_t id
unique ID to identify the chapter
Definition: avformat.h:1244
OptionsContext::codec_names
SpecifierOptList codec_names
Definition: ffmpeg.h:154
MuxStream::stats
EncStats stats
Definition: ffmpeg_mux.h:53
OptionsContext::stream_maps
StreamMap * stream_maps
Definition: ffmpeg.h:184
av_opt_set_dict2
int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
Set all the options from a given dictionary on an object.
Definition: opt.c:1956
pix_fmt_parse
static enum AVPixelFormat pix_fmt_parse(OutputStream *ost, const char *name)
Definition: ffmpeg_mux_init.c:525
AVCodecParameters::height
int height
The height of the video frame in pixels.
Definition: codec_par.h:150
av_get_sample_fmt
enum AVSampleFormat av_get_sample_fmt(const char *name)
Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE on error.
Definition: samplefmt.c:58
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
OptionsContext::fps_mode
SpecifierOptList fps_mode
Definition: ffmpeg.h:215
AVCodecParameters::block_align
int block_align
The number of bytes per coded audio frame, required by some formats.
Definition: codec_par.h:221
VSYNC_CFR
@ VSYNC_CFR
Definition: ffmpeg.h:69
OptionsContext::shortest_buf_duration
float shortest_buf_duration
Definition: ffmpeg.h:196
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
AVProgram::metadata
AVDictionary * metadata
Definition: avformat.h:1214
OutputFile::bitexact
int bitexact
Definition: ffmpeg.h:718
display.h
AVIAMFMixPresentation
Information on how to render and mix one or more AVIAMFAudioElement to generate the final audio outpu...
Definition: iamf.h:616
OptionsContext::mux_stats
SpecifierOptList mux_stats
Definition: ffmpeg.h:259
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
OptionsContext::muxing_queue_data_threshold
SpecifierOptList muxing_queue_data_threshold
Definition: ffmpeg.h:246
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:204
InputFile::ctx
AVFormatContext * ctx
Definition: ffmpeg.h:534
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AVFormatContext::max_delay
int max_delay
Definition: avformat.h:1429
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1208
OptionsContext::enc_stats_post
SpecifierOptList enc_stats_post
Definition: ffmpeg.h:258
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
av_inv_q
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
Definition: rational.h:159
len
int len
Definition: vorbis_enc_data.h:426
SchedulerNode
Definition: ffmpeg_sched.h:103
ENC_STATS_STREAM_IDX
@ ENC_STATS_STREAM_IDX
Definition: ffmpeg.h:571
filtergraphs
FilterGraph ** filtergraphs
Definition: ffmpeg.c:114
int_cb
const AVIOInterruptCB int_cb
Definition: ffmpeg.c:312
InputFile::stream_groups
InputStreamGroup ** stream_groups
Definition: ffmpeg.h:552
AVCodecContext::height
int height
Definition: avcodec.h:604
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:83
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:643
ENC_STATS_SAMPLE_NUM
@ ENC_STATS_SAMPLE_NUM
Definition: ffmpeg.h:582
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
nb_output_files
int nb_output_files
Definition: ffmpeg.c:112
AVIAMFParamDefinition::nb_subblocks
unsigned int nb_subblocks
Number of subblocks in the array.
Definition: iamf.h:208
sch_connect
int sch_connect(Scheduler *sch, SchedulerNode src, SchedulerNode dst)
Definition: ffmpeg_sched.c:973
avcodec.h
OptionGroup::sws_dict
AVDictionary * sws_dict
Definition: cmdutils.h:349
av_opt_eval_flags
int av_opt_eval_flags(void *obj, const AVOption *o, const char *val, int *flags_out)
AVStream::disposition
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition: avformat.h:816
tag
uint32_t tag
Definition: movenc.c:2049
OptionsContext::metadata_map
SpecifierOptList metadata_map
Definition: ffmpeg.h:230
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:759
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1452
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:747
AV_LOG_FATAL
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:204
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
AVFormatContext::oformat
const struct AVOutputFormat * oformat
The output container format.
Definition: avformat.h:1303
av_strlcat
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes,...
Definition: avstring.c:95
VSYNC_DROP
@ VSYNC_DROP
Definition: ffmpeg.h:73
output_file_item_name
static const char * output_file_item_name(void *obj)
Definition: ffmpeg_mux_init.c:3313
av_opt_eval_int
int av_opt_eval_int(void *obj, const AVOption *o, const char *val, int *int_out)
AV_CODEC_PROP_ENHANCEMENT
#define AV_CODEC_PROP_ENHANCEMENT
Video codec contains enhancement information meant to be applied to other existing frames,...
Definition: codec_desc.h:105
AV_CODEC_PROP_TEXT_SUB
#define AV_CODEC_PROP_TEXT_SUB
Subtitle codec is text based.
Definition: codec_desc.h:116
InputFile::streams
InputStream ** streams
Definition: ffmpeg.h:548
avformat.h
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
ost_bind_filter
static int ost_bind_filter(const Muxer *mux, MuxStream *ms, OutputFilter *ofilter, const OptionsContext *o, AVRational enc_tb, enum VideoSyncMethod vsync_method, int keep_pix_fmt, int autoscale, int threads_manual, const ViewSpecifier *vs, SchedulerNode *src)
Definition: ffmpeg_mux_init.c:903
dict.h
av_packet_side_data_new
AVPacketSideData * av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd, enum AVPacketSideDataType type, size_t size, int flags)
Allocate a new packet side data.
Definition: packet.c:695
check_avoptions_used
int check_avoptions_used(const AVDictionary *opts, const AVDictionary *opts_used, void *logctx, int decode)
Definition: ffmpeg.c:501
set_encoder_id
static int set_encoder_id(OutputStream *ost, const AVCodec *codec)
Definition: ffmpeg_mux_init.c:1169
flag
#define flag(name)
Definition: cbs_av1.c:496
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
id
enum AVCodecID id
Definition: dts2pts.c:550
av_guess_codec
enum AVCodecID av_guess_codec(const AVOutputFormat *fmt, const char *short_name, const char *filename, const char *mime_type, enum AVMediaType type)
Guess the codec ID based upon muxer and filename.
Definition: format.c:117
SCH_MSTREAM
#define SCH_MSTREAM(file, stream)
Definition: ffmpeg_sched.h:114
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
av_get_pix_fmt
enum AVPixelFormat av_get_pix_fmt(const char *name)
Return the pixel format corresponding to name.
Definition: pixdesc.c:3388
OptionsContext::max_muxing_queue_size
SpecifierOptList max_muxing_queue_size
Definition: ffmpeg.h:245
AVStreamGroup
Definition: avformat.h:1117
of_add_attachments
static int of_add_attachments(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1904
av_get_media_type_string
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition: utils.c:28
AVCodecContext
main external API structure.
Definition: avcodec.h:443
OptionsContext::inter_matrices
SpecifierOptList inter_matrices
Definition: ffmpeg.h:225
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:753
AV_CLASS_CATEGORY_MUXER
@ AV_CLASS_CATEGORY_MUXER
Definition: log.h:32
av_find_best_pix_fmt_of_2
enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
Compute what kind of losses will occur when converting from one specific pixel format to another.
Definition: pixdesc.c:3735
AVStreamGroup::nb_streams
unsigned int nb_streams
Number of elements in AVStreamGroup.streams.
Definition: avformat.h:1172
OptionsContext::audio_sample_rate
SpecifierOptList audio_sample_rate
Definition: ffmpeg.h:157
OptionsContext::mux_preload
float mux_preload
Definition: ffmpeg.h:194
AVRational::den
int den
Denominator.
Definition: rational.h:60
InputStream::file
struct InputFile * file
Definition: ffmpeg.h:487
SpecifierOpt::str
uint8_t * str
Definition: cmdutils.h:174
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
avfilter.h
av_bprint_clear
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
Definition: bprint.c:227
av_dict_parse_string
int av_dict_parse_string(AVDictionary **pm, const char *str, const char *key_val_sep, const char *pairs_sep, int flags)
Parse the key/value pairs list and add the parsed entries to a dictionary.
Definition: dict.c:210
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
OptionsContext::frame_sizes
SpecifierOptList frame_sizes
Definition: ffmpeg.h:160
OptionsContext::video_disable
int video_disable
Definition: ffmpeg.h:200
AVOutputFormat::video_codec
enum AVCodecID video_codec
default video codec
Definition: avformat.h:519
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:881
AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN
Subblocks are of struct type AVIAMFMixGain.
Definition: iamf.h:173
EncStats::lock_initialized
int lock_initialized
Definition: ffmpeg.h:604
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
AVFormatContext::duration
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1419
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
video_sync_method
enum VideoSyncMethod video_sync_method
Definition: ffmpeg_opt.c:60
GROW_ARRAY
#define GROW_ARRAY(array, nb_elems)
Definition: cmdutils.h:536
InputFile::ts_offset
int64_t ts_offset
Definition: ffmpeg.h:541
av_iamf_audio_element_add_layer
AVIAMFLayer * av_iamf_audio_element_add_layer(AVIAMFAudioElement *audio_element)
Allocate a layer and add it to a given AVIAMFAudioElement.
VSYNC_AUTO
@ VSYNC_AUTO
Definition: ffmpeg.h:67
OutputFilter
Definition: ffmpeg.h:390
map_auto_audio
static int map_auto_audio(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1713
av_dict_set_int
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set() that converts the value to a string and stores it.
Definition: dict.c:177
OptionsContext::codec_tags
SpecifierOptList codec_tags
Definition: ffmpeg.h:211
AVIAMFSubmix::nb_elements
unsigned int nb_elements
Number of elements in the submix.
Definition: iamf.h:575
OptionsContext::filter_scripts
SpecifierOptList filter_scripts
Definition: ffmpeg.h:236
AVIO_FLAG_READ
#define AVIO_FLAG_READ
read-only
Definition: avio.h:617
desc
const char * desc
Definition: libsvtav1.c:83
OptionsContext::time_bases
SpecifierOptList time_bases
Definition: ffmpeg.h:253
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
AVERROR_ENCODER_NOT_FOUND
#define AVERROR_ENCODER_NOT_FOUND
Encoder not found.
Definition: error.h:56
av_bsf_list_parse_str
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
Parse string describing list of bitstream filters and create single AVBSFContext describing the whole...
Definition: bsf.c:526
unescape
static int unescape(char **pdst, size_t *dst_len, const char **pstr, char delim)
Definition: ffmpeg_mux_init.c:207
avutil.h
AVIAMFAudioElement::demixing_info
AVIAMFParamDefinition * demixing_info
Demixing information used to reconstruct a scalable channel audio representation.
Definition: iamf.h:379
sch_sq_add_enc
int sch_sq_add_enc(Scheduler *sch, unsigned sq_idx, unsigned enc_idx, int limiting, uint64_t max_frames)
Definition: ffmpeg_sched.c:942
mem.h
AVIAMFSubmix::output_mix_config
AVIAMFParamDefinition * output_mix_config
Information required for post-processing the mixed audio signal to generate the audio signal for play...
Definition: iamf.h:598
MuxStream::sq_idx_mux
int sq_idx_mux
Definition: ffmpeg_mux.h:59
AVStreamGroup::type
enum AVStreamGroupParamsType type
Group type.
Definition: avformat.h:1144
SpecifierOpt::u
union SpecifierOpt::@0 u
avio_open2
int avio_open2(AVIOContext **s, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Create and initialize a AVIOContext for accessing the resource indicated by url.
Definition: avio.c:497
av_strdup
#define av_strdup(s)
Definition: ops_asmgen.c:47
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:322
ffmpeg_mux.h
OptionsContext::rc_overrides
SpecifierOptList rc_overrides
Definition: ffmpeg.h:223
AVCodecParameters::avcodec_parameters_from_context
int avcodec_parameters_from_context(struct AVCodecParameters *par, const AVCodecContext *codec)
Fill the parameters struct based on the values from the supplied codec context.
Definition: codec_par.c:138
new_stream_audio
static int new_stream_audio(Muxer *mux, const OptionsContext *o, OutputStream *ost)
Definition: ffmpeg_mux_init.c:822
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
sch_mux_sub_heartbeat_add
int sch_mux_sub_heartbeat_add(Scheduler *sch, unsigned mux_idx, unsigned stream_idx, unsigned dec_idx)
Definition: ffmpeg_sched.c:1292
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
avformat_stream_group_create
AVStreamGroup * avformat_stream_group_create(AVFormatContext *s, enum AVStreamGroupParamsType type, AVDictionary **options)
Add a new empty stream group to a media file.
Definition: options.c:460
InputStream::index
int index
Definition: ffmpeg.h:489
of_map_group
static int of_map_group(Muxer *mux, AVDictionary **dict, AVBPrint *bp, const char *map)
Definition: ffmpeg_mux_init.c:2470
AVFormatContext::nb_stream_groups
unsigned int nb_stream_groups
Number of elements in AVFormatContext.stream_groups.
Definition: avformat.h:1359
AVStreamGroupTileGrid::height
int height
Height of the final image for presentation.
Definition: avformat.h:1049
ffmpeg_sched.h
EncStatsFile::path
char * path
Definition: ffmpeg_mux_init.c:157
compare_int64
static int compare_int64(const void *a, const void *b)
Definition: ffmpeg_mux_init.c:3182
OptionsContext::copy_initial_nonkeyframes
SpecifierOptList copy_initial_nonkeyframes
Definition: ffmpeg.h:232
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
FKF_N_FORCED
@ FKF_N_FORCED
Definition: ffmpeg.h:558
AVDictionaryEntry
Definition: dict.h:90
OptionsContext::attachments
const char ** attachments
Definition: ffmpeg.h:186
ENC_TIME_BASE_FILTER
@ ENC_TIME_BASE_FILTER
Definition: ffmpeg.h:79
av_add_q
AVRational av_add_q(AVRational b, AVRational c)
Add two rationals.
Definition: rational.c:93
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:57
audio_disable
static int audio_disable
Definition: ffplay.c:316
EncStatsComponent
Definition: ffmpeg.h:590
avio_closep
int avio_closep(AVIOContext **s)
Close the resource accessed by the AVIOContext *s, free it and set the pointer pointing to it to NULL...
Definition: avio.c:655
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
OFILTER_FLAG_DISABLE_CONVERT
@ OFILTER_FLAG_DISABLE_CONVERT
Definition: ffmpeg.h:303
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
AVCodecContext::inter_matrix
uint16_t * inter_matrix
custom inter quantization matrix Must be allocated with the av_malloc() family of functions,...
Definition: avcodec.h:969
cmdutils.h
Muxer::enc_opts_used
AVDictionary * enc_opts_used
Definition: ffmpeg_mux.h:113
AVCodecContext::rc_override_count
int rc_override_count
ratecontrol override, see RcOverride
Definition: avcodec.h:1280
InputFile::input_ts_offset
int64_t input_ts_offset
Definition: ffmpeg.h:535
EncStats::nb_components
int nb_components
Definition: ffmpeg.h:599
OptionsContext::data_disable
int data_disable
Definition: ffmpeg.h:203
nb_filtergraphs
int nb_filtergraphs
Definition: ffmpeg.c:115
AVIAMFSubmixElement::element_mix_config
AVIAMFParamDefinition * element_mix_config
Information required required for applying any processing to the referenced and rendered Audio Elemen...
Definition: iamf.h:464
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:604
AV_CODEC_FLAG2_FIXED_FRAME_SIZE
#define AV_CODEC_FLAG2_FIXED_FRAME_SIZE
Force audio encoders to use a fixed frame size.
Definition: avcodec.h:359
muxer_thread
int muxer_thread(void *arg)
Definition: ffmpeg_mux.c:407
AVIAMFSubmixElement
Submix element as defined in section 3.7 of IAMF.
Definition: iamf.h:449
ENC_STATS_PKT_SIZE
@ ENC_STATS_PKT_SIZE
Definition: ffmpeg.h:584
OutputStream
Definition: mux.c:53
check_opt_bitexact
static int check_opt_bitexact(void *ctx, const AVDictionary *opts, const char *opt_name, int flag)
Definition: ffmpeg_mux_init.c:53
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
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
forced_keyframes_const_names
static const char *const forced_keyframes_const_names[]
Definition: ffmpeg_mux_init.c:3173
read_file_to_string
char * read_file_to_string(const char *filename)
Definition: cmdutils.c:1571
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
process_forced_keyframes
static int process_forced_keyframes(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:3265
av_bprint_chars
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.
Definition: bprint.c:130
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3896
AVIAMFAudioElement::recon_gain_info
AVIAMFParamDefinition * recon_gain_info
Recon gain information used to reconstruct a scalable channel audio representation.
Definition: iamf.h:386
sq_alloc
SyncQueue * sq_alloc(enum SyncQueueType type, int64_t buf_size_us, void *logctx)
Allocate a sync queue of the given type.
Definition: sync_queue.c:654
av_opt_set_dict
int av_opt_set_dict(void *obj, AVDictionary **options)
Set all the options from a given dictionary on an object.
Definition: opt.c:1980
AVDictionaryEntry::value
char * value
Definition: dict.h:92
avstring.h
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:226
opt_match_per_type_str
const char * opt_match_per_type_str(const SpecifierOptList *sol, char mediatype)
Definition: ffmpeg_opt.c:168
opt_match_per_stream_str
void opt_match_per_stream_str(void *logctx, const SpecifierOptList *sol, AVFormatContext *fc, AVStream *st, const char **out)
sch_mux_stream_buffering
void sch_mux_stream_buffering(Scheduler *sch, unsigned mux_idx, unsigned stream_idx, size_t data_threshold, int max_packets)
Configure limits on packet buffering performed before the muxer task is started.
Definition: ffmpeg_sched.c:1251
InputFile::nb_streams
int nb_streams
Definition: ffmpeg.h:549
FKF_N
@ FKF_N
Definition: ffmpeg.h:557
avformat_alloc_output_context2
int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat, const char *format_name, const char *filename)
Allocate an AVFormatContext for an output format.
Definition: mux.c:95
ENC_STATS_DTS_TIME
@ ENC_STATS_DTS_TIME
Definition: ffmpeg.h:581
AVChapter::time_base
AVRational time_base
time base in which the start/end timestamps are specified
Definition: avformat.h:1245
OutputFile::recording_time
int64_t recording_time
desired length of the resulting file in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:715
VSYNC_PASSTHROUGH
@ VSYNC_PASSTHROUGH
Definition: ffmpeg.h:68
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
snprintf
#define snprintf
Definition: snprintf.h:34
EncStats::io
AVIOContext * io
Definition: ffmpeg.h:601
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:42
OptionsContext::bitstream_filters
SpecifierOptList bitstream_filters
Definition: ffmpeg.h:210
src
#define src
Definition: vp8dsp.c:248
copy_chapters
static int copy_chapters(InputFile *ifile, OutputFile *ofile, AVFormatContext *os, int copy_metadata)
Definition: ffmpeg_mux_init.c:2901
MuxStream::last_mux_dts
int64_t last_mux_dts
Definition: ffmpeg_mux.h:70
OptionsContext::enc_time_bases
SpecifierOptList enc_time_bases
Definition: ffmpeg.h:254
av_opt_is_set_to_default_by_name
int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags)
Check if given option is set to its default value.
Definition: opt.c:2711
ENC_STATS_TIMEBASE
@ ENC_STATS_TIMEBASE
Definition: ffmpeg.h:574
create_streams
static int create_streams(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1987
MuxStream::stream_duration
int64_t stream_duration
Definition: ffmpeg_mux.h:72
OutputStream::class
const AVClass * class
Definition: ffmpeg.h:650
OptionsContext::top_field_first
SpecifierOptList top_field_first
Definition: ffmpeg.h:228
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3376
AV_IAMF_PARAMETER_DEFINITION_DEMIXING
@ AV_IAMF_PARAMETER_DEFINITION_DEMIXING
Subblocks are of struct type AVIAMFDemixingInfo.
Definition: iamf.h:177
OutputFile
Definition: ffmpeg.h:705
AV_CODEC_FLAG_PASS1
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition: avcodec.h:290
sch_add_sq_enc
int sch_add_sq_enc(Scheduler *sch, uint64_t buf_size_us, void *logctx)
Add an pre-encoding sync queue to the scheduler.
Definition: ffmpeg_sched.c:917
AV_CODEC_CONFIG_COLOR_SPACE
@ AV_CODEC_CONFIG_COLOR_SPACE
AVColorSpace, terminated by AVCOL_SPC_UNSPECIFIED.
Definition: avcodec.h:2566