3 * ffmpeg option parsing
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavformat/avformat.h"
29 #include "libavcodec/avcodec.h"
31 #include "libavfilter/avfilter.h"
33 #include "libavutil/avassert.h"
34 #include "libavutil/avstring.h"
35 #include "libavutil/avutil.h"
36 #include "libavutil/channel_layout.h"
37 #include "libavutil/intreadwrite.h"
38 #include "libavutil/fifo.h"
39 #include "libavutil/mathematics.h"
40 #include "libavutil/opt.h"
41 #include "libavutil/parseutils.h"
42 #include "libavutil/pixdesc.h"
43 #include "libavutil/pixfmt.h"
45 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
47 #define SPECIFIER_OPT_FMT_str "%s"
48 #define SPECIFIER_OPT_FMT_i "%i"
49 #define SPECIFIER_OPT_FMT_i64 "%"PRId64
50 #define SPECIFIER_OPT_FMT_ui64 "%"PRIu64
51 #define SPECIFIER_OPT_FMT_f "%f"
52 #define SPECIFIER_OPT_FMT_dbl "%lf"
54 static const char *opt_name_codec_names[] = {"c", "codec", "acodec", "vcodec", "scodec", "dcodec", NULL};
55 static const char *opt_name_audio_channels[] = {"ac", NULL};
56 static const char *opt_name_audio_sample_rate[] = {"ar", NULL};
57 static const char *opt_name_frame_rates[] = {"r", NULL};
58 static const char *opt_name_frame_sizes[] = {"s", NULL};
59 static const char *opt_name_frame_pix_fmts[] = {"pix_fmt", NULL};
60 static const char *opt_name_ts_scale[] = {"itsscale", NULL};
61 static const char *opt_name_hwaccels[] = {"hwaccel", NULL};
62 static const char *opt_name_hwaccel_devices[] = {"hwaccel_device", NULL};
63 static const char *opt_name_hwaccel_output_formats[] = {"hwaccel_output_format", NULL};
64 static const char *opt_name_autorotate[] = {"autorotate", NULL};
65 static const char *opt_name_max_frames[] = {"frames", "aframes", "vframes", "dframes", NULL};
66 static const char *opt_name_bitstream_filters[] = {"bsf", "absf", "vbsf", NULL};
67 static const char *opt_name_codec_tags[] = {"tag", "atag", "vtag", "stag", NULL};
68 static const char *opt_name_sample_fmts[] = {"sample_fmt", NULL};
69 static const char *opt_name_qscale[] = {"q", "qscale", NULL};
70 static const char *opt_name_forced_key_frames[] = {"forced_key_frames", NULL};
71 static const char *opt_name_force_fps[] = {"force_fps", NULL};
72 static const char *opt_name_frame_aspect_ratios[] = {"aspect", NULL};
73 static const char *opt_name_rc_overrides[] = {"rc_override", NULL};
74 static const char *opt_name_intra_matrices[] = {"intra_matrix", NULL};
75 static const char *opt_name_inter_matrices[] = {"inter_matrix", NULL};
76 static const char *opt_name_chroma_intra_matrices[] = {"chroma_intra_matrix", NULL};
77 static const char *opt_name_top_field_first[] = {"top", NULL};
78 static const char *opt_name_presets[] = {"pre", "apre", "vpre", "spre", NULL};
79 static const char *opt_name_copy_initial_nonkeyframes[] = {"copyinkfr", NULL};
80 static const char *opt_name_copy_prior_start[] = {"copypriorss", NULL};
81 static const char *opt_name_filters[] = {"filter", "af", "vf", NULL};
82 static const char *opt_name_filter_scripts[] = {"filter_script", NULL};
83 static const char *opt_name_reinit_filters[] = {"reinit_filter", NULL};
84 static const char *opt_name_fix_sub_duration[] = {"fix_sub_duration", NULL};
85 static const char *opt_name_canvas_sizes[] = {"canvas_size", NULL};
86 static const char *opt_name_pass[] = {"pass", NULL};
87 static const char *opt_name_passlogfiles[] = {"passlogfile", NULL};
88 static const char *opt_name_max_muxing_queue_size[] = {"max_muxing_queue_size", NULL};
89 static const char *opt_name_guess_layout_max[] = {"guess_layout_max", NULL};
90 static const char *opt_name_apad[] = {"apad", NULL};
91 static const char *opt_name_discard[] = {"discard", NULL};
92 static const char *opt_name_disposition[] = {"disposition", NULL};
93 static const char *opt_name_time_bases[] = {"time_base", NULL};
94 static const char *opt_name_enc_time_bases[] = {"enc_time_base", NULL};
96 #define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\
98 char namestr[128] = "";\
99 const char *spec = so->specifier && so->specifier[0] ? so->specifier : "";\
100 for (i = 0; opt_name_##name[i]; i++)\
101 av_strlcatf(namestr, sizeof(namestr), "-%s%s", opt_name_##name[i], opt_name_##name[i+1] ? (opt_name_##name[i+2] ? ", " : " or ") : "");\
102 av_log(NULL, AV_LOG_WARNING, "Multiple %s options specified for stream %d, only the last option '-%s%s%s "SPECIFIER_OPT_FMT_##type"' will be used.\n",\
103 namestr, st->index, opt_name_##name[0], spec[0] ? ":" : "", spec, so->u.type);\
106 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
108 int i, ret, matches = 0;\
110 for (i = 0; i < o->nb_ ## name; i++) {\
111 char *spec = o->name[i].specifier;\
112 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0) {\
113 outvar = o->name[i].u.type;\
120 WARN_MULTIPLE_OPT_USAGE(name, type, so, st);\
123 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
126 for (i = 0; i < o->nb_ ## name; i++) {\
127 char *spec = o->name[i].specifier;\
128 if (!strcmp(spec, mediatype))\
129 outvar = o->name[i].u.type;\
133 const HWAccel hwaccels[] = {
134 #if CONFIG_VIDEOTOOLBOX
135 { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
138 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
142 HWDevice *filter_hw_device;
144 char *vstats_filename;
147 float audio_drift_threshold = 0.1;
148 float dts_delta_threshold = 10;
149 float dts_error_threshold = 3600*30;
151 int audio_volume = 256;
152 int audio_sync_method = 0;
153 int video_sync_method = VSYNC_AUTO;
154 float frame_drop_threshold = 0;
155 int do_deinterlace = 0;
156 int do_benchmark = 0;
157 int do_benchmark_all = 0;
161 int start_at_zero = 0;
164 int exit_on_error = 0;
165 int abort_on_flags = 0;
166 int print_stats = -1;
168 int stdin_interaction = 1;
169 int frame_bits_per_raw_sample = 0;
170 float max_error_rate = 2.0/3;
171 int filter_nbthreads = 0;
172 int filter_complex_nbthreads = 0;
173 int vstats_version = 2;
176 static int intra_only = 0;
177 static int file_overwrite = 0;
178 static int no_file_overwrite = 0;
179 static int do_psnr = 0;
180 static int input_sync;
181 static int input_stream_potentially_available = 0;
182 static int ignore_unknown_streams = 0;
183 static int copy_unknown_streams = 0;
184 static int find_stream_info = 1;
186 static void uninit_options(OptionsContext *o)
188 const OptionDef *po = options;
191 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
193 void *dst = (uint8_t*)o + po->u.off;
195 if (po->flags & OPT_SPEC) {
196 SpecifierOpt **so = dst;
197 int i, *count = (int*)(so + 1);
198 for (i = 0; i < *count; i++) {
199 av_freep(&(*so)[i].specifier);
200 if (po->flags & OPT_STRING)
201 av_freep(&(*so)[i].u.str);
205 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
210 for (i = 0; i < o->nb_stream_maps; i++)
211 av_freep(&o->stream_maps[i].linklabel);
212 av_freep(&o->stream_maps);
213 av_freep(&o->audio_channel_maps);
214 av_freep(&o->streamid_map);
215 av_freep(&o->attachments);
218 static void init_options(OptionsContext *o)
220 memset(o, 0, sizeof(*o));
222 o->stop_time = INT64_MAX;
223 o->mux_max_delay = 0.7;
224 o->start_time = AV_NOPTS_VALUE;
225 o->start_time_eof = AV_NOPTS_VALUE;
226 o->recording_time = INT64_MAX;
227 o->limit_filesize = UINT64_MAX;
228 o->chapters_input_file = INT_MAX;
229 o->accurate_seek = 1;
232 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
234 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
236 printf("Hardware acceleration methods:\n");
237 while ((type = av_hwdevice_iterate_types(type)) !=
238 AV_HWDEVICE_TYPE_NONE)
239 printf("%s\n", av_hwdevice_get_type_name(type));
244 /* return a copy of the input with the stream specifiers removed from the keys */
245 static AVDictionary *strip_specifiers(AVDictionary *dict)
247 AVDictionaryEntry *e = NULL;
248 AVDictionary *ret = NULL;
250 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
251 char *p = strchr(e->key, ':');
255 av_dict_set(&ret, e->key, e->value, 0);
262 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
264 static const AVOption opts[] = {
265 { "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
266 { "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
267 { "empty_output_stream", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT_STREAM }, .unit = "flags" },
270 static const AVClass class = {
272 .item_name = av_default_item_name,
274 .version = LIBAVUTIL_VERSION_INT,
276 const AVClass *pclass = &class;
278 return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
281 static int opt_sameq(void *optctx, const char *opt, const char *arg)
283 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
284 "If you are looking for an option to preserve the quality (which is not "
285 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
287 return AVERROR(EINVAL);
290 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
292 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
293 return opt_default(optctx, "channel", arg);
296 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
298 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
299 return opt_default(optctx, "standard", arg);
302 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
304 OptionsContext *o = optctx;
305 return parse_option(o, "codec:a", arg, options);
308 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
310 OptionsContext *o = optctx;
311 return parse_option(o, "codec:v", arg, options);
314 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
316 OptionsContext *o = optctx;
317 return parse_option(o, "codec:s", arg, options);
320 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
322 OptionsContext *o = optctx;
323 return parse_option(o, "codec:d", arg, options);
326 static int opt_map(void *optctx, const char *opt, const char *arg)
328 OptionsContext *o = optctx;
330 int i, negative = 0, file_idx, disabled = 0;
331 int sync_file_idx = -1, sync_stream_idx = 0;
340 map = av_strdup(arg);
342 return AVERROR(ENOMEM);
344 /* parse sync stream first, just pick first matching stream */
345 if (sync = strchr(map, ',')) {
347 sync_file_idx = strtol(sync + 1, &sync, 0);
348 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
349 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
354 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
355 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
356 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
360 if (i == input_files[sync_file_idx]->nb_streams) {
361 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
362 "match any streams.\n", arg);
365 if (input_streams[input_files[sync_file_idx]->ist_index + sync_stream_idx]->user_set_discard == AVDISCARD_ALL) {
366 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s matches a disabled input "
374 /* this mapping refers to lavfi output */
375 const char *c = map + 1;
376 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
377 m = &o->stream_maps[o->nb_stream_maps - 1];
378 m->linklabel = av_get_token(&c, "]");
380 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
384 if (allow_unused = strchr(map, '?'))
386 file_idx = strtol(map, &p, 0);
387 if (file_idx >= nb_input_files || file_idx < 0) {
388 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
392 /* disable some already defined maps */
393 for (i = 0; i < o->nb_stream_maps; i++) {
394 m = &o->stream_maps[i];
395 if (file_idx == m->file_index &&
396 check_stream_specifier(input_files[m->file_index]->ctx,
397 input_files[m->file_index]->ctx->streams[m->stream_index],
398 *p == ':' ? p + 1 : p) > 0)
402 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
403 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
404 *p == ':' ? p + 1 : p) <= 0)
406 if (input_streams[input_files[file_idx]->ist_index + i]->user_set_discard == AVDISCARD_ALL) {
410 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
411 m = &o->stream_maps[o->nb_stream_maps - 1];
413 m->file_index = file_idx;
416 if (sync_file_idx >= 0) {
417 m->sync_file_index = sync_file_idx;
418 m->sync_stream_index = sync_stream_idx;
420 m->sync_file_index = file_idx;
421 m->sync_stream_index = i;
428 av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
429 } else if (disabled) {
430 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches disabled streams.\n"
431 "To ignore this, add a trailing '?' to the map.\n", arg);
434 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
435 "To ignore this, add a trailing '?' to the map.\n", arg);
444 static int opt_attach(void *optctx, const char *opt, const char *arg)
446 OptionsContext *o = optctx;
447 GROW_ARRAY(o->attachments, o->nb_attachments);
448 o->attachments[o->nb_attachments - 1] = arg;
452 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
454 OptionsContext *o = optctx;
460 mapchan = av_strdup(arg);
462 return AVERROR(ENOMEM);
464 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
465 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
467 /* muted channel syntax */
468 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
469 if ((n == 1 || n == 3) && m->channel_idx == -1) {
470 m->file_idx = m->stream_idx = -1;
472 m->ofile_idx = m->ostream_idx = -1;
478 n = sscanf(arg, "%d.%d.%d:%d.%d",
479 &m->file_idx, &m->stream_idx, &m->channel_idx,
480 &m->ofile_idx, &m->ostream_idx);
482 if (n != 3 && n != 5) {
483 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
484 "[file.stream.channel|-1][:syncfile:syncstream]\n");
488 if (n != 5) // only file.stream.channel specified
489 m->ofile_idx = m->ostream_idx = -1;
492 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
493 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
497 if (m->stream_idx < 0 ||
498 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
499 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
500 m->file_idx, m->stream_idx);
503 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
504 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
505 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
506 m->file_idx, m->stream_idx);
509 /* allow trailing ? to map_channel */
510 if (allow_unused = strchr(mapchan, '?'))
512 if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels ||
513 input_streams[input_files[m->file_idx]->ist_index + m->stream_idx]->user_set_discard == AVDISCARD_ALL) {
515 av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
516 m->file_idx, m->stream_idx, m->channel_idx);
518 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n"
519 "To ignore this, add a trailing '?' to the map_channel.\n",
520 m->file_idx, m->stream_idx, m->channel_idx);
529 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
531 av_free(sdp_filename);
532 sdp_filename = av_strdup(arg);
537 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
539 const char *prefix = "vaapi:";
542 tmp = av_asprintf("%s%s", prefix, arg);
544 return AVERROR(ENOMEM);
545 err = hw_device_init_from_string(tmp, NULL);
551 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
553 if (!strcmp(arg, "list")) {
554 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
555 printf("Supported hardware device types:\n");
556 while ((type = av_hwdevice_iterate_types(type)) !=
557 AV_HWDEVICE_TYPE_NONE)
558 printf("%s\n", av_hwdevice_get_type_name(type));
562 return hw_device_init_from_string(arg, NULL);
566 static int opt_filter_hw_device(void *optctx, const char *opt, const char *arg)
568 if (filter_hw_device) {
569 av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
570 return AVERROR(EINVAL);
572 filter_hw_device = hw_device_get_by_name(arg);
573 if (!filter_hw_device) {
574 av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg);
575 return AVERROR(EINVAL);
581 * Parse a metadata specifier passed as 'arg' parameter.
582 * @param arg metadata string to parse
583 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
584 * @param index for type c/p, chapter/program index is written here
585 * @param stream_spec for type s, the stream specifier is written here
587 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
595 if (*(++arg) && *arg != ':') {
596 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
599 *stream_spec = *arg == ':' ? arg + 1 : "";
604 *index = strtol(++arg, NULL, 0);
607 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
614 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
616 AVDictionary **meta_in = NULL;
617 AVDictionary **meta_out = NULL;
619 char type_in, type_out;
620 const char *istream_spec = NULL, *ostream_spec = NULL;
621 int idx_in = 0, idx_out = 0;
623 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
624 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
627 if (type_out == 'g' || !*outspec)
628 o->metadata_global_manual = 1;
629 if (type_out == 's' || !*outspec)
630 o->metadata_streams_manual = 1;
631 if (type_out == 'c' || !*outspec)
632 o->metadata_chapters_manual = 1;
636 if (type_in == 'g' || type_out == 'g')
637 o->metadata_global_manual = 1;
638 if (type_in == 's' || type_out == 's')
639 o->metadata_streams_manual = 1;
640 if (type_in == 'c' || type_out == 'c')
641 o->metadata_chapters_manual = 1;
643 /* ic is NULL when just disabling automatic mappings */
647 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
648 if ((index) < 0 || (index) >= (nb_elems)) {\
649 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
654 #define SET_DICT(type, meta, context, index)\
657 meta = &context->metadata;\
660 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
661 meta = &context->chapters[index]->metadata;\
664 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
665 meta = &context->programs[index]->metadata;\
668 break; /* handled separately below */ \
669 default: av_assert0(0);\
672 SET_DICT(type_in, meta_in, ic, idx_in);
673 SET_DICT(type_out, meta_out, oc, idx_out);
675 /* for input streams choose first matching stream */
676 if (type_in == 's') {
677 for (i = 0; i < ic->nb_streams; i++) {
678 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
679 meta_in = &ic->streams[i]->metadata;
685 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
690 if (type_out == 's') {
691 for (i = 0; i < oc->nb_streams; i++) {
692 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
693 meta_out = &oc->streams[i]->metadata;
694 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
699 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
704 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
706 OptionsContext *o = optctx;
708 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
709 struct tm time = *gmtime((time_t*)&recording_timestamp);
710 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
712 parse_option(o, "metadata", buf, options);
714 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
715 "tag instead.\n", opt);
719 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
721 const AVCodecDescriptor *desc;
722 const char *codec_string = encoder ? "encoder" : "decoder";
726 avcodec_find_encoder_by_name(name) :
727 avcodec_find_decoder_by_name(name);
729 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
730 codec = encoder ? avcodec_find_encoder(desc->id) :
731 avcodec_find_decoder(desc->id);
733 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
734 codec_string, codec->name, desc->name);
738 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
741 if (codec->type != type) {
742 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
748 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
750 char *codec_name = NULL;
752 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
754 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
755 st->codecpar->codec_id = codec->id;
758 return avcodec_find_decoder(st->codecpar->codec_id);
761 /* Add all the streams from the given input file to the global
762 * list of input streams. */
763 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
767 for (i = 0; i < ic->nb_streams; i++) {
768 AVStream *st = ic->streams[i];
769 AVCodecParameters *par = st->codecpar;
770 InputStream *ist = av_mallocz(sizeof(*ist));
771 char *framerate = NULL, *hwaccel_device = NULL;
772 const char *hwaccel = NULL;
773 char *hwaccel_output_format = NULL;
774 char *codec_tag = NULL;
776 char *discard_str = NULL;
777 const AVClass *cc = avcodec_get_class();
778 const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL, 0, 0);
783 GROW_ARRAY(input_streams, nb_input_streams);
784 input_streams[nb_input_streams - 1] = ist;
787 ist->file_index = nb_input_files;
789 st->discard = AVDISCARD_ALL;
791 ist->min_pts = INT64_MAX;
792 ist->max_pts = INT64_MIN;
795 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
798 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
800 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
802 uint32_t tag = strtol(codec_tag, &next, 0);
804 tag = AV_RL32(codec_tag);
805 st->codecpar->codec_tag = tag;
808 ist->dec = choose_decoder(o, ic, st);
809 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
811 ist->reinit_filters = -1;
812 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
814 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
815 ist->user_set_discard = AVDISCARD_NONE;
817 if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
818 (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ||
819 (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) ||
820 (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
821 ist->user_set_discard = AVDISCARD_ALL;
823 if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
824 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
829 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
831 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
833 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
837 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
839 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
844 ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
846 switch (par->codec_type) {
847 case AVMEDIA_TYPE_VIDEO:
849 ist->dec = avcodec_find_decoder(par->codec_id);
851 if (st->codec->lowres) {
852 ist->dec_ctx->lowres = st->codec->lowres;
853 ist->dec_ctx->width = st->codec->width;
854 ist->dec_ctx->height = st->codec->height;
855 ist->dec_ctx->coded_width = st->codec->coded_width;
856 ist->dec_ctx->coded_height = st->codec->coded_height;
860 // avformat_find_stream_info() doesn't set this for us anymore.
861 ist->dec_ctx->framerate = st->avg_frame_rate;
863 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
864 if (framerate && av_parse_video_rate(&ist->framerate,
866 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
871 ist->top_field_first = -1;
872 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
874 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
875 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
876 hwaccel_output_format, ic, st);
878 if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "cuvid")) {
879 av_log(NULL, AV_LOG_WARNING,
880 "WARNING: defaulting hwaccel_output_format to cuda for compatibility "
881 "with old commandlines. This behaviour is DEPRECATED and will be removed "
882 "in the future. Please explicitly set \"-hwaccel_output_format cuda\".\n");
883 ist->hwaccel_output_format = AV_PIX_FMT_CUDA;
884 } else if (hwaccel_output_format) {
885 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
886 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
887 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
888 "format: %s", hwaccel_output_format);
891 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
895 // The NVDEC hwaccels use a CUDA device, so remap the name here.
896 if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
899 if (!strcmp(hwaccel, "none"))
900 ist->hwaccel_id = HWACCEL_NONE;
901 else if (!strcmp(hwaccel, "auto"))
902 ist->hwaccel_id = HWACCEL_AUTO;
904 enum AVHWDeviceType type;
906 for (i = 0; hwaccels[i].name; i++) {
907 if (!strcmp(hwaccels[i].name, hwaccel)) {
908 ist->hwaccel_id = hwaccels[i].id;
913 if (!ist->hwaccel_id) {
914 type = av_hwdevice_find_type_by_name(hwaccel);
915 if (type != AV_HWDEVICE_TYPE_NONE) {
916 ist->hwaccel_id = HWACCEL_GENERIC;
917 ist->hwaccel_device_type = type;
921 if (!ist->hwaccel_id) {
922 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
924 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
925 type = AV_HWDEVICE_TYPE_NONE;
926 while ((type = av_hwdevice_iterate_types(type)) !=
927 AV_HWDEVICE_TYPE_NONE)
928 av_log(NULL, AV_LOG_FATAL, "%s ",
929 av_hwdevice_get_type_name(type));
930 av_log(NULL, AV_LOG_FATAL, "\n");
936 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
937 if (hwaccel_device) {
938 ist->hwaccel_device = av_strdup(hwaccel_device);
939 if (!ist->hwaccel_device)
943 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
946 case AVMEDIA_TYPE_AUDIO:
947 ist->guess_layout_max = INT_MAX;
948 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
949 guess_input_channel_layout(ist);
951 case AVMEDIA_TYPE_DATA:
952 case AVMEDIA_TYPE_SUBTITLE: {
953 char *canvas_size = NULL;
955 ist->dec = avcodec_find_decoder(par->codec_id);
956 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
957 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
959 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
960 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
965 case AVMEDIA_TYPE_ATTACHMENT:
966 case AVMEDIA_TYPE_UNKNOWN:
972 ret = avcodec_parameters_from_context(par, ist->dec_ctx);
974 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
980 static void assert_file_overwrite(const char *filename)
982 const char *proto_name = avio_find_protocol_name(filename);
984 if (file_overwrite && no_file_overwrite) {
985 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
989 if (!file_overwrite) {
990 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
991 if (stdin_interaction && !no_file_overwrite) {
992 fprintf(stderr,"File '%s' already exists. Overwrite? [y/N] ", filename);
995 signal(SIGINT, SIG_DFL);
997 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
1003 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
1009 if (proto_name && !strcmp(proto_name, "file")) {
1010 for (int i = 0; i < nb_input_files; i++) {
1011 InputFile *file = input_files[i];
1012 if (file->ctx->iformat->flags & AVFMT_NOFILE)
1014 if (!strcmp(filename, file->ctx->url)) {
1015 av_log(NULL, AV_LOG_FATAL, "Output %s same as Input #%d - exiting\n", filename, i);
1016 av_log(NULL, AV_LOG_WARNING, "FFmpeg cannot edit existing files in-place.\n");
1023 static void dump_attachment(AVStream *st, const char *filename)
1026 AVIOContext *out = NULL;
1027 AVDictionaryEntry *e;
1029 if (!st->codecpar->extradata_size) {
1030 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
1031 nb_input_files - 1, st->index);
1034 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
1035 filename = e->value;
1037 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
1038 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
1042 assert_file_overwrite(filename);
1044 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
1045 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
1050 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
1055 static int open_input_file(OptionsContext *o, const char *filename)
1058 AVFormatContext *ic;
1059 AVInputFormat *file_iformat = NULL;
1062 AVDictionary *unused_opts = NULL;
1063 AVDictionaryEntry *e = NULL;
1064 char * video_codec_name = NULL;
1065 char * audio_codec_name = NULL;
1066 char *subtitle_codec_name = NULL;
1067 char * data_codec_name = NULL;
1068 int scan_all_pmts_set = 0;
1070 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
1071 o->stop_time = INT64_MAX;
1072 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1075 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1076 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
1077 if (o->stop_time <= start_time) {
1078 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1081 o->recording_time = o->stop_time - start_time;
1086 if (!(file_iformat = av_find_input_format(o->format))) {
1087 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
1092 if (!strcmp(filename, "-"))
1095 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
1096 strcmp(filename, "/dev/stdin");
1098 /* get default parameters from command line */
1099 ic = avformat_alloc_context();
1101 print_error(filename, AVERROR(ENOMEM));
1104 if (o->nb_audio_sample_rate) {
1105 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
1107 if (o->nb_audio_channels) {
1108 /* because we set audio_channels based on both the "ac" and
1109 * "channel_layout" options, we need to check that the specified
1110 * demuxer actually has the "channels" option before setting it */
1111 if (file_iformat && file_iformat->priv_class &&
1112 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
1113 AV_OPT_SEARCH_FAKE_OBJ)) {
1114 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
1117 if (o->nb_frame_rates) {
1118 /* set the format-level framerate option;
1119 * this is important for video grabbers, e.g. x11 */
1120 if (file_iformat && file_iformat->priv_class &&
1121 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
1122 AV_OPT_SEARCH_FAKE_OBJ)) {
1123 av_dict_set(&o->g->format_opts, "framerate",
1124 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
1127 if (o->nb_frame_sizes) {
1128 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
1130 if (o->nb_frame_pix_fmts)
1131 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
1133 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
1134 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
1135 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
1136 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
1138 if (video_codec_name)
1139 ic->video_codec = find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
1140 if (audio_codec_name)
1141 ic->audio_codec = find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
1142 if (subtitle_codec_name)
1143 ic->subtitle_codec = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
1144 if (data_codec_name)
1145 ic->data_codec = find_codec_or_die(data_codec_name , AVMEDIA_TYPE_DATA , 0);
1147 ic->video_codec_id = video_codec_name ? ic->video_codec->id : AV_CODEC_ID_NONE;
1148 ic->audio_codec_id = audio_codec_name ? ic->audio_codec->id : AV_CODEC_ID_NONE;
1149 ic->subtitle_codec_id = subtitle_codec_name ? ic->subtitle_codec->id : AV_CODEC_ID_NONE;
1150 ic->data_codec_id = data_codec_name ? ic->data_codec->id : AV_CODEC_ID_NONE;
1152 ic->flags |= AVFMT_FLAG_NONBLOCK;
1154 ic->flags |= AVFMT_FLAG_BITEXACT;
1155 ic->interrupt_callback = int_cb;
1157 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
1158 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
1159 scan_all_pmts_set = 1;
1161 /* open the input file with generic avformat function */
1162 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1164 print_error(filename, err);
1165 if (err == AVERROR_PROTOCOL_NOT_FOUND)
1166 av_log(NULL, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1169 if (scan_all_pmts_set)
1170 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1171 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
1172 assert_avoptions(o->g->format_opts);
1174 /* apply forced codec ids */
1175 for (i = 0; i < ic->nb_streams; i++)
1176 choose_decoder(o, ic, ic->streams[i]);
1178 if (find_stream_info) {
1179 AVDictionary **opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
1180 int orig_nb_streams = ic->nb_streams;
1182 /* If not enough info to get the stream parameters, we decode the
1183 first frames to get it. (used in mpeg case for example) */
1184 ret = avformat_find_stream_info(ic, opts);
1186 for (i = 0; i < orig_nb_streams; i++)
1187 av_dict_free(&opts[i]);
1191 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
1192 if (ic->nb_streams == 0) {
1193 avformat_close_input(&ic);
1199 if (o->start_time != AV_NOPTS_VALUE && o->start_time_eof != AV_NOPTS_VALUE) {
1200 av_log(NULL, AV_LOG_WARNING, "Cannot use -ss and -sseof both, using -ss for %s\n", filename);
1201 o->start_time_eof = AV_NOPTS_VALUE;
1204 if (o->start_time_eof != AV_NOPTS_VALUE) {
1205 if (o->start_time_eof >= 0) {
1206 av_log(NULL, AV_LOG_ERROR, "-sseof value must be negative; aborting\n");
1209 if (ic->duration > 0) {
1210 o->start_time = o->start_time_eof + ic->duration;
1211 if (o->start_time < 0) {
1212 av_log(NULL, AV_LOG_WARNING, "-sseof value seeks to before start of file %s; ignored\n", filename);
1213 o->start_time = AV_NOPTS_VALUE;
1216 av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
1218 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
1219 /* add the stream start time */
1220 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1221 timestamp += ic->start_time;
1223 /* if seeking requested, we execute it */
1224 if (o->start_time != AV_NOPTS_VALUE) {
1225 int64_t seek_timestamp = timestamp;
1227 if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1228 int dts_heuristic = 0;
1229 for (i=0; i<ic->nb_streams; i++) {
1230 const AVCodecParameters *par = ic->streams[i]->codecpar;
1231 if (par->video_delay) {
1236 if (dts_heuristic) {
1237 seek_timestamp -= 3*AV_TIME_BASE / 23;
1240 ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1242 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
1243 filename, (double)timestamp / AV_TIME_BASE);
1247 /* update the current parameters so that they match the one of the input stream */
1248 add_input_streams(o, ic);
1250 /* dump the file content */
1251 av_dump_format(ic, nb_input_files, filename, 0);
1253 GROW_ARRAY(input_files, nb_input_files);
1254 f = av_mallocz(sizeof(*f));
1257 input_files[nb_input_files - 1] = f;
1260 f->ist_index = nb_input_streams - ic->nb_streams;
1261 f->start_time = o->start_time;
1262 f->recording_time = o->recording_time;
1263 f->input_ts_offset = o->input_ts_offset;
1264 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1265 f->nb_streams = ic->nb_streams;
1266 f->rate_emu = o->rate_emu;
1267 f->accurate_seek = o->accurate_seek;
1270 f->time_base = (AVRational){ 1, 1 };
1272 f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
1275 /* check if all codec options have been used */
1276 unused_opts = strip_specifiers(o->g->codec_opts);
1277 for (i = f->ist_index; i < nb_input_streams; i++) {
1279 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1280 AV_DICT_IGNORE_SUFFIX)))
1281 av_dict_set(&unused_opts, e->key, NULL, 0);
1285 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1286 const AVClass *class = avcodec_get_class();
1287 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1288 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1289 const AVClass *fclass = avformat_get_class();
1290 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
1291 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1292 if (!option || foption)
1296 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1297 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1298 "input file #%d (%s) is not a decoding option.\n", e->key,
1299 option->help ? option->help : "", nb_input_files - 1,
1304 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1305 "input file #%d (%s) has not been used for any stream. The most "
1306 "likely reason is either wrong type (e.g. a video option with "
1307 "no video streams) or that it is a private option of some decoder "
1308 "which was not actually used for any stream.\n", e->key,
1309 option->help ? option->help : "", nb_input_files - 1, filename);
1311 av_dict_free(&unused_opts);
1313 for (i = 0; i < o->nb_dump_attachment; i++) {
1316 for (j = 0; j < ic->nb_streams; j++) {
1317 AVStream *st = ic->streams[j];
1319 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1320 dump_attachment(st, o->dump_attachment[i].u.str);
1324 input_stream_potentially_available = 1;
1329 static uint8_t *get_line(AVIOContext *s)
1335 if (avio_open_dyn_buf(&line) < 0) {
1336 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1340 while ((c = avio_r8(s)) && c != '\n')
1343 avio_close_dyn_buf(line, &buf);
1348 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1351 char filename[1000];
1352 const char *base[3] = { getenv("AVCONV_DATADIR"),
1357 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1361 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1362 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1363 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1366 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1367 i != 1 ? "" : "/.avconv", preset_name);
1368 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1374 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1376 enum AVMediaType type = ost->st->codecpar->codec_type;
1377 char *codec_name = NULL;
1379 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
1380 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1382 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->url,
1383 NULL, ost->st->codecpar->codec_type);
1384 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
1386 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
1387 "output stream #%d:%d. Default encoder for format %s (codec %s) is "
1388 "probably disabled. Please choose an encoder manually.\n",
1389 ost->file_index, ost->index, s->oformat->name,
1390 avcodec_get_name(ost->st->codecpar->codec_id));
1391 return AVERROR_ENCODER_NOT_FOUND;
1393 } else if (!strcmp(codec_name, "copy"))
1394 ost->stream_copy = 1;
1396 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
1397 ost->st->codecpar->codec_id = ost->enc->id;
1399 ost->encoding_needed = !ost->stream_copy;
1401 /* no encoding supported for other media types */
1402 ost->stream_copy = 1;
1403 ost->encoding_needed = 0;
1409 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1412 AVStream *st = avformat_new_stream(oc, NULL);
1413 int idx = oc->nb_streams - 1, ret = 0;
1414 const char *bsfs = NULL, *time_base = NULL;
1415 char *next, *codec_tag = NULL;
1420 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1424 if (oc->nb_streams - 1 < o->nb_streamid_map)
1425 st->id = o->streamid_map[oc->nb_streams - 1];
1427 GROW_ARRAY(output_streams, nb_output_streams);
1428 if (!(ost = av_mallocz(sizeof(*ost))))
1430 output_streams[nb_output_streams - 1] = ost;
1432 ost->file_index = nb_output_files - 1;
1435 ost->forced_kf_ref_pts = AV_NOPTS_VALUE;
1436 st->codecpar->codec_type = type;
1438 ret = choose_encoder(o, oc, ost);
1440 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1441 "%d:%d\n", ost->file_index, ost->index);
1445 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1446 if (!ost->enc_ctx) {
1447 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1450 ost->enc_ctx->codec_type = type;
1452 ost->ref_par = avcodec_parameters_alloc();
1453 if (!ost->ref_par) {
1454 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding parameters.\n");
1459 AVIOContext *s = NULL;
1460 char *buf = NULL, *arg = NULL, *preset = NULL;
1462 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1464 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1465 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1468 if (!buf[0] || buf[0] == '#') {
1472 if (!(arg = strchr(buf, '='))) {
1473 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1477 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1479 } while (!s->eof_reached);
1483 av_log(NULL, AV_LOG_FATAL,
1484 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1485 preset, ost->file_index, ost->index);
1489 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1494 ost->enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
1496 MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
1499 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1500 q.num <= 0 || q.den <= 0) {
1501 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1507 MATCH_PER_STREAM_OPT(enc_time_bases, str, time_base, oc, st);
1510 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1512 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1515 ost->enc_timebase = q;
1518 ost->max_frames = INT64_MAX;
1519 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1520 for (i = 0; i<o->nb_max_frames; i++) {
1521 char *p = o->max_frames[i].specifier;
1522 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1523 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1528 ost->copy_prior_start = -1;
1529 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1531 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1532 if (bsfs && *bsfs) {
1533 ret = av_bsf_list_parse_str(bsfs, &ost->bsf_ctx);
1535 av_log(NULL, AV_LOG_ERROR, "Error parsing bitstream filter sequence '%s': %s\n", bsfs, av_err2str(ret));
1540 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1542 uint32_t tag = strtol(codec_tag, &next, 0);
1544 tag = AV_RL32(codec_tag);
1545 ost->st->codecpar->codec_tag =
1546 ost->enc_ctx->codec_tag = tag;
1549 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1551 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1552 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1555 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1556 ost->disposition = av_strdup(ost->disposition);
1558 ost->max_muxing_queue_size = 128;
1559 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1560 ost->max_muxing_queue_size *= sizeof(AVPacket);
1562 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1563 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1565 av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1567 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1568 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1569 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1571 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1573 ost->source_index = source_index;
1574 if (source_index >= 0) {
1575 ost->sync_ist = input_streams[source_index];
1576 input_streams[source_index]->discard = 0;
1577 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1579 ost->last_mux_dts = AV_NOPTS_VALUE;
1581 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1582 if (!ost->muxing_queue)
1588 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1591 const char *p = str;
1598 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1605 /* read file contents into a string */
1606 static uint8_t *read_file(const char *filename)
1608 AVIOContext *pb = NULL;
1609 AVIOContext *dyn_buf = NULL;
1610 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1611 uint8_t buf[1024], *str;
1614 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1618 ret = avio_open_dyn_buf(&dyn_buf);
1623 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1624 avio_write(dyn_buf, buf, ret);
1625 avio_w8(dyn_buf, 0);
1628 ret = avio_close_dyn_buf(dyn_buf, &str);
1634 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1637 AVStream *st = ost->st;
1639 if (ost->filters_script && ost->filters) {
1640 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1641 "output stream #%d:%d.\n", nb_output_files, st->index);
1645 if (ost->filters_script)
1646 return read_file(ost->filters_script);
1647 else if (ost->filters)
1648 return av_strdup(ost->filters);
1650 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1654 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1655 const OutputStream *ost, enum AVMediaType type)
1657 if (ost->filters_script || ost->filters) {
1658 av_log(NULL, AV_LOG_ERROR,
1659 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1660 "Filtering and streamcopy cannot be used together.\n",
1661 ost->filters ? "Filtergraph" : "Filtergraph script",
1662 ost->filters ? ost->filters : ost->filters_script,
1663 av_get_media_type_string(type), ost->file_index, ost->index);
1668 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1672 AVCodecContext *video_enc;
1673 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1675 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1677 video_enc = ost->enc_ctx;
1679 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1680 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1681 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1684 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1685 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1687 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1688 if (frame_aspect_ratio) {
1690 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1691 q.num <= 0 || q.den <= 0) {
1692 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1695 ost->frame_aspect_ratio = q;
1698 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1699 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1701 if (!ost->stream_copy) {
1702 const char *p = NULL;
1703 char *frame_size = NULL;
1704 char *frame_pix_fmt = NULL;
1705 char *intra_matrix = NULL, *inter_matrix = NULL;
1706 char *chroma_intra_matrix = NULL;
1710 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1711 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1712 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1716 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1717 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1718 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1719 ost->keep_pix_fmt = 1;
1720 if (!*++frame_pix_fmt)
1721 frame_pix_fmt = NULL;
1723 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1724 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1727 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1730 video_enc->gop_size = 0;
1731 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1733 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1734 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1737 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1739 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1740 if (chroma_intra_matrix) {
1741 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1743 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1746 video_enc->chroma_intra_matrix = p;
1747 parse_matrix_coeffs(p, chroma_intra_matrix);
1749 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1751 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1752 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1755 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1758 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1759 for (i = 0; p; i++) {
1761 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1763 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1766 video_enc->rc_override =
1767 av_realloc_array(video_enc->rc_override,
1768 i + 1, sizeof(RcOverride));
1769 if (!video_enc->rc_override) {
1770 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1773 video_enc->rc_override[i].start_frame = start;
1774 video_enc->rc_override[i].end_frame = end;
1776 video_enc->rc_override[i].qscale = q;
1777 video_enc->rc_override[i].quality_factor = 1.0;
1780 video_enc->rc_override[i].qscale = 0;
1781 video_enc->rc_override[i].quality_factor = -q/100.0;
1786 video_enc->rc_override_count = i;
1789 video_enc->flags|= AV_CODEC_FLAG_PSNR;
1792 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1795 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1796 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1799 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1800 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1804 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1805 if (ost->logfile_prefix &&
1806 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1810 char logfilename[1024];
1813 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1814 ost->logfile_prefix ? ost->logfile_prefix :
1815 DEFAULT_PASS_LOGFILENAME_PREFIX,
1817 if (!strcmp(ost->enc->name, "libx264")) {
1818 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1820 if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1821 char *logbuffer = read_file(logfilename);
1824 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1828 video_enc->stats_in = logbuffer;
1830 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1831 f = av_fopen_utf8(logfilename, "wb");
1833 av_log(NULL, AV_LOG_FATAL,
1834 "Cannot write log file '%s' for pass-1 encoding: %s\n",
1835 logfilename, strerror(errno));
1843 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1844 if (ost->forced_keyframes)
1845 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1847 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1849 ost->top_field_first = -1;
1850 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1853 ost->avfilter = get_ost_filters(o, oc, ost);
1857 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1860 if (ost->stream_copy)
1861 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1866 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1871 AVCodecContext *audio_enc;
1873 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1876 audio_enc = ost->enc_ctx;
1877 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1879 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1880 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1882 if (!ost->stream_copy) {
1883 char *sample_fmt = NULL;
1885 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1887 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1889 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1890 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1894 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1896 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1897 ost->apad = av_strdup(ost->apad);
1899 ost->avfilter = get_ost_filters(o, oc, ost);
1903 /* check for channel mapping for this audio stream */
1904 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1905 AudioChannelMap *map = &o->audio_channel_maps[n];
1906 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1907 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1910 if (map->channel_idx == -1) {
1912 } else if (ost->source_index < 0) {
1913 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1914 ost->file_index, ost->st->index);
1917 ist = input_streams[ost->source_index];
1920 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1921 if (av_reallocp_array(&ost->audio_channels_map,
1922 ost->audio_channels_mapped + 1,
1923 sizeof(*ost->audio_channels_map)
1927 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1933 if (ost->stream_copy)
1934 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1939 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1943 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1944 if (!ost->stream_copy) {
1945 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1952 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1956 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1957 if (!ost->stream_copy) {
1958 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1965 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1967 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1968 ost->stream_copy = 1;
1973 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1977 AVCodecContext *subtitle_enc;
1979 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1981 subtitle_enc = ost->enc_ctx;
1983 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1985 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1987 if (!ost->stream_copy) {
1988 char *frame_size = NULL;
1990 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1991 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1992 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
2000 /* arg format is "output-stream-index:streamid-value". */
2001 static int opt_streamid(void *optctx, const char *opt, const char *arg)
2003 OptionsContext *o = optctx;
2008 av_strlcpy(idx_str, arg, sizeof(idx_str));
2009 p = strchr(idx_str, ':');
2011 av_log(NULL, AV_LOG_FATAL,
2012 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
2017 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
2018 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
2019 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
2023 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
2025 AVFormatContext *is = ifile->ctx;
2026 AVFormatContext *os = ofile->ctx;
2030 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
2032 return AVERROR(ENOMEM);
2035 for (i = 0; i < is->nb_chapters; i++) {
2036 AVChapter *in_ch = is->chapters[i], *out_ch;
2037 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
2038 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
2039 AV_TIME_BASE_Q, in_ch->time_base);
2040 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
2041 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
2044 if (in_ch->end < ts_off)
2046 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
2049 out_ch = av_mallocz(sizeof(AVChapter));
2051 return AVERROR(ENOMEM);
2053 out_ch->id = in_ch->id;
2054 out_ch->time_base = in_ch->time_base;
2055 out_ch->start = FFMAX(0, in_ch->start - ts_off);
2056 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
2059 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
2061 os->chapters[os->nb_chapters++] = out_ch;
2066 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
2067 AVFormatContext *oc)
2071 switch (ofilter->type) {
2072 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
2073 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
2075 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
2080 ost->source_index = -1;
2081 ost->filter = ofilter;
2084 ofilter->format = -1;
2086 if (ost->stream_copy) {
2087 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
2088 "which is fed from a complex filtergraph. Filtering and streamcopy "
2089 "cannot be used together.\n", ost->file_index, ost->index);
2093 if (ost->avfilter && (ost->filters || ost->filters_script)) {
2094 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
2095 av_log(NULL, AV_LOG_ERROR,
2096 "%s '%s' was specified through the %s option "
2097 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
2098 "%s and -filter_complex cannot be used together for the same stream.\n",
2099 ost->filters ? "Filtergraph" : "Filtergraph script",
2100 ost->filters ? ost->filters : ost->filters_script,
2101 opt, ost->file_index, ost->index, opt);
2105 avfilter_inout_free(&ofilter->out_tmp);
2108 static int init_complex_filters(void)
2112 for (i = 0; i < nb_filtergraphs; i++) {
2113 ret = init_complex_filtergraph(filtergraphs[i]);
2120 static int open_output_file(OptionsContext *o, const char *filename)
2122 AVFormatContext *oc;
2127 AVDictionary *unused_opts = NULL;
2128 AVDictionaryEntry *e = NULL;
2129 int format_flags = 0;
2131 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
2132 o->stop_time = INT64_MAX;
2133 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
2136 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
2137 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
2138 if (o->stop_time <= start_time) {
2139 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
2142 o->recording_time = o->stop_time - start_time;
2146 GROW_ARRAY(output_files, nb_output_files);
2147 of = av_mallocz(sizeof(*of));
2150 output_files[nb_output_files - 1] = of;
2152 of->ost_index = nb_output_streams;
2153 of->recording_time = o->recording_time;
2154 of->start_time = o->start_time;
2155 of->limit_filesize = o->limit_filesize;
2156 of->shortest = o->shortest;
2157 av_dict_copy(&of->opts, o->g->format_opts, 0);
2159 if (!strcmp(filename, "-"))
2162 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
2164 print_error(filename, err);
2169 if (o->recording_time != INT64_MAX)
2170 oc->duration = o->recording_time;
2172 oc->interrupt_callback = int_cb;
2174 e = av_dict_get(o->g->format_opts, "fflags", NULL, 0);
2176 const AVOption *o = av_opt_find(oc, "fflags", NULL, 0, 0);
2177 av_opt_eval_flags(oc, o, e->value, &format_flags);
2180 format_flags |= AVFMT_FLAG_BITEXACT;
2181 oc->flags |= AVFMT_FLAG_BITEXACT;
2184 /* create streams for all unlabeled output pads */
2185 for (i = 0; i < nb_filtergraphs; i++) {
2186 FilterGraph *fg = filtergraphs[i];
2187 for (j = 0; j < fg->nb_outputs; j++) {
2188 OutputFilter *ofilter = fg->outputs[j];
2190 if (!ofilter->out_tmp || ofilter->out_tmp->name)
2193 switch (ofilter->type) {
2194 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
2195 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
2196 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
2198 init_output_filter(ofilter, o, oc);
2202 if (!o->nb_stream_maps) {
2203 char *subtitle_codec_name = NULL;
2204 /* pick the "best" stream of each type */
2206 /* video: highest resolution */
2207 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2208 int area = 0, idx = -1;
2209 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2210 for (i = 0; i < nb_input_streams; i++) {
2212 ist = input_streams[i];
2213 new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames
2214 + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
2215 if (ist->user_set_discard == AVDISCARD_ALL)
2217 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2219 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
2221 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2228 new_video_stream(o, oc, idx);
2231 /* audio: most channels */
2232 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2233 int best_score = 0, idx = -1;
2234 for (i = 0; i < nb_input_streams; i++) {
2236 ist = input_streams[i];
2237 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames
2238 + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
2239 if (ist->user_set_discard == AVDISCARD_ALL)
2241 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
2242 score > best_score) {
2248 new_audio_stream(o, oc, idx);
2251 /* subtitles: pick first */
2252 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2253 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2254 for (i = 0; i < nb_input_streams; i++)
2255 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2256 AVCodecDescriptor const *input_descriptor =
2257 avcodec_descriptor_get(input_streams[i]->st->codecpar->codec_id);
2258 AVCodecDescriptor const *output_descriptor = NULL;
2259 AVCodec const *output_codec =
2260 avcodec_find_encoder(oc->oformat->subtitle_codec);
2261 int input_props = 0, output_props = 0;
2262 if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
2265 output_descriptor = avcodec_descriptor_get(output_codec->id);
2266 if (input_descriptor)
2267 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2268 if (output_descriptor)
2269 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2270 if (subtitle_codec_name ||
2271 input_props & output_props ||
2272 // Map dvb teletext which has neither property to any output subtitle encoder
2273 input_descriptor && output_descriptor &&
2274 (!input_descriptor->props ||
2275 !output_descriptor->props)) {
2276 new_subtitle_stream(o, oc, i);
2281 /* Data only if codec id match */
2282 if (!o->data_disable ) {
2283 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2284 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2285 if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
2287 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
2288 && input_streams[i]->st->codecpar->codec_id == codec_id )
2289 new_data_stream(o, oc, i);
2293 for (i = 0; i < o->nb_stream_maps; i++) {
2294 StreamMap *map = &o->stream_maps[i];
2299 if (map->linklabel) {
2301 OutputFilter *ofilter = NULL;
2304 for (j = 0; j < nb_filtergraphs; j++) {
2305 fg = filtergraphs[j];
2306 for (k = 0; k < fg->nb_outputs; k++) {
2307 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2308 if (out && !strcmp(out->name, map->linklabel)) {
2309 ofilter = fg->outputs[k];
2316 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2317 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2320 init_output_filter(ofilter, o, oc);
2322 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2324 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2325 if (ist->user_set_discard == AVDISCARD_ALL) {
2326 av_log(NULL, AV_LOG_FATAL, "Stream #%d:%d is disabled and cannot be mapped.\n",
2327 map->file_index, map->stream_index);
2330 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
2332 if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
2334 if(o-> video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
2336 if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2340 switch (ist->st->codecpar->codec_type) {
2341 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2342 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2343 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2344 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2345 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2346 case AVMEDIA_TYPE_UNKNOWN:
2347 if (copy_unknown_streams) {
2348 ost = new_unknown_stream (o, oc, src_idx);
2352 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2353 "Cannot map stream #%d:%d - unsupported type.\n",
2354 map->file_index, map->stream_index);
2355 if (!ignore_unknown_streams) {
2356 av_log(NULL, AV_LOG_FATAL,
2357 "If you want unsupported types ignored instead "
2358 "of failing, please use the -ignore_unknown option\n"
2359 "If you want them copied, please use -copy_unknown\n");
2364 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2365 + map->sync_stream_index];
2370 /* handle attached files */
2371 for (i = 0; i < o->nb_attachments; i++) {
2373 uint8_t *attachment;
2377 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2378 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2382 if ((len = avio_size(pb)) <= 0) {
2383 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2387 if (len > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE ||
2388 !(attachment = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE))) {
2389 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large.\n",
2393 avio_read(pb, attachment, len);
2394 memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
2396 ost = new_attachment_stream(o, oc, -1);
2397 ost->stream_copy = 0;
2398 ost->attachment_filename = o->attachments[i];
2399 ost->st->codecpar->extradata = attachment;
2400 ost->st->codecpar->extradata_size = len;
2402 p = strrchr(o->attachments[i], '/');
2403 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2407 #if FF_API_LAVF_AVCTX
2408 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2409 AVDictionaryEntry *e;
2410 ost = output_streams[i];
2412 if ((ost->stream_copy || ost->attachment_filename)
2413 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2414 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2415 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2420 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2421 av_dump_format(oc, nb_output_files - 1, oc->url, 1);
2422 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2426 /* check if all codec options have been used */
2427 unused_opts = strip_specifiers(o->g->codec_opts);
2428 for (i = of->ost_index; i < nb_output_streams; i++) {
2430 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2431 AV_DICT_IGNORE_SUFFIX)))
2432 av_dict_set(&unused_opts, e->key, NULL, 0);
2436 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2437 const AVClass *class = avcodec_get_class();
2438 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2439 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2440 const AVClass *fclass = avformat_get_class();
2441 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2442 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2443 if (!option || foption)
2447 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2448 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2449 "output file #%d (%s) is not an encoding option.\n", e->key,
2450 option->help ? option->help : "", nb_output_files - 1,
2455 // gop_timecode is injected by generic code but not always used
2456 if (!strcmp(e->key, "gop_timecode"))
2459 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2460 "output file #%d (%s) has not been used for any stream. The most "
2461 "likely reason is either wrong type (e.g. a video option with "
2462 "no video streams) or that it is a private option of some encoder "
2463 "which was not actually used for any stream.\n", e->key,
2464 option->help ? option->help : "", nb_output_files - 1, filename);
2466 av_dict_free(&unused_opts);
2468 /* set the decoding_needed flags and create simple filtergraphs */
2469 for (i = of->ost_index; i < nb_output_streams; i++) {
2470 OutputStream *ost = output_streams[i];
2472 if (ost->encoding_needed && ost->source_index >= 0) {
2473 InputStream *ist = input_streams[ost->source_index];
2474 ist->decoding_needed |= DECODING_FOR_OST;
2476 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
2477 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2478 err = init_simple_filtergraph(ist, ost);
2480 av_log(NULL, AV_LOG_ERROR,
2481 "Error initializing a simple filtergraph between streams "
2482 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
2483 nb_output_files - 1, ost->st->index);
2489 /* set the filter output constraints */
2491 OutputFilter *f = ost->filter;
2493 switch (ost->enc_ctx->codec_type) {
2494 case AVMEDIA_TYPE_VIDEO:
2495 f->frame_rate = ost->frame_rate;
2496 f->width = ost->enc_ctx->width;
2497 f->height = ost->enc_ctx->height;
2498 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
2499 f->format = ost->enc_ctx->pix_fmt;
2500 } else if (ost->enc->pix_fmts) {
2502 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
2504 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2507 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
2510 case AVMEDIA_TYPE_AUDIO:
2511 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
2512 f->format = ost->enc_ctx->sample_fmt;
2513 } else if (ost->enc->sample_fmts) {
2515 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
2517 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2520 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
2522 if (ost->enc_ctx->sample_rate) {
2523 f->sample_rate = ost->enc_ctx->sample_rate;
2524 } else if (ost->enc->supported_samplerates) {
2526 while (ost->enc->supported_samplerates[count])
2528 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
2529 if (!f->sample_rates)
2531 memcpy(f->sample_rates, ost->enc->supported_samplerates,
2532 (count + 1) * sizeof(*f->sample_rates));
2534 if (ost->enc_ctx->channels) {
2535 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
2536 } else if (ost->enc->channel_layouts) {
2538 while (ost->enc->channel_layouts[count])
2540 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
2541 if (!f->channel_layouts)
2543 memcpy(f->channel_layouts, ost->enc->channel_layouts,
2544 (count + 1) * sizeof(*f->channel_layouts));
2551 /* check filename in case of an image number is expected */
2552 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2553 if (!av_filename_number_test(oc->url)) {
2554 print_error(oc->url, AVERROR(EINVAL));
2559 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2560 av_log(NULL, AV_LOG_ERROR,
2561 "No input streams but output needs an input stream\n");
2565 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2566 /* test if it already exists to avoid losing precious files */
2567 assert_file_overwrite(filename);
2570 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2571 &oc->interrupt_callback,
2573 print_error(filename, err);
2576 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2577 assert_file_overwrite(filename);
2579 if (o->mux_preload) {
2580 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2582 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2585 for (i = 0; i < o->nb_metadata_map; i++) {
2587 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2589 if (in_file_index >= nb_input_files) {
2590 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2593 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2594 in_file_index >= 0 ?
2595 input_files[in_file_index]->ctx : NULL, o);
2599 if (o->chapters_input_file >= nb_input_files) {
2600 if (o->chapters_input_file == INT_MAX) {
2601 /* copy chapters from the first input file that has them*/
2602 o->chapters_input_file = -1;
2603 for (i = 0; i < nb_input_files; i++)
2604 if (input_files[i]->ctx->nb_chapters) {
2605 o->chapters_input_file = i;
2609 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2610 o->chapters_input_file);
2614 if (o->chapters_input_file >= 0)
2615 copy_chapters(input_files[o->chapters_input_file], of,
2616 !o->metadata_chapters_manual);
2618 /* copy global metadata by default */
2619 if (!o->metadata_global_manual && nb_input_files){
2620 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2621 AV_DICT_DONT_OVERWRITE);
2622 if(o->recording_time != INT64_MAX)
2623 av_dict_set(&oc->metadata, "duration", NULL, 0);
2624 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2626 if (!o->metadata_streams_manual)
2627 for (i = of->ost_index; i < nb_output_streams; i++) {
2629 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2631 ist = input_streams[output_streams[i]->source_index];
2632 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2633 if (!output_streams[i]->stream_copy) {
2634 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2638 /* process manually set programs */
2639 for (i = 0; i < o->nb_program; i++) {
2640 const char *p = o->program[i].u.str;
2645 const char *p2 = av_get_token(&p, ":");
2646 const char *to_dealloc = p2;
2653 key = av_get_token(&p2, "=");
2655 av_freep(&to_dealloc);
2661 if (!strcmp(key, "program_num"))
2662 progid = strtol(p2, NULL, 0);
2663 av_freep(&to_dealloc);
2667 program = av_new_program(oc, progid);
2669 p = o->program[i].u.str;
2671 const char *p2 = av_get_token(&p, ":");
2672 const char *to_dealloc = p2;
2678 key = av_get_token(&p2, "=");
2680 av_log(NULL, AV_LOG_FATAL,
2681 "No '=' character in program string %s.\n",
2689 if (!strcmp(key, "title")) {
2690 av_dict_set(&program->metadata, "title", p2, 0);
2691 } else if (!strcmp(key, "program_num")) {
2692 } else if (!strcmp(key, "st")) {
2693 int st_num = strtol(p2, NULL, 0);
2694 av_program_add_stream_index(oc, progid, st_num);
2696 av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2699 av_freep(&to_dealloc);
2704 /* process manually set metadata */
2705 for (i = 0; i < o->nb_metadata; i++) {
2708 const char *stream_spec;
2709 int index = 0, j, ret = 0;
2711 val = strchr(o->metadata[i].u.str, '=');
2713 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2714 o->metadata[i].u.str);
2719 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2721 for (j = 0; j < oc->nb_streams; j++) {
2722 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2723 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2724 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2726 double theta = av_strtod(val, &tail);
2728 ost->rotate_overridden = 1;
2729 ost->rotate_override_value = theta;
2732 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2744 if (index < 0 || index >= oc->nb_chapters) {
2745 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2748 m = &oc->chapters[index]->metadata;
2751 if (index < 0 || index >= oc->nb_programs) {
2752 av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2755 m = &oc->programs[index]->metadata;
2758 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2761 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2768 static int opt_target(void *optctx, const char *opt, const char *arg)
2770 OptionsContext *o = optctx;
2771 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2772 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2774 if (!strncmp(arg, "pal-", 4)) {
2777 } else if (!strncmp(arg, "ntsc-", 5)) {
2780 } else if (!strncmp(arg, "film-", 5)) {
2784 /* Try to determine PAL/NTSC by peeking in the input files */
2785 if (nb_input_files) {
2787 for (j = 0; j < nb_input_files; j++) {
2788 for (i = 0; i < input_files[j]->nb_streams; i++) {
2789 AVStream *st = input_files[j]->ctx->streams[i];
2791 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2793 fr = st->time_base.den * 1000LL / st->time_base.num;
2797 } else if ((fr == 29970) || (fr == 23976)) {
2802 if (norm != UNKNOWN)
2806 if (norm != UNKNOWN)
2807 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2810 if (norm == UNKNOWN) {
2811 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2812 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2813 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2817 if (!strcmp(arg, "vcd")) {
2818 opt_video_codec(o, "c:v", "mpeg1video");
2819 opt_audio_codec(o, "c:a", "mp2");
2820 parse_option(o, "f", "vcd", options);
2822 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2823 parse_option(o, "r", frame_rates[norm], options);
2824 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2826 opt_default(NULL, "b:v", "1150000");
2827 opt_default(NULL, "maxrate:v", "1150000");
2828 opt_default(NULL, "minrate:v", "1150000");
2829 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2831 opt_default(NULL, "b:a", "224000");
2832 parse_option(o, "ar", "44100", options);
2833 parse_option(o, "ac", "2", options);
2835 opt_default(NULL, "packetsize", "2324");
2836 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2838 /* We have to offset the PTS, so that it is consistent with the SCR.
2839 SCR starts at 36000, but the first two packs contain only padding
2840 and the first pack from the other stream, respectively, may also have
2841 been written before.
2842 So the real data starts at SCR 36000+3*1200. */
2843 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2844 } else if (!strcmp(arg, "svcd")) {
2846 opt_video_codec(o, "c:v", "mpeg2video");
2847 opt_audio_codec(o, "c:a", "mp2");
2848 parse_option(o, "f", "svcd", options);
2850 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2851 parse_option(o, "r", frame_rates[norm], options);
2852 parse_option(o, "pix_fmt", "yuv420p", options);
2853 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2855 opt_default(NULL, "b:v", "2040000");
2856 opt_default(NULL, "maxrate:v", "2516000");
2857 opt_default(NULL, "minrate:v", "0"); // 1145000;
2858 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2859 opt_default(NULL, "scan_offset", "1");
2861 opt_default(NULL, "b:a", "224000");
2862 parse_option(o, "ar", "44100", options);
2864 opt_default(NULL, "packetsize", "2324");
2866 } else if (!strcmp(arg, "dvd")) {
2868 opt_video_codec(o, "c:v", "mpeg2video");
2869 opt_audio_codec(o, "c:a", "ac3");
2870 parse_option(o, "f", "dvd", options);
2872 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2873 parse_option(o, "r", frame_rates[norm], options);
2874 parse_option(o, "pix_fmt", "yuv420p", options);
2875 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2877 opt_default(NULL, "b:v", "6000000");
2878 opt_default(NULL, "maxrate:v", "9000000");
2879 opt_default(NULL, "minrate:v", "0"); // 1500000;
2880 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2882 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2883 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2885 opt_default(NULL, "b:a", "448000");
2886 parse_option(o, "ar", "48000", options);
2888 } else if (!strncmp(arg, "dv", 2)) {
2890 parse_option(o, "f", "dv", options);
2892 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2893 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2894 norm == PAL ? "yuv420p" : "yuv411p", options);
2895 parse_option(o, "r", frame_rates[norm], options);
2897 parse_option(o, "ar", "48000", options);
2898 parse_option(o, "ac", "2", options);
2901 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2902 return AVERROR(EINVAL);
2905 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2906 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2911 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2913 av_free (vstats_filename);
2914 vstats_filename = av_strdup (arg);
2918 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2921 time_t today2 = time(NULL);
2922 struct tm *today = localtime(&today2);
2924 if (!today) { // maybe tomorrow
2925 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2929 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2931 return opt_vstats_file(NULL, opt, filename);
2934 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2936 OptionsContext *o = optctx;
2937 return parse_option(o, "frames:v", arg, options);
2940 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2942 OptionsContext *o = optctx;
2943 return parse_option(o, "frames:a", arg, options);
2946 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2948 OptionsContext *o = optctx;
2949 return parse_option(o, "frames:d", arg, options);
2952 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2955 AVDictionary *cbak = codec_opts;
2956 AVDictionary *fbak = format_opts;
2960 ret = opt_default(NULL, opt, arg);
2962 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2963 av_dict_copy(&o->g->format_opts, format_opts, 0);
2964 av_dict_free(&codec_opts);
2965 av_dict_free(&format_opts);
2972 static int opt_preset(void *optctx, const char *opt, const char *arg)
2974 OptionsContext *o = optctx;
2976 char filename[1000], line[1000], tmp_line[1000];
2977 const char *codec_name = NULL;
2981 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2983 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2984 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2985 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2987 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2991 while (fgets(line, sizeof(line), f)) {
2992 char *key = tmp_line, *value, *endptr;
2994 if (strcspn(line, "#\n\r") == 0)
2996 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2997 if (!av_strtok(key, "=", &value) ||
2998 !av_strtok(value, "\r\n", &endptr)) {
2999 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
3002 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
3004 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
3005 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
3006 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
3007 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
3008 else if (opt_default_new(o, key, value) < 0) {
3009 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
3010 filename, line, key, value);
3020 static int opt_old2new(void *optctx, const char *opt, const char *arg)
3022 OptionsContext *o = optctx;
3024 char *s = av_asprintf("%s:%c", opt + 1, *opt);
3026 return AVERROR(ENOMEM);
3027 ret = parse_option(o, s, arg, options);
3032 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
3034 OptionsContext *o = optctx;
3036 if(!strcmp(opt, "ab")){
3037 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
3039 } else if(!strcmp(opt, "b")){
3040 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
3041 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
3044 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3048 static int opt_qscale(void *optctx, const char *opt, const char *arg)
3050 OptionsContext *o = optctx;
3053 if(!strcmp(opt, "qscale")){
3054 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
3055 return parse_option(o, "q:v", arg, options);
3057 s = av_asprintf("q%s", opt + 6);
3059 return AVERROR(ENOMEM);
3060 ret = parse_option(o, s, arg, options);
3065 static int opt_profile(void *optctx, const char *opt, const char *arg)
3067 OptionsContext *o = optctx;
3068 if(!strcmp(opt, "profile")){
3069 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
3070 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
3073 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3077 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
3079 OptionsContext *o = optctx;
3080 return parse_option(o, "filter:v", arg, options);
3083 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
3085 OptionsContext *o = optctx;
3086 return parse_option(o, "filter:a", arg, options);
3089 static int opt_vsync(void *optctx, const char *opt, const char *arg)
3091 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
3092 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
3093 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
3094 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
3096 if (video_sync_method == VSYNC_AUTO)
3097 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
3101 static int opt_timecode(void *optctx, const char *opt, const char *arg)
3103 OptionsContext *o = optctx;
3105 char *tcr = av_asprintf("timecode=%s", arg);
3107 return AVERROR(ENOMEM);
3108 ret = parse_option(o, "metadata:g", tcr, options);
3110 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
3115 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
3117 OptionsContext *o = optctx;
3118 char layout_str[32];
3121 int ret, channels, ac_str_size;
3124 layout = av_get_channel_layout(arg);
3126 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
3127 return AVERROR(EINVAL);
3129 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
3130 ret = opt_default_new(o, opt, layout_str);
3134 /* set 'ac' option based on channel layout */
3135 channels = av_get_channel_layout_nb_channels(layout);
3136 snprintf(layout_str, sizeof(layout_str), "%d", channels);
3137 stream_str = strchr(opt, ':');
3138 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
3139 ac_str = av_mallocz(ac_str_size);
3141 return AVERROR(ENOMEM);
3142 av_strlcpy(ac_str, "ac", 3);
3144 av_strlcat(ac_str, stream_str, ac_str_size);
3145 ret = parse_option(o, ac_str, layout_str, options);
3151 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
3153 OptionsContext *o = optctx;
3154 return parse_option(o, "q:a", arg, options);
3157 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
3159 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3160 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3161 return AVERROR(ENOMEM);
3162 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3163 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
3164 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
3165 return AVERROR(ENOMEM);
3167 input_stream_potentially_available = 1;
3172 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
3174 uint8_t *graph_desc = read_file(arg);
3176 return AVERROR(EINVAL);
3178 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3179 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3180 return AVERROR(ENOMEM);
3181 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3182 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
3184 input_stream_potentially_available = 1;
3189 void show_help_default(const char *opt, const char *arg)
3191 /* per-file options have at least one of those set */
3192 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
3193 int show_advanced = 0, show_avoptions = 0;
3196 if (!strcmp(opt, "long"))
3198 else if (!strcmp(opt, "full"))
3199 show_advanced = show_avoptions = 1;
3201 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
3206 printf("Getting help:\n"
3207 " -h -- print basic options\n"
3208 " -h long -- print more options\n"
3209 " -h full -- print all options (including all format and codec specific options, very long)\n"
3210 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol\n"
3211 " See man %s for detailed description of the options.\n"
3212 "\n", program_name);
3214 show_help_options(options, "Print help / information / capabilities:",
3217 show_help_options(options, "Global options (affect whole program "
3218 "instead of just one file):",
3219 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
3221 show_help_options(options, "Advanced global options:", OPT_EXPERT,
3222 per_file | OPT_EXIT, 0);
3224 show_help_options(options, "Per-file main options:", 0,
3225 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
3226 OPT_EXIT, per_file);
3228 show_help_options(options, "Advanced per-file options:",
3229 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
3231 show_help_options(options, "Video options:",
3232 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
3234 show_help_options(options, "Advanced Video options:",
3235 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
3237 show_help_options(options, "Audio options:",
3238 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
3240 show_help_options(options, "Advanced Audio options:",
3241 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
3242 show_help_options(options, "Subtitle options:",
3243 OPT_SUBTITLE, 0, 0);
3246 if (show_avoptions) {
3247 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3248 show_help_children(avcodec_get_class(), flags);
3249 show_help_children(avformat_get_class(), flags);
3251 show_help_children(sws_get_class(), flags);
3253 #if CONFIG_SWRESAMPLE
3254 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
3256 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
3257 show_help_children(av_bsf_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_BSF_PARAM);
3261 void show_usage(void)
3263 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
3264 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3265 av_log(NULL, AV_LOG_INFO, "\n");
3273 static const OptionGroupDef groups[] = {
3274 [GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
3275 [GROUP_INFILE] = { "input url", "i", OPT_INPUT },
3278 static int open_files(OptionGroupList *l, const char *inout,
3279 int (*open_file)(OptionsContext*, const char*))
3283 for (i = 0; i < l->nb_groups; i++) {
3284 OptionGroup *g = &l->groups[i];
3290 ret = parse_optgroup(&o, g);
3292 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3293 "%s.\n", inout, g->arg);
3298 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3299 ret = open_file(&o, g->arg);
3302 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3306 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3312 int ffmpeg_parse_options(int argc, char **argv)
3314 OptionParseContext octx;
3318 memset(&octx, 0, sizeof(octx));
3320 /* split the commandline into an internal representation */
3321 ret = split_commandline(&octx, argc, argv, options, groups,
3322 FF_ARRAY_ELEMS(groups));
3324 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3328 /* apply global options */
3329 ret = parse_optgroup(NULL, &octx.global_opts);
3331 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3335 /* configure terminal and setup signal handlers */
3338 /* open input files */
3339 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3341 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3345 /* create the complex filtergraphs */
3346 ret = init_complex_filters();
3348 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3352 /* open output files */
3353 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3355 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3359 check_filter_outputs();
3362 uninit_parse_context(&octx);
3364 av_strerror(ret, error, sizeof(error));
3365 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3370 static int opt_progress(void *optctx, const char *opt, const char *arg)
3372 AVIOContext *avio = NULL;
3375 if (!strcmp(arg, "-"))
3377 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3379 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3380 arg, av_err2str(ret));
3383 progress_avio = avio;
3387 #define OFFSET(x) offsetof(OptionsContext, x)
3388 const OptionDef options[] = {
3390 CMDUTILS_COMMON_OPTIONS
3391 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3392 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3393 "force format", "fmt" },
3394 { "y", OPT_BOOL, { &file_overwrite },
3395 "overwrite output files" },
3396 { "n", OPT_BOOL, { &no_file_overwrite },
3397 "never overwrite output files" },
3398 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3399 "Ignore unknown stream types" },
3400 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
3401 "Copy unknown stream types" },
3402 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3403 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3404 "codec name", "codec" },
3405 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3406 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3407 "codec name", "codec" },
3408 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3409 OPT_OUTPUT, { .off = OFFSET(presets) },
3410 "preset name", "preset" },
3411 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3412 OPT_OUTPUT, { .func_arg = opt_map },
3413 "set input stream mapping",
3414 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3415 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3416 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3417 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3418 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3419 "set metadata information of outfile from infile",
3420 "outfile[,metadata]:infile[,metadata]" },
3421 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3422 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3423 "set chapters mapping", "input_file_index" },
3424 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3425 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3426 "record or transcode \"duration\" seconds of audio/video",
3428 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3429 "record or transcode stop time", "time_stop" },
3430 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3431 "set the limit file size in bytes", "limit_size" },
3432 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3433 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3434 "set the start time offset", "time_off" },
3435 { "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3436 OPT_INPUT, { .off = OFFSET(start_time_eof) },
3437 "set the start time offset relative to EOF", "time_off" },
3438 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3439 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3440 "enable/disable seeking by timestamp with -ss" },
3441 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3442 OPT_INPUT, { .off = OFFSET(accurate_seek) },
3443 "enable/disable accurate seeking with -ss" },
3444 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3445 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3446 "set the input ts offset", "time_off" },
3447 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3448 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3449 "set the input ts scale", "scale" },
3450 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3451 "set the recording timestamp ('now' to set the current time)", "time" },
3452 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3453 "add metadata", "string=string" },
3454 { "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3455 "add program with specified streams", "title=string:st=number..." },
3456 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3457 OPT_OUTPUT, { .func_arg = opt_data_frames },
3458 "set the number of data frames to output", "number" },
3459 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3460 "add timings for benchmarking" },
3461 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3462 "add timings for each task" },
3463 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3464 "write program-readable progress information", "url" },
3465 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3466 "enable or disable interaction on standard input" },
3467 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3468 "set max runtime in seconds in CPU user time", "limit" },
3469 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3470 "dump each input packet" },
3471 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3472 "when dumping packets, also dump the payload" },
3473 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3474 OPT_INPUT, { .off = OFFSET(rate_emu) },
3475 "read input at native frame rate", "" },
3476 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3477 "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3478 "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3479 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3480 "video sync method", "" },
3481 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3482 "frame drop threshold", "" },
3483 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3484 "audio sync method", "" },
3485 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3486 "audio drift threshold", "threshold" },
3487 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
3488 "copy timestamps" },
3489 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3490 "shift input timestamps to start at 0 when using copyts" },
3491 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
3492 "copy input stream time base when stream copying", "mode" },
3493 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3494 OPT_OUTPUT, { .off = OFFSET(shortest) },
3495 "finish encoding within shortest input" },
3496 { "bitexact", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3497 OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(bitexact) },
3499 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3500 OPT_OUTPUT, { .off = OFFSET(apad) },
3502 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3503 "timestamp discontinuity delta threshold", "threshold" },
3504 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3505 "timestamp error delta threshold", "threshold" },
3506 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3507 "exit on error", "error" },
3508 { "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3509 "abort on the specified condition flags", "flags" },
3510 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3511 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3512 "copy initial non-keyframes" },
3513 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3514 "copy or discard frames before start time" },
3515 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3516 "set the number of frames to output", "number" },
3517 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3518 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3519 "force codec tag/fourcc", "fourcc/tag" },
3520 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3521 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3522 "use fixed quality scale (VBR)", "q" },
3523 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3524 OPT_OUTPUT, { .func_arg = opt_qscale },
3525 "use fixed quality scale (VBR)", "q" },
3526 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3527 "set profile", "profile" },
3528 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3529 "set stream filtergraph", "filter_graph" },
3530 { "filter_threads", HAS_ARG | OPT_INT, { &filter_nbthreads },
3531 "number of non-complex filter threads" },
3532 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3533 "read stream filtergraph description from a file", "filename" },
3534 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3535 "reinit filtergraph on input parameter changes", "" },
3536 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3537 "create a complex filtergraph", "graph_description" },
3538 { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads },
3539 "number of threads for -filter_complex" },
3540 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3541 "create a complex filtergraph", "graph_description" },
3542 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3543 "read complex filtergraph description from a file", "filename" },
3544 { "stats", OPT_BOOL, { &print_stats },
3545 "print progress report during encoding", },
3546 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3547 OPT_OUTPUT, { .func_arg = opt_attach },
3548 "add an attachment to the output file", "filename" },
3549 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3550 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3551 "extract an attachment into a file", "filename" },
3552 { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3553 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3554 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3555 "print timestamp debugging info" },
3556 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3557 "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.", "maximum error rate" },
3558 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3559 OPT_INPUT, { .off = OFFSET(discard) },
3561 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3562 OPT_OUTPUT, { .off = OFFSET(disposition) },
3563 "disposition", "" },
3564 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3565 { .off = OFFSET(thread_queue_size) },
3566 "set the maximum number of queued packets from the demuxer" },
3567 { "find_stream_info", OPT_BOOL | OPT_PERFILE | OPT_INPUT | OPT_EXPERT, { &find_stream_info },
3568 "read and decode the streams to fill missing information with heuristics" },
3571 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3572 "set the number of video frames to output", "number" },
3573 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3574 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3575 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3576 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3577 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3578 "set frame size (WxH or abbreviation)", "size" },
3579 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3580 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3581 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3582 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3583 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3584 "set pixel format", "format" },
3585 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3586 "set the number of bits per raw sample", "number" },
3587 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3588 "deprecated use -g 1" },
3589 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3591 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3592 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3593 "rate control override for specific intervals", "override" },
3594 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3595 OPT_OUTPUT, { .func_arg = opt_video_codec },
3596 "force video codec ('copy' to copy stream)", "codec" },
3597 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3599 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3601 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3602 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3603 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3604 "select the pass number (1 to 3)", "n" },
3605 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3606 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3607 "select two pass log file name prefix", "prefix" },
3608 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3609 "this option is deprecated, use the yadif filter instead" },
3610 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3611 "calculate PSNR of compressed frames" },
3612 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3613 "dump video coding statistics to file" },
3614 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3615 "dump video coding statistics to file", "file" },
3616 { "vstats_version", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &vstats_version },
3617 "Version of the vstats format to use."},
3618 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3619 "set video filters", "filter_graph" },
3620 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3621 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3622 "specify intra matrix coeffs", "matrix" },
3623 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3624 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3625 "specify inter matrix coeffs", "matrix" },
3626 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3627 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3628 "specify intra matrix coeffs", "matrix" },
3629 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3630 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3631 "top=1/bottom=0/auto=-1 field first", "" },
3632 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3633 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3634 "force video tag/fourcc", "fourcc/tag" },
3635 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3636 "show QP histogram" },
3637 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3638 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3639 "force the selected framerate, disable the best supported framerate selection" },
3640 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3641 OPT_OUTPUT, { .func_arg = opt_streamid },
3642 "set the value of an outfile streamid", "streamIndex:value" },
3643 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3644 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3645 "force key frames at specified timestamps", "timestamps" },
3646 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3647 "audio bitrate (please use -b:a)", "bitrate" },
3648 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3649 "video bitrate (please use -b:v)", "bitrate" },
3650 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3651 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3652 "use HW accelerated decoding", "hwaccel name" },
3653 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3654 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3655 "select a device for HW acceleration", "devicename" },
3656 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3657 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
3658 "select output format used with HW accelerated decoding", "format" },
3659 #if CONFIG_VIDEOTOOLBOX
3660 { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3662 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3663 "show available HW acceleration methods" },
3664 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3665 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3666 "automatically insert correct rotate filters" },
3669 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3670 "set the number of audio frames to output", "number" },
3671 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3672 "set audio quality (codec-specific)", "quality", },
3673 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3674 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3675 "set audio sampling rate (in Hz)", "rate" },
3676 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3677 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3678 "set number of audio channels", "channels" },
3679 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3681 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3682 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3683 "force audio codec ('copy' to copy stream)", "codec" },
3684 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3685 OPT_OUTPUT, { .func_arg = opt_old2new },
3686 "force audio tag/fourcc", "fourcc/tag" },
3687 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3688 "change audio volume (256=normal)" , "volume" },
3689 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3690 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3691 "set sample format", "format" },
3692 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3693 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3694 "set channel layout", "layout" },
3695 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3696 "set audio filters", "filter_graph" },
3697 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3698 "set the maximum number of channels to try to guess the channel layout" },
3700 /* subtitle options */
3701 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3702 "disable subtitle" },
3703 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3704 "force subtitle codec ('copy' to copy stream)", "codec" },
3705 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3706 , "force subtitle tag/fourcc", "fourcc/tag" },
3707 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3708 "fix subtitles duration" },
3709 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3710 "set canvas size (WxH or abbreviation)", "size" },
3713 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3714 "deprecated, use -channel", "channel" },
3715 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3716 "deprecated, use -standard", "standard" },
3717 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3720 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3721 "set the maximum demux-decode delay", "seconds" },
3722 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3723 "set the initial demux-decode delay", "seconds" },
3724 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3725 "specify a file in which to print sdp information", "file" },
3727 { "time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(time_bases) },
3728 "set the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)", "ratio" },
3729 { "enc_time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(enc_time_bases) },
3730 "set the desired time base for the encoder (1:24, 1:48000 or 0.04166, 2.0833e-5). "
3731 "two special values are defined - "
3732 "0 = use frame rate (video) or sample rate (audio),"
3733 "-1 = match source time base", "ratio" },
3735 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3736 "A comma-separated list of bitstream filters", "bitstream_filters" },
3737 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3738 "deprecated", "audio bitstream_filters" },
3739 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3740 "deprecated", "video bitstream_filters" },
3742 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3743 "set the audio options to the indicated preset", "preset" },
3744 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3745 "set the video options to the indicated preset", "preset" },
3746 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3747 "set the subtitle options to the indicated preset", "preset" },
3748 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3749 "set options from indicated preset file", "filename" },
3751 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
3752 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
3754 /* data codec support */
3755 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3756 "force data codec ('copy' to copy stream)", "codec" },
3757 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3761 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
3762 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
3766 { "qsv_device", HAS_ARG | OPT_STRING | OPT_EXPERT, { &qsv_device },
3767 "set QSV hardware device (DirectX adapter index, DRM path or X11 display name)", "device"},
3770 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
3771 "initialise hardware device", "args" },
3772 { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device },
3773 "set hardware device used when filtering", "device" },