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 
485 static int fmt_in_list(const int *formats, int format)
486 {
487  for (; *formats != -1; 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 && !fmt_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 && fmt_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 && !fmt_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 {
734  if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
735  char *logbuffer = read_file_to_string(logfilename);
736 
737  if (!logbuffer) {
738  av_log(ost, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
739  logfilename);
740  return AVERROR(EIO);
741  }
742  video_enc->stats_in = logbuffer;
743  }
744  if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
745  f = fopen_utf8(logfilename, "wb");
746  if (!f) {
748  "Cannot write log file '%s' for pass-1 encoding: %s\n",
749  logfilename, strerror(errno));
750  return AVERROR(errno);
751  }
752  ost->logfile = f;
753  }
754  }
755  }
756 
757  opt_match_per_stream_int(ost, &o->force_fps, oc, st, &ms->force_fps);
758 
759 #if FFMPEG_OPT_TOP
760  ost->top_field_first = -1;
761  opt_match_per_stream_int(ost, &o->top_field_first, oc, st, &ost->top_field_first);
762  if (ost->top_field_first >= 0)
763  av_log(ost, AV_LOG_WARNING, "-top is deprecated, use the setfield filter instead\n");
764 #endif
765 
766 #if FFMPEG_OPT_VSYNC
767  *vsync_method = video_sync_method;
768 #else
769  *vsync_method = VSYNC_AUTO;
770 #endif
771  opt_match_per_stream_str(ost, &o->fps_mode, oc, st, &fps_mode);
772  if (fps_mode) {
773  ret = parse_and_set_vsync(fps_mode, vsync_method, ost->file->index, ost->index, 0);
774  if (ret < 0)
775  return ret;
776  }
777 
778  if ((ms->frame_rate.num || ms->max_frame_rate.num) &&
779  !(*vsync_method == VSYNC_AUTO ||
780  *vsync_method == VSYNC_CFR || *vsync_method == VSYNC_VSCFR)) {
781  av_log(ost, AV_LOG_FATAL, "One of -r/-fpsmax was specified "
782  "together a non-CFR -vsync/-fps_mode. This is contradictory.\n");
783  return AVERROR(EINVAL);
784  }
785 
786  if (*vsync_method == VSYNC_AUTO) {
787  if (ms->frame_rate.num || ms->max_frame_rate.num) {
788  *vsync_method = VSYNC_CFR;
789  } else if (!strcmp(oc->oformat->name, "avi")) {
790  *vsync_method = VSYNC_VFR;
791  } else {
792  *vsync_method = (oc->oformat->flags & AVFMT_VARIABLE_FPS) ?
793  ((oc->oformat->flags & AVFMT_NOTIMESTAMPS) ?
795  }
796 
797  if (ost->ist && *vsync_method == VSYNC_CFR) {
798  const InputFile *ifile = ost->ist->file;
799 
800  if (ifile->nb_streams == 1 && ifile->input_ts_offset == 0)
801  *vsync_method = VSYNC_VSCFR;
802  }
803 
804  if (*vsync_method == VSYNC_CFR && copy_ts) {
805  *vsync_method = VSYNC_VSCFR;
806  }
807  }
808 #if FFMPEG_OPT_VSYNC_DROP
809  if (*vsync_method == VSYNC_DROP)
810  ms->ts_drop = 1;
811 #endif
812  }
813 
814  return 0;
815 }
816 
817 static int new_stream_audio(Muxer *mux, const OptionsContext *o,
818  OutputStream *ost)
819 {
820  MuxStream *ms = ms_from_ost(ost);
821  AVFormatContext *oc = mux->fc;
822  AVStream *st = ost->st;
823 
824  if (ost->enc) {
825  AVCodecContext *audio_enc = ost->enc->enc_ctx;
826  int channels = 0;
827  const char *layout = NULL;
828  const char *sample_fmt = NULL;
829 
831  if (channels) {
833  audio_enc->ch_layout.nb_channels = channels;
834  }
835 
837  if (layout && av_channel_layout_from_string(&audio_enc->ch_layout, layout) < 0) {
838  av_log(ost, AV_LOG_FATAL, "Unknown channel layout: %s\n", layout);
839  return AVERROR(EINVAL);
840  }
841 
842  opt_match_per_stream_str(ost, &o->sample_fmts, oc, st, &sample_fmt);
843  if (sample_fmt &&
844  (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
845  av_log(ost, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
846  return AVERROR(EINVAL);
847  }
848 
849  opt_match_per_stream_int(ost, &o->audio_sample_rate, oc, st, &audio_enc->sample_rate);
850  opt_match_per_stream_str(ost, &o->apad, oc, st, &ms->apad);
851  }
852 
853  return 0;
854 }
855 
856 static int new_stream_subtitle(Muxer *mux, const OptionsContext *o,
857  OutputStream *ost)
858 {
859  AVStream *st;
860 
861  st = ost->st;
862 
863  if (ost->enc) {
864  AVCodecContext *subtitle_enc = ost->enc->enc_ctx;
865 
866  AVCodecDescriptor const *input_descriptor =
867  avcodec_descriptor_get(ost->ist->par->codec_id);
868  AVCodecDescriptor const *output_descriptor =
869  avcodec_descriptor_get(subtitle_enc->codec_id);
870  int input_props = 0, output_props = 0;
871 
872  const char *frame_size = NULL;
873 
875  if (frame_size) {
876  int ret = av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size);
877  if (ret < 0) {
878  av_log(ost, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
879  return ret;
880  }
881  }
882  if (input_descriptor)
883  input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
884  if (output_descriptor)
885  output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
886  if (input_props && output_props && input_props != output_props) {
888  "Subtitle encoding currently only possible from text to text "
889  "or bitmap to bitmap\n");
890  return AVERROR(EINVAL);
891  }
892  }
893 
894  return 0;
895 }
896 
897 static int
898 ost_bind_filter(const Muxer *mux, MuxStream *ms, OutputFilter *ofilter,
899  const OptionsContext *o,
900  AVRational enc_tb, enum VideoSyncMethod vsync_method,
901  int keep_pix_fmt, int autoscale, int threads_manual,
902  const ViewSpecifier *vs,
904 {
905  OutputStream *ost = &ms->ost;
906  AVCodecContext *enc_ctx = ost->enc->enc_ctx;
907  char name[16];
908  char *filters = NULL;
909  int ret;
910 
912  .enc = enc_ctx->codec,
913  .name = name,
914  .format = (ost->type == AVMEDIA_TYPE_VIDEO) ?
915  enc_ctx->pix_fmt : enc_ctx->sample_fmt,
916  .width = enc_ctx->width,
917  .height = enc_ctx->height,
918  .color_space = enc_ctx->colorspace,
919  .color_range = enc_ctx->color_range,
920  .alpha_mode = enc_ctx->alpha_mode,
921  .vsync_method = vsync_method,
922  .frame_rate = ms->frame_rate,
923  .max_frame_rate = ms->max_frame_rate,
924  .sample_rate = enc_ctx->sample_rate,
925  .ch_layout = enc_ctx->ch_layout,
926  .sws_opts = o->g->sws_dict,
927  .swr_opts = o->g->swr_opts,
928  .output_tb = enc_tb,
929  .trim_start_us = mux->of.start_time,
930  .trim_duration_us = mux->of.recording_time,
931  .ts_offset = mux->of.start_time == AV_NOPTS_VALUE ?
932  0 : mux->of.start_time,
933  .vs = vs,
934  .nb_threads = -1,
935 
936  .flags = OFILTER_FLAG_DISABLE_CONVERT * !!keep_pix_fmt |
937  OFILTER_FLAG_AUTOSCALE * !!autoscale |
939  };
940 
941  snprintf(name, sizeof(name), "#%d:%d", mux->of.index, ost->index);
942 
943  if (ost->type == AVMEDIA_TYPE_VIDEO) {
944  if (!keep_pix_fmt) {
947  (const void **) &opts.formats, NULL);
948  if (ret < 0)
949  return ret;
950  }
951  if (!ms->force_fps) {
954  (const void **) &opts.frame_rates, NULL);
955  if (ret < 0)
956  return ret;
957  }
960  (const void **) &opts.color_spaces, NULL);
961  if (ret < 0)
962  return ret;
965  (const void **) &opts.color_ranges, NULL);
966  if (ret < 0)
967  return ret;
970  (const void **) &opts.alpha_modes, NULL);
971  if (ret < 0)
972  return ret;
973  } else {
976  (const void **) &opts.formats, NULL);
977  if (ret < 0)
978  return ret;
981  (const void **) &opts.sample_rates, NULL);
982  if (ret < 0)
983  return ret;
986  (const void **) &opts.ch_layouts, NULL);
987  if (ret < 0)
988  return ret;
989  }
990 
991  if (threads_manual) {
992  ret = av_opt_get_int(enc_ctx, "threads", 0, &opts.nb_threads);
993  if (ret < 0)
994  return ret;
995  }
996 
997  ret = ost_get_filters(o, mux->fc, ost, &filters);
998  if (ret < 0)
999  return ret;
1000 
1001  if (ofilter) {
1002  av_assert0(!filters);
1003  ost->filter = ofilter;
1004  ret = ofilter_bind_enc(ofilter, ms->sch_idx_enc, &opts);
1005  } else {
1006  ret = fg_create_simple(&ost->fg_simple, ost->ist, filters,
1007  mux->sch, ms->sch_idx_enc, &opts);
1008  if (ret >= 0)
1009  ost->filter = ost->fg_simple->outputs[0];
1010 
1011  }
1012  if (ret < 0)
1013  return ret;
1014 
1015  *src = SCH_ENC(ms->sch_idx_enc);
1016 
1017  return 0;
1018 }
1019 
1020 static int streamcopy_init(const OptionsContext *o, const Muxer *mux,
1021  OutputStream *ost, AVDictionary **encoder_opts)
1022 {
1023  MuxStream *ms = ms_from_ost(ost);
1024 
1025  const InputStream *ist = ost->ist;
1026  const InputFile *ifile = ist->file;
1027 
1028  AVCodecParameters *par = ms->par_in;
1029  uint32_t codec_tag = par->codec_tag;
1030 
1031  AVCodecContext *codec_ctx = NULL;
1032 
1033  AVRational fr = ms->frame_rate;
1034 
1035  int ret = 0;
1036 
1037  const char *filters = NULL;
1038 #if FFMPEG_OPT_FILTER_SCRIPT
1039  const char *filters_script = NULL;
1040 
1041  opt_match_per_stream_str(ost, &o->filter_scripts, mux->fc, ost->st, &filters_script);
1042 #endif
1043  opt_match_per_stream_str(ost, &o->filters, mux->fc, ost->st, &filters);
1044 
1045  if (
1047  filters_script ||
1048 #endif
1049  filters) {
1051  "%s '%s' was specified, but codec copy was selected. "
1052  "Filtering and streamcopy cannot be used together.\n",
1054  filters ? "Filtergraph" : "Filtergraph script",
1055  filters ? filters : filters_script
1056 #else
1057  "Filtergraph", filters
1058 #endif
1059  );
1060  return AVERROR(EINVAL);
1061  }
1062 
1063  codec_ctx = avcodec_alloc_context3(NULL);
1064  if (!codec_ctx)
1065  return AVERROR(ENOMEM);
1066 
1067  ret = avcodec_parameters_to_context(codec_ctx, ist->par);
1068  if (ret >= 0)
1069  ret = av_opt_set_dict(codec_ctx, encoder_opts);
1070  if (ret < 0) {
1072  "Error setting up codec context options.\n");
1073  goto fail;
1074  }
1075 
1076  ret = avcodec_parameters_from_context(par, codec_ctx);
1077  if (ret < 0) {
1079  "Error getting reference codec parameters.\n");
1080  goto fail;
1081  }
1082 
1083  if (!codec_tag) {
1084  const struct AVCodecTag * const *ct = mux->fc->oformat->codec_tag;
1085  unsigned int codec_tag_tmp;
1086  if (!ct || av_codec_get_id (ct, par->codec_tag) == par->codec_id ||
1087  !av_codec_get_tag2(ct, par->codec_id, &codec_tag_tmp))
1088  codec_tag = par->codec_tag;
1089  }
1090 
1091  par->codec_tag = codec_tag;
1092 
1093  if (!fr.num)
1094  fr = ist->framerate;
1095 
1096  if (fr.num)
1097  ost->st->avg_frame_rate = fr;
1098  else
1099  ost->st->avg_frame_rate = ist->st->avg_frame_rate;
1100 
1101  // copy timebase while removing common factors
1102  if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0) {
1103  if (fr.num)
1104  ost->st->time_base = av_inv_q(fr);
1105  else
1106  ost->st->time_base = av_add_q(ist->st->time_base, (AVRational){0, 1});
1107  }
1108 
1109  if (!ms->copy_prior_start) {
1110  ms->ts_copy_start = (mux->of.start_time == AV_NOPTS_VALUE) ?
1111  0 : mux->of.start_time;
1112  if (copy_ts && ifile->start_time != AV_NOPTS_VALUE) {
1113  ms->ts_copy_start = FFMAX(ms->ts_copy_start,
1114  ifile->start_time + ifile->ts_offset);
1115  }
1116  }
1117 
1118  for (int i = 0; i < ist->st->codecpar->nb_coded_side_data; i++) {
1119  const AVPacketSideData *sd_src = &ist->st->codecpar->coded_side_data[i];
1120  AVPacketSideData *sd_dst;
1121 
1124  sd_src->type, sd_src->size, 0);
1125  if (!sd_dst) {
1126  ret = AVERROR(ENOMEM);
1127  goto fail;
1128  }
1129  memcpy(sd_dst->data, sd_src->data, sd_src->size);
1130  }
1131 
1132  switch (par->codec_type) {
1133  case AVMEDIA_TYPE_AUDIO:
1134  if ((par->block_align == 1 || par->block_align == 1152 || par->block_align == 576) &&
1135  par->codec_id == AV_CODEC_ID_MP3)
1136  par->block_align = 0;
1137  if (par->codec_id == AV_CODEC_ID_AC3)
1138  par->block_align = 0;
1139  break;
1140  case AVMEDIA_TYPE_VIDEO: {
1141  AVRational sar;
1142  if (ost->frame_aspect_ratio.num) { // overridden by the -aspect cli option
1143  sar =
1144  av_mul_q(ost->frame_aspect_ratio,
1145  (AVRational){ par->height, par->width });
1146  av_log(ost, AV_LOG_WARNING, "Overriding aspect ratio "
1147  "with stream copy may produce invalid files\n");
1148  }
1149  else if (ist->st->sample_aspect_ratio.num)
1150  sar = ist->st->sample_aspect_ratio;
1151  else
1152  sar = par->sample_aspect_ratio;
1153  ost->st->sample_aspect_ratio = par->sample_aspect_ratio = sar;
1154  ost->st->r_frame_rate = ist->st->r_frame_rate;
1155  break;
1156  }
1157  }
1158 
1159 fail:
1160  avcodec_free_context(&codec_ctx);
1161  return ret;
1162 }
1163 
1164 static int set_encoder_id(OutputStream *ost, const AVCodec *codec)
1165 {
1166  const char *cname = codec->name;
1167  uint8_t *encoder_string;
1168  int encoder_string_len;
1169 
1170  encoder_string_len = sizeof(LIBAVCODEC_IDENT) + strlen(cname) + 2;
1171  encoder_string = av_mallocz(encoder_string_len);
1172  if (!encoder_string)
1173  return AVERROR(ENOMEM);
1174 
1175  if (!ost->file->bitexact && !ost->bitexact)
1176  av_strlcpy(encoder_string, LIBAVCODEC_IDENT " ", encoder_string_len);
1177  else
1178  av_strlcpy(encoder_string, "Lavc ", encoder_string_len);
1179  av_strlcat(encoder_string, cname, encoder_string_len);
1180  av_dict_set(&ost->st->metadata, "encoder", encoder_string,
1182 
1183  return 0;
1184 }
1185 
1186 static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type,
1187  InputStream *ist, OutputFilter *ofilter, const ViewSpecifier *vs,
1188  OutputStream **post)
1189 {
1190  AVFormatContext *oc = mux->fc;
1191  MuxStream *ms;
1192  OutputStream *ost;
1193  const AVCodec *enc;
1194  AVStream *st;
1195  SchedulerNode src = { .type = SCH_NODE_TYPE_NONE };
1196  AVDictionary *encoder_opts = NULL;
1197  int ret = 0, keep_pix_fmt = 0, autoscale = 1;
1198  int threads_manual = 0;
1199  AVRational enc_tb = { 0, 0 };
1200  enum VideoSyncMethod vsync_method = VSYNC_AUTO;
1201  const char *bsfs = NULL, *time_base = NULL, *codec_tag = NULL;
1202  char *next;
1203  double qscale = -1;
1204 
1205  st = avformat_new_stream(oc, NULL);
1206  if (!st)
1207  return AVERROR(ENOMEM);
1208 
1209  ms = mux_stream_alloc(mux, type);
1210  if (!ms)
1211  return AVERROR(ENOMEM);
1212 
1213  // only streams with sources (i.e. not attachments)
1214  // are handled by the scheduler
1215  if (ist || ofilter) {
1217  if (ret < 0)
1218  return ret;
1219 
1220  ret = sch_add_mux_stream(mux->sch, mux->sch_idx);
1221  if (ret < 0)
1222  return ret;
1223 
1224  av_assert0(ret == mux->nb_sch_stream_idx - 1);
1225  mux->sch_stream_idx[ret] = ms->ost.index;
1226  ms->sch_idx = ret;
1227  }
1228 
1229  ost = &ms->ost;
1230 
1231  if (o->streamid) {
1232  AVDictionaryEntry *e;
1233  char idx[16], *p;
1234  snprintf(idx, sizeof(idx), "%d", ost->index);
1235 
1236  e = av_dict_get(o->streamid, idx, NULL, 0);
1237  if (e) {
1238  st->id = strtol(e->value, &p, 0);
1239  if (!e->value[0] || *p) {
1240  av_log(ost, AV_LOG_FATAL, "Invalid stream id: %s\n", e->value);
1241  return AVERROR(EINVAL);
1242  }
1243  }
1244  }
1245 
1247  if (!ms->par_in)
1248  return AVERROR(ENOMEM);
1249 
1251 
1252  ost->st = st;
1253  ost->ist = ist;
1254  ost->kf.ref_pts = AV_NOPTS_VALUE;
1255  ms->par_in->codec_type = type;
1256  st->codecpar->codec_type = type;
1257 
1258  ret = choose_encoder(o, oc, ms, &enc);
1259  if (ret < 0) {
1260  av_log(ost, AV_LOG_FATAL, "Error selecting an encoder\n");
1261  return ret;
1262  }
1263 
1264  if (enc) {
1266  ost->type == AVMEDIA_TYPE_SUBTITLE ? NULL : enc_open);
1267  if (ret < 0)
1268  return ret;
1269  ms->sch_idx_enc = ret;
1270 
1271  ret = enc_alloc(&ost->enc, enc, mux->sch, ms->sch_idx_enc, ost);
1272  if (ret < 0)
1273  return ret;
1274 
1275  av_strlcat(ms->log_name, "/", sizeof(ms->log_name));
1276  av_strlcat(ms->log_name, enc->name, sizeof(ms->log_name));
1277  } else {
1278  if (ofilter) {
1280  "Streamcopy requested for output stream fed "
1281  "from a complex filtergraph. Filtering and streamcopy "
1282  "cannot be used together.\n");
1283  return AVERROR(EINVAL);
1284  }
1285 
1286  av_strlcat(ms->log_name, "/copy", sizeof(ms->log_name));
1287  }
1288 
1289  av_log(ost, AV_LOG_VERBOSE, "Created %s stream from ",
1291  if (ist)
1292  av_log(ost, AV_LOG_VERBOSE, "input stream %d:%d",
1293  ist->file->index, ist->index);
1294  else if (ofilter)
1295  av_log(ost, AV_LOG_VERBOSE, "complex filtergraph %d:[%s]\n",
1296  ofilter->graph->index, ofilter->name);
1297  else if (type == AVMEDIA_TYPE_ATTACHMENT)
1298  av_log(ost, AV_LOG_VERBOSE, "attached file");
1299  else av_assert0(0);
1300  av_log(ost, AV_LOG_VERBOSE, "\n");
1301 
1302  ms->pkt = av_packet_alloc();
1303  if (!ms->pkt)
1304  return AVERROR(ENOMEM);
1305 
1306  if (ost->enc) {
1307  AVIOContext *s = NULL;
1308  char *buf = NULL, *arg = NULL;
1309  const char *enc_stats_pre = NULL, *enc_stats_post = NULL, *mux_stats = NULL;
1310  const char *enc_time_base = NULL, *preset = NULL;
1311 
1312  ret = filter_codec_opts(o->g->codec_opts, enc->id,
1313  oc, st, enc, &encoder_opts,
1314  &mux->enc_opts_used);
1315  if (ret < 0)
1316  goto fail;
1317 
1318  opt_match_per_stream_str(ost, &o->presets, oc, st, &preset);
1319  opt_match_per_stream_int(ost, &o->autoscale, oc, st, &autoscale);
1320  if (preset && (!(ret = get_preset_file_2(preset, enc->name, &s)))) {
1321  AVBPrint bprint;
1323  do {
1324  av_bprint_clear(&bprint);
1325  buf = get_line(s, &bprint);
1326  if (!buf) {
1327  ret = AVERROR(ENOMEM);
1328  break;
1329  }
1330 
1331  if (!buf[0] || buf[0] == '#')
1332  continue;
1333  if (!(arg = strchr(buf, '='))) {
1334  av_log(ost, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1335  ret = AVERROR(EINVAL);
1336  break;
1337  }
1338  *arg++ = 0;
1339  av_dict_set(&encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1340  } while (!s->eof_reached);
1341  av_bprint_finalize(&bprint, NULL);
1342  avio_closep(&s);
1343  }
1344  if (ret) {
1346  "Preset %s specified, but could not be opened.\n", preset);
1347  goto fail;
1348  }
1349 
1350  opt_match_per_stream_str(ost, &o->enc_stats_pre, oc, st, &enc_stats_pre);
1351  if (enc_stats_pre &&
1353  const char *format = "{fidx} {sidx} {n} {t}";
1354 
1356 
1357  ret = enc_stats_init(ost, &ost->enc_stats_pre, 1, enc_stats_pre, format);
1358  if (ret < 0)
1359  goto fail;
1360  }
1361 
1362  opt_match_per_stream_str(ost, &o->enc_stats_post, oc, st, &enc_stats_post);
1363  if (enc_stats_post &&
1365  const char *format = "{fidx} {sidx} {n} {t}";
1366 
1368 
1369  ret = enc_stats_init(ost, &ost->enc_stats_post, 0, enc_stats_post, format);
1370  if (ret < 0)
1371  goto fail;
1372  }
1373 
1374  opt_match_per_stream_str(ost, &o->mux_stats, oc, st, &mux_stats);
1375  if (mux_stats &&
1377  const char *format = "{fidx} {sidx} {n} {t}";
1378 
1380 
1381  ret = enc_stats_init(ost, &ms->stats, 0, mux_stats, format);
1382  if (ret < 0)
1383  goto fail;
1384  }
1385 
1386  opt_match_per_stream_str(ost, &o->enc_time_bases, oc, st, &enc_time_base);
1387  if (enc_time_base && type == AVMEDIA_TYPE_SUBTITLE)
1389  "-enc_time_base not supported for subtitles, ignoring\n");
1390  else if (enc_time_base) {
1391  AVRational q;
1392 
1393  if (!strcmp(enc_time_base, "demux")) {
1394  q = (AVRational){ ENC_TIME_BASE_DEMUX, 0 };
1395  } else if (!strcmp(enc_time_base, "filter")) {
1396  q = (AVRational){ ENC_TIME_BASE_FILTER, 0 };
1397  } else {
1398  ret = av_parse_ratio(&q, enc_time_base, INT_MAX, 0, NULL);
1399  if (ret < 0 || q.den <= 0
1401  || q.num < 0
1402 #endif
1403  ) {
1404  av_log(ost, AV_LOG_FATAL, "Invalid time base: %s\n", enc_time_base);
1405  ret = ret < 0 ? ret : AVERROR(EINVAL);
1406  goto fail;
1407  }
1408 #if FFMPEG_OPT_ENC_TIME_BASE_NUM
1409  if (q.num < 0)
1410  av_log(ost, AV_LOG_WARNING, "-enc_time_base -1 is deprecated,"
1411  " use -enc_time_base demux\n");
1412 #endif
1413  }
1414 
1415  enc_tb = q;
1416  }
1417 
1418  threads_manual = !!av_dict_get(encoder_opts, "threads", NULL, 0);
1419 
1420  ret = av_opt_set_dict2(ost->enc->enc_ctx, &encoder_opts, AV_OPT_SEARCH_CHILDREN);
1421  if (ret < 0) {
1422  av_log(ost, AV_LOG_ERROR, "Error applying encoder options: %s\n",
1423  av_err2str(ret));
1424  goto fail;
1425  }
1426 
1427  ret = check_avoptions(encoder_opts);
1428  if (ret < 0)
1429  goto fail;
1430 
1431  // default to automatic thread count
1432  if (!threads_manual)
1433  ost->enc->enc_ctx->thread_count = 0;
1434  } else {
1436  NULL, &encoder_opts,
1437  &mux->enc_opts_used);
1438  if (ret < 0)
1439  goto fail;
1440  }
1441 
1442 
1443  if (o->bitexact) {
1444  ost->bitexact = 1;
1445  } else if (ost->enc) {
1446  ost->bitexact = !!(ost->enc->enc_ctx->flags & AV_CODEC_FLAG_BITEXACT);
1447  }
1448 
1449  if (enc) {
1450  ret = set_encoder_id(ost, enc);
1451  if (ret < 0)
1452  return ret;
1453  }
1454 
1455  opt_match_per_stream_str(ost, &o->time_bases, oc, st, &time_base);
1456  if (time_base) {
1457  AVRational q;
1458  if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1459  q.num <= 0 || q.den <= 0) {
1460  av_log(ost, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1461  ret = AVERROR(EINVAL);
1462  goto fail;
1463  }
1464  st->time_base = q;
1465  }
1466 
1467  ms->max_frames = INT64_MAX;
1469  for (int i = 0; i < o->max_frames.nb_opt; i++) {
1470  char *p = o->max_frames.opt[i].specifier;
1471  if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1472  av_log(ost, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1473  break;
1474  }
1475  }
1476 
1477  ms->copy_prior_start = -1;
1479  opt_match_per_stream_str(ost, &o->bitstream_filters, oc, st, &bsfs);
1480  if (bsfs && *bsfs) {
1481  ret = av_bsf_list_parse_str(bsfs, &ms->bsf_ctx);
1482  if (ret < 0) {
1483  av_log(ost, AV_LOG_ERROR, "Error parsing bitstream filter sequence '%s': %s\n", bsfs, av_err2str(ret));
1484  goto fail;
1485  }
1486  }
1487 
1488  opt_match_per_stream_str(ost, &o->codec_tags, oc, st, &codec_tag);
1489  if (codec_tag) {
1490  uint32_t tag = strtol(codec_tag, &next, 0);
1491  if (*next) {
1492  uint8_t buf[4] = { 0 };
1493  memcpy(buf, codec_tag, FFMIN(sizeof(buf), strlen(codec_tag)));
1494  tag = AV_RL32(buf);
1495  }
1496  ost->st->codecpar->codec_tag = tag;
1497  ms->par_in->codec_tag = tag;
1498  if (ost->enc)
1499  ost->enc->enc_ctx->codec_tag = tag;
1500  }
1501 
1502  opt_match_per_stream_dbl(ost, &o->qscale, oc, st, &qscale);
1503  if (ost->enc && qscale >= 0) {
1504  ost->enc->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1505  ost->enc->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1506  }
1507 
1508  if (ms->sch_idx >= 0) {
1509  int max_muxing_queue_size = 128;
1510  int muxing_queue_data_threshold = 50 * 1024 * 1024;
1511 
1513  &max_muxing_queue_size);
1515  oc, st, &muxing_queue_data_threshold);
1516 
1517  sch_mux_stream_buffering(mux->sch, mux->sch_idx, ms->sch_idx,
1518  max_muxing_queue_size, muxing_queue_data_threshold);
1519  }
1520 
1522  &ost->bits_per_raw_sample);
1523 
1525  oc, st, &ost->fix_sub_duration_heartbeat);
1526 
1527  if (oc->oformat->flags & AVFMT_GLOBALHEADER && ost->enc)
1528  ost->enc->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1529 
1531  oc, st, &ms->copy_initial_nonkeyframes);
1532  switch (type) {
1533  case AVMEDIA_TYPE_VIDEO: ret = new_stream_video (mux, o, ost, &keep_pix_fmt, &vsync_method); break;
1534  case AVMEDIA_TYPE_AUDIO: ret = new_stream_audio (mux, o, ost); break;
1535  case AVMEDIA_TYPE_SUBTITLE: ret = new_stream_subtitle (mux, o, ost); break;
1536  }
1537  if (ret < 0)
1538  goto fail;
1539 
1540  if (ost->enc &&
1542  ret = ost_bind_filter(mux, ms, ofilter, o, enc_tb, vsync_method,
1543  keep_pix_fmt, autoscale, threads_manual, vs, &src);
1544  if (ret < 0)
1545  goto fail;
1546  } else if (ost->ist) {
1547  ret = ist_use(ost->ist, !!ost->enc, NULL, &src);
1548  if (ret < 0) {
1550  "Error binding an input stream\n");
1551  goto fail;
1552  }
1553  ms->sch_idx_src = src.idx;
1554 
1555  // src refers to a decoder for transcoding, demux stream otherwise
1556  if (ost->enc) {
1557  ret = sch_connect(mux->sch,
1558  src, SCH_ENC(ms->sch_idx_enc));
1559  if (ret < 0)
1560  goto fail;
1561  src = SCH_ENC(ms->sch_idx_enc);
1562  }
1563  }
1564 
1565  if (src.type != SCH_NODE_TYPE_NONE) {
1566  ret = sch_connect(mux->sch,
1567  src, SCH_MSTREAM(mux->sch_idx, ms->sch_idx));
1568  if (ret < 0)
1569  goto fail;
1570  } else {
1571  // only attachment streams don't have a source
1573  }
1574 
1575  if (ost->ist && !ost->enc) {
1576  ret = streamcopy_init(o, mux, ost, &encoder_opts);
1577  if (ret < 0)
1578  goto fail;
1579  }
1580 
1581  // copy estimated duration as a hint to the muxer
1582  if (ost->ist && ost->ist->st->duration > 0) {
1583  ms->stream_duration = ist->st->duration;
1584  ms->stream_duration_tb = ist->st->time_base;
1585  }
1586 
1587  if (post)
1588  *post = ost;
1589 
1590  ret = 0;
1591 
1592 fail:
1593  av_dict_free(&encoder_opts);
1594 
1595  return ret;
1596 }
1597 
1598 static int map_auto_video(Muxer *mux, const OptionsContext *o)
1599 {
1600  AVFormatContext *oc = mux->fc;
1601  InputStreamGroup *best_istg = NULL;
1602  InputStream *best_ist = NULL;
1603  int64_t best_score = 0;
1604  int qcr;
1605 
1606  /* video: highest resolution */
1608  return 0;
1609 
1610  qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
1611  for (int j = 0; j < nb_input_files; j++) {
1612  InputFile *ifile = input_files[j];
1613  InputStreamGroup *file_best_istg = NULL;
1614  InputStream *file_best_ist = NULL;
1615  int64_t file_best_score = 0;
1616  for (int i = 0; i < ifile->nb_stream_groups; i++) {
1617  InputStreamGroup *istg = ifile->stream_groups[i];
1618  int64_t score = 0;
1619 
1620  if (!istg->fg)
1621  continue;
1622 
1623  for (int j = 0; j < istg->stg->nb_streams; j++) {
1624  AVStream *st = istg->stg->streams[j];
1625 
1627  score = 100000000;
1628  break;
1629  }
1630  }
1631 
1632  switch (istg->stg->type) {
1634  const AVStreamGroupTileGrid *tg = istg->stg->params.tile_grid;
1635  score += tg->width * (int64_t)tg->height
1636  + 5000000*!!(istg->stg->disposition & AV_DISPOSITION_DEFAULT);
1637  break;
1638  }
1639  default:
1640  continue;
1641  }
1642 
1643  if (score > file_best_score) {
1644  file_best_score = score;
1645  file_best_istg = istg;
1646  }
1647  }
1648  for (int i = 0; i < ifile->nb_streams; i++) {
1649  InputStream *ist = ifile->streams[i];
1650  int64_t score;
1651 
1652  if (ist->user_set_discard == AVDISCARD_ALL ||
1654  continue;
1655 
1656  score = ist->st->codecpar->width * (int64_t)ist->st->codecpar->height
1657  + 100000000 * !!(ist->st->event_flags & AVSTREAM_EVENT_FLAG_NEW_PACKETS)
1658  + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
1659  if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1660  score = 1;
1661 
1662  if (score > file_best_score) {
1663  if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1664  continue;
1665  file_best_score = score;
1666  file_best_ist = ist;
1667  file_best_istg = NULL;
1668  }
1669  }
1670  if (file_best_istg) {
1671  file_best_score -= 5000000*!!(file_best_istg->stg->disposition & AV_DISPOSITION_DEFAULT);
1672  if (file_best_score > best_score) {
1673  best_score = file_best_score;
1674  best_istg = file_best_istg;
1675  best_ist = NULL;
1676  }
1677  }
1678  if (file_best_ist) {
1679  if((qcr == MKTAG('A', 'P', 'I', 'C')) ||
1680  !(file_best_ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1681  file_best_score -= 5000000*!!(file_best_ist->st->disposition & AV_DISPOSITION_DEFAULT);
1682  if (file_best_score > best_score) {
1683  best_score = file_best_score;
1684  best_ist = file_best_ist;
1685  best_istg = NULL;
1686  }
1687  }
1688  }
1689  if (best_istg) {
1690  FilterGraph *fg = best_istg->fg;
1691  OutputFilter *ofilter = fg->outputs[0];
1692 
1693  av_assert0(fg->nb_outputs == 1);
1694  av_log(mux, AV_LOG_VERBOSE, "Creating output stream from stream group derived complex filtergraph %d.\n", fg->index);
1695 
1696  return ost_add(mux, o, AVMEDIA_TYPE_VIDEO, NULL, ofilter, NULL, NULL);
1697  }
1698  if (best_ist)
1699  return ost_add(mux, o, AVMEDIA_TYPE_VIDEO, best_ist, NULL, NULL, NULL);
1700 
1701  return 0;
1702 }
1703 
1704 static int map_auto_audio(Muxer *mux, const OptionsContext *o)
1705 {
1706  AVFormatContext *oc = mux->fc;
1707  InputStream *best_ist = NULL;
1708  int best_score = 0;
1709 
1710  /* audio: most channels */
1712  return 0;
1713 
1714  for (int j = 0; j < nb_input_files; j++) {
1715  InputFile *ifile = input_files[j];
1716  InputStream *file_best_ist = NULL;
1717  int file_best_score = 0;
1718  for (int i = 0; i < ifile->nb_streams; i++) {
1719  InputStream *ist = ifile->streams[i];
1720  int score;
1721 
1722  if (ist->user_set_discard == AVDISCARD_ALL ||
1724  continue;
1725 
1726  score = ist->st->codecpar->ch_layout.nb_channels
1727  + 100000000 * !!(ist->st->event_flags & AVSTREAM_EVENT_FLAG_NEW_PACKETS)
1728  + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
1729  if (score > file_best_score) {
1730  file_best_score = score;
1731  file_best_ist = ist;
1732  }
1733  }
1734  if (file_best_ist) {
1735  file_best_score -= 5000000*!!(file_best_ist->st->disposition & AV_DISPOSITION_DEFAULT);
1736  if (file_best_score > best_score) {
1737  best_score = file_best_score;
1738  best_ist = file_best_ist;
1739  }
1740  }
1741  }
1742  if (best_ist)
1743  return ost_add(mux, o, AVMEDIA_TYPE_AUDIO, best_ist, NULL, NULL, NULL);
1744 
1745  return 0;
1746 }
1747 
1748 static int map_auto_subtitle(Muxer *mux, const OptionsContext *o)
1749 {
1750  AVFormatContext *oc = mux->fc;
1751  const char *subtitle_codec_name = NULL;
1752 
1753  /* subtitles: pick first */
1756  return 0;
1757 
1758  for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist))
1759  if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1760  AVCodecDescriptor const *input_descriptor =
1761  avcodec_descriptor_get(ist->st->codecpar->codec_id);
1762  AVCodecDescriptor const *output_descriptor = NULL;
1763  AVCodec const *output_codec =
1765  int input_props = 0, output_props = 0;
1766  if (ist->user_set_discard == AVDISCARD_ALL)
1767  continue;
1768  if (output_codec)
1769  output_descriptor = avcodec_descriptor_get(output_codec->id);
1770  if (input_descriptor)
1771  input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1772  if (output_descriptor)
1773  output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1774  if (subtitle_codec_name ||
1775  input_props & output_props ||
1776  // Map dvb teletext which has neither property to any output subtitle encoder
1777  input_descriptor && output_descriptor &&
1778  (!input_descriptor->props ||
1779  !output_descriptor->props)) {
1780  return ost_add(mux, o, AVMEDIA_TYPE_SUBTITLE, ist, NULL, NULL, NULL);
1781  }
1782  }
1783 
1784  return 0;
1785 }
1786 
1787 static int map_auto_data(Muxer *mux, const OptionsContext *o)
1788 {
1789  AVFormatContext *oc = mux->fc;
1790  /* Data only if codec id match */
1792 
1793  if (codec_id == AV_CODEC_ID_NONE)
1794  return 0;
1795 
1796  for (InputStream *ist = ist_iter(NULL); ist; ist = ist_iter(ist)) {
1797  if (ist->user_set_discard == AVDISCARD_ALL)
1798  continue;
1799  if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA &&
1800  ist->st->codecpar->codec_id == codec_id) {
1801  int ret = ost_add(mux, o, AVMEDIA_TYPE_DATA, ist, NULL, NULL, NULL);
1802  if (ret < 0)
1803  return ret;
1804  }
1805  }
1806 
1807  return 0;
1808 }
1809 
1810 static int map_manual(Muxer *mux, const OptionsContext *o, const StreamMap *map)
1811 {
1812  InputStream *ist;
1813  int ret;
1814 
1815  if (map->disabled)
1816  return 0;
1817 
1818  if (map->linklabel) {
1819  FilterGraph *fg;
1820  OutputFilter *ofilter = NULL;
1821  int j, k;
1822 
1823  for (j = 0; j < nb_filtergraphs; j++) {
1824  fg = filtergraphs[j];
1825  for (k = 0; k < fg->nb_outputs; k++) {
1826  const char *linklabel = fg->outputs[k]->linklabel;
1827  if (linklabel && !strcmp(linklabel, map->linklabel)) {
1828  ofilter = fg->outputs[k];
1829  goto loop_end;
1830  }
1831  }
1832  }
1833 loop_end:
1834  if (!ofilter) {
1835  av_log(mux, AV_LOG_FATAL, "Output with label '%s' does not exist "
1836  "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
1837  return AVERROR(EINVAL);
1838  }
1839 
1840  av_log(mux, AV_LOG_VERBOSE, "Creating output stream from an explicitly "
1841  "mapped complex filtergraph %d, output [%s]\n", fg->index, map->linklabel);
1842 
1843  ret = ost_add(mux, o, ofilter->type, NULL, ofilter, NULL, NULL);
1844  if (ret < 0)
1845  return ret;
1846  } else {
1847  const ViewSpecifier *vs = map->vs.type == VIEW_SPECIFIER_TYPE_NONE ?
1848  NULL : &map->vs;
1849 
1850  ist = input_files[map->file_index]->streams[map->stream_index];
1851  if (ist->user_set_discard == AVDISCARD_ALL) {
1852  av_log(mux, AV_LOG_FATAL, "Stream #%d:%d is disabled and cannot be mapped.\n",
1853  map->file_index, map->stream_index);
1854  return AVERROR(EINVAL);
1855  }
1857  return 0;
1859  return 0;
1861  return 0;
1862  if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
1863  return 0;
1864 
1865  if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_UNKNOWN &&
1868  "Cannot map stream #%d:%d - unsupported type.\n",
1869  map->file_index, map->stream_index);
1870  if (!ignore_unknown_streams) {
1871  av_log(mux, AV_LOG_FATAL,
1872  "If you want unsupported types ignored instead "
1873  "of failing, please use the -ignore_unknown option\n"
1874  "If you want them copied, please use -copy_unknown\n");
1875  return AVERROR(EINVAL);
1876  }
1877  return 0;
1878  }
1879 
1880  if (vs && ist->st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO) {
1881  av_log(mux, AV_LOG_ERROR,
1882  "View specifier given for mapping a %s input stream\n",
1884  return AVERROR(EINVAL);
1885  }
1886 
1887  ret = ost_add(mux, o, ist->st->codecpar->codec_type, ist, NULL, vs, NULL);
1888  if (ret < 0)
1889  return ret;
1890  }
1891 
1892  return 0;
1893 }
1894 
1895 static int of_add_attachments(Muxer *mux, const OptionsContext *o)
1896 {
1897  MuxStream *ms;
1898  OutputStream *ost;
1899  int err;
1900 
1901  for (int i = 0; i < o->nb_attachments; i++) {
1902  AVIOContext *pb;
1903  uint8_t *attachment;
1904  char *attachment_filename;
1905  const char *p;
1906  int64_t len;
1907 
1908  if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1909  av_log(mux, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1910  o->attachments[i]);
1911  return err;
1912  }
1913  if ((len = avio_size(pb)) <= 0) {
1914  av_log(mux, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1915  o->attachments[i]);
1916  err = len ? len : AVERROR_INVALIDDATA;
1917  goto read_fail;
1918  }
1919  if (len > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
1920  av_log(mux, AV_LOG_FATAL, "Attachment %s too large.\n",
1921  o->attachments[i]);
1922  err = AVERROR(ERANGE);
1923  goto read_fail;
1924  }
1925 
1926  attachment = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE);
1927  if (!attachment) {
1928  err = AVERROR(ENOMEM);
1929  goto read_fail;
1930  }
1931 
1932  err = avio_read(pb, attachment, len);
1933  if (err < 0)
1934  av_log(mux, AV_LOG_FATAL, "Error reading attachment file %s: %s\n",
1935  o->attachments[i], av_err2str(err));
1936  else if (err != len) {
1937  av_log(mux, AV_LOG_FATAL, "Could not read all %"PRId64" bytes for "
1938  "attachment file %s\n", len, o->attachments[i]);
1939  err = AVERROR(EIO);
1940  }
1941 
1942 read_fail:
1943  avio_closep(&pb);
1944  if (err < 0)
1945  return err;
1946 
1947  memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
1948 
1949  av_log(mux, AV_LOG_VERBOSE, "Creating attachment stream from file %s\n",
1950  o->attachments[i]);
1951 
1952  attachment_filename = av_strdup(o->attachments[i]);
1953  if (!attachment_filename) {
1954  av_free(attachment);
1955  return AVERROR(ENOMEM);
1956  }
1957 
1958  err = ost_add(mux, o, AVMEDIA_TYPE_ATTACHMENT, NULL, NULL, NULL, &ost);
1959  if (err < 0) {
1960  av_free(attachment_filename);
1961  av_freep(&attachment);
1962  return err;
1963  }
1964 
1965  ms = ms_from_ost(ost);
1966 
1967  ost->attachment_filename = attachment_filename;
1968  ms->par_in->extradata = attachment;
1969  ms->par_in->extradata_size = len;
1970 
1971  p = strrchr(o->attachments[i], '/');
1972  av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1973  }
1974 
1975  return 0;
1976 }
1977 
1978 static int create_streams(Muxer *mux, const OptionsContext *o)
1979 {
1980  static int (* const map_func[])(Muxer *mux, const OptionsContext *o) = {
1985  };
1986 
1987  AVFormatContext *oc = mux->fc;
1988 
1989  int auto_disable =
1990  o->video_disable * (1 << AVMEDIA_TYPE_VIDEO) |
1991  o->audio_disable * (1 << AVMEDIA_TYPE_AUDIO) |
1993  o->data_disable * (1 << AVMEDIA_TYPE_DATA);
1994 
1995  int ret;
1996 
1997  /* create streams for all unlabeled output pads */
1998  for (int i = 0; i < nb_filtergraphs; i++) {
1999  FilterGraph *fg = filtergraphs[i];
2000  for (int j = 0; j < fg->nb_outputs; j++) {
2001  OutputFilter *ofilter = fg->outputs[j];
2002 
2003  if (ofilter->linklabel || ofilter->bound)
2004  continue;
2005 
2006  auto_disable |= 1 << ofilter->type;
2007 
2008  av_log(mux, AV_LOG_VERBOSE, "Creating output stream from unlabeled "
2009  "output of complex filtergraph %d.", fg->index);
2010  if (!o->nb_stream_maps)
2011  av_log(mux, AV_LOG_VERBOSE, " This overrides automatic %s mapping.",
2012  av_get_media_type_string(ofilter->type));
2013  av_log(mux, AV_LOG_VERBOSE, "\n");
2014 
2015  ret = ost_add(mux, o, ofilter->type, NULL, ofilter, NULL, NULL);
2016  if (ret < 0)
2017  return ret;
2018  }
2019  }
2020 
2021  if (!o->nb_stream_maps) {
2022  av_log(mux, AV_LOG_VERBOSE, "No explicit maps, mapping streams automatically...\n");
2023 
2024  /* pick the "best" stream of each type */
2025  for (int i = 0; i < FF_ARRAY_ELEMS(map_func); i++) {
2026  if (!map_func[i] || auto_disable & (1 << i))
2027  continue;
2028  ret = map_func[i](mux, o);
2029  if (ret < 0)
2030  return ret;
2031  }
2032  } else {
2033  av_log(mux, AV_LOG_VERBOSE, "Adding streams from explicit maps...\n");
2034 
2035  for (int i = 0; i < o->nb_stream_maps; i++) {
2036  ret = map_manual(mux, o, &o->stream_maps[i]);
2037  if (ret < 0)
2038  return ret;
2039  }
2040  }
2041 
2042  ret = of_add_attachments(mux, o);
2043  if (ret < 0)
2044  return ret;
2045 
2046  // setup fix_sub_duration_heartbeat mappings
2047  for (unsigned i = 0; i < oc->nb_streams; i++) {
2048  MuxStream *src = ms_from_ost(mux->of.streams[i]);
2049 
2050  if (!src->ost.fix_sub_duration_heartbeat)
2051  continue;
2052 
2053  for (unsigned j = 0; j < oc->nb_streams; j++) {
2054  MuxStream *dst = ms_from_ost(mux->of.streams[j]);
2055 
2056  if (src == dst || dst->ost.type != AVMEDIA_TYPE_SUBTITLE ||
2057  !dst->ost.enc || !dst->ost.ist || !dst->ost.ist->fix_sub_duration)
2058  continue;
2059 
2060  ret = sch_mux_sub_heartbeat_add(mux->sch, mux->sch_idx, src->sch_idx,
2061  dst->sch_idx_src);
2062 
2063  }
2064  }
2065 
2066  // handle -apad
2067  if (o->shortest) {
2068  int have_video = 0;
2069 
2070  for (unsigned i = 0; i < mux->of.nb_streams; i++)
2071  if (mux->of.streams[i]->type == AVMEDIA_TYPE_VIDEO) {
2072  have_video = 1;
2073  break;
2074  }
2075 
2076  for (unsigned i = 0; have_video && i < mux->of.nb_streams; i++) {
2077  MuxStream *ms = ms_from_ost(mux->of.streams[i]);
2078  OutputFilter *ofilter = ms->ost.filter;
2079 
2080  if (ms->ost.type != AVMEDIA_TYPE_AUDIO || !ms->apad || !ofilter)
2081  continue;
2082 
2083  ofilter->apad = av_strdup(ms->apad);
2084  if (!ofilter->apad)
2085  return AVERROR(ENOMEM);
2086  }
2087  }
2088  for (unsigned i = 0; i < mux->of.nb_streams; i++) {
2089  MuxStream *ms = ms_from_ost(mux->of.streams[i]);
2090  ms->apad = NULL;
2091  }
2092 
2093  if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2094  av_dump_format(oc, nb_output_files - 1, oc->url, 1);
2095  av_log(mux, AV_LOG_ERROR, "Output file does not contain any stream\n");
2096  return AVERROR(EINVAL);
2097  }
2098 
2099  return 0;
2100 }
2101 
2103  int64_t buf_size_us, int shortest)
2104 {
2105  OutputFile *of = &mux->of;
2106  int nb_av_enc = 0, nb_audio_fs = 0, nb_interleaved = 0;
2107  int limit_frames = 0, limit_frames_av_enc = 0;
2108 
2109 #define IS_AV_ENC(ost, type) \
2110  (ost->enc && (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO))
2111 #define IS_INTERLEAVED(type) (type != AVMEDIA_TYPE_ATTACHMENT)
2112 
2113  for (int i = 0; i < oc->nb_streams; i++) {
2114  OutputStream *ost = of->streams[i];
2115  MuxStream *ms = ms_from_ost(ost);
2116  enum AVMediaType type = ost->type;
2117 
2118  ms->sq_idx_mux = -1;
2119 
2120  nb_interleaved += IS_INTERLEAVED(type);
2121  nb_av_enc += IS_AV_ENC(ost, type);
2122  nb_audio_fs += (ost->enc && type == AVMEDIA_TYPE_AUDIO &&
2123  !(ost->enc->enc_ctx->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE));
2124 
2125  limit_frames |= ms->max_frames < INT64_MAX;
2126  limit_frames_av_enc |= (ms->max_frames < INT64_MAX) && IS_AV_ENC(ost, type);
2127  }
2128 
2129  if (!((nb_interleaved > 1 && shortest) ||
2130  (nb_interleaved > 0 && limit_frames) ||
2131  nb_audio_fs))
2132  return 0;
2133 
2134  /* we use a sync queue before encoding when:
2135  * - 'shortest' is in effect and we have two or more encoded audio/video
2136  * streams
2137  * - at least one encoded audio/video stream is frame-limited, since
2138  * that has similar semantics to 'shortest'
2139  * - at least one audio encoder requires constant frame sizes
2140  *
2141  * Note that encoding sync queues are handled in the scheduler, because
2142  * different encoders run in different threads and need external
2143  * synchronization, while muxer sync queues can be handled inside the muxer
2144  */
2145  if ((shortest && nb_av_enc > 1) || limit_frames_av_enc || nb_audio_fs) {
2146  int sq_idx, ret;
2147 
2148  sq_idx = sch_add_sq_enc(mux->sch, buf_size_us, mux);
2149  if (sq_idx < 0)
2150  return sq_idx;
2151 
2152  for (int i = 0; i < oc->nb_streams; i++) {
2153  OutputStream *ost = of->streams[i];
2154  MuxStream *ms = ms_from_ost(ost);
2155  enum AVMediaType type = ost->type;
2156 
2157  if (!IS_AV_ENC(ost, type))
2158  continue;
2159 
2160  ret = sch_sq_add_enc(mux->sch, sq_idx, ms->sch_idx_enc,
2161  shortest || ms->max_frames < INT64_MAX,
2162  ms->max_frames);
2163  if (ret < 0)
2164  return ret;
2165  }
2166  }
2167 
2168  /* if there are any additional interleaved streams, then ALL the streams
2169  * are also synchronized before sending them to the muxer */
2170  if (nb_interleaved > nb_av_enc) {
2171  mux->sq_mux = sq_alloc(SYNC_QUEUE_PACKETS, buf_size_us, mux);
2172  if (!mux->sq_mux)
2173  return AVERROR(ENOMEM);
2174 
2175  mux->sq_pkt = av_packet_alloc();
2176  if (!mux->sq_pkt)
2177  return AVERROR(ENOMEM);
2178 
2179  for (int i = 0; i < oc->nb_streams; i++) {
2180  OutputStream *ost = of->streams[i];
2181  MuxStream *ms = ms_from_ost(ost);
2182  enum AVMediaType type = ost->type;
2183 
2184  if (!IS_INTERLEAVED(type))
2185  continue;
2186 
2187  ms->sq_idx_mux = sq_add_stream(mux->sq_mux,
2188  shortest || ms->max_frames < INT64_MAX);
2189  if (ms->sq_idx_mux < 0)
2190  return ms->sq_idx_mux;
2191 
2192  if (ms->max_frames != INT64_MAX)
2193  sq_limit_frames(mux->sq_mux, ms->sq_idx_mux, ms->max_frames);
2194  }
2195  }
2196 
2197 #undef IS_AV_ENC
2198 #undef IS_INTERLEAVED
2199 
2200  return 0;
2201 }
2202 
2203 static int of_parse_iamf_audio_element_layers(Muxer *mux, AVStreamGroup *stg, char *ptr)
2204 {
2205  AVIAMFAudioElement *audio_element = stg->params.iamf_audio_element;
2206  AVDictionary *dict = NULL;
2207  const char *token;
2208  int ret = 0;
2209 
2210  audio_element->demixing_info =
2212  audio_element->recon_gain_info =
2214 
2215  if (!audio_element->demixing_info ||
2216  !audio_element->recon_gain_info)
2217  return AVERROR(ENOMEM);
2218 
2219  /* process manually set layers and parameters */
2220  token = av_strtok(NULL, ",", &ptr);
2221  while (token) {
2222  const AVDictionaryEntry *e;
2223  int demixing = 0, recon_gain = 0;
2224  int layer = 0;
2225 
2226  if (ptr)
2227  ptr += strspn(ptr, " \n\t\r");
2228  if (av_strstart(token, "layer=", &token))
2229  layer = 1;
2230  else if (av_strstart(token, "demixing=", &token))
2231  demixing = 1;
2232  else if (av_strstart(token, "recon_gain=", &token))
2233  recon_gain = 1;
2234 
2235  av_dict_free(&dict);
2236  ret = av_dict_parse_string(&dict, token, "=", ":", 0);
2237  if (ret < 0) {
2238  av_log(mux, AV_LOG_ERROR, "Error parsing audio element specification %s\n", token);
2239  goto fail;
2240  }
2241 
2242  if (layer) {
2243  AVIAMFLayer *audio_layer = av_iamf_audio_element_add_layer(audio_element);
2244  if (!audio_layer) {
2245  av_log(mux, AV_LOG_ERROR, "Error adding layer to stream group %d\n", stg->index);
2246  ret = AVERROR(ENOMEM);
2247  goto fail;
2248  }
2249  av_opt_set_dict(audio_layer, &dict);
2250  } else if (demixing || recon_gain) {
2251  AVIAMFParamDefinition *param = demixing ? audio_element->demixing_info
2252  : audio_element->recon_gain_info;
2253  void *subblock = av_iamf_param_definition_get_subblock(param, 0);
2254 
2255  av_opt_set_dict(param, &dict);
2256  av_opt_set_dict(subblock, &dict);
2257  }
2258 
2259  // make sure that no entries are left in the dict
2260  e = NULL;
2261  if (e = av_dict_iterate(dict, e)) {
2262  av_log(mux, AV_LOG_FATAL, "Unknown layer key %s.\n", e->key);
2263  ret = AVERROR(EINVAL);
2264  goto fail;
2265  }
2266  token = av_strtok(NULL, ",", &ptr);
2267  }
2268 
2269 fail:
2270  av_dict_free(&dict);
2271  if (!ret && !audio_element->nb_layers) {
2272  av_log(mux, AV_LOG_ERROR, "No layer in audio element specification\n");
2273  ret = AVERROR(EINVAL);
2274  }
2275 
2276  return ret;
2277 }
2278 
2279 static int of_parse_iamf_submixes(Muxer *mux, AVStreamGroup *stg, char *ptr)
2280 {
2281  AVFormatContext *oc = mux->fc;
2283  AVDictionary *dict = NULL;
2284  const char *token;
2285  char *submix_str = NULL;
2286  int ret = 0;
2287 
2288  /* process manually set submixes */
2289  token = av_strtok(NULL, ",", &ptr);
2290  while (token) {
2291  AVIAMFSubmix *submix = NULL;
2292  const char *subtoken;
2293  char *subptr = NULL;
2294 
2295  if (ptr)
2296  ptr += strspn(ptr, " \n\t\r");
2297  if (!av_strstart(token, "submix=", &token)) {
2298  av_log(mux, AV_LOG_ERROR, "No submix in mix presentation specification \"%s\"\n", token);
2299  goto fail;
2300  }
2301 
2302  submix_str = av_strdup(token);
2303  if (!submix_str)
2304  goto fail;
2305 
2307  if (!submix) {
2308  av_log(mux, AV_LOG_ERROR, "Error adding submix to stream group %d\n", stg->index);
2309  ret = AVERROR(ENOMEM);
2310  goto fail;
2311  }
2312  submix->output_mix_config =
2314  if (!submix->output_mix_config) {
2315  ret = AVERROR(ENOMEM);
2316  goto fail;
2317  }
2318 
2319  subptr = NULL;
2320  subtoken = av_strtok(submix_str, "|", &subptr);
2321  while (subtoken) {
2322  const AVDictionaryEntry *e;
2323  int element = 0, layout = 0;
2324 
2325  if (subptr)
2326  subptr += strspn(subptr, " \n\t\r");
2327  if (av_strstart(subtoken, "element=", &subtoken))
2328  element = 1;
2329  else if (av_strstart(subtoken, "layout=", &subtoken))
2330  layout = 1;
2331 
2332  av_dict_free(&dict);
2333  ret = av_dict_parse_string(&dict, subtoken, "=", ":", 0);
2334  if (ret < 0) {
2335  av_log(mux, AV_LOG_ERROR, "Error parsing submix specification \"%s\"\n", subtoken);
2336  goto fail;
2337  }
2338 
2339  if (element) {
2340  AVIAMFSubmixElement *submix_element;
2341  char *endptr = NULL;
2342  int64_t idx = -1;
2343 
2344  if (e = av_dict_get(dict, "stg", NULL, 0))
2345  idx = strtoll(e->value, &endptr, 0);
2346  if (!endptr || *endptr || idx < 0 || idx >= oc->nb_stream_groups - 1 ||
2348  av_log(mux, AV_LOG_ERROR, "Invalid or missing stream group index in "
2349  "submix element specification \"%s\"\n", subtoken);
2350  ret = AVERROR(EINVAL);
2351  goto fail;
2352  }
2353  submix_element = av_iamf_submix_add_element(submix);
2354  if (!submix_element) {
2355  av_log(mux, AV_LOG_ERROR, "Error adding element to submix\n");
2356  ret = AVERROR(ENOMEM);
2357  goto fail;
2358  }
2359 
2360  submix_element->audio_element_id = oc->stream_groups[idx]->id;
2361 
2362  submix_element->element_mix_config =
2364  if (!submix_element->element_mix_config)
2365  ret = AVERROR(ENOMEM);
2366  av_dict_set(&dict, "stg", NULL, 0);
2367  av_opt_set_dict2(submix_element, &dict, AV_OPT_SEARCH_CHILDREN);
2368  } else if (layout) {
2369  AVIAMFSubmixLayout *submix_layout = av_iamf_submix_add_layout(submix);
2370  if (!submix_layout) {
2371  av_log(mux, AV_LOG_ERROR, "Error adding layout to submix\n");
2372  ret = AVERROR(ENOMEM);
2373  goto fail;
2374  }
2375  av_opt_set_dict(submix_layout, &dict);
2376  } else
2377  av_opt_set_dict2(submix, &dict, AV_OPT_SEARCH_CHILDREN);
2378 
2379  if (ret < 0) {
2380  goto fail;
2381  }
2382 
2383  // make sure that no entries are left in the dict
2384  e = NULL;
2385  while (e = av_dict_iterate(dict, e)) {
2386  av_log(mux, AV_LOG_FATAL, "Unknown submix key %s.\n", e->key);
2387  ret = AVERROR(EINVAL);
2388  goto fail;
2389  }
2390  subtoken = av_strtok(NULL, "|", &subptr);
2391  }
2392  av_freep(&submix_str);
2393 
2394  if (!submix->nb_elements) {
2395  av_log(mux, AV_LOG_ERROR, "No audio elements in submix specification \"%s\"\n", token);
2396  ret = AVERROR(EINVAL);
2397  }
2398  token = av_strtok(NULL, ",", &ptr);
2399  }
2400 
2401 fail:
2402  av_dict_free(&dict);
2403  av_free(submix_str);
2404 
2405  return ret;
2406 }
2407 
2408 static int of_serialize_options(Muxer *mux, void *obj, AVBPrint *bp)
2409 {
2410  char *ptr;
2411  int ret;
2412 
2414  &ptr, '=', ':');
2415  if (ret < 0) {
2416  av_log(mux, AV_LOG_ERROR, "Failed to serialize group\n");
2417  return ret;
2418  }
2419 
2420  av_bprintf(bp, "%s", ptr);
2421  ret = strlen(ptr);
2422  av_free(ptr);
2423 
2424  return ret;
2425 }
2426 
2427 #define SERIALIZE(parent, child) do { \
2428  ret = of_serialize_options(mux, parent->child, bp); \
2429  if (ret < 0) \
2430  return ret; \
2431 } while (0)
2432 
2433 #define SERIALIZE_LOOP_SUBBLOCK(obj) do { \
2434  for (int k = 0; k < obj->nb_subblocks; k++) { \
2435  ret = of_serialize_options(mux, \
2436  av_iamf_param_definition_get_subblock(obj, k), bp); \
2437  if (ret < 0) \
2438  return ret; \
2439  } \
2440 } while (0)
2441 
2442 #define SERIALIZE_LOOP(parent, child, suffix, separator) do { \
2443  for (int j = 0; j < parent->nb_## child ## suffix; j++) { \
2444  av_bprintf(bp, separator#child "="); \
2445  SERIALIZE(parent, child ## suffix[j]); \
2446  } \
2447 } while (0)
2448 
2450 {
2451  AVFormatContext *oc = mux->fc;
2452 
2453  for (unsigned i = 0; i < oc->nb_stream_groups; i++)
2454  if (oc->stream_groups[i]->id == id)
2455  return oc->stream_groups[i]->index;
2456 
2457  return AVERROR(EINVAL);
2458 }
2459 
2460 static int of_map_group(Muxer *mux, AVDictionary **dict, AVBPrint *bp, const char *map)
2461 {
2462  AVStreamGroup *stg;
2463  int ret, file_idx, stream_idx;
2464  char *ptr;
2465 
2466  file_idx = strtol(map, &ptr, 0);
2467  if (file_idx >= nb_input_files || file_idx < 0 || map == ptr) {
2468  av_log(mux, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2469  return AVERROR(EINVAL);
2470  }
2471 
2472  stream_idx = strtol(*ptr == '=' ? ptr + 1 : ptr, &ptr, 0);
2473  if (*ptr || stream_idx >= input_files[file_idx]->ctx->nb_stream_groups || stream_idx < 0) {
2474  av_log(mux, AV_LOG_ERROR, "Invalid input stream group index: %d.\n", stream_idx);
2475  return AVERROR(EINVAL);
2476  }
2477 
2478  stg = input_files[file_idx]->ctx->stream_groups[stream_idx];
2479  ret = of_serialize_options(mux, stg, bp);
2480  if (ret < 0)
2481  return ret;
2482 
2483  ret = av_dict_parse_string(dict, bp->str, "=", ":", 0);
2484  if (ret < 0)
2485  av_log(mux, AV_LOG_ERROR, "Error parsing mapped group specification %s\n", ptr);
2486  av_dict_set_int(dict, "type", stg->type, 0);
2487 
2488  av_bprint_clear(bp);
2489  switch(stg->type) {
2491  AVIAMFAudioElement *audio_element = stg->params.iamf_audio_element;
2492 
2493  if (audio_element->demixing_info) {
2494  AVIAMFParamDefinition *demixing_info = audio_element->demixing_info;
2495  av_bprintf(bp, ",demixing=");
2496  SERIALIZE(audio_element, demixing_info);
2497  if (ret && demixing_info->nb_subblocks)
2498  av_bprintf(bp, ":");
2499  SERIALIZE_LOOP_SUBBLOCK(demixing_info);
2500  }
2501  if (audio_element->recon_gain_info) {
2502  AVIAMFParamDefinition *recon_gain_info = audio_element->recon_gain_info;
2503  av_bprintf(bp, ",recon_gain=");
2504  SERIALIZE(audio_element, recon_gain_info);
2505  if (ret && recon_gain_info->nb_subblocks)
2506  av_bprintf(bp, ":");
2507  SERIALIZE_LOOP_SUBBLOCK(recon_gain_info);
2508  }
2509  SERIALIZE_LOOP(audio_element, layer, s, ",");
2510  break;
2511  }
2514 
2515  for (int i = 0; i < mix->nb_submixes; i++) {
2516  AVIAMFSubmix *submix = mix->submixes[i];
2517  AVIAMFParamDefinition *output_mix_config = submix->output_mix_config;
2518 
2519  av_bprintf(bp, ",submix=");
2520  SERIALIZE(mix, submixes[i]);
2521  if (ret && output_mix_config->nb_subblocks)
2522  av_bprintf(bp, ":");
2523  SERIALIZE_LOOP_SUBBLOCK(output_mix_config);
2524  for (int j = 0; j < submix->nb_elements; j++) {
2525  AVIAMFSubmixElement *element = submix->elements[j];
2526  AVIAMFParamDefinition *element_mix_config = element->element_mix_config;
2528 
2529  if (id < 0) {
2530  av_log(mux, AV_LOG_ERROR, "Invalid or missing stream group index in"
2531  "submix element");
2532  return id;
2533  }
2534 
2535  av_bprintf(bp, "|element=");
2536  SERIALIZE(submix, elements[j]);
2537  if (ret && element_mix_config->nb_subblocks)
2538  av_bprintf(bp, ":");
2539  SERIALIZE_LOOP_SUBBLOCK(element_mix_config);
2540  if (ret)
2541  av_bprintf(bp, ":");
2542  av_bprintf(bp, "stg=%"PRId64, id);
2543  }
2544  SERIALIZE_LOOP(submix, layout, s, "|");
2545  }
2546  break;
2547  }
2548  default:
2549  av_log(mux, AV_LOG_ERROR, "Unsupported mapped group type %d.\n", stg->type);
2550  ret = AVERROR(EINVAL);
2551  break;
2552  }
2553  return 0;
2554 }
2555 
2556 static int of_parse_group_token(Muxer *mux, const char *token, char *ptr)
2557 {
2558  AVFormatContext *oc = mux->fc;
2559  AVStreamGroup *stg;
2560  AVDictionary *dict = NULL, *tmp = NULL;
2561  char *mapped_string = NULL;
2562  const AVDictionaryEntry *e;
2563  const AVOption opts[] = {
2564  { "type", "Set group type", offsetof(AVStreamGroup, type), AV_OPT_TYPE_INT,
2565  { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, .unit = "type" },
2566  { "iamf_audio_element", NULL, 0, AV_OPT_TYPE_CONST,
2567  { .i64 = AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT }, .unit = "type" },
2568  { "iamf_mix_presentation", NULL, 0, AV_OPT_TYPE_CONST,
2569  { .i64 = AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION }, .unit = "type" },
2570  { NULL },
2571  };
2572  const AVClass class = {
2573  .class_name = "StreamGroupType",
2574  .item_name = av_default_item_name,
2575  .option = opts,
2576  .version = LIBAVUTIL_VERSION_INT,
2577  };
2578  const AVClass *pclass = &class;
2579  int type, ret;
2580 
2581  ret = av_dict_parse_string(&dict, token, "=", ":", AV_DICT_MULTIKEY);
2582  if (ret < 0) {
2583  av_log(mux, AV_LOG_ERROR, "Error parsing group specification %s\n", token);
2584  return ret;
2585  }
2586 
2587  av_dict_copy(&tmp, dict, 0);
2588  e = av_dict_get(dict, "map", NULL, 0);
2589  if (e) {
2590  AVBPrint bp;
2591 
2592  if (ptr) {
2593  av_log(mux, AV_LOG_ERROR, "Unexpected extra parameters when mapping a"
2594  " stream group\n");
2595  ret = AVERROR(EINVAL);
2596  goto end;
2597  }
2598 
2600  ret = of_map_group(mux, &tmp, &bp, e->value);
2601  if (ret < 0) {
2602  av_bprint_finalize(&bp, NULL);
2603  goto end;
2604  }
2605 
2606  av_bprint_finalize(&bp, &mapped_string);
2607  ptr = mapped_string;
2608  }
2609 
2610  // "type" is not a user settable AVOption in AVStreamGroup, so handle it here
2611  e = av_dict_get(tmp, "type", NULL, 0);
2612  if (!e) {
2613  av_log(mux, AV_LOG_ERROR, "No type specified for Stream Group in \"%s\"\n", token);
2614  ret = AVERROR(EINVAL);
2615  goto end;
2616  }
2617 
2618  ret = av_opt_eval_int(&pclass, opts, e->value, &type);
2620  ret = AVERROR(EINVAL);
2621  if (ret < 0) {
2622  av_log(mux, AV_LOG_ERROR, "Invalid group type \"%s\"\n", e->value);
2623  goto end;
2624  }
2625 
2626  stg = avformat_stream_group_create(oc, type, &tmp);
2627  if (!stg) {
2628  ret = AVERROR(ENOMEM);
2629  goto end;
2630  }
2631 
2632  e = NULL;
2633  while (e = av_dict_get(dict, "st", e, 0)) {
2634  char *endptr;
2635  int64_t idx = strtoll(e->value, &endptr, 0);
2636  if (*endptr || idx < 0 || idx >= oc->nb_streams) {
2637  av_log(mux, AV_LOG_ERROR, "Invalid stream index %"PRId64"\n", idx);
2638  ret = AVERROR(EINVAL);
2639  goto end;
2640  }
2641  ret = avformat_stream_group_add_stream(stg, oc->streams[idx]);
2642  if (ret < 0)
2643  goto end;
2644  }
2645  while (e = av_dict_get(dict, "stg", e, 0)) {
2646  char *endptr;
2647  int64_t idx = strtoll(e->value, &endptr, 0);
2648  if (*endptr || idx < 0 || idx >= oc->nb_stream_groups - 1) {
2649  av_log(mux, AV_LOG_ERROR, "Invalid stream group index %"PRId64"\n", idx);
2650  ret = AVERROR(EINVAL);
2651  goto end;
2652  }
2653  for (unsigned i = 0; i < oc->stream_groups[idx]->nb_streams; i++) {
2655  if (ret < 0)
2656  goto end;
2657  }
2658  }
2659 
2660  switch(type) {
2662  ret = of_parse_iamf_audio_element_layers(mux, stg, ptr);
2663  break;
2665  ret = of_parse_iamf_submixes(mux, stg, ptr);
2666  break;
2667  default:
2668  av_log(mux, AV_LOG_FATAL, "Unknown group type %d.\n", type);
2669  ret = AVERROR(EINVAL);
2670  break;
2671  }
2672 
2673  if (ret < 0)
2674  goto end;
2675 
2676  // make sure that nothing but "st" and "stg" entries are left in the dict
2677  e = NULL;
2678  av_dict_set(&tmp, "map", NULL, 0);
2679  av_dict_set(&tmp, "type", NULL, 0);
2680  while (e = av_dict_iterate(tmp, e)) {
2681  if (!strcmp(e->key, "st") || !strcmp(e->key, "stg"))
2682  continue;
2683 
2684  av_log(mux, AV_LOG_FATAL, "Unknown group key %s.\n", e->key);
2685  ret = AVERROR(EINVAL);
2686  goto end;
2687  }
2688 
2689  ret = 0;
2690 end:
2691  av_free(mapped_string);
2692  av_dict_free(&dict);
2693  av_dict_free(&tmp);
2694 
2695  return ret;
2696 }
2697 
2698 static int of_add_groups(Muxer *mux, const OptionsContext *o)
2699 {
2700  /* process manually set groups */
2701  for (int i = 0; i < o->stream_groups.nb_opt; i++) {
2702  const char *token;
2703  char *str, *ptr = NULL;
2704  int ret = 0;
2705 
2706  str = av_strdup(o->stream_groups.opt[i].u.str);
2707  if (!str)
2708  return ret;
2709 
2710  token = av_strtok(str, ",", &ptr);
2711  if (token) {
2712  if (ptr)
2713  ptr += strspn(ptr, " \n\t\r");
2714  ret = of_parse_group_token(mux, token, ptr);
2715  }
2716 
2717  av_free(str);
2718  if (ret < 0)
2719  return ret;
2720  }
2721 
2722  return 0;
2723 }
2724 
2725 static int of_add_programs(Muxer *mux, const OptionsContext *o)
2726 {
2727  AVFormatContext *oc = mux->fc;
2728  /* process manually set programs */
2729  for (int i = 0; i < o->program.nb_opt; i++) {
2730  AVDictionary *dict = NULL;
2731  const AVDictionaryEntry *e;
2732  AVProgram *program;
2733  int ret, progid = i + 1;
2734 
2735  ret = av_dict_parse_string(&dict, o->program.opt[i].u.str, "=", ":",
2737  if (ret < 0) {
2738  av_log(mux, AV_LOG_ERROR, "Error parsing program specification %s\n",
2739  o->program.opt[i].u.str);
2740  return ret;
2741  }
2742 
2743  e = av_dict_get(dict, "program_num", NULL, 0);
2744  if (e) {
2745  progid = strtol(e->value, NULL, 0);
2746  av_dict_set(&dict, e->key, NULL, 0);
2747  }
2748 
2749  program = av_new_program(oc, progid);
2750  if (!program) {
2751  ret = AVERROR(ENOMEM);
2752  goto fail;
2753  }
2754 
2755  e = av_dict_get(dict, "title", NULL, 0);
2756  if (e) {
2757  av_dict_set(&program->metadata, e->key, e->value, 0);
2758  av_dict_set(&dict, e->key, NULL, 0);
2759  }
2760 
2761  e = NULL;
2762  while (e = av_dict_get(dict, "st", e, 0)) {
2763  int st_num = strtol(e->value, NULL, 0);
2764  av_program_add_stream_index(oc, progid, st_num);
2765  }
2766 
2767  // make sure that nothing but "st" entries are left in the dict
2768  e = NULL;
2769  while (e = av_dict_iterate(dict, e)) {
2770  if (!strcmp(e->key, "st"))
2771  continue;
2772 
2773  av_log(mux, AV_LOG_FATAL, "Unknown program key %s.\n", e->key);
2774  ret = AVERROR(EINVAL);
2775  goto fail;
2776  }
2777 
2778 fail:
2779  av_dict_free(&dict);
2780  if (ret < 0)
2781  return ret;
2782  }
2783 
2784  return 0;
2785 }
2786 
2787 /**
2788  * Parse a metadata specifier passed as 'arg' parameter.
2789  * @param arg metadata string to parse
2790  * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
2791  * @param index for type c/p, chapter/program index is written here
2792  * @param stream_spec for type s, the stream specifier is written here
2793  */
2794 static int parse_meta_type(void *logctx, const char *arg,
2795  char *type, int *index, const char **stream_spec)
2796 {
2797  if (*arg) {
2798  *type = *arg;
2799  switch (*arg) {
2800  case 'g':
2801  break;
2802  case 's':
2803  if (*(++arg) && *arg != ':') {
2804  av_log(logctx, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
2805  return AVERROR(EINVAL);
2806  }
2807  *stream_spec = *arg == ':' ? arg + 1 : "";
2808  break;
2809  case 'c':
2810  case 'p':
2811  if (*(++arg) == ':')
2812  *index = strtol(++arg, NULL, 0);
2813  break;
2814  default:
2815  av_log(logctx, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
2816  return AVERROR(EINVAL);
2817  }
2818  } else
2819  *type = 'g';
2820 
2821  return 0;
2822 }
2823 
2825  const OptionsContext *o)
2826 {
2827  for (int i = 0; i < o->metadata.nb_opt; i++) {
2828  AVDictionary **m;
2829  char type, *val;
2830  const char *stream_spec;
2831  int index = 0, ret = 0;
2832 
2833  val = strchr(o->metadata.opt[i].u.str, '=');
2834  if (!val) {
2835  av_log(of, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2836  o->metadata.opt[i].u.str);
2837  return AVERROR(EINVAL);
2838  }
2839  *val++ = 0;
2840 
2841  ret = parse_meta_type(of, o->metadata.opt[i].specifier, &type, &index, &stream_spec);
2842  if (ret < 0)
2843  return ret;
2844 
2845  if (type == 's') {
2846  for (int j = 0; j < oc->nb_streams; j++) {
2847  if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2848  av_dict_set(&oc->streams[j]->metadata, o->metadata.opt[i].u.str, *val ? val : NULL, 0);
2849  } else if (ret < 0)
2850  return ret;
2851  }
2852  } else {
2853  switch (type) {
2854  case 'g':
2855  m = &oc->metadata;
2856  break;
2857  case 'c':
2858  if (index < 0 || index >= oc->nb_chapters) {
2859  av_log(of, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2860  return AVERROR(EINVAL);
2861  }
2862  m = &oc->chapters[index]->metadata;
2863  break;
2864  case 'p':
2865  if (index < 0 || index >= oc->nb_programs) {
2866  av_log(of, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2867  return AVERROR(EINVAL);
2868  }
2869  m = &oc->programs[index]->metadata;
2870  break;
2871  default:
2872  av_log(of, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata.opt[i].specifier);
2873  return AVERROR(EINVAL);
2874  }
2875  av_dict_set(m, o->metadata.opt[i].u.str, *val ? val : NULL, 0);
2876  }
2877  }
2878 
2879  return 0;
2880 }
2881 
2882 static int copy_chapters(InputFile *ifile, OutputFile *ofile, AVFormatContext *os,
2883  int copy_metadata)
2884 {
2885  AVFormatContext *is = ifile->ctx;
2886  AVChapter **tmp;
2887 
2888  tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
2889  if (!tmp)
2890  return AVERROR(ENOMEM);
2891  os->chapters = tmp;
2892 
2893  for (int i = 0; i < is->nb_chapters; i++) {
2894  AVChapter *in_ch = is->chapters[i], *out_ch;
2895  int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
2896  int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
2897  AV_TIME_BASE_Q, in_ch->time_base);
2898  int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
2900 
2901 
2902  if (in_ch->end < ts_off)
2903  continue;
2904  if (rt != INT64_MAX && in_ch->start > rt + ts_off)
2905  break;
2906 
2907  out_ch = av_mallocz(sizeof(AVChapter));
2908  if (!out_ch)
2909  return AVERROR(ENOMEM);
2910 
2911  out_ch->id = in_ch->id;
2912  out_ch->time_base = in_ch->time_base;
2913  out_ch->start = FFMAX(0, in_ch->start - ts_off);
2914  out_ch->end = FFMIN(rt, in_ch->end - ts_off);
2915 
2916  if (copy_metadata)
2917  av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
2918 
2919  os->chapters[os->nb_chapters++] = out_ch;
2920  }
2921  return 0;
2922 }
2923 
2924 static int copy_metadata(Muxer *mux, AVFormatContext *ic,
2925  const char *outspec, const char *inspec,
2926  int *metadata_global_manual, int *metadata_streams_manual,
2927  int *metadata_chapters_manual)
2928 {
2929  AVFormatContext *oc = mux->fc;
2930  AVDictionary **meta_in = NULL;
2931  AVDictionary **meta_out = NULL;
2932  int i, ret = 0;
2933  char type_in, type_out;
2934  const char *istream_spec = NULL, *ostream_spec = NULL;
2935  int idx_in = 0, idx_out = 0;
2936 
2937  ret = parse_meta_type(mux, inspec, &type_in, &idx_in, &istream_spec);
2938  if (ret >= 0)
2939  ret = parse_meta_type(mux, outspec, &type_out, &idx_out, &ostream_spec);
2940  if (ret < 0)
2941  return ret;
2942 
2943  if (type_in == 'g' || type_out == 'g' || (!*outspec && !ic))
2944  *metadata_global_manual = 1;
2945  if (type_in == 's' || type_out == 's' || (!*outspec && !ic))
2946  *metadata_streams_manual = 1;
2947  if (type_in == 'c' || type_out == 'c' || (!*outspec && !ic))
2948  *metadata_chapters_manual = 1;
2949 
2950  /* ic is NULL when just disabling automatic mappings */
2951  if (!ic)
2952  return 0;
2953 
2954 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2955  if ((index) < 0 || (index) >= (nb_elems)) {\
2956  av_log(mux, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
2957  (desc), (index));\
2958  return AVERROR(EINVAL);\
2959  }
2960 
2961 #define SET_DICT(type, meta, context, index)\
2962  switch (type) {\
2963  case 'g':\
2964  meta = &context->metadata;\
2965  break;\
2966  case 'c':\
2967  METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
2968  meta = &context->chapters[index]->metadata;\
2969  break;\
2970  case 'p':\
2971  METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
2972  meta = &context->programs[index]->metadata;\
2973  break;\
2974  case 's':\
2975  break; /* handled separately below */ \
2976  default: av_assert0(0);\
2977  }\
2978 
2979  SET_DICT(type_in, meta_in, ic, idx_in);
2980  SET_DICT(type_out, meta_out, oc, idx_out);
2981 
2982  /* for input streams choose first matching stream */
2983  if (type_in == 's') {
2984  for (i = 0; i < ic->nb_streams; i++) {
2985  if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
2986  meta_in = &ic->streams[i]->metadata;
2987  break;
2988  } else if (ret < 0)
2989  return ret;
2990  }
2991  if (!meta_in) {
2992  av_log(mux, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
2993  return AVERROR(EINVAL);
2994  }
2995  }
2996 
2997  if (type_out == 's') {
2998  for (i = 0; i < oc->nb_streams; i++) {
2999  if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3000  meta_out = &oc->streams[i]->metadata;
3001  av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3002  } else if (ret < 0)
3003  return ret;
3004  }
3005  } else
3006  av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3007 
3008  return 0;
3009 }
3010 
3011 static int copy_meta(Muxer *mux, const OptionsContext *o)
3012 {
3013  OutputFile *of = &mux->of;
3014  AVFormatContext *oc = mux->fc;
3015  int chapters_input_file = o->chapters_input_file;
3016  int metadata_global_manual = 0;
3017  int metadata_streams_manual = 0;
3018  int metadata_chapters_manual = 0;
3019  int ret;
3020 
3021  /* copy metadata */
3022  for (int i = 0; i < o->metadata_map.nb_opt; i++) {
3023  char *p;
3024  int in_file_index = strtol(o->metadata_map.opt[i].u.str, &p, 0);
3025 
3026  if (in_file_index >= nb_input_files) {
3027  av_log(mux, AV_LOG_FATAL, "Invalid input file index %d while "
3028  "processing metadata maps\n", in_file_index);
3029  return AVERROR(EINVAL);
3030  }
3031  ret = copy_metadata(mux,
3032  in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL,
3033  o->metadata_map.opt[i].specifier, *p ? p + 1 : p,
3034  &metadata_global_manual, &metadata_streams_manual,
3035  &metadata_chapters_manual);
3036  if (ret < 0)
3037  return ret;
3038  }
3039 
3040  /* copy chapters */
3041  if (chapters_input_file >= nb_input_files) {
3042  if (chapters_input_file == INT_MAX) {
3043  /* copy chapters from the first input file that has them*/
3044  chapters_input_file = -1;
3045  for (int i = 0; i < nb_input_files; i++)
3046  if (input_files[i]->ctx->nb_chapters) {
3047  chapters_input_file = i;
3048  break;
3049  }
3050  } else {
3051  av_log(mux, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
3052  chapters_input_file);
3053  return AVERROR(EINVAL);
3054  }
3055  }
3056  if (chapters_input_file >= 0)
3057  copy_chapters(input_files[chapters_input_file], of, oc,
3058  !metadata_chapters_manual);
3059 
3060  /* copy global metadata by default */
3061  if (!metadata_global_manual && nb_input_files){
3064  if (of->recording_time != INT64_MAX)
3065  av_dict_set(&oc->metadata, "duration", NULL, 0);
3066  av_dict_set(&oc->metadata, "creation_time", NULL, 0);
3067  av_dict_set(&oc->metadata, "company_name", NULL, 0);
3068  av_dict_set(&oc->metadata, "product_name", NULL, 0);
3069  av_dict_set(&oc->metadata, "product_version", NULL, 0);
3070  }
3071  if (!metadata_streams_manual)
3072  for (int i = 0; i < of->nb_streams; i++) {
3073  OutputStream *ost = of->streams[i];
3074 
3075  if (!ost->ist) /* this is true e.g. for attached files */
3076  continue;
3078  }
3079 
3080  return 0;
3081 }
3082 
3083 static int set_dispositions(Muxer *mux, const OptionsContext *o)
3084 {
3085  OutputFile *of = &mux->of;
3086  AVFormatContext *ctx = mux->fc;
3087 
3088  // indexed by type+1, because AVMEDIA_TYPE_UNKNOWN=-1
3089  int nb_streams[AVMEDIA_TYPE_NB + 1] = { 0 };
3090  int have_default[AVMEDIA_TYPE_NB + 1] = { 0 };
3091  int have_manual = 0;
3092  int ret = 0;
3093 
3094  const char **dispositions;
3095 
3096  dispositions = av_calloc(ctx->nb_streams, sizeof(*dispositions));
3097  if (!dispositions)
3098  return AVERROR(ENOMEM);
3099 
3100  // first, copy the input dispositions
3101  for (int i = 0; i < ctx->nb_streams; i++) {
3102  OutputStream *ost = of->streams[i];
3103 
3104  nb_streams[ost->type + 1]++;
3105 
3106  opt_match_per_stream_str(ost, &o->disposition, ctx, ost->st, &dispositions[i]);
3107 
3108  have_manual |= !!dispositions[i];
3109 
3110  if (ost->ist) {
3111  ost->st->disposition = ost->ist->st->disposition;
3112 
3114  have_default[ost->type + 1] = 1;
3115  }
3116  }
3117 
3118  if (have_manual) {
3119  // process manually set dispositions - they override the above copy
3120  for (int i = 0; i < ctx->nb_streams; i++) {
3121  OutputStream *ost = of->streams[i];
3122  const char *disp = dispositions[i];
3123 
3124  if (!disp)
3125  continue;
3126 
3127  ret = av_opt_set(ost->st, "disposition", disp, 0);
3128  if (ret < 0)
3129  goto finish;
3130  }
3131  } else {
3132  // For each media type with more than one stream, find a suitable stream to
3133  // mark as default, unless one is already marked default.
3134  // "Suitable" means the first of that type, skipping attached pictures.
3135  for (int i = 0; i < ctx->nb_streams; i++) {
3136  OutputStream *ost = of->streams[i];
3137  enum AVMediaType type = ost->type;
3138 
3139  if (nb_streams[type + 1] < 2 || have_default[type + 1] ||
3141  continue;
3142 
3144  have_default[type + 1] = 1;
3145  }
3146  }
3147 
3148 finish:
3149  av_freep(&dispositions);
3150 
3151  return ret;
3152 }
3153 
3154 static const char *const forced_keyframes_const_names[] = {
3155  "n",
3156  "n_forced",
3157  "prev_forced_n",
3158  "prev_forced_t",
3159  "t",
3160  NULL
3161 };
3162 
3163 static int compare_int64(const void *a, const void *b)
3164 {
3165  return FFDIFFSIGN(*(const int64_t *)a, *(const int64_t *)b);
3166 }
3167 
3169  const Muxer *mux, const char *spec)
3170 {
3171  const char *p;
3172  int n = 1, i, ret, size, index = 0;
3173  int64_t t, *pts;
3174 
3175  for (p = spec; *p; p++)
3176  if (*p == ',')
3177  n++;
3178  size = n;
3179  pts = av_malloc_array(size, sizeof(*pts));
3180  if (!pts)
3181  return AVERROR(ENOMEM);
3182 
3183  p = spec;
3184  for (i = 0; i < n; i++) {
3185  char *next = strchr(p, ',');
3186 
3187  if (next)
3188  *next++ = 0;
3189 
3190  if (strstr(p, "chapters") == p) {
3191  AVChapter * const *ch = mux->fc->chapters;
3192  unsigned int nb_ch = mux->fc->nb_chapters;
3193  int j;
3194 
3195  if (nb_ch > INT_MAX - size) {
3196  ret = AVERROR(ERANGE);
3197  goto fail;
3198  }
3199  size += nb_ch - 1;
3200  pts = av_realloc_f(pts, size, sizeof(*pts));
3201  if (!pts)
3202  return AVERROR(ENOMEM);
3203 
3204  if (p[8]) {
3205  ret = av_parse_time(&t, p + 8, 1);
3206  if (ret < 0) {
3208  "Invalid chapter time offset: %s\n", p + 8);
3209  goto fail;
3210  }
3211  } else
3212  t = 0;
3213 
3214  for (j = 0; j < nb_ch; j++) {
3215  const AVChapter *c = ch[j];
3216  av_assert1(index < size);
3217  pts[index++] = av_rescale_q(c->start, c->time_base,
3218  AV_TIME_BASE_Q) + t;
3219  }
3220 
3221  } else {
3222  av_assert1(index < size);
3223  ret = av_parse_time(&t, p, 1);
3224  if (ret < 0) {
3225  av_log(log, AV_LOG_ERROR, "Invalid keyframe time: %s\n", p);
3226  goto fail;
3227  }
3228 
3229  pts[index++] = t;
3230  }
3231 
3232  p = next;
3233  }
3234 
3235  av_assert0(index == size);
3236  qsort(pts, size, sizeof(*pts), compare_int64);
3237  kf->nb_pts = size;
3238  kf->pts = pts;
3239 
3240  return 0;
3241 fail:
3242  av_freep(&pts);
3243  return ret;
3244 }
3245 
3247 {
3248  for (int i = 0; i < mux->of.nb_streams; i++) {
3249  OutputStream *ost = mux->of.streams[i];
3250  const char *forced_keyframes = NULL;
3251 
3253  mux->fc, ost->st, &forced_keyframes);
3254 
3255  if (!(ost->type == AVMEDIA_TYPE_VIDEO &&
3256  ost->enc && forced_keyframes))
3257  continue;
3258 
3259  if (!strncmp(forced_keyframes, "expr:", 5)) {
3260  int ret = av_expr_parse(&ost->kf.pexpr, forced_keyframes + 5,
3262  if (ret < 0) {
3264  "Invalid force_key_frames expression '%s'\n", forced_keyframes + 5);
3265  return ret;
3266  }
3267  ost->kf.expr_const_values[FKF_N] = 0;
3268  ost->kf.expr_const_values[FKF_N_FORCED] = 0;
3269  ost->kf.expr_const_values[FKF_PREV_FORCED_N] = NAN;
3270  ost->kf.expr_const_values[FKF_PREV_FORCED_T] = NAN;
3271 
3272  // Don't parse the 'forced_keyframes' in case of 'keep-source-keyframes',
3273  // parse it only for static kf timings
3274  } else if (!strcmp(forced_keyframes, "source")) {
3275  ost->kf.type = KF_FORCE_SOURCE;
3276 #if FFMPEG_OPT_FORCE_KF_SOURCE_NO_DROP
3277  } else if (!strcmp(forced_keyframes, "source_no_drop")) {
3278  av_log(ost, AV_LOG_WARNING, "The 'source_no_drop' value for "
3279  "-force_key_frames is deprecated, use just 'source'\n");
3280  ost->kf.type = KF_FORCE_SOURCE;
3281 #endif
3282  } else {
3283  int ret = parse_forced_key_frames(ost, &ost->kf, mux, forced_keyframes);
3284  if (ret < 0)
3285  return ret;
3286  }
3287  }
3288 
3289  return 0;
3290 }
3291 
3292 static const char *output_file_item_name(void *obj)
3293 {
3294  const Muxer *mux = obj;
3295 
3296  return mux->log_name;
3297 }
3298 
3299 static const AVClass output_file_class = {
3300  .class_name = "OutputFile",
3301  .version = LIBAVUTIL_VERSION_INT,
3302  .item_name = output_file_item_name,
3303  .category = AV_CLASS_CATEGORY_MUXER,
3304 };
3305 
3306 static Muxer *mux_alloc(void)
3307 {
3308  Muxer *mux = allocate_array_elem(&output_files, sizeof(*mux), &nb_output_files);
3309 
3310  if (!mux)
3311  return NULL;
3312 
3313  mux->of.class = &output_file_class;
3314  mux->of.index = nb_output_files - 1;
3315 
3316  snprintf(mux->log_name, sizeof(mux->log_name), "out#%d", mux->of.index);
3317 
3318  return mux;
3319 }
3320 
3321 int of_open(const OptionsContext *o, const char *filename, Scheduler *sch)
3322 {
3323  Muxer *mux;
3324  AVFormatContext *oc;
3325  int err;
3326  OutputFile *of;
3327 
3328  int64_t recording_time = o->recording_time;
3329  int64_t stop_time = o->stop_time;
3330 
3331  mux = mux_alloc();
3332  if (!mux)
3333  return AVERROR(ENOMEM);
3334 
3335  of = &mux->of;
3336 
3337  if (stop_time != INT64_MAX && recording_time != INT64_MAX) {
3338  stop_time = INT64_MAX;
3339  av_log(mux, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
3340  }
3341 
3342  if (stop_time != INT64_MAX && recording_time == INT64_MAX) {
3344  if (stop_time <= start_time) {
3345  av_log(mux, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
3346  return AVERROR(EINVAL);
3347  } else {
3348  recording_time = stop_time - start_time;
3349  }
3350  }
3351 
3352  of->recording_time = recording_time;
3353  of->start_time = o->start_time;
3354 
3355  mux->limit_filesize = o->limit_filesize;
3356  av_dict_copy(&mux->opts, o->g->format_opts, 0);
3357 
3358  if (!strcmp(filename, "-"))
3359  filename = "pipe:";
3360 
3361  err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3362  if (!oc) {
3363  av_log(mux, AV_LOG_FATAL, "Error initializing the muxer for %s: %s\n",
3364  filename, av_err2str(err));
3365  return err;
3366  }
3367  mux->fc = oc;
3368 
3369  av_strlcat(mux->log_name, "/", sizeof(mux->log_name));
3370  av_strlcat(mux->log_name, oc->oformat->name, sizeof(mux->log_name));
3371 
3372 
3373  if (recording_time != INT64_MAX)
3374  oc->duration = recording_time;
3375 
3376  oc->interrupt_callback = int_cb;
3377 
3378  if (o->bitexact) {
3379  oc->flags |= AVFMT_FLAG_BITEXACT;
3380  of->bitexact = 1;
3381  } else {
3382  of->bitexact = check_opt_bitexact(oc, mux->opts, "fflags",
3384  }
3385 
3386  err = sch_add_mux(sch, muxer_thread, mux_check_init, mux,
3387  !strcmp(oc->oformat->name, "rtp"), o->thread_queue_size);
3388  if (err < 0)
3389  return err;
3390  mux->sch = sch;
3391  mux->sch_idx = err;
3392 
3393  /* create all output streams for this file */
3394  err = create_streams(mux, o);
3395  if (err < 0)
3396  return err;
3397 
3398  /* check if all codec options have been used */
3399  err = check_avoptions_used(o->g->codec_opts, mux->enc_opts_used, mux, 0);
3400  av_dict_free(&mux->enc_opts_used);
3401  if (err < 0)
3402  return err;
3403 
3404  /* check filename in case of an image number is expected */
3406  av_log(mux, AV_LOG_FATAL,
3407  "Output filename '%s' does not contain a numeric pattern like "
3408  "'%%d', which is required by output format '%s'.\n",
3409  oc->url, oc->oformat->name);
3410  return AVERROR(EINVAL);
3411  }
3412 
3413  if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3414  /* test if it already exists to avoid losing precious files */
3415  err = assert_file_overwrite(filename);
3416  if (err < 0)
3417  return err;
3418 
3419  /* open the file */
3420  if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
3421  &oc->interrupt_callback,
3422  &mux->opts)) < 0) {
3423  av_log(mux, AV_LOG_FATAL, "Error opening output %s: %s\n",
3424  filename, av_err2str(err));
3425  return err;
3426  }
3427  } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename)) {
3428  err = assert_file_overwrite(filename);
3429  if (err < 0)
3430  return err;
3431  }
3432 
3433  if (o->mux_preload) {
3434  av_dict_set_int(&mux->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
3435  }
3436  oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3437 
3438  /* copy metadata and chapters from input files */
3439  err = copy_meta(mux, o);
3440  if (err < 0)
3441  return err;
3442 
3443  err = of_add_groups(mux, o);
3444  if (err < 0)
3445  return err;
3446 
3447  err = of_add_programs(mux, o);
3448  if (err < 0)
3449  return err;
3450 
3451  err = of_add_metadata(of, oc, o);
3452  if (err < 0)
3453  return err;
3454 
3455  err = set_dispositions(mux, o);
3456  if (err < 0) {
3457  av_log(mux, AV_LOG_FATAL, "Error setting output stream dispositions\n");
3458  return err;
3459  }
3460 
3461  // parse forced keyframe specifications;
3462  // must be done after chapters are created
3463  err = process_forced_keyframes(mux, o);
3464  if (err < 0) {
3465  av_log(mux, AV_LOG_FATAL, "Error processing forced keyframes\n");
3466  return err;
3467  }
3468 
3470  o->shortest);
3471  if (err < 0) {
3472  av_log(mux, AV_LOG_FATAL, "Error setting up output sync queues\n");
3473  return err;
3474  }
3475 
3476  of->url = filename;
3477 
3478  /* initialize streamcopy streams. */
3479  for (int i = 0; i < of->nb_streams; i++) {
3480  OutputStream *ost = of->streams[i];
3481 
3482  if (!ost->enc) {
3483  err = of_stream_init(of, ost, NULL);
3484  if (err < 0)
3485  return err;
3486  }
3487  }
3488 
3489  return 0;
3490 }
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:613
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:1810
SYNC_QUEUE_PACKETS
@ SYNC_QUEUE_PACKETS
Definition: sync_queue.h:29
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:1246
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:565
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:368
AV_BPRINT_SIZE_UNLIMITED
#define AV_BPRINT_SIZE_UNLIMITED
InputFile::start_time
int64_t start_time
Definition: ffmpeg.h:536
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
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:1351
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:1117
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:462
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:386
FKF_PREV_FORCED_T
@ FKF_PREV_FORCED_T
Definition: ffmpeg.h:553
InputFile::nb_stream_groups
int nb_stream_groups
Definition: ffmpeg.h:546
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:1932
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:932
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:506
AVChapter::metadata
AVDictionary * metadata
Definition: avformat.h:1227
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:106
opt.h
of_serialize_options
static int of_serialize_options(Muxer *mux, void *obj, AVBPrint *bp)
Definition: ffmpeg_mux_init.c:2408
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
AVStreamGroup::tile_grid
struct AVStreamGroupTileGrid * tile_grid
Definition: avformat.h:1133
LIBAVCODEC_IDENT
#define LIBAVCODEC_IDENT
Definition: version.h:43
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:659
MuxStream::sch_idx
int sch_idx
Definition: ffmpeg_mux.h:55
AVSTREAM_EVENT_FLAG_NEW_PACKETS
#define AVSTREAM_EVENT_FLAG_NEW_PACKETS
Definition: avformat.h:868
check_avoptions
int check_avoptions(AVDictionary *m)
Definition: cmdutils.c:1606
ENC_STATS_PTS
@ ENC_STATS_PTS
Definition: ffmpeg.h:569
OutputFilter::apad
char * apad
Definition: ffmpeg.h:399
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:566
elements
static const ElemCat * elements[ELEMENT_COUNT]
Definition: signature.h:565
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1024
FKF_PREV_FORCED_N
@ FKF_PREV_FORCED_N
Definition: ffmpeg.h:552
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:1364
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
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:3594
AVFMT_VARIABLE_FPS
#define AVFMT_VARIABLE_FPS
Format allows variable fps.
Definition: avformat.h:481
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:670
ENC_STATS_DTS
@ ENC_STATS_DTS
Definition: ffmpeg.h:573
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:2533
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:2203
KeyframeForceCtx::nb_pts
int nb_pts
Definition: ffmpeg.h:614
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:478
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:485
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:254
ENC_STATS_AVG_BITRATE
@ ENC_STATS_AVG_BITRATE
Definition: ffmpeg.h:579
AVCodecContext::intra_matrix
uint16_t * intra_matrix
custom intra quantization matrix Must be allocated with the av_malloc() family of functions,...
Definition: avcodec.h:948
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:1175
ist_iter
InputStream * ist_iter(InputStream *prev)
Definition: ffmpeg.c:383
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:617
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:707
avcodec_find_encoder
const AVCodec * avcodec_find_encoder(enum AVCodecID id)
Find a registered encoder with a matching codec ID.
Definition: allcodecs.c:1033
InputFile::index
int index
Definition: ffmpeg.h:525
OptionsContext::presets
SpecifierOptList presets
Definition: ffmpeg.h:229
pixdesc.h
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1332
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:409
subtitle_codec_name
static const char * subtitle_codec_name
Definition: ffplay.c:340
ENC_STATS_LITERAL
@ ENC_STATS_LITERAL
Definition: ffmpeg.h:562
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:2536
OptionsContext::passlogfiles
SpecifierOptList passlogfiles
Definition: ffmpeg.h:242
AVOption
AVOption.
Definition: opt.h:429
OutputStream::index
int index
Definition: ffmpeg.h:648
streamcopy_init
static int streamcopy_init(const OptionsContext *o, const Muxer *mux, OutputStream *ost, AVDictionary **encoder_opts)
Definition: ffmpeg_mux_init.c:1020
b
#define b
Definition: input.c:42
ofilter_bind_enc
int ofilter_bind_enc(OutputFilter *ofilter, unsigned sched_idx_enc, const OutputFilterOptions *opts)
Definition: ffmpeg_filter.c:813
FilterGraph::index
int index
Definition: ffmpeg.h:409
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:833
AVChapter::start
int64_t start
Definition: avformat.h:1226
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
OptionGroup::swr_opts
AVDictionary * swr_opts
Definition: cmdutils.h:350
AVFormatContext::programs
AVProgram ** programs
Definition: avformat.h:1462
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:2449
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
video_disable
static int video_disable
Definition: ffplay.c:315
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:2531
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:3168
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:1186
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:3083
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:2770
MuxStream::ts_copy_start
int64_t ts_copy_start
Definition: ffmpeg_mux.h:66
OutputStream::file
struct OutputFile * file
Definition: ffmpeg.h:646
AVOutputFormat::subtitle_codec
enum AVCodecID subtitle_codec
default subtitle codec
Definition: avformat.h:518
MuxStream::stream_duration_tb
AVRational stream_duration_tb
Definition: ffmpeg_mux.h:73
ENC_STATS_TIMEBASE_IN
@ ENC_STATS_TIMEBASE_IN
Definition: ffmpeg.h:568
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
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:704
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:710
Muxer
Definition: ffmpeg_mux.h:95
InputStream
Definition: ffmpeg.h:476
OptionsContext::chapters_input_file
int chapters_input_file
Definition: ffmpeg.h:189
AVPacketSideData::size
size_t size
Definition: packet.h:411
OutputFilterOptions
Definition: ffmpeg.h:307
EncStatsFile
Definition: ffmpeg_mux_init.c:156
AVFormatContext::interrupt_callback
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
Definition: avformat.h:1534
map_auto_subtitle
static int map_auto_subtitle(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1748
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:440
of_parse_group_token
static int of_parse_group_token(Muxer *mux, const char *token, char *ptr)
Definition: ffmpeg_mux_init.c:2556
InputStreamGroup
Definition: ffmpeg.h:510
OptionsContext::g
OptionGroup * g
Definition: ffmpeg.h:146
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:1039
mux_alloc
static Muxer * mux_alloc(void)
Definition: ffmpeg_mux_init.c:3306
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:258
fail
#define fail()
Definition: checkasm.h:206
AVStreamGroupTileGrid
AVStreamGroupTileGrid holds information on how to combine several independent images on a single canv...
Definition: avformat.h:951
OptionsContext::mux_stats_fmt
SpecifierOptList mux_stats_fmt
Definition: ffmpeg.h:260
AVIAMFSubmixLayout
Submix layout as defined in section 3.7.6 of IAMF.
Definition: iamf.h:514
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:666
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:3011
AV_BPRINT_SIZE_AUTOMATIC
#define AV_BPRINT_SIZE_AUTOMATIC
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
AVChapter
Definition: avformat.h:1223
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:835
av_new_program
AVProgram * av_new_program(AVFormatContext *ac, int id)
Definition: avformat.c:267
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:460
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:803
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:396
InputFile
Definition: ffmpeg.h:522
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:1339
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:1496
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:848
AVCodecTag
Definition: internal.h:42
ENC_STATS_PTS_IN
@ ENC_STATS_PTS_IN
Definition: ffmpeg.h:571
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:232
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:1090
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:591
of_parse_iamf_submixes
static int of_parse_iamf_submixes(Muxer *mux, AVStreamGroup *stg, char *ptr)
Definition: ffmpeg_mux_init.c:2279
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:837
AVChapter::end
int64_t end
chapter start/end time in time_base units
Definition: avformat.h:1226
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:2534
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:642
OptionsContext::intra_matrices
SpecifierOptList intra_matrices
Definition: ffmpeg.h:222
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:1320
MuxStream::pkt
AVPacket * pkt
Definition: ffmpeg_mux.h:51
OptionsContext::stream_groups
SpecifierOptList stream_groups
Definition: ffmpeg.h:250
FilterGraph::outputs
OutputFilter ** outputs
Definition: ffmpeg.h:413
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:2698
InputStream::framerate
AVRational framerate
Definition: ffmpeg.h:497
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:1415
AVCodecParameters::sample_aspect_ratio
AVRational sample_aspect_ratio
Video only.
Definition: codec_par.h:144
output_file_class
static const AVClass output_file_class
Definition: ffmpeg_mux_init.c:3299
AVFormatContext::nb_programs
unsigned int nb_programs
Definition: avformat.h:1461
RcOverride
Definition: avcodec.h:193
AVFormatContext::chapters
AVChapter ** chapters
Definition: avformat.h:1365
ENC_STATS_FILE_IDX
@ ENC_STATS_FILE_IDX
Definition: ffmpeg.h:563
AVDictionaryEntry::key
char * key
Definition: dict.h:91
frame_size
int frame_size
Definition: mxfenc.c:2487
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
Video only.
Definition: codec_par.h:134
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:253
OutputFilter::linklabel
uint8_t * linklabel
Definition: ffmpeg.h:397
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:578
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
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:2824
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:1109
AVPacketSideData::data
uint8_t * data
Definition: packet.h:410
ignore_unknown_streams
int ignore_unknown_streams
Definition: ffmpeg_opt.c:89
ctx
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:302
nb_streams
static int nb_streams
Definition: ffprobe.c:340
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:601
encoder_thread
int encoder_thread(void *arg)
Definition: ffmpeg_enc.c:857
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:531
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:86
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:202
InputStreamGroup::stg
AVStreamGroup * stg
Definition: ffmpeg.h:519
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:469
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:441
Muxer::limit_filesize
int64_t limit_filesize
Definition: ffmpeg_mux.h:116
arg
const char * arg
Definition: jacosubdec.c:67
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
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:1264
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:580
OptionGroup::format_opts
AVDictionary * format_opts
Definition: cmdutils.h:348
opts
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:856
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:767
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:387
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:2794
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:783
NULL
#define NULL
Definition: coverity.c:32
av_program_add_stream_index
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx)
Definition: avformat.c:298
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:669
InputStream::st
AVStream * st
Definition: ffmpeg.h:484
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:2532
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:1598
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:801
ENC_STATS_PTS_TIME
@ ENC_STATS_PTS_TIME
Definition: ffmpeg.h:570
OptionsContext::fix_sub_duration_heartbeat
SpecifierOptList fix_sub_duration_heartbeat
Definition: ffmpeg.h:239
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:301
EncStats::lock
pthread_mutex_t lock
Definition: ffmpeg.h:596
OptionsContext::copy_prior_start
SpecifierOptList copy_prior_start
Definition: ffmpeg.h:231
AVPacketSideData::type
enum AVPacketSideDataType type
Definition: packet.h:412
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:1424
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:241
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1306
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:103
parseutils.h
AVIAMFLayer
A layer defining a Channel Layout in the Audio Element.
Definition: iamf.h:294
EncStats
Definition: ffmpeg.h:590
OptionsContext::program
SpecifierOptList program
Definition: ffmpeg.h:249
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:824
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:1273
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
OutputFile::index
int index
Definition: ffmpeg.h:699
OutputFile::class
const AVClass * class
Definition: ffmpeg.h:697
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:572
FilterGraph::nb_outputs
int nb_outputs
Definition: ffmpeg.h:414
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:2924
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:804
InputStream::par
AVCodecParameters * par
Codec parameters - to be used by the decoding/streamcopy code.
Definition: ffmpeg.h:492
input_files
InputFile ** input_files
Definition: ffmpeg.c:105
OutputFile::streams
OutputStream ** streams
Definition: ffmpeg.h:703
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
Scheduler
Definition: ffmpeg_sched.c:273
AVIAMFSubmixElement::audio_element_id
unsigned int audio_element_id
The id of the Audio Element this submix element references.
Definition: iamf.h:452
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:513
FilterGraph
Definition: ffmpeg.h:407
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
AVIAMFSubmix
Submix layout as defined in section 3.7 of IAMF.
Definition: iamf.h:556
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1320
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:2725
AVOutputFormat::flags
int flags
can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:525
AV_STREAM_GROUP_PARAMS_TILE_GRID
@ AV_STREAM_GROUP_PARAMS_TILE_GRID
Definition: avformat.h:1091
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:800
AV_CODEC_CONFIG_CHANNEL_LAYOUT
@ AV_CODEC_CONFIG_CHANNEL_LAYOUT
AVChannelLayout, terminated by {0}.
Definition: avcodec.h:2535
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:1991
OptionsContext::apad
SpecifierOptList apad
Definition: ffmpeg.h:246
OptionsContext::enc_stats_post_fmt
SpecifierOptList enc_stats_post_fmt
Definition: ffmpeg.h:259
OutputStream::filter
OutputFilter * filter
Definition: ffmpeg.h:675
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVCodecContext::rc_override
RcOverride * rc_override
Definition: avcodec.h:1263
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
InputStreamGroup::fg
FilterGraph * fg
Definition: ffmpeg.h:518
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:255
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:108
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:326
AVFormatContext::url
char * url
input or output URL.
Definition: avformat.h:1380
EncStatsType
EncStatsType
Definition: ffmpeg.h:561
Muxer::sch
Scheduler * sch
Definition: ffmpeg_mux.h:103
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1031
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:576
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:2538
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:1131
AVStream::event_flags
int event_flags
Flags indicating events happening on the stream, a combination of AVSTREAM_EVENT_FLAG_*.
Definition: avformat.h:855
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:241
OutputStream::type
enum AVMediaType type
Definition: ffmpeg.h:643
OutputFile::url
const char * url
Definition: ffmpeg.h:701
setup_sync_queues
static int setup_sync_queues(Muxer *mux, AVFormatContext *oc, int64_t buf_size_us, int shortest)
Definition: ffmpeg_mux_init.c:2102
AVFMT_NOFILE
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:468
AVCodecContext::chroma_intra_matrix
uint16_t * chroma_intra_matrix
custom intra quantization matrix
Definition: avcodec.h:964
AVStreamGroup::params
union AVStreamGroup::@418 params
Group type-specific parameters.
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:822
OptionsContext::disposition
SpecifierOptList disposition
Definition: ffmpeg.h:248
AVFMT_NOSTREAMS
#define AVFMT_NOSTREAMS
Format does not require any streams.
Definition: avformat.h:483
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:1541
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:356
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:64
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
AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
@ AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
Definition: avformat.h:1089
AVStreamGroup::streams
AVStream ** streams
A list of streams in the group.
Definition: avformat.h:1165
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:565
KeyframeForceCtx
Definition: ffmpeg.h:607
OutputFilter::type
enum AVMediaType type
Definition: ffmpeg.h:401
AVStreamGroup::iamf_mix_presentation
struct AVIAMFMixPresentation * iamf_mix_presentation
Definition: avformat.h:1132
OptionsContext::chroma_intra_matrices
SpecifierOptList chroma_intra_matrices
Definition: ffmpeg.h:224
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_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
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:3321
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:312
bprint.h
AVStreamGroupTileGrid::width
int width
Width of the final image for presentation.
Definition: avformat.h:1036
map_auto_data
static int map_auto_data(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1787
AV_STREAM_GROUP_PARAMS_NONE
@ AV_STREAM_GROUP_PARAMS_NONE
Definition: avformat.h:1088
log.h
AVFMT_GLOBALHEADER
#define AVFMT_GLOBALHEADER
Format wants global header.
Definition: avformat.h:477
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
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:1224
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:1962
pix_fmt_parse
static enum AVPixelFormat pix_fmt_parse(OutputStream *ost, const char *name)
Definition: ffmpeg_mux_init.c:525
AVCodecParameters::height
int height
Definition: codec_par.h:135
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
Audio only.
Definition: codec_par.h:191
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:1194
OutputFile::bitexact
int bitexact
Definition: ffmpeg.h:709
display.h
AVIAMFMixPresentation
Information on how to render and mix one or more AVIAMFAudioElement to generate the final audio outpu...
Definition: iamf.h:613
OptionsContext::mux_stats
SpecifierOptList mux_stats
Definition: ffmpeg.h:257
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:57
OptionsContext::muxing_queue_data_threshold
SpecifierOptList muxing_queue_data_threshold
Definition: ffmpeg.h:244
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:204
InputFile::ctx
AVFormatContext * ctx
Definition: ffmpeg.h:527
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AVFormatContext::max_delay
int max_delay
Definition: avformat.h:1409
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1188
OptionsContext::enc_stats_post
SpecifierOptList enc_stats_post
Definition: ffmpeg.h:256
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:564
filtergraphs
FilterGraph ** filtergraphs
Definition: ffmpeg.c:111
int_cb
const AVIOInterruptCB int_cb
Definition: ffmpeg.c:308
InputFile::stream_groups
InputStreamGroup ** stream_groups
Definition: ffmpeg.h:545
AVCodecContext::height
int height
Definition: avcodec.h:592
fmt_in_list
static int fmt_in_list(const int *formats, int format)
Definition: ffmpeg_mux_init.c:485
AVCodecParameters::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire stream.
Definition: codec_par.h:81
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:631
ENC_STATS_SAMPLE_NUM
@ ENC_STATS_SAMPLE_NUM
Definition: ffmpeg.h:575
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:109
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:937
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:813
tag
uint32_t tag
Definition: movenc.c:1995
OptionsContext::metadata_map
SpecifierOptList metadata_map
Definition: ffmpeg.h:228
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:756
AVFMT_FLAG_BITEXACT
#define AVFMT_FLAG_BITEXACT
When muxing, try to avoid writing any random/volatile data to the output.
Definition: avformat.h:1432
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
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:1283
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:3292
av_opt_eval_int
int av_opt_eval_int(void *obj, const AVOption *o, const char *val, int *int_out)
AV_CODEC_PROP_TEXT_SUB
#define AV_CODEC_PROP_TEXT_SUB
Subtitle codec is text based.
Definition: codec_desc.h:108
InputFile::streams
InputStream ** streams
Definition: ffmpeg.h:541
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:898
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:720
check_avoptions_used
int check_avoptions_used(const AVDictionary *opts, const AVDictionary *opts_used, void *logctx, int decode)
Definition: ffmpeg.c:497
set_encoder_id
static int set_encoder_id(OutputStream *ost, const AVCodec *codec)
Definition: ffmpeg_mux_init.c:1164
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:367
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:3526
OptionsContext::max_muxing_queue_size
SpecifierOptList max_muxing_queue_size
Definition: ffmpeg.h:243
AVStreamGroup
Definition: avformat.h:1098
of_add_attachments
static int of_add_attachments(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1895
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:431
OptionsContext::inter_matrices
SpecifierOptList inter_matrices
Definition: ffmpeg.h:223
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:750
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:3873
AVStreamGroup::nb_streams
unsigned int nb_streams
Number of elements in AVStreamGroup.streams.
Definition: avformat.h:1152
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:480
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:517
AVStream::r_frame_rate
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:878
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:597
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:1399
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:534
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:383
map_auto_audio
static int map_auto_audio(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1704
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:572
OptionsContext::filter_scripts
SpecifierOptList filter_scripts
Definition: ffmpeg.h:234
AVIO_FLAG_READ
#define AVIO_FLAG_READ
read-only
Definition: avio.h:617
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:272
desc
const char * desc
Definition: libsvtav1.c:79
OptionsContext::time_bases
SpecifierOptList time_bases
Definition: ffmpeg.h:251
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:376
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:906
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:595
MuxStream::sq_idx_mux
int sq_idx_mux
Definition: ffmpeg_mux.h:59
AVStreamGroup::type
enum AVStreamGroupParamsType type
Group type.
Definition: avformat.h:1125
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:492
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:221
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:817
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:1256
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:433
InputStream::index
int index
Definition: ffmpeg.h:482
of_map_group
static int of_map_group(Muxer *mux, AVDictionary **dict, AVBPrint *bp, const char *map)
Definition: ffmpeg_mux_init.c:2460
AVFormatContext::nb_stream_groups
unsigned int nb_stream_groups
Number of elements in AVFormatContext.stream_groups.
Definition: avformat.h:1339
AVStreamGroupTileGrid::height
int height
Height of the final image for presentation.
Definition: avformat.h:1046
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:3163
OptionsContext::copy_initial_nonkeyframes
SpecifierOptList copy_initial_nonkeyframes
Definition: ffmpeg.h:230
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
FKF_N_FORCED
@ FKF_N_FORCED
Definition: ffmpeg.h:551
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:55
audio_disable
static int audio_disable
Definition: ffplay.c:314
EncStatsComponent
Definition: ffmpeg.h:583
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:650
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:299
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:957
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:1262
InputFile::input_ts_offset
int64_t input_ts_offset
Definition: ffmpeg.h:528
EncStats::nb_components
int nb_components
Definition: ffmpeg.h:592
OptionsContext::data_disable
int data_disable
Definition: ffmpeg.h:203
nb_filtergraphs
int nb_filtergraphs
Definition: ffmpeg.c:112
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:461
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
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:446
ENC_STATS_PKT_SIZE
@ ENC_STATS_PKT_SIZE
Definition: ffmpeg.h:577
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:3154
read_file_to_string
char * read_file_to_string(const char *filename)
Definition: cmdutils.c:1572
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:3246
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:3878
AVIAMFAudioElement::recon_gain_info
AVIAMFParamDefinition * recon_gain_info
Recon gain information used to reconstruct a scalable channel audio representation.
Definition: iamf.h:383
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:1986
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:1215
InputFile::nb_streams
int nb_streams
Definition: ffmpeg.h:542
FKF_N
@ FKF_N
Definition: ffmpeg.h:550
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:574
AVChapter::time_base
AVRational time_base
time base in which the start/end timestamps are specified
Definition: avformat.h:1225
OutputFile::recording_time
int64_t recording_time
desired length of the resulting file in microseconds == AV_TIME_BASE units
Definition: ffmpeg.h:706
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:594
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:2882
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:252
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:2715
ENC_STATS_TIMEBASE
@ ENC_STATS_TIMEBASE
Definition: ffmpeg.h:567
create_streams
static int create_streams(Muxer *mux, const OptionsContext *o)
Definition: ffmpeg_mux_init.c:1978
MuxStream::stream_duration
int64_t stream_duration
Definition: ffmpeg_mux.h:72
OutputStream::class
const AVClass * class
Definition: ffmpeg.h:641
OptionsContext::top_field_first
SpecifierOptList top_field_first
Definition: ffmpeg.h:226
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:3514
AV_IAMF_PARAMETER_DEFINITION_DEMIXING
@ AV_IAMF_PARAMETER_DEFINITION_DEMIXING
Subblocks are of struct type AVIAMFDemixingInfo.
Definition: iamf.h:177
OutputFile
Definition: ffmpeg.h:696
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:881
AV_CODEC_CONFIG_COLOR_SPACE
@ AV_CODEC_CONFIG_COLOR_SPACE
AVColorSpace, terminated by AVCOL_SPC_UNSPECIFIED.
Definition: avcodec.h:2537