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