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_autoscale[] = {"autoscale", NULL};
66 static const char *opt_name_max_frames[] = {"frames", "aframes", "vframes", "dframes", NULL};
67 static const char *opt_name_bitstream_filters[] = {"bsf", "absf", "vbsf", NULL};
68 static const char *opt_name_codec_tags[] = {"tag", "atag", "vtag", "stag", NULL};
69 static const char *opt_name_sample_fmts[] = {"sample_fmt", NULL};
70 static const char *opt_name_qscale[] = {"q", "qscale", NULL};
71 static const char *opt_name_forced_key_frames[] = {"forced_key_frames", NULL};
72 static const char *opt_name_force_fps[] = {"force_fps", NULL};
73 static const char *opt_name_frame_aspect_ratios[] = {"aspect", NULL};
74 static const char *opt_name_rc_overrides[] = {"rc_override", NULL};
75 static const char *opt_name_intra_matrices[] = {"intra_matrix", NULL};
76 static const char *opt_name_inter_matrices[] = {"inter_matrix", NULL};
77 static const char *opt_name_chroma_intra_matrices[] = {"chroma_intra_matrix", NULL};
78 static const char *opt_name_top_field_first[] = {"top", NULL};
79 static const char *opt_name_presets[] = {"pre", "apre", "vpre", "spre", NULL};
80 static const char *opt_name_copy_initial_nonkeyframes[] = {"copyinkfr", NULL};
81 static const char *opt_name_copy_prior_start[] = {"copypriorss", NULL};
82 static const char *opt_name_filters[] = {"filter", "af", "vf", NULL};
83 static const char *opt_name_filter_scripts[] = {"filter_script", NULL};
84 static const char *opt_name_reinit_filters[] = {"reinit_filter", NULL};
85 static const char *opt_name_fix_sub_duration[] = {"fix_sub_duration", NULL};
86 static const char *opt_name_canvas_sizes[] = {"canvas_size", NULL};
87 static const char *opt_name_pass[] = {"pass", NULL};
88 static const char *opt_name_passlogfiles[] = {"passlogfile", NULL};
89 static const char *opt_name_max_muxing_queue_size[] = {"max_muxing_queue_size", NULL};
90 static const char *opt_name_guess_layout_max[] = {"guess_layout_max", NULL};
91 static const char *opt_name_apad[] = {"apad", NULL};
92 static const char *opt_name_discard[] = {"discard", NULL};
93 static const char *opt_name_disposition[] = {"disposition", NULL};
94 static const char *opt_name_time_bases[] = {"time_base", NULL};
95 static const char *opt_name_enc_time_bases[] = {"enc_time_base", NULL};
97 #define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\
99 char namestr[128] = "";\
100 const char *spec = so->specifier && so->specifier[0] ? so->specifier : "";\
101 for (i = 0; opt_name_##name[i]; i++)\
102 av_strlcatf(namestr, sizeof(namestr), "-%s%s", opt_name_##name[i], opt_name_##name[i+1] ? (opt_name_##name[i+2] ? ", " : " or ") : "");\
103 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",\
104 namestr, st->index, opt_name_##name[0], spec[0] ? ":" : "", spec, so->u.type);\
107 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
109 int i, ret, matches = 0;\
111 for (i = 0; i < o->nb_ ## name; i++) {\
112 char *spec = o->name[i].specifier;\
113 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0) {\
114 outvar = o->name[i].u.type;\
121 WARN_MULTIPLE_OPT_USAGE(name, type, so, st);\
124 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
127 for (i = 0; i < o->nb_ ## name; i++) {\
128 char *spec = o->name[i].specifier;\
129 if (!strcmp(spec, mediatype))\
130 outvar = o->name[i].u.type;\
134 const HWAccel hwaccels[] = {
135 #if CONFIG_VIDEOTOOLBOX
136 { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
139 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
143 HWDevice *filter_hw_device;
145 char *vstats_filename;
148 float audio_drift_threshold = 0.1;
149 float dts_delta_threshold = 10;
150 float dts_error_threshold = 3600*30;
152 int audio_volume = 256;
153 int audio_sync_method = 0;
154 int video_sync_method = VSYNC_AUTO;
155 float frame_drop_threshold = 0;
156 int do_deinterlace = 0;
157 int do_benchmark = 0;
158 int do_benchmark_all = 0;
162 int start_at_zero = 0;
165 int exit_on_error = 0;
166 int abort_on_flags = 0;
167 int print_stats = -1;
169 int stdin_interaction = 1;
170 int frame_bits_per_raw_sample = 0;
171 float max_error_rate = 2.0/3;
172 int filter_nbthreads = 0;
173 int filter_complex_nbthreads = 0;
174 int vstats_version = 2;
177 static int intra_only = 0;
178 static int file_overwrite = 0;
179 static int no_file_overwrite = 0;
180 static int do_psnr = 0;
181 static int input_sync;
182 static int input_stream_potentially_available = 0;
183 static int ignore_unknown_streams = 0;
184 static int copy_unknown_streams = 0;
185 static int find_stream_info = 1;
187 static void uninit_options(OptionsContext *o)
189 const OptionDef *po = options;
192 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
194 void *dst = (uint8_t*)o + po->u.off;
196 if (po->flags & OPT_SPEC) {
197 SpecifierOpt **so = dst;
198 int i, *count = (int*)(so + 1);
199 for (i = 0; i < *count; i++) {
200 av_freep(&(*so)[i].specifier);
201 if (po->flags & OPT_STRING)
202 av_freep(&(*so)[i].u.str);
206 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
211 for (i = 0; i < o->nb_stream_maps; i++)
212 av_freep(&o->stream_maps[i].linklabel);
213 av_freep(&o->stream_maps);
214 av_freep(&o->audio_channel_maps);
215 av_freep(&o->streamid_map);
216 av_freep(&o->attachments);
219 static void init_options(OptionsContext *o)
221 memset(o, 0, sizeof(*o));
223 o->stop_time = INT64_MAX;
224 o->mux_max_delay = 0.7;
225 o->start_time = AV_NOPTS_VALUE;
226 o->start_time_eof = AV_NOPTS_VALUE;
227 o->recording_time = INT64_MAX;
228 o->limit_filesize = UINT64_MAX;
229 o->chapters_input_file = INT_MAX;
230 o->accurate_seek = 1;
231 o->thread_queue_size = -1;
234 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
236 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
238 printf("Hardware acceleration methods:\n");
239 while ((type = av_hwdevice_iterate_types(type)) !=
240 AV_HWDEVICE_TYPE_NONE)
241 printf("%s\n", av_hwdevice_get_type_name(type));
246 /* return a copy of the input with the stream specifiers removed from the keys */
247 static AVDictionary *strip_specifiers(AVDictionary *dict)
249 AVDictionaryEntry *e = NULL;
250 AVDictionary *ret = NULL;
252 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
253 char *p = strchr(e->key, ':');
257 av_dict_set(&ret, e->key, e->value, 0);
264 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
266 static const AVOption opts[] = {
267 { "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
268 { "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
269 { "empty_output_stream", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT_STREAM }, .unit = "flags" },
272 static const AVClass class = {
274 .item_name = av_default_item_name,
276 .version = LIBAVUTIL_VERSION_INT,
278 const AVClass *pclass = &class;
280 return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
283 static int opt_sameq(void *optctx, const char *opt, const char *arg)
285 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
286 "If you are looking for an option to preserve the quality (which is not "
287 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
289 return AVERROR(EINVAL);
292 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
294 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
295 return opt_default(optctx, "channel", arg);
298 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
300 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
301 return opt_default(optctx, "standard", arg);
304 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
306 OptionsContext *o = optctx;
307 return parse_option(o, "codec:a", arg, options);
310 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
312 OptionsContext *o = optctx;
313 return parse_option(o, "codec:v", arg, options);
316 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
318 OptionsContext *o = optctx;
319 return parse_option(o, "codec:s", arg, options);
322 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
324 OptionsContext *o = optctx;
325 return parse_option(o, "codec:d", arg, options);
328 static int opt_map(void *optctx, const char *opt, const char *arg)
330 OptionsContext *o = optctx;
332 int i, negative = 0, file_idx, disabled = 0;
333 int sync_file_idx = -1, sync_stream_idx = 0;
342 map = av_strdup(arg);
344 return AVERROR(ENOMEM);
346 /* parse sync stream first, just pick first matching stream */
347 if (sync = strchr(map, ',')) {
349 sync_file_idx = strtol(sync + 1, &sync, 0);
350 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
351 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
356 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
357 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
358 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
362 if (i == input_files[sync_file_idx]->nb_streams) {
363 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
364 "match any streams.\n", arg);
367 if (input_streams[input_files[sync_file_idx]->ist_index + sync_stream_idx]->user_set_discard == AVDISCARD_ALL) {
368 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s matches a disabled input "
376 /* this mapping refers to lavfi output */
377 const char *c = map + 1;
378 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
379 m = &o->stream_maps[o->nb_stream_maps - 1];
380 m->linklabel = av_get_token(&c, "]");
382 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
386 if (allow_unused = strchr(map, '?'))
388 file_idx = strtol(map, &p, 0);
389 if (file_idx >= nb_input_files || file_idx < 0) {
390 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
394 /* disable some already defined maps */
395 for (i = 0; i < o->nb_stream_maps; i++) {
396 m = &o->stream_maps[i];
397 if (file_idx == m->file_index &&
398 check_stream_specifier(input_files[m->file_index]->ctx,
399 input_files[m->file_index]->ctx->streams[m->stream_index],
400 *p == ':' ? p + 1 : p) > 0)
404 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
405 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
406 *p == ':' ? p + 1 : p) <= 0)
408 if (input_streams[input_files[file_idx]->ist_index + i]->user_set_discard == AVDISCARD_ALL) {
412 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
413 m = &o->stream_maps[o->nb_stream_maps - 1];
415 m->file_index = file_idx;
418 if (sync_file_idx >= 0) {
419 m->sync_file_index = sync_file_idx;
420 m->sync_stream_index = sync_stream_idx;
422 m->sync_file_index = file_idx;
423 m->sync_stream_index = i;
430 av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
431 } else if (disabled) {
432 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches disabled streams.\n"
433 "To ignore this, add a trailing '?' to the map.\n", arg);
436 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
437 "To ignore this, add a trailing '?' to the map.\n", arg);
446 static int opt_attach(void *optctx, const char *opt, const char *arg)
448 OptionsContext *o = optctx;
449 GROW_ARRAY(o->attachments, o->nb_attachments);
450 o->attachments[o->nb_attachments - 1] = arg;
454 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
456 OptionsContext *o = optctx;
462 mapchan = av_strdup(arg);
464 return AVERROR(ENOMEM);
466 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
467 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
469 /* muted channel syntax */
470 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
471 if ((n == 1 || n == 3) && m->channel_idx == -1) {
472 m->file_idx = m->stream_idx = -1;
474 m->ofile_idx = m->ostream_idx = -1;
480 n = sscanf(arg, "%d.%d.%d:%d.%d",
481 &m->file_idx, &m->stream_idx, &m->channel_idx,
482 &m->ofile_idx, &m->ostream_idx);
484 if (n != 3 && n != 5) {
485 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
486 "[file.stream.channel|-1][:syncfile:syncstream]\n");
490 if (n != 5) // only file.stream.channel specified
491 m->ofile_idx = m->ostream_idx = -1;
494 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
495 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
499 if (m->stream_idx < 0 ||
500 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
501 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
502 m->file_idx, m->stream_idx);
505 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
506 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
507 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
508 m->file_idx, m->stream_idx);
511 /* allow trailing ? to map_channel */
512 if (allow_unused = strchr(mapchan, '?'))
514 if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels ||
515 input_streams[input_files[m->file_idx]->ist_index + m->stream_idx]->user_set_discard == AVDISCARD_ALL) {
517 av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
518 m->file_idx, m->stream_idx, m->channel_idx);
520 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n"
521 "To ignore this, add a trailing '?' to the map_channel.\n",
522 m->file_idx, m->stream_idx, m->channel_idx);
531 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
533 av_free(sdp_filename);
534 sdp_filename = av_strdup(arg);
539 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
541 const char *prefix = "vaapi:";
544 tmp = av_asprintf("%s%s", prefix, arg);
546 return AVERROR(ENOMEM);
547 err = hw_device_init_from_string(tmp, NULL);
553 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
555 if (!strcmp(arg, "list")) {
556 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
557 printf("Supported hardware device types:\n");
558 while ((type = av_hwdevice_iterate_types(type)) !=
559 AV_HWDEVICE_TYPE_NONE)
560 printf("%s\n", av_hwdevice_get_type_name(type));
564 return hw_device_init_from_string(arg, NULL);
568 static int opt_filter_hw_device(void *optctx, const char *opt, const char *arg)
570 if (filter_hw_device) {
571 av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
572 return AVERROR(EINVAL);
574 filter_hw_device = hw_device_get_by_name(arg);
575 if (!filter_hw_device) {
576 av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg);
577 return AVERROR(EINVAL);
583 * Parse a metadata specifier passed as 'arg' parameter.
584 * @param arg metadata string to parse
585 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
586 * @param index for type c/p, chapter/program index is written here
587 * @param stream_spec for type s, the stream specifier is written here
589 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
597 if (*(++arg) && *arg != ':') {
598 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
601 *stream_spec = *arg == ':' ? arg + 1 : "";
606 *index = strtol(++arg, NULL, 0);
609 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
616 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
618 AVDictionary **meta_in = NULL;
619 AVDictionary **meta_out = NULL;
621 char type_in, type_out;
622 const char *istream_spec = NULL, *ostream_spec = NULL;
623 int idx_in = 0, idx_out = 0;
625 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
626 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
629 if (type_out == 'g' || !*outspec)
630 o->metadata_global_manual = 1;
631 if (type_out == 's' || !*outspec)
632 o->metadata_streams_manual = 1;
633 if (type_out == 'c' || !*outspec)
634 o->metadata_chapters_manual = 1;
638 if (type_in == 'g' || type_out == 'g')
639 o->metadata_global_manual = 1;
640 if (type_in == 's' || type_out == 's')
641 o->metadata_streams_manual = 1;
642 if (type_in == 'c' || type_out == 'c')
643 o->metadata_chapters_manual = 1;
645 /* ic is NULL when just disabling automatic mappings */
649 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
650 if ((index) < 0 || (index) >= (nb_elems)) {\
651 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
656 #define SET_DICT(type, meta, context, index)\
659 meta = &context->metadata;\
662 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
663 meta = &context->chapters[index]->metadata;\
666 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
667 meta = &context->programs[index]->metadata;\
670 break; /* handled separately below */ \
671 default: av_assert0(0);\
674 SET_DICT(type_in, meta_in, ic, idx_in);
675 SET_DICT(type_out, meta_out, oc, idx_out);
677 /* for input streams choose first matching stream */
678 if (type_in == 's') {
679 for (i = 0; i < ic->nb_streams; i++) {
680 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
681 meta_in = &ic->streams[i]->metadata;
687 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
692 if (type_out == 's') {
693 for (i = 0; i < oc->nb_streams; i++) {
694 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
695 meta_out = &oc->streams[i]->metadata;
696 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
701 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
706 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
708 OptionsContext *o = optctx;
710 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
711 struct tm time = *gmtime((time_t*)&recording_timestamp);
712 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
714 parse_option(o, "metadata", buf, options);
716 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
717 "tag instead.\n", opt);
721 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
723 const AVCodecDescriptor *desc;
724 const char *codec_string = encoder ? "encoder" : "decoder";
728 avcodec_find_encoder_by_name(name) :
729 avcodec_find_decoder_by_name(name);
731 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
732 codec = encoder ? avcodec_find_encoder(desc->id) :
733 avcodec_find_decoder(desc->id);
735 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
736 codec_string, codec->name, desc->name);
740 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
743 if (codec->type != type) {
744 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
750 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
752 char *codec_name = NULL;
754 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
756 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
757 st->codecpar->codec_id = codec->id;
760 return avcodec_find_decoder(st->codecpar->codec_id);
763 /* Add all the streams from the given input file to the global
764 * list of input streams. */
765 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
769 for (i = 0; i < ic->nb_streams; i++) {
770 AVStream *st = ic->streams[i];
771 AVCodecParameters *par = st->codecpar;
772 InputStream *ist = av_mallocz(sizeof(*ist));
773 char *framerate = NULL, *hwaccel_device = NULL;
774 const char *hwaccel = NULL;
775 char *hwaccel_output_format = NULL;
776 char *codec_tag = NULL;
778 char *discard_str = NULL;
779 const AVClass *cc = avcodec_get_class();
780 const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL, 0, 0);
785 GROW_ARRAY(input_streams, nb_input_streams);
786 input_streams[nb_input_streams - 1] = ist;
789 ist->file_index = nb_input_files;
791 st->discard = AVDISCARD_ALL;
793 ist->min_pts = INT64_MAX;
794 ist->max_pts = INT64_MIN;
797 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
800 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
802 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
804 uint32_t tag = strtol(codec_tag, &next, 0);
806 tag = AV_RL32(codec_tag);
807 st->codecpar->codec_tag = tag;
810 ist->dec = choose_decoder(o, ic, st);
811 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
813 ist->reinit_filters = -1;
814 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
816 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
817 ist->user_set_discard = AVDISCARD_NONE;
819 if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
820 (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ||
821 (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) ||
822 (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
823 ist->user_set_discard = AVDISCARD_ALL;
825 if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
826 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
831 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
833 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
835 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
839 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
841 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
846 ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
848 switch (par->codec_type) {
849 case AVMEDIA_TYPE_VIDEO:
851 ist->dec = avcodec_find_decoder(par->codec_id);
853 if (st->codec->lowres) {
854 ist->dec_ctx->lowres = st->codec->lowres;
855 ist->dec_ctx->width = st->codec->width;
856 ist->dec_ctx->height = st->codec->height;
857 ist->dec_ctx->coded_width = st->codec->coded_width;
858 ist->dec_ctx->coded_height = st->codec->coded_height;
862 // avformat_find_stream_info() doesn't set this for us anymore.
863 ist->dec_ctx->framerate = st->avg_frame_rate;
865 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
866 if (framerate && av_parse_video_rate(&ist->framerate,
868 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
873 ist->top_field_first = -1;
874 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
876 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
877 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
878 hwaccel_output_format, ic, st);
880 if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "cuvid")) {
881 av_log(NULL, AV_LOG_WARNING,
882 "WARNING: defaulting hwaccel_output_format to cuda for compatibility "
883 "with old commandlines. This behaviour is DEPRECATED and will be removed "
884 "in the future. Please explicitly set \"-hwaccel_output_format cuda\".\n");
885 ist->hwaccel_output_format = AV_PIX_FMT_CUDA;
886 } else if (hwaccel_output_format) {
887 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
888 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
889 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
890 "format: %s", hwaccel_output_format);
893 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
897 // The NVDEC hwaccels use a CUDA device, so remap the name here.
898 if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
901 if (!strcmp(hwaccel, "none"))
902 ist->hwaccel_id = HWACCEL_NONE;
903 else if (!strcmp(hwaccel, "auto"))
904 ist->hwaccel_id = HWACCEL_AUTO;
906 enum AVHWDeviceType type;
908 for (i = 0; hwaccels[i].name; i++) {
909 if (!strcmp(hwaccels[i].name, hwaccel)) {
910 ist->hwaccel_id = hwaccels[i].id;
915 if (!ist->hwaccel_id) {
916 type = av_hwdevice_find_type_by_name(hwaccel);
917 if (type != AV_HWDEVICE_TYPE_NONE) {
918 ist->hwaccel_id = HWACCEL_GENERIC;
919 ist->hwaccel_device_type = type;
923 if (!ist->hwaccel_id) {
924 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
926 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
927 type = AV_HWDEVICE_TYPE_NONE;
928 while ((type = av_hwdevice_iterate_types(type)) !=
929 AV_HWDEVICE_TYPE_NONE)
930 av_log(NULL, AV_LOG_FATAL, "%s ",
931 av_hwdevice_get_type_name(type));
932 av_log(NULL, AV_LOG_FATAL, "\n");
938 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
939 if (hwaccel_device) {
940 ist->hwaccel_device = av_strdup(hwaccel_device);
941 if (!ist->hwaccel_device)
945 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
948 case AVMEDIA_TYPE_AUDIO:
949 ist->guess_layout_max = INT_MAX;
950 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
951 guess_input_channel_layout(ist);
953 case AVMEDIA_TYPE_DATA:
954 case AVMEDIA_TYPE_SUBTITLE: {
955 char *canvas_size = NULL;
957 ist->dec = avcodec_find_decoder(par->codec_id);
958 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
959 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
961 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
962 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
967 case AVMEDIA_TYPE_ATTACHMENT:
968 case AVMEDIA_TYPE_UNKNOWN:
974 ret = avcodec_parameters_from_context(par, ist->dec_ctx);
976 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
982 static void assert_file_overwrite(const char *filename)
984 const char *proto_name = avio_find_protocol_name(filename);
986 if (file_overwrite && no_file_overwrite) {
987 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
991 if (!file_overwrite) {
992 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
993 if (stdin_interaction && !no_file_overwrite) {
994 fprintf(stderr,"File '%s' already exists. Overwrite? [y/N] ", filename);
997 signal(SIGINT, SIG_DFL);
999 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
1005 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
1011 if (proto_name && !strcmp(proto_name, "file")) {
1012 for (int i = 0; i < nb_input_files; i++) {
1013 InputFile *file = input_files[i];
1014 if (file->ctx->iformat->flags & AVFMT_NOFILE)
1016 if (!strcmp(filename, file->ctx->url)) {
1017 av_log(NULL, AV_LOG_FATAL, "Output %s same as Input #%d - exiting\n", filename, i);
1018 av_log(NULL, AV_LOG_WARNING, "FFmpeg cannot edit existing files in-place.\n");
1025 static void dump_attachment(AVStream *st, const char *filename)
1028 AVIOContext *out = NULL;
1029 AVDictionaryEntry *e;
1031 if (!st->codecpar->extradata_size) {
1032 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
1033 nb_input_files - 1, st->index);
1036 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
1037 filename = e->value;
1039 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
1040 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
1044 assert_file_overwrite(filename);
1046 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
1047 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
1052 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
1057 static int open_input_file(OptionsContext *o, const char *filename)
1060 AVFormatContext *ic;
1061 AVInputFormat *file_iformat = NULL;
1064 AVDictionary *unused_opts = NULL;
1065 AVDictionaryEntry *e = NULL;
1066 char * video_codec_name = NULL;
1067 char * audio_codec_name = NULL;
1068 char *subtitle_codec_name = NULL;
1069 char * data_codec_name = NULL;
1070 int scan_all_pmts_set = 0;
1072 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
1073 o->stop_time = INT64_MAX;
1074 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1077 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1078 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
1079 if (o->stop_time <= start_time) {
1080 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1083 o->recording_time = o->stop_time - start_time;
1088 if (!(file_iformat = av_find_input_format(o->format))) {
1089 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
1094 if (!strcmp(filename, "-"))
1097 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
1098 strcmp(filename, "/dev/stdin");
1100 /* get default parameters from command line */
1101 ic = avformat_alloc_context();
1103 print_error(filename, AVERROR(ENOMEM));
1106 if (o->nb_audio_sample_rate) {
1107 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
1109 if (o->nb_audio_channels) {
1110 /* because we set audio_channels based on both the "ac" and
1111 * "channel_layout" options, we need to check that the specified
1112 * demuxer actually has the "channels" option before setting it */
1113 if (file_iformat && file_iformat->priv_class &&
1114 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
1115 AV_OPT_SEARCH_FAKE_OBJ)) {
1116 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
1119 if (o->nb_frame_rates) {
1120 /* set the format-level framerate option;
1121 * this is important for video grabbers, e.g. x11 */
1122 if (file_iformat && file_iformat->priv_class &&
1123 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
1124 AV_OPT_SEARCH_FAKE_OBJ)) {
1125 av_dict_set(&o->g->format_opts, "framerate",
1126 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
1129 if (o->nb_frame_sizes) {
1130 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
1132 if (o->nb_frame_pix_fmts)
1133 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
1135 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
1136 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
1137 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
1138 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
1140 if (video_codec_name)
1141 ic->video_codec = find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
1142 if (audio_codec_name)
1143 ic->audio_codec = find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
1144 if (subtitle_codec_name)
1145 ic->subtitle_codec = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
1146 if (data_codec_name)
1147 ic->data_codec = find_codec_or_die(data_codec_name , AVMEDIA_TYPE_DATA , 0);
1149 ic->video_codec_id = video_codec_name ? ic->video_codec->id : AV_CODEC_ID_NONE;
1150 ic->audio_codec_id = audio_codec_name ? ic->audio_codec->id : AV_CODEC_ID_NONE;
1151 ic->subtitle_codec_id = subtitle_codec_name ? ic->subtitle_codec->id : AV_CODEC_ID_NONE;
1152 ic->data_codec_id = data_codec_name ? ic->data_codec->id : AV_CODEC_ID_NONE;
1154 ic->flags |= AVFMT_FLAG_NONBLOCK;
1156 ic->flags |= AVFMT_FLAG_BITEXACT;
1157 ic->interrupt_callback = int_cb;
1159 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
1160 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
1161 scan_all_pmts_set = 1;
1163 /* open the input file with generic avformat function */
1164 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1166 print_error(filename, err);
1167 if (err == AVERROR_PROTOCOL_NOT_FOUND)
1168 av_log(NULL, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1171 if (scan_all_pmts_set)
1172 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1173 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
1174 assert_avoptions(o->g->format_opts);
1176 /* apply forced codec ids */
1177 for (i = 0; i < ic->nb_streams; i++)
1178 choose_decoder(o, ic, ic->streams[i]);
1180 if (find_stream_info) {
1181 AVDictionary **opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
1182 int orig_nb_streams = ic->nb_streams;
1184 /* If not enough info to get the stream parameters, we decode the
1185 first frames to get it. (used in mpeg case for example) */
1186 ret = avformat_find_stream_info(ic, opts);
1188 for (i = 0; i < orig_nb_streams; i++)
1189 av_dict_free(&opts[i]);
1193 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
1194 if (ic->nb_streams == 0) {
1195 avformat_close_input(&ic);
1201 if (o->start_time != AV_NOPTS_VALUE && o->start_time_eof != AV_NOPTS_VALUE) {
1202 av_log(NULL, AV_LOG_WARNING, "Cannot use -ss and -sseof both, using -ss for %s\n", filename);
1203 o->start_time_eof = AV_NOPTS_VALUE;
1206 if (o->start_time_eof != AV_NOPTS_VALUE) {
1207 if (o->start_time_eof >= 0) {
1208 av_log(NULL, AV_LOG_ERROR, "-sseof value must be negative; aborting\n");
1211 if (ic->duration > 0) {
1212 o->start_time = o->start_time_eof + ic->duration;
1213 if (o->start_time < 0) {
1214 av_log(NULL, AV_LOG_WARNING, "-sseof value seeks to before start of file %s; ignored\n", filename);
1215 o->start_time = AV_NOPTS_VALUE;
1218 av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
1220 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
1221 /* add the stream start time */
1222 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1223 timestamp += ic->start_time;
1225 /* if seeking requested, we execute it */
1226 if (o->start_time != AV_NOPTS_VALUE) {
1227 int64_t seek_timestamp = timestamp;
1229 if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1230 int dts_heuristic = 0;
1231 for (i=0; i<ic->nb_streams; i++) {
1232 const AVCodecParameters *par = ic->streams[i]->codecpar;
1233 if (par->video_delay) {
1238 if (dts_heuristic) {
1239 seek_timestamp -= 3*AV_TIME_BASE / 23;
1242 ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1244 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
1245 filename, (double)timestamp / AV_TIME_BASE);
1249 /* update the current parameters so that they match the one of the input stream */
1250 add_input_streams(o, ic);
1252 /* dump the file content */
1253 av_dump_format(ic, nb_input_files, filename, 0);
1255 GROW_ARRAY(input_files, nb_input_files);
1256 f = av_mallocz(sizeof(*f));
1259 input_files[nb_input_files - 1] = f;
1262 f->ist_index = nb_input_streams - ic->nb_streams;
1263 f->start_time = o->start_time;
1264 f->recording_time = o->recording_time;
1265 f->input_ts_offset = o->input_ts_offset;
1266 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1267 f->nb_streams = ic->nb_streams;
1268 f->rate_emu = o->rate_emu;
1269 f->accurate_seek = o->accurate_seek;
1272 f->time_base = (AVRational){ 1, 1 };
1274 f->thread_queue_size = o->thread_queue_size;
1277 /* check if all codec options have been used */
1278 unused_opts = strip_specifiers(o->g->codec_opts);
1279 for (i = f->ist_index; i < nb_input_streams; i++) {
1281 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1282 AV_DICT_IGNORE_SUFFIX)))
1283 av_dict_set(&unused_opts, e->key, NULL, 0);
1287 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1288 const AVClass *class = avcodec_get_class();
1289 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1290 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1291 const AVClass *fclass = avformat_get_class();
1292 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
1293 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1294 if (!option || foption)
1298 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1299 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1300 "input file #%d (%s) is not a decoding option.\n", e->key,
1301 option->help ? option->help : "", nb_input_files - 1,
1306 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1307 "input file #%d (%s) has not been used for any stream. The most "
1308 "likely reason is either wrong type (e.g. a video option with "
1309 "no video streams) or that it is a private option of some decoder "
1310 "which was not actually used for any stream.\n", e->key,
1311 option->help ? option->help : "", nb_input_files - 1, filename);
1313 av_dict_free(&unused_opts);
1315 for (i = 0; i < o->nb_dump_attachment; i++) {
1318 for (j = 0; j < ic->nb_streams; j++) {
1319 AVStream *st = ic->streams[j];
1321 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1322 dump_attachment(st, o->dump_attachment[i].u.str);
1326 input_stream_potentially_available = 1;
1331 static uint8_t *get_line(AVIOContext *s)
1337 if (avio_open_dyn_buf(&line) < 0) {
1338 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1342 while ((c = avio_r8(s)) && c != '\n')
1345 avio_close_dyn_buf(line, &buf);
1350 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1353 char filename[1000];
1354 const char *base[3] = { getenv("AVCONV_DATADIR"),
1359 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1363 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1364 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1365 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1368 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1369 i != 1 ? "" : "/.avconv", preset_name);
1370 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1376 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1378 enum AVMediaType type = ost->st->codecpar->codec_type;
1379 char *codec_name = NULL;
1381 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
1382 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1384 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->url,
1385 NULL, ost->st->codecpar->codec_type);
1386 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
1388 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
1389 "output stream #%d:%d. Default encoder for format %s (codec %s) is "
1390 "probably disabled. Please choose an encoder manually.\n",
1391 ost->file_index, ost->index, s->oformat->name,
1392 avcodec_get_name(ost->st->codecpar->codec_id));
1393 return AVERROR_ENCODER_NOT_FOUND;
1395 } else if (!strcmp(codec_name, "copy"))
1396 ost->stream_copy = 1;
1398 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
1399 ost->st->codecpar->codec_id = ost->enc->id;
1401 ost->encoding_needed = !ost->stream_copy;
1403 /* no encoding supported for other media types */
1404 ost->stream_copy = 1;
1405 ost->encoding_needed = 0;
1411 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1414 AVStream *st = avformat_new_stream(oc, NULL);
1415 int idx = oc->nb_streams - 1, ret = 0;
1416 const char *bsfs = NULL, *time_base = NULL;
1417 char *next, *codec_tag = NULL;
1422 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1426 if (oc->nb_streams - 1 < o->nb_streamid_map)
1427 st->id = o->streamid_map[oc->nb_streams - 1];
1429 GROW_ARRAY(output_streams, nb_output_streams);
1430 if (!(ost = av_mallocz(sizeof(*ost))))
1432 output_streams[nb_output_streams - 1] = ost;
1434 ost->file_index = nb_output_files - 1;
1437 ost->forced_kf_ref_pts = AV_NOPTS_VALUE;
1438 st->codecpar->codec_type = type;
1440 ret = choose_encoder(o, oc, ost);
1442 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1443 "%d:%d\n", ost->file_index, ost->index);
1447 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1448 if (!ost->enc_ctx) {
1449 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1452 ost->enc_ctx->codec_type = type;
1454 ost->ref_par = avcodec_parameters_alloc();
1455 if (!ost->ref_par) {
1456 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding parameters.\n");
1461 AVIOContext *s = NULL;
1462 char *buf = NULL, *arg = NULL, *preset = NULL;
1464 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1466 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1468 MATCH_PER_STREAM_OPT(autoscale, i, ost->autoscale, oc, st);
1469 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1472 if (!buf[0] || buf[0] == '#') {
1476 if (!(arg = strchr(buf, '='))) {
1477 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1481 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1483 } while (!s->eof_reached);
1487 av_log(NULL, AV_LOG_FATAL,
1488 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1489 preset, ost->file_index, ost->index);
1493 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1498 ost->enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
1500 MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
1503 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1504 q.num <= 0 || q.den <= 0) {
1505 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1511 MATCH_PER_STREAM_OPT(enc_time_bases, str, time_base, oc, st);
1514 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1516 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1519 ost->enc_timebase = q;
1522 ost->max_frames = INT64_MAX;
1523 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1524 for (i = 0; i<o->nb_max_frames; i++) {
1525 char *p = o->max_frames[i].specifier;
1526 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1527 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1532 ost->copy_prior_start = -1;
1533 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1535 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1536 if (bsfs && *bsfs) {
1537 ret = av_bsf_list_parse_str(bsfs, &ost->bsf_ctx);
1539 av_log(NULL, AV_LOG_ERROR, "Error parsing bitstream filter sequence '%s': %s\n", bsfs, av_err2str(ret));
1544 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1546 uint32_t tag = strtol(codec_tag, &next, 0);
1548 tag = AV_RL32(codec_tag);
1549 ost->st->codecpar->codec_tag =
1550 ost->enc_ctx->codec_tag = tag;
1553 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1555 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1556 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1559 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1560 ost->disposition = av_strdup(ost->disposition);
1562 ost->max_muxing_queue_size = 128;
1563 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1564 ost->max_muxing_queue_size *= sizeof(AVPacket);
1566 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1567 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1569 av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1571 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1572 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1573 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1575 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1577 ost->source_index = source_index;
1578 if (source_index >= 0) {
1579 ost->sync_ist = input_streams[source_index];
1580 input_streams[source_index]->discard = 0;
1581 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1583 ost->last_mux_dts = AV_NOPTS_VALUE;
1585 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1586 if (!ost->muxing_queue)
1592 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1595 const char *p = str;
1602 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1609 /* read file contents into a string */
1610 static uint8_t *read_file(const char *filename)
1612 AVIOContext *pb = NULL;
1613 AVIOContext *dyn_buf = NULL;
1614 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1615 uint8_t buf[1024], *str;
1618 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1622 ret = avio_open_dyn_buf(&dyn_buf);
1627 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1628 avio_write(dyn_buf, buf, ret);
1629 avio_w8(dyn_buf, 0);
1632 ret = avio_close_dyn_buf(dyn_buf, &str);
1638 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1641 AVStream *st = ost->st;
1643 if (ost->filters_script && ost->filters) {
1644 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1645 "output stream #%d:%d.\n", nb_output_files, st->index);
1649 if (ost->filters_script)
1650 return read_file(ost->filters_script);
1651 else if (ost->filters)
1652 return av_strdup(ost->filters);
1654 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1658 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1659 const OutputStream *ost, enum AVMediaType type)
1661 if (ost->filters_script || ost->filters) {
1662 av_log(NULL, AV_LOG_ERROR,
1663 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1664 "Filtering and streamcopy cannot be used together.\n",
1665 ost->filters ? "Filtergraph" : "Filtergraph script",
1666 ost->filters ? ost->filters : ost->filters_script,
1667 av_get_media_type_string(type), ost->file_index, ost->index);
1672 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1676 AVCodecContext *video_enc;
1677 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1679 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1681 video_enc = ost->enc_ctx;
1683 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1684 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1685 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1688 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1689 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1691 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1692 if (frame_aspect_ratio) {
1694 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1695 q.num <= 0 || q.den <= 0) {
1696 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1699 ost->frame_aspect_ratio = q;
1702 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1703 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1705 if (!ost->stream_copy) {
1706 const char *p = NULL;
1707 char *frame_size = NULL;
1708 char *frame_pix_fmt = NULL;
1709 char *intra_matrix = NULL, *inter_matrix = NULL;
1710 char *chroma_intra_matrix = NULL;
1714 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1715 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1716 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1720 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1721 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1722 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1723 ost->keep_pix_fmt = 1;
1724 if (!*++frame_pix_fmt)
1725 frame_pix_fmt = NULL;
1727 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1728 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1731 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1734 video_enc->gop_size = 0;
1735 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1737 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1738 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1741 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1743 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1744 if (chroma_intra_matrix) {
1745 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1747 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1750 video_enc->chroma_intra_matrix = p;
1751 parse_matrix_coeffs(p, chroma_intra_matrix);
1753 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1755 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1756 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1759 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1762 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1763 for (i = 0; p; i++) {
1765 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1767 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1770 video_enc->rc_override =
1771 av_realloc_array(video_enc->rc_override,
1772 i + 1, sizeof(RcOverride));
1773 if (!video_enc->rc_override) {
1774 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1777 video_enc->rc_override[i].start_frame = start;
1778 video_enc->rc_override[i].end_frame = end;
1780 video_enc->rc_override[i].qscale = q;
1781 video_enc->rc_override[i].quality_factor = 1.0;
1784 video_enc->rc_override[i].qscale = 0;
1785 video_enc->rc_override[i].quality_factor = -q/100.0;
1790 video_enc->rc_override_count = i;
1793 video_enc->flags|= AV_CODEC_FLAG_PSNR;
1796 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1799 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1800 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1803 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1804 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1808 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1809 if (ost->logfile_prefix &&
1810 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1814 char logfilename[1024];
1817 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1818 ost->logfile_prefix ? ost->logfile_prefix :
1819 DEFAULT_PASS_LOGFILENAME_PREFIX,
1821 if (!strcmp(ost->enc->name, "libx264")) {
1822 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1824 if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1825 char *logbuffer = read_file(logfilename);
1828 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1832 video_enc->stats_in = logbuffer;
1834 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1835 f = av_fopen_utf8(logfilename, "wb");
1837 av_log(NULL, AV_LOG_FATAL,
1838 "Cannot write log file '%s' for pass-1 encoding: %s\n",
1839 logfilename, strerror(errno));
1847 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1848 if (ost->forced_keyframes)
1849 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1851 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1853 ost->top_field_first = -1;
1854 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1857 ost->avfilter = get_ost_filters(o, oc, ost);
1861 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1864 if (ost->stream_copy)
1865 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1870 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1875 AVCodecContext *audio_enc;
1877 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1880 audio_enc = ost->enc_ctx;
1881 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1883 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1884 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1886 if (!ost->stream_copy) {
1887 char *sample_fmt = NULL;
1889 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1891 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1893 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1894 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1898 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1900 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1901 ost->apad = av_strdup(ost->apad);
1903 ost->avfilter = get_ost_filters(o, oc, ost);
1907 /* check for channel mapping for this audio stream */
1908 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1909 AudioChannelMap *map = &o->audio_channel_maps[n];
1910 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1911 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1914 if (map->channel_idx == -1) {
1916 } else if (ost->source_index < 0) {
1917 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1918 ost->file_index, ost->st->index);
1921 ist = input_streams[ost->source_index];
1924 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1925 if (av_reallocp_array(&ost->audio_channels_map,
1926 ost->audio_channels_mapped + 1,
1927 sizeof(*ost->audio_channels_map)
1931 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1937 if (ost->stream_copy)
1938 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1943 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1947 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1948 if (!ost->stream_copy) {
1949 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1956 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1960 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1961 if (!ost->stream_copy) {
1962 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1969 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1971 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1972 ost->stream_copy = 1;
1977 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1981 AVCodecContext *subtitle_enc;
1983 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1985 subtitle_enc = ost->enc_ctx;
1987 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1989 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1991 if (!ost->stream_copy) {
1992 char *frame_size = NULL;
1994 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1995 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1996 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
2004 /* arg format is "output-stream-index:streamid-value". */
2005 static int opt_streamid(void *optctx, const char *opt, const char *arg)
2007 OptionsContext *o = optctx;
2012 av_strlcpy(idx_str, arg, sizeof(idx_str));
2013 p = strchr(idx_str, ':');
2015 av_log(NULL, AV_LOG_FATAL,
2016 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
2021 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
2022 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
2023 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
2027 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
2029 AVFormatContext *is = ifile->ctx;
2030 AVFormatContext *os = ofile->ctx;
2034 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
2036 return AVERROR(ENOMEM);
2039 for (i = 0; i < is->nb_chapters; i++) {
2040 AVChapter *in_ch = is->chapters[i], *out_ch;
2041 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
2042 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
2043 AV_TIME_BASE_Q, in_ch->time_base);
2044 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
2045 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
2048 if (in_ch->end < ts_off)
2050 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
2053 out_ch = av_mallocz(sizeof(AVChapter));
2055 return AVERROR(ENOMEM);
2057 out_ch->id = in_ch->id;
2058 out_ch->time_base = in_ch->time_base;
2059 out_ch->start = FFMAX(0, in_ch->start - ts_off);
2060 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
2063 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
2065 os->chapters[os->nb_chapters++] = out_ch;
2070 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
2071 AVFormatContext *oc)
2075 switch (ofilter->type) {
2076 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
2077 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
2079 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
2084 ost->source_index = -1;
2085 ost->filter = ofilter;
2088 ofilter->format = -1;
2090 if (ost->stream_copy) {
2091 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
2092 "which is fed from a complex filtergraph. Filtering and streamcopy "
2093 "cannot be used together.\n", ost->file_index, ost->index);
2097 if (ost->avfilter && (ost->filters || ost->filters_script)) {
2098 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
2099 av_log(NULL, AV_LOG_ERROR,
2100 "%s '%s' was specified through the %s option "
2101 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
2102 "%s and -filter_complex cannot be used together for the same stream.\n",
2103 ost->filters ? "Filtergraph" : "Filtergraph script",
2104 ost->filters ? ost->filters : ost->filters_script,
2105 opt, ost->file_index, ost->index, opt);
2109 avfilter_inout_free(&ofilter->out_tmp);
2112 static int init_complex_filters(void)
2116 for (i = 0; i < nb_filtergraphs; i++) {
2117 ret = init_complex_filtergraph(filtergraphs[i]);
2124 static int open_output_file(OptionsContext *o, const char *filename)
2126 AVFormatContext *oc;
2131 AVDictionary *unused_opts = NULL;
2132 AVDictionaryEntry *e = NULL;
2133 int format_flags = 0;
2135 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
2136 o->stop_time = INT64_MAX;
2137 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
2140 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
2141 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
2142 if (o->stop_time <= start_time) {
2143 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
2146 o->recording_time = o->stop_time - start_time;
2150 GROW_ARRAY(output_files, nb_output_files);
2151 of = av_mallocz(sizeof(*of));
2154 output_files[nb_output_files - 1] = of;
2156 of->ost_index = nb_output_streams;
2157 of->recording_time = o->recording_time;
2158 of->start_time = o->start_time;
2159 of->limit_filesize = o->limit_filesize;
2160 of->shortest = o->shortest;
2161 av_dict_copy(&of->opts, o->g->format_opts, 0);
2163 if (!strcmp(filename, "-"))
2166 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
2168 print_error(filename, err);
2173 if (o->recording_time != INT64_MAX)
2174 oc->duration = o->recording_time;
2176 oc->interrupt_callback = int_cb;
2178 e = av_dict_get(o->g->format_opts, "fflags", NULL, 0);
2180 const AVOption *o = av_opt_find(oc, "fflags", NULL, 0, 0);
2181 av_opt_eval_flags(oc, o, e->value, &format_flags);
2184 format_flags |= AVFMT_FLAG_BITEXACT;
2185 oc->flags |= AVFMT_FLAG_BITEXACT;
2188 /* create streams for all unlabeled output pads */
2189 for (i = 0; i < nb_filtergraphs; i++) {
2190 FilterGraph *fg = filtergraphs[i];
2191 for (j = 0; j < fg->nb_outputs; j++) {
2192 OutputFilter *ofilter = fg->outputs[j];
2194 if (!ofilter->out_tmp || ofilter->out_tmp->name)
2197 switch (ofilter->type) {
2198 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
2199 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
2200 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
2202 init_output_filter(ofilter, o, oc);
2206 if (!o->nb_stream_maps) {
2207 char *subtitle_codec_name = NULL;
2208 /* pick the "best" stream of each type */
2210 /* video: highest resolution */
2211 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2212 int area = 0, idx = -1;
2213 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2214 for (i = 0; i < nb_input_streams; i++) {
2216 ist = input_streams[i];
2217 new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames
2218 + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
2219 if (ist->user_set_discard == AVDISCARD_ALL)
2221 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2223 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
2225 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2232 new_video_stream(o, oc, idx);
2235 /* audio: most channels */
2236 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2237 int best_score = 0, idx = -1;
2238 for (i = 0; i < nb_input_streams; i++) {
2240 ist = input_streams[i];
2241 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames
2242 + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
2243 if (ist->user_set_discard == AVDISCARD_ALL)
2245 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
2246 score > best_score) {
2252 new_audio_stream(o, oc, idx);
2255 /* subtitles: pick first */
2256 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2257 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2258 for (i = 0; i < nb_input_streams; i++)
2259 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2260 AVCodecDescriptor const *input_descriptor =
2261 avcodec_descriptor_get(input_streams[i]->st->codecpar->codec_id);
2262 AVCodecDescriptor const *output_descriptor = NULL;
2263 AVCodec const *output_codec =
2264 avcodec_find_encoder(oc->oformat->subtitle_codec);
2265 int input_props = 0, output_props = 0;
2266 if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
2269 output_descriptor = avcodec_descriptor_get(output_codec->id);
2270 if (input_descriptor)
2271 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2272 if (output_descriptor)
2273 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2274 if (subtitle_codec_name ||
2275 input_props & output_props ||
2276 // Map dvb teletext which has neither property to any output subtitle encoder
2277 input_descriptor && output_descriptor &&
2278 (!input_descriptor->props ||
2279 !output_descriptor->props)) {
2280 new_subtitle_stream(o, oc, i);
2285 /* Data only if codec id match */
2286 if (!o->data_disable ) {
2287 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2288 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2289 if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
2291 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
2292 && input_streams[i]->st->codecpar->codec_id == codec_id )
2293 new_data_stream(o, oc, i);
2297 for (i = 0; i < o->nb_stream_maps; i++) {
2298 StreamMap *map = &o->stream_maps[i];
2303 if (map->linklabel) {
2305 OutputFilter *ofilter = NULL;
2308 for (j = 0; j < nb_filtergraphs; j++) {
2309 fg = filtergraphs[j];
2310 for (k = 0; k < fg->nb_outputs; k++) {
2311 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2312 if (out && !strcmp(out->name, map->linklabel)) {
2313 ofilter = fg->outputs[k];
2320 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2321 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2324 init_output_filter(ofilter, o, oc);
2326 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2328 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2329 if (ist->user_set_discard == AVDISCARD_ALL) {
2330 av_log(NULL, AV_LOG_FATAL, "Stream #%d:%d is disabled and cannot be mapped.\n",
2331 map->file_index, map->stream_index);
2334 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
2336 if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
2338 if(o-> video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
2340 if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2344 switch (ist->st->codecpar->codec_type) {
2345 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2346 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2347 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2348 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2349 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2350 case AVMEDIA_TYPE_UNKNOWN:
2351 if (copy_unknown_streams) {
2352 ost = new_unknown_stream (o, oc, src_idx);
2356 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2357 "Cannot map stream #%d:%d - unsupported type.\n",
2358 map->file_index, map->stream_index);
2359 if (!ignore_unknown_streams) {
2360 av_log(NULL, AV_LOG_FATAL,
2361 "If you want unsupported types ignored instead "
2362 "of failing, please use the -ignore_unknown option\n"
2363 "If you want them copied, please use -copy_unknown\n");
2368 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2369 + map->sync_stream_index];
2374 /* handle attached files */
2375 for (i = 0; i < o->nb_attachments; i++) {
2377 uint8_t *attachment;
2381 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2382 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2386 if ((len = avio_size(pb)) <= 0) {
2387 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2391 if (len > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE ||
2392 !(attachment = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE))) {
2393 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large.\n",
2397 avio_read(pb, attachment, len);
2398 memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
2400 ost = new_attachment_stream(o, oc, -1);
2401 ost->stream_copy = 0;
2402 ost->attachment_filename = o->attachments[i];
2403 ost->st->codecpar->extradata = attachment;
2404 ost->st->codecpar->extradata_size = len;
2406 p = strrchr(o->attachments[i], '/');
2407 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2411 #if FF_API_LAVF_AVCTX
2412 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2413 AVDictionaryEntry *e;
2414 ost = output_streams[i];
2416 if ((ost->stream_copy || ost->attachment_filename)
2417 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2418 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2419 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2424 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2425 av_dump_format(oc, nb_output_files - 1, oc->url, 1);
2426 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2430 /* check if all codec options have been used */
2431 unused_opts = strip_specifiers(o->g->codec_opts);
2432 for (i = of->ost_index; i < nb_output_streams; i++) {
2434 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2435 AV_DICT_IGNORE_SUFFIX)))
2436 av_dict_set(&unused_opts, e->key, NULL, 0);
2440 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2441 const AVClass *class = avcodec_get_class();
2442 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2443 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2444 const AVClass *fclass = avformat_get_class();
2445 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2446 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2447 if (!option || foption)
2451 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2452 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2453 "output file #%d (%s) is not an encoding option.\n", e->key,
2454 option->help ? option->help : "", nb_output_files - 1,
2459 // gop_timecode is injected by generic code but not always used
2460 if (!strcmp(e->key, "gop_timecode"))
2463 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2464 "output file #%d (%s) has not been used for any stream. The most "
2465 "likely reason is either wrong type (e.g. a video option with "
2466 "no video streams) or that it is a private option of some encoder "
2467 "which was not actually used for any stream.\n", e->key,
2468 option->help ? option->help : "", nb_output_files - 1, filename);
2470 av_dict_free(&unused_opts);
2472 /* set the decoding_needed flags and create simple filtergraphs */
2473 for (i = of->ost_index; i < nb_output_streams; i++) {
2474 OutputStream *ost = output_streams[i];
2476 if (ost->encoding_needed && ost->source_index >= 0) {
2477 InputStream *ist = input_streams[ost->source_index];
2478 ist->decoding_needed |= DECODING_FOR_OST;
2480 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
2481 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2482 err = init_simple_filtergraph(ist, ost);
2484 av_log(NULL, AV_LOG_ERROR,
2485 "Error initializing a simple filtergraph between streams "
2486 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
2487 nb_output_files - 1, ost->st->index);
2493 /* set the filter output constraints */
2495 OutputFilter *f = ost->filter;
2497 switch (ost->enc_ctx->codec_type) {
2498 case AVMEDIA_TYPE_VIDEO:
2499 f->frame_rate = ost->frame_rate;
2500 f->width = ost->enc_ctx->width;
2501 f->height = ost->enc_ctx->height;
2502 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
2503 f->format = ost->enc_ctx->pix_fmt;
2504 } else if (ost->enc->pix_fmts) {
2506 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
2508 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2511 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
2514 case AVMEDIA_TYPE_AUDIO:
2515 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
2516 f->format = ost->enc_ctx->sample_fmt;
2517 } else if (ost->enc->sample_fmts) {
2519 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
2521 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2524 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
2526 if (ost->enc_ctx->sample_rate) {
2527 f->sample_rate = ost->enc_ctx->sample_rate;
2528 } else if (ost->enc->supported_samplerates) {
2530 while (ost->enc->supported_samplerates[count])
2532 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
2533 if (!f->sample_rates)
2535 memcpy(f->sample_rates, ost->enc->supported_samplerates,
2536 (count + 1) * sizeof(*f->sample_rates));
2538 if (ost->enc_ctx->channels) {
2539 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
2540 } else if (ost->enc->channel_layouts) {
2542 while (ost->enc->channel_layouts[count])
2544 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
2545 if (!f->channel_layouts)
2547 memcpy(f->channel_layouts, ost->enc->channel_layouts,
2548 (count + 1) * sizeof(*f->channel_layouts));
2555 /* check filename in case of an image number is expected */
2556 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2557 if (!av_filename_number_test(oc->url)) {
2558 print_error(oc->url, AVERROR(EINVAL));
2563 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2564 av_log(NULL, AV_LOG_ERROR,
2565 "No input streams but output needs an input stream\n");
2569 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2570 /* test if it already exists to avoid losing precious files */
2571 assert_file_overwrite(filename);
2574 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2575 &oc->interrupt_callback,
2577 print_error(filename, err);
2580 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2581 assert_file_overwrite(filename);
2583 if (o->mux_preload) {
2584 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2586 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2589 for (i = 0; i < o->nb_metadata_map; i++) {
2591 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2593 if (in_file_index >= nb_input_files) {
2594 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2597 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2598 in_file_index >= 0 ?
2599 input_files[in_file_index]->ctx : NULL, o);
2603 if (o->chapters_input_file >= nb_input_files) {
2604 if (o->chapters_input_file == INT_MAX) {
2605 /* copy chapters from the first input file that has them*/
2606 o->chapters_input_file = -1;
2607 for (i = 0; i < nb_input_files; i++)
2608 if (input_files[i]->ctx->nb_chapters) {
2609 o->chapters_input_file = i;
2613 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2614 o->chapters_input_file);
2618 if (o->chapters_input_file >= 0)
2619 copy_chapters(input_files[o->chapters_input_file], of,
2620 !o->metadata_chapters_manual);
2622 /* copy global metadata by default */
2623 if (!o->metadata_global_manual && nb_input_files){
2624 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2625 AV_DICT_DONT_OVERWRITE);
2626 if(o->recording_time != INT64_MAX)
2627 av_dict_set(&oc->metadata, "duration", NULL, 0);
2628 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2630 if (!o->metadata_streams_manual)
2631 for (i = of->ost_index; i < nb_output_streams; i++) {
2633 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2635 ist = input_streams[output_streams[i]->source_index];
2636 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2637 if (!output_streams[i]->stream_copy) {
2638 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2642 /* process manually set programs */
2643 for (i = 0; i < o->nb_program; i++) {
2644 const char *p = o->program[i].u.str;
2649 const char *p2 = av_get_token(&p, ":");
2650 const char *to_dealloc = p2;
2657 key = av_get_token(&p2, "=");
2659 av_freep(&to_dealloc);
2665 if (!strcmp(key, "program_num"))
2666 progid = strtol(p2, NULL, 0);
2667 av_freep(&to_dealloc);
2671 program = av_new_program(oc, progid);
2673 p = o->program[i].u.str;
2675 const char *p2 = av_get_token(&p, ":");
2676 const char *to_dealloc = p2;
2682 key = av_get_token(&p2, "=");
2684 av_log(NULL, AV_LOG_FATAL,
2685 "No '=' character in program string %s.\n",
2693 if (!strcmp(key, "title")) {
2694 av_dict_set(&program->metadata, "title", p2, 0);
2695 } else if (!strcmp(key, "program_num")) {
2696 } else if (!strcmp(key, "st")) {
2697 int st_num = strtol(p2, NULL, 0);
2698 av_program_add_stream_index(oc, progid, st_num);
2700 av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2703 av_freep(&to_dealloc);
2708 /* process manually set metadata */
2709 for (i = 0; i < o->nb_metadata; i++) {
2712 const char *stream_spec;
2713 int index = 0, j, ret = 0;
2715 val = strchr(o->metadata[i].u.str, '=');
2717 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2718 o->metadata[i].u.str);
2723 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2725 for (j = 0; j < oc->nb_streams; j++) {
2726 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2727 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2728 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2730 double theta = av_strtod(val, &tail);
2732 ost->rotate_overridden = 1;
2733 ost->rotate_override_value = theta;
2736 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2748 if (index < 0 || index >= oc->nb_chapters) {
2749 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2752 m = &oc->chapters[index]->metadata;
2755 if (index < 0 || index >= oc->nb_programs) {
2756 av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2759 m = &oc->programs[index]->metadata;
2762 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2765 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2772 static int opt_target(void *optctx, const char *opt, const char *arg)
2774 OptionsContext *o = optctx;
2775 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2776 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2778 if (!strncmp(arg, "pal-", 4)) {
2781 } else if (!strncmp(arg, "ntsc-", 5)) {
2784 } else if (!strncmp(arg, "film-", 5)) {
2788 /* Try to determine PAL/NTSC by peeking in the input files */
2789 if (nb_input_files) {
2791 for (j = 0; j < nb_input_files; j++) {
2792 for (i = 0; i < input_files[j]->nb_streams; i++) {
2793 AVStream *st = input_files[j]->ctx->streams[i];
2795 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2797 fr = st->time_base.den * 1000LL / st->time_base.num;
2801 } else if ((fr == 29970) || (fr == 23976)) {
2806 if (norm != UNKNOWN)
2810 if (norm != UNKNOWN)
2811 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2814 if (norm == UNKNOWN) {
2815 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2816 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2817 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2821 if (!strcmp(arg, "vcd")) {
2822 opt_video_codec(o, "c:v", "mpeg1video");
2823 opt_audio_codec(o, "c:a", "mp2");
2824 parse_option(o, "f", "vcd", options);
2826 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2827 parse_option(o, "r", frame_rates[norm], options);
2828 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2830 opt_default(NULL, "b:v", "1150000");
2831 opt_default(NULL, "maxrate:v", "1150000");
2832 opt_default(NULL, "minrate:v", "1150000");
2833 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2835 opt_default(NULL, "b:a", "224000");
2836 parse_option(o, "ar", "44100", options);
2837 parse_option(o, "ac", "2", options);
2839 opt_default(NULL, "packetsize", "2324");
2840 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2842 /* We have to offset the PTS, so that it is consistent with the SCR.
2843 SCR starts at 36000, but the first two packs contain only padding
2844 and the first pack from the other stream, respectively, may also have
2845 been written before.
2846 So the real data starts at SCR 36000+3*1200. */
2847 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2848 } else if (!strcmp(arg, "svcd")) {
2850 opt_video_codec(o, "c:v", "mpeg2video");
2851 opt_audio_codec(o, "c:a", "mp2");
2852 parse_option(o, "f", "svcd", options);
2854 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2855 parse_option(o, "r", frame_rates[norm], options);
2856 parse_option(o, "pix_fmt", "yuv420p", options);
2857 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2859 opt_default(NULL, "b:v", "2040000");
2860 opt_default(NULL, "maxrate:v", "2516000");
2861 opt_default(NULL, "minrate:v", "0"); // 1145000;
2862 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2863 opt_default(NULL, "scan_offset", "1");
2865 opt_default(NULL, "b:a", "224000");
2866 parse_option(o, "ar", "44100", options);
2868 opt_default(NULL, "packetsize", "2324");
2870 } else if (!strcmp(arg, "dvd")) {
2872 opt_video_codec(o, "c:v", "mpeg2video");
2873 opt_audio_codec(o, "c:a", "ac3");
2874 parse_option(o, "f", "dvd", options);
2876 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2877 parse_option(o, "r", frame_rates[norm], options);
2878 parse_option(o, "pix_fmt", "yuv420p", options);
2879 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2881 opt_default(NULL, "b:v", "6000000");
2882 opt_default(NULL, "maxrate:v", "9000000");
2883 opt_default(NULL, "minrate:v", "0"); // 1500000;
2884 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2886 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2887 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2889 opt_default(NULL, "b:a", "448000");
2890 parse_option(o, "ar", "48000", options);
2892 } else if (!strncmp(arg, "dv", 2)) {
2894 parse_option(o, "f", "dv", options);
2896 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2897 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2898 norm == PAL ? "yuv420p" : "yuv411p", options);
2899 parse_option(o, "r", frame_rates[norm], options);
2901 parse_option(o, "ar", "48000", options);
2902 parse_option(o, "ac", "2", options);
2905 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2906 return AVERROR(EINVAL);
2909 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2910 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2915 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2917 av_free (vstats_filename);
2918 vstats_filename = av_strdup (arg);
2922 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2925 time_t today2 = time(NULL);
2926 struct tm *today = localtime(&today2);
2928 if (!today) { // maybe tomorrow
2929 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2933 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2935 return opt_vstats_file(NULL, opt, filename);
2938 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2940 OptionsContext *o = optctx;
2941 return parse_option(o, "frames:v", arg, options);
2944 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2946 OptionsContext *o = optctx;
2947 return parse_option(o, "frames:a", arg, options);
2950 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2952 OptionsContext *o = optctx;
2953 return parse_option(o, "frames:d", arg, options);
2956 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2959 AVDictionary *cbak = codec_opts;
2960 AVDictionary *fbak = format_opts;
2964 ret = opt_default(NULL, opt, arg);
2966 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2967 av_dict_copy(&o->g->format_opts, format_opts, 0);
2968 av_dict_free(&codec_opts);
2969 av_dict_free(&format_opts);
2976 static int opt_preset(void *optctx, const char *opt, const char *arg)
2978 OptionsContext *o = optctx;
2980 char filename[1000], line[1000], tmp_line[1000];
2981 const char *codec_name = NULL;
2985 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2987 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2988 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2989 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2991 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2995 while (fgets(line, sizeof(line), f)) {
2996 char *key = tmp_line, *value, *endptr;
2998 if (strcspn(line, "#\n\r") == 0)
3000 av_strlcpy(tmp_line, line, sizeof(tmp_line));
3001 if (!av_strtok(key, "=", &value) ||
3002 !av_strtok(value, "\r\n", &endptr)) {
3003 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
3006 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
3008 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
3009 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
3010 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
3011 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
3012 else if (opt_default_new(o, key, value) < 0) {
3013 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
3014 filename, line, key, value);
3024 static int opt_old2new(void *optctx, const char *opt, const char *arg)
3026 OptionsContext *o = optctx;
3028 char *s = av_asprintf("%s:%c", opt + 1, *opt);
3030 return AVERROR(ENOMEM);
3031 ret = parse_option(o, s, arg, options);
3036 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
3038 OptionsContext *o = optctx;
3040 if(!strcmp(opt, "ab")){
3041 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
3043 } else if(!strcmp(opt, "b")){
3044 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
3045 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
3048 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3052 static int opt_qscale(void *optctx, const char *opt, const char *arg)
3054 OptionsContext *o = optctx;
3057 if(!strcmp(opt, "qscale")){
3058 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
3059 return parse_option(o, "q:v", arg, options);
3061 s = av_asprintf("q%s", opt + 6);
3063 return AVERROR(ENOMEM);
3064 ret = parse_option(o, s, arg, options);
3069 static int opt_profile(void *optctx, const char *opt, const char *arg)
3071 OptionsContext *o = optctx;
3072 if(!strcmp(opt, "profile")){
3073 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
3074 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
3077 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3081 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
3083 OptionsContext *o = optctx;
3084 return parse_option(o, "filter:v", arg, options);
3087 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
3089 OptionsContext *o = optctx;
3090 return parse_option(o, "filter:a", arg, options);
3093 static int opt_vsync(void *optctx, const char *opt, const char *arg)
3095 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
3096 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
3097 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
3098 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
3100 if (video_sync_method == VSYNC_AUTO)
3101 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
3105 static int opt_timecode(void *optctx, const char *opt, const char *arg)
3107 OptionsContext *o = optctx;
3109 char *tcr = av_asprintf("timecode=%s", arg);
3111 return AVERROR(ENOMEM);
3112 ret = parse_option(o, "metadata:g", tcr, options);
3114 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
3119 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
3121 OptionsContext *o = optctx;
3122 char layout_str[32];
3125 int ret, channels, ac_str_size;
3128 layout = av_get_channel_layout(arg);
3130 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
3131 return AVERROR(EINVAL);
3133 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
3134 ret = opt_default_new(o, opt, layout_str);
3138 /* set 'ac' option based on channel layout */
3139 channels = av_get_channel_layout_nb_channels(layout);
3140 snprintf(layout_str, sizeof(layout_str), "%d", channels);
3141 stream_str = strchr(opt, ':');
3142 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
3143 ac_str = av_mallocz(ac_str_size);
3145 return AVERROR(ENOMEM);
3146 av_strlcpy(ac_str, "ac", 3);
3148 av_strlcat(ac_str, stream_str, ac_str_size);
3149 ret = parse_option(o, ac_str, layout_str, options);
3155 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
3157 OptionsContext *o = optctx;
3158 return parse_option(o, "q:a", arg, options);
3161 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
3163 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3164 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3165 return AVERROR(ENOMEM);
3166 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3167 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
3168 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
3169 return AVERROR(ENOMEM);
3171 input_stream_potentially_available = 1;
3176 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
3178 uint8_t *graph_desc = read_file(arg);
3180 return AVERROR(EINVAL);
3182 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3183 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3184 return AVERROR(ENOMEM);
3185 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3186 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
3188 input_stream_potentially_available = 1;
3193 void show_help_default(const char *opt, const char *arg)
3195 /* per-file options have at least one of those set */
3196 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
3197 int show_advanced = 0, show_avoptions = 0;
3200 if (!strcmp(opt, "long"))
3202 else if (!strcmp(opt, "full"))
3203 show_advanced = show_avoptions = 1;
3205 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
3210 printf("Getting help:\n"
3211 " -h -- print basic options\n"
3212 " -h long -- print more options\n"
3213 " -h full -- print all options (including all format and codec specific options, very long)\n"
3214 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol\n"
3215 " See man %s for detailed description of the options.\n"
3216 "\n", program_name);
3218 show_help_options(options, "Print help / information / capabilities:",
3221 show_help_options(options, "Global options (affect whole program "
3222 "instead of just one file):",
3223 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
3225 show_help_options(options, "Advanced global options:", OPT_EXPERT,
3226 per_file | OPT_EXIT, 0);
3228 show_help_options(options, "Per-file main options:", 0,
3229 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
3230 OPT_EXIT, per_file);
3232 show_help_options(options, "Advanced per-file options:",
3233 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
3235 show_help_options(options, "Video options:",
3236 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
3238 show_help_options(options, "Advanced Video options:",
3239 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
3241 show_help_options(options, "Audio options:",
3242 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
3244 show_help_options(options, "Advanced Audio options:",
3245 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
3246 show_help_options(options, "Subtitle options:",
3247 OPT_SUBTITLE, 0, 0);
3250 if (show_avoptions) {
3251 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3252 show_help_children(avcodec_get_class(), flags);
3253 show_help_children(avformat_get_class(), flags);
3255 show_help_children(sws_get_class(), flags);
3257 #if CONFIG_SWRESAMPLE
3258 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
3260 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
3261 show_help_children(av_bsf_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_BSF_PARAM);
3265 void show_usage(void)
3267 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
3268 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3269 av_log(NULL, AV_LOG_INFO, "\n");
3277 static const OptionGroupDef groups[] = {
3278 [GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
3279 [GROUP_INFILE] = { "input url", "i", OPT_INPUT },
3282 static int open_files(OptionGroupList *l, const char *inout,
3283 int (*open_file)(OptionsContext*, const char*))
3287 for (i = 0; i < l->nb_groups; i++) {
3288 OptionGroup *g = &l->groups[i];
3294 ret = parse_optgroup(&o, g);
3296 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3297 "%s.\n", inout, g->arg);
3302 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3303 ret = open_file(&o, g->arg);
3306 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3310 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3316 int ffmpeg_parse_options(int argc, char **argv)
3318 OptionParseContext octx;
3322 memset(&octx, 0, sizeof(octx));
3324 /* split the commandline into an internal representation */
3325 ret = split_commandline(&octx, argc, argv, options, groups,
3326 FF_ARRAY_ELEMS(groups));
3328 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3332 /* apply global options */
3333 ret = parse_optgroup(NULL, &octx.global_opts);
3335 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3339 /* configure terminal and setup signal handlers */
3342 /* open input files */
3343 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3345 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3349 /* create the complex filtergraphs */
3350 ret = init_complex_filters();
3352 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3356 /* open output files */
3357 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3359 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3363 check_filter_outputs();
3366 uninit_parse_context(&octx);
3368 av_strerror(ret, error, sizeof(error));
3369 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3374 static int opt_progress(void *optctx, const char *opt, const char *arg)
3376 AVIOContext *avio = NULL;
3379 if (!strcmp(arg, "-"))
3381 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3383 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3384 arg, av_err2str(ret));
3387 progress_avio = avio;
3391 #define OFFSET(x) offsetof(OptionsContext, x)
3392 const OptionDef options[] = {
3394 CMDUTILS_COMMON_OPTIONS
3395 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3396 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3397 "force format", "fmt" },
3398 { "y", OPT_BOOL, { &file_overwrite },
3399 "overwrite output files" },
3400 { "n", OPT_BOOL, { &no_file_overwrite },
3401 "never overwrite output files" },
3402 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3403 "Ignore unknown stream types" },
3404 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
3405 "Copy unknown stream types" },
3406 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3407 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3408 "codec name", "codec" },
3409 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3410 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3411 "codec name", "codec" },
3412 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3413 OPT_OUTPUT, { .off = OFFSET(presets) },
3414 "preset name", "preset" },
3415 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3416 OPT_OUTPUT, { .func_arg = opt_map },
3417 "set input stream mapping",
3418 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3419 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3420 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3421 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3422 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3423 "set metadata information of outfile from infile",
3424 "outfile[,metadata]:infile[,metadata]" },
3425 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3426 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3427 "set chapters mapping", "input_file_index" },
3428 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3429 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3430 "record or transcode \"duration\" seconds of audio/video",
3432 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3433 "record or transcode stop time", "time_stop" },
3434 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3435 "set the limit file size in bytes", "limit_size" },
3436 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3437 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3438 "set the start time offset", "time_off" },
3439 { "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3440 OPT_INPUT, { .off = OFFSET(start_time_eof) },
3441 "set the start time offset relative to EOF", "time_off" },
3442 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3443 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3444 "enable/disable seeking by timestamp with -ss" },
3445 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3446 OPT_INPUT, { .off = OFFSET(accurate_seek) },
3447 "enable/disable accurate seeking with -ss" },
3448 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3449 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3450 "set the input ts offset", "time_off" },
3451 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3452 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3453 "set the input ts scale", "scale" },
3454 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3455 "set the recording timestamp ('now' to set the current time)", "time" },
3456 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3457 "add metadata", "string=string" },
3458 { "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3459 "add program with specified streams", "title=string:st=number..." },
3460 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3461 OPT_OUTPUT, { .func_arg = opt_data_frames },
3462 "set the number of data frames to output", "number" },
3463 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3464 "add timings for benchmarking" },
3465 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3466 "add timings for each task" },
3467 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3468 "write program-readable progress information", "url" },
3469 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3470 "enable or disable interaction on standard input" },
3471 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3472 "set max runtime in seconds in CPU user time", "limit" },
3473 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3474 "dump each input packet" },
3475 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3476 "when dumping packets, also dump the payload" },
3477 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3478 OPT_INPUT, { .off = OFFSET(rate_emu) },
3479 "read input at native frame rate", "" },
3480 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3481 "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3482 "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3483 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3484 "video sync method", "" },
3485 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3486 "frame drop threshold", "" },
3487 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3488 "audio sync method", "" },
3489 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3490 "audio drift threshold", "threshold" },
3491 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
3492 "copy timestamps" },
3493 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3494 "shift input timestamps to start at 0 when using copyts" },
3495 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
3496 "copy input stream time base when stream copying", "mode" },
3497 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3498 OPT_OUTPUT, { .off = OFFSET(shortest) },
3499 "finish encoding within shortest input" },
3500 { "bitexact", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3501 OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(bitexact) },
3503 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3504 OPT_OUTPUT, { .off = OFFSET(apad) },
3506 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3507 "timestamp discontinuity delta threshold", "threshold" },
3508 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3509 "timestamp error delta threshold", "threshold" },
3510 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3511 "exit on error", "error" },
3512 { "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3513 "abort on the specified condition flags", "flags" },
3514 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3515 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3516 "copy initial non-keyframes" },
3517 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3518 "copy or discard frames before start time" },
3519 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3520 "set the number of frames to output", "number" },
3521 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3522 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3523 "force codec tag/fourcc", "fourcc/tag" },
3524 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3525 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3526 "use fixed quality scale (VBR)", "q" },
3527 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3528 OPT_OUTPUT, { .func_arg = opt_qscale },
3529 "use fixed quality scale (VBR)", "q" },
3530 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3531 "set profile", "profile" },
3532 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3533 "set stream filtergraph", "filter_graph" },
3534 { "filter_threads", HAS_ARG | OPT_INT, { &filter_nbthreads },
3535 "number of non-complex filter threads" },
3536 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3537 "read stream filtergraph description from a file", "filename" },
3538 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3539 "reinit filtergraph on input parameter changes", "" },
3540 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3541 "create a complex filtergraph", "graph_description" },
3542 { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads },
3543 "number of threads for -filter_complex" },
3544 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3545 "create a complex filtergraph", "graph_description" },
3546 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3547 "read complex filtergraph description from a file", "filename" },
3548 { "stats", OPT_BOOL, { &print_stats },
3549 "print progress report during encoding", },
3550 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3551 OPT_OUTPUT, { .func_arg = opt_attach },
3552 "add an attachment to the output file", "filename" },
3553 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3554 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3555 "extract an attachment into a file", "filename" },
3556 { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3557 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3558 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3559 "print timestamp debugging info" },
3560 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3561 "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.", "maximum error rate" },
3562 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3563 OPT_INPUT, { .off = OFFSET(discard) },
3565 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3566 OPT_OUTPUT, { .off = OFFSET(disposition) },
3567 "disposition", "" },
3568 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3569 { .off = OFFSET(thread_queue_size) },
3570 "set the maximum number of queued packets from the demuxer" },
3571 { "find_stream_info", OPT_BOOL | OPT_PERFILE | OPT_INPUT | OPT_EXPERT, { &find_stream_info },
3572 "read and decode the streams to fill missing information with heuristics" },
3575 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3576 "set the number of video frames to output", "number" },
3577 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3578 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3579 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3580 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3581 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3582 "set frame size (WxH or abbreviation)", "size" },
3583 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3584 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3585 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3586 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3587 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3588 "set pixel format", "format" },
3589 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3590 "set the number of bits per raw sample", "number" },
3591 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3592 "deprecated use -g 1" },
3593 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3595 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3596 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3597 "rate control override for specific intervals", "override" },
3598 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3599 OPT_OUTPUT, { .func_arg = opt_video_codec },
3600 "force video codec ('copy' to copy stream)", "codec" },
3601 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3603 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3605 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3606 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3607 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3608 "select the pass number (1 to 3)", "n" },
3609 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3610 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3611 "select two pass log file name prefix", "prefix" },
3612 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3613 "this option is deprecated, use the yadif filter instead" },
3614 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3615 "calculate PSNR of compressed frames" },
3616 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3617 "dump video coding statistics to file" },
3618 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3619 "dump video coding statistics to file", "file" },
3620 { "vstats_version", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &vstats_version },
3621 "Version of the vstats format to use."},
3622 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3623 "set video filters", "filter_graph" },
3624 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3625 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3626 "specify intra matrix coeffs", "matrix" },
3627 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3628 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3629 "specify inter matrix coeffs", "matrix" },
3630 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3631 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3632 "specify intra matrix coeffs", "matrix" },
3633 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3634 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3635 "top=1/bottom=0/auto=-1 field first", "" },
3636 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3637 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3638 "force video tag/fourcc", "fourcc/tag" },
3639 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3640 "show QP histogram" },
3641 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3642 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3643 "force the selected framerate, disable the best supported framerate selection" },
3644 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3645 OPT_OUTPUT, { .func_arg = opt_streamid },
3646 "set the value of an outfile streamid", "streamIndex:value" },
3647 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3648 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3649 "force key frames at specified timestamps", "timestamps" },
3650 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3651 "audio bitrate (please use -b:a)", "bitrate" },
3652 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3653 "video bitrate (please use -b:v)", "bitrate" },
3654 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3655 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3656 "use HW accelerated decoding", "hwaccel name" },
3657 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3658 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3659 "select a device for HW acceleration", "devicename" },
3660 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3661 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
3662 "select output format used with HW accelerated decoding", "format" },
3663 #if CONFIG_VIDEOTOOLBOX
3664 { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3666 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3667 "show available HW acceleration methods" },
3668 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3669 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3670 "automatically insert correct rotate filters" },
3671 { "autoscale", HAS_ARG | OPT_BOOL | OPT_SPEC |
3672 OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(autoscale) },
3673 "automatically insert a scale filter at the end of the filter graph" },
3676 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3677 "set the number of audio frames to output", "number" },
3678 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3679 "set audio quality (codec-specific)", "quality", },
3680 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3681 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3682 "set audio sampling rate (in Hz)", "rate" },
3683 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3684 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3685 "set number of audio channels", "channels" },
3686 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3688 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3689 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3690 "force audio codec ('copy' to copy stream)", "codec" },
3691 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3692 OPT_OUTPUT, { .func_arg = opt_old2new },
3693 "force audio tag/fourcc", "fourcc/tag" },
3694 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3695 "change audio volume (256=normal)" , "volume" },
3696 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3697 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3698 "set sample format", "format" },
3699 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3700 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3701 "set channel layout", "layout" },
3702 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3703 "set audio filters", "filter_graph" },
3704 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3705 "set the maximum number of channels to try to guess the channel layout" },
3707 /* subtitle options */
3708 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3709 "disable subtitle" },
3710 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3711 "force subtitle codec ('copy' to copy stream)", "codec" },
3712 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3713 , "force subtitle tag/fourcc", "fourcc/tag" },
3714 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3715 "fix subtitles duration" },
3716 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3717 "set canvas size (WxH or abbreviation)", "size" },
3720 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3721 "deprecated, use -channel", "channel" },
3722 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3723 "deprecated, use -standard", "standard" },
3724 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3727 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3728 "set the maximum demux-decode delay", "seconds" },
3729 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3730 "set the initial demux-decode delay", "seconds" },
3731 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3732 "specify a file in which to print sdp information", "file" },
3734 { "time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(time_bases) },
3735 "set the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)", "ratio" },
3736 { "enc_time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(enc_time_bases) },
3737 "set the desired time base for the encoder (1:24, 1:48000 or 0.04166, 2.0833e-5). "
3738 "two special values are defined - "
3739 "0 = use frame rate (video) or sample rate (audio),"
3740 "-1 = match source time base", "ratio" },
3742 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3743 "A comma-separated list of bitstream filters", "bitstream_filters" },
3744 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3745 "deprecated", "audio bitstream_filters" },
3746 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3747 "deprecated", "video bitstream_filters" },
3749 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3750 "set the audio options to the indicated preset", "preset" },
3751 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3752 "set the video options to the indicated preset", "preset" },
3753 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3754 "set the subtitle options to the indicated preset", "preset" },
3755 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3756 "set options from indicated preset file", "filename" },
3758 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
3759 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
3761 /* data codec support */
3762 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3763 "force data codec ('copy' to copy stream)", "codec" },
3764 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3768 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
3769 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
3773 { "qsv_device", HAS_ARG | OPT_STRING | OPT_EXPERT, { &qsv_device },
3774 "set QSV hardware device (DirectX adapter index, DRM path or X11 display name)", "device"},
3777 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
3778 "initialise hardware device", "args" },
3779 { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device },
3780 "set hardware device used when filtering", "device" },