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 *const opt_name_codec_names[] = {"c", "codec", "acodec", "vcodec", "scodec", "dcodec", NULL};
55 static const char *const opt_name_audio_channels[] = {"ac", NULL};
56 static const char *const opt_name_audio_sample_rate[] = {"ar", NULL};
57 static const char *const opt_name_frame_rates[] = {"r", NULL};
58 static const char *const opt_name_frame_sizes[] = {"s", NULL};
59 static const char *const opt_name_frame_pix_fmts[] = {"pix_fmt", NULL};
60 static const char *const opt_name_ts_scale[] = {"itsscale", NULL};
61 static const char *const opt_name_hwaccels[] = {"hwaccel", NULL};
62 static const char *const opt_name_hwaccel_devices[] = {"hwaccel_device", NULL};
63 static const char *const opt_name_hwaccel_output_formats[] = {"hwaccel_output_format", NULL};
64 static const char *const opt_name_autorotate[] = {"autorotate", NULL};
65 static const char *const opt_name_autoscale[] = {"autoscale", NULL};
66 static const char *const opt_name_max_frames[] = {"frames", "aframes", "vframes", "dframes", NULL};
67 static const char *const opt_name_bitstream_filters[] = {"bsf", "absf", "vbsf", NULL};
68 static const char *const opt_name_codec_tags[] = {"tag", "atag", "vtag", "stag", NULL};
69 static const char *const opt_name_sample_fmts[] = {"sample_fmt", NULL};
70 static const char *const opt_name_qscale[] = {"q", "qscale", NULL};
71 static const char *const opt_name_forced_key_frames[] = {"forced_key_frames", NULL};
72 static const char *const opt_name_force_fps[] = {"force_fps", NULL};
73 static const char *const opt_name_frame_aspect_ratios[] = {"aspect", NULL};
74 static const char *const opt_name_rc_overrides[] = {"rc_override", NULL};
75 static const char *const opt_name_intra_matrices[] = {"intra_matrix", NULL};
76 static const char *const opt_name_inter_matrices[] = {"inter_matrix", NULL};
77 static const char *const opt_name_chroma_intra_matrices[] = {"chroma_intra_matrix", NULL};
78 static const char *const opt_name_top_field_first[] = {"top", NULL};
79 static const char *const opt_name_presets[] = {"pre", "apre", "vpre", "spre", NULL};
80 static const char *const opt_name_copy_initial_nonkeyframes[] = {"copyinkfr", NULL};
81 static const char *const opt_name_copy_prior_start[] = {"copypriorss", NULL};
82 static const char *const opt_name_filters[] = {"filter", "af", "vf", NULL};
83 static const char *const opt_name_filter_scripts[] = {"filter_script", NULL};
84 static const char *const opt_name_reinit_filters[] = {"reinit_filter", NULL};
85 static const char *const opt_name_fix_sub_duration[] = {"fix_sub_duration", NULL};
86 static const char *const opt_name_canvas_sizes[] = {"canvas_size", NULL};
87 static const char *const opt_name_pass[] = {"pass", NULL};
88 static const char *const opt_name_passlogfiles[] = {"passlogfile", NULL};
89 static const char *const opt_name_max_muxing_queue_size[] = {"max_muxing_queue_size", NULL};
90 static const char *const opt_name_muxing_queue_data_threshold[] = {"muxing_queue_data_threshold", NULL};
91 static const char *const opt_name_guess_layout_max[] = {"guess_layout_max", NULL};
92 static const char *const opt_name_apad[] = {"apad", NULL};
93 static const char *const opt_name_discard[] = {"discard", NULL};
94 static const char *const opt_name_disposition[] = {"disposition", NULL};
95 static const char *const opt_name_time_bases[] = {"time_base", NULL};
96 static const char *const opt_name_enc_time_bases[] = {"enc_time_base", NULL};
98 #define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\
100 char namestr[128] = "";\
101 const char *spec = so->specifier && so->specifier[0] ? so->specifier : "";\
102 for (i = 0; opt_name_##name[i]; i++)\
103 av_strlcatf(namestr, sizeof(namestr), "-%s%s", opt_name_##name[i], opt_name_##name[i+1] ? (opt_name_##name[i+2] ? ", " : " or ") : "");\
104 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",\
105 namestr, st->index, opt_name_##name[0], spec[0] ? ":" : "", spec, so->u.type);\
108 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
110 int i, ret, matches = 0;\
112 for (i = 0; i < o->nb_ ## name; i++) {\
113 char *spec = o->name[i].specifier;\
114 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0) {\
115 outvar = o->name[i].u.type;\
122 WARN_MULTIPLE_OPT_USAGE(name, type, so, st);\
125 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
128 for (i = 0; i < o->nb_ ## name; i++) {\
129 char *spec = o->name[i].specifier;\
130 if (!strcmp(spec, mediatype))\
131 outvar = o->name[i].u.type;\
135 const HWAccel hwaccels[] = {
136 #if CONFIG_VIDEOTOOLBOX
137 { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
140 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
144 HWDevice *filter_hw_device;
146 char *vstats_filename;
149 float audio_drift_threshold = 0.1;
150 float dts_delta_threshold = 10;
151 float dts_error_threshold = 3600*30;
153 int audio_volume = 256;
154 int audio_sync_method = 0;
155 int video_sync_method = VSYNC_AUTO;
156 float frame_drop_threshold = 0;
157 int do_deinterlace = 0;
158 int do_benchmark = 0;
159 int do_benchmark_all = 0;
163 int start_at_zero = 0;
166 int exit_on_error = 0;
167 int abort_on_flags = 0;
168 int print_stats = -1;
170 int stdin_interaction = 1;
171 int frame_bits_per_raw_sample = 0;
172 float max_error_rate = 2.0/3;
173 int filter_nbthreads = 0;
174 int filter_complex_nbthreads = 0;
175 int vstats_version = 2;
176 int auto_conversion_filters = 1;
177 int64_t stats_period = 500000;
180 static int intra_only = 0;
181 static int file_overwrite = 0;
182 static int no_file_overwrite = 0;
183 static int do_psnr = 0;
184 static int input_sync;
185 static int input_stream_potentially_available = 0;
186 static int ignore_unknown_streams = 0;
187 static int copy_unknown_streams = 0;
188 static int find_stream_info = 1;
190 static void uninit_options(OptionsContext *o)
192 const OptionDef *po = options;
195 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
197 void *dst = (uint8_t*)o + po->u.off;
199 if (po->flags & OPT_SPEC) {
200 SpecifierOpt **so = dst;
201 int i, *count = (int*)(so + 1);
202 for (i = 0; i < *count; i++) {
203 av_freep(&(*so)[i].specifier);
204 if (po->flags & OPT_STRING)
205 av_freep(&(*so)[i].u.str);
209 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
214 for (i = 0; i < o->nb_stream_maps; i++)
215 av_freep(&o->stream_maps[i].linklabel);
216 av_freep(&o->stream_maps);
217 av_freep(&o->audio_channel_maps);
218 av_freep(&o->streamid_map);
219 av_freep(&o->attachments);
222 static void init_options(OptionsContext *o)
224 memset(o, 0, sizeof(*o));
226 o->stop_time = INT64_MAX;
227 o->mux_max_delay = 0.7;
228 o->start_time = AV_NOPTS_VALUE;
229 o->start_time_eof = AV_NOPTS_VALUE;
230 o->recording_time = INT64_MAX;
231 o->limit_filesize = UINT64_MAX;
232 o->chapters_input_file = INT_MAX;
233 o->accurate_seek = 1;
234 o->thread_queue_size = -1;
237 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
239 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
241 printf("Hardware acceleration methods:\n");
242 while ((type = av_hwdevice_iterate_types(type)) !=
243 AV_HWDEVICE_TYPE_NONE)
244 printf("%s\n", av_hwdevice_get_type_name(type));
249 /* return a copy of the input with the stream specifiers removed from the keys */
250 static AVDictionary *strip_specifiers(AVDictionary *dict)
252 AVDictionaryEntry *e = NULL;
253 AVDictionary *ret = NULL;
255 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
256 char *p = strchr(e->key, ':');
260 av_dict_set(&ret, e->key, e->value, 0);
267 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
269 static const AVOption opts[] = {
270 { "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
271 { "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
272 { "empty_output_stream", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT_STREAM }, .unit = "flags" },
275 static const AVClass class = {
277 .item_name = av_default_item_name,
279 .version = LIBAVUTIL_VERSION_INT,
281 const AVClass *pclass = &class;
283 return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
286 static int opt_stats_period(void *optctx, const char *opt, const char *arg)
288 int64_t user_stats_period = parse_time_or_die(opt, arg, 1);
290 if (user_stats_period <= 0) {
291 av_log(NULL, AV_LOG_ERROR, "stats_period %s must be positive.\n", arg);
292 return AVERROR(EINVAL);
295 stats_period = user_stats_period;
296 av_log(NULL, AV_LOG_INFO, "ffmpeg stats and -progress period set to %s.\n", arg);
301 static int opt_sameq(void *optctx, const char *opt, const char *arg)
303 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
304 "If you are looking for an option to preserve the quality (which is not "
305 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
307 return AVERROR(EINVAL);
310 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
312 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
313 return opt_default(optctx, "channel", arg);
316 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
318 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
319 return opt_default(optctx, "standard", arg);
322 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
324 OptionsContext *o = optctx;
325 return parse_option(o, "codec:a", arg, options);
328 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
330 OptionsContext *o = optctx;
331 return parse_option(o, "codec:v", arg, options);
334 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
336 OptionsContext *o = optctx;
337 return parse_option(o, "codec:s", arg, options);
340 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
342 OptionsContext *o = optctx;
343 return parse_option(o, "codec:d", arg, options);
346 static int opt_map(void *optctx, const char *opt, const char *arg)
348 OptionsContext *o = optctx;
350 int i, negative = 0, file_idx, disabled = 0;
351 int sync_file_idx = -1, sync_stream_idx = 0;
360 map = av_strdup(arg);
362 return AVERROR(ENOMEM);
364 /* parse sync stream first, just pick first matching stream */
365 if (sync = strchr(map, ',')) {
367 sync_file_idx = strtol(sync + 1, &sync, 0);
368 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
369 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
374 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
375 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
376 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
380 if (i == input_files[sync_file_idx]->nb_streams) {
381 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
382 "match any streams.\n", arg);
385 if (input_streams[input_files[sync_file_idx]->ist_index + sync_stream_idx]->user_set_discard == AVDISCARD_ALL) {
386 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s matches a disabled input "
394 /* this mapping refers to lavfi output */
395 const char *c = map + 1;
396 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
397 m = &o->stream_maps[o->nb_stream_maps - 1];
398 m->linklabel = av_get_token(&c, "]");
400 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
404 if (allow_unused = strchr(map, '?'))
406 file_idx = strtol(map, &p, 0);
407 if (file_idx >= nb_input_files || file_idx < 0) {
408 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
412 /* disable some already defined maps */
413 for (i = 0; i < o->nb_stream_maps; i++) {
414 m = &o->stream_maps[i];
415 if (file_idx == m->file_index &&
416 check_stream_specifier(input_files[m->file_index]->ctx,
417 input_files[m->file_index]->ctx->streams[m->stream_index],
418 *p == ':' ? p + 1 : p) > 0)
422 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
423 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
424 *p == ':' ? p + 1 : p) <= 0)
426 if (input_streams[input_files[file_idx]->ist_index + i]->user_set_discard == AVDISCARD_ALL) {
430 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
431 m = &o->stream_maps[o->nb_stream_maps - 1];
433 m->file_index = file_idx;
436 if (sync_file_idx >= 0) {
437 m->sync_file_index = sync_file_idx;
438 m->sync_stream_index = sync_stream_idx;
440 m->sync_file_index = file_idx;
441 m->sync_stream_index = i;
448 av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
449 } else if (disabled) {
450 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches disabled streams.\n"
451 "To ignore this, add a trailing '?' to the map.\n", arg);
454 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
455 "To ignore this, add a trailing '?' to the map.\n", arg);
464 static int opt_attach(void *optctx, const char *opt, const char *arg)
466 OptionsContext *o = optctx;
467 GROW_ARRAY(o->attachments, o->nb_attachments);
468 o->attachments[o->nb_attachments - 1] = arg;
472 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
474 OptionsContext *o = optctx;
480 mapchan = av_strdup(arg);
482 return AVERROR(ENOMEM);
484 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
485 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
487 /* muted channel syntax */
488 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
489 if ((n == 1 || n == 3) && m->channel_idx == -1) {
490 m->file_idx = m->stream_idx = -1;
492 m->ofile_idx = m->ostream_idx = -1;
498 n = sscanf(arg, "%d.%d.%d:%d.%d",
499 &m->file_idx, &m->stream_idx, &m->channel_idx,
500 &m->ofile_idx, &m->ostream_idx);
502 if (n != 3 && n != 5) {
503 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
504 "[file.stream.channel|-1][:syncfile:syncstream]\n");
508 if (n != 5) // only file.stream.channel specified
509 m->ofile_idx = m->ostream_idx = -1;
512 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
513 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
517 if (m->stream_idx < 0 ||
518 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
519 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
520 m->file_idx, m->stream_idx);
523 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
524 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
525 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
526 m->file_idx, m->stream_idx);
529 /* allow trailing ? to map_channel */
530 if (allow_unused = strchr(mapchan, '?'))
532 if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels ||
533 input_streams[input_files[m->file_idx]->ist_index + m->stream_idx]->user_set_discard == AVDISCARD_ALL) {
535 av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
536 m->file_idx, m->stream_idx, m->channel_idx);
538 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n"
539 "To ignore this, add a trailing '?' to the map_channel.\n",
540 m->file_idx, m->stream_idx, m->channel_idx);
549 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
551 av_free(sdp_filename);
552 sdp_filename = av_strdup(arg);
557 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
559 const char *prefix = "vaapi:";
562 tmp = av_asprintf("%s%s", prefix, arg);
564 return AVERROR(ENOMEM);
565 err = hw_device_init_from_string(tmp, NULL);
571 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
573 if (!strcmp(arg, "list")) {
574 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
575 printf("Supported hardware device types:\n");
576 while ((type = av_hwdevice_iterate_types(type)) !=
577 AV_HWDEVICE_TYPE_NONE)
578 printf("%s\n", av_hwdevice_get_type_name(type));
582 return hw_device_init_from_string(arg, NULL);
586 static int opt_filter_hw_device(void *optctx, const char *opt, const char *arg)
588 if (filter_hw_device) {
589 av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
590 return AVERROR(EINVAL);
592 filter_hw_device = hw_device_get_by_name(arg);
593 if (!filter_hw_device) {
594 av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg);
595 return AVERROR(EINVAL);
601 * Parse a metadata specifier passed as 'arg' parameter.
602 * @param arg metadata string to parse
603 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
604 * @param index for type c/p, chapter/program index is written here
605 * @param stream_spec for type s, the stream specifier is written here
607 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
615 if (*(++arg) && *arg != ':') {
616 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
619 *stream_spec = *arg == ':' ? arg + 1 : "";
624 *index = strtol(++arg, NULL, 0);
627 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
634 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
636 AVDictionary **meta_in = NULL;
637 AVDictionary **meta_out = NULL;
639 char type_in, type_out;
640 const char *istream_spec = NULL, *ostream_spec = NULL;
641 int idx_in = 0, idx_out = 0;
643 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
644 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
647 if (type_out == 'g' || !*outspec)
648 o->metadata_global_manual = 1;
649 if (type_out == 's' || !*outspec)
650 o->metadata_streams_manual = 1;
651 if (type_out == 'c' || !*outspec)
652 o->metadata_chapters_manual = 1;
656 if (type_in == 'g' || type_out == 'g')
657 o->metadata_global_manual = 1;
658 if (type_in == 's' || type_out == 's')
659 o->metadata_streams_manual = 1;
660 if (type_in == 'c' || type_out == 'c')
661 o->metadata_chapters_manual = 1;
663 /* ic is NULL when just disabling automatic mappings */
667 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
668 if ((index) < 0 || (index) >= (nb_elems)) {\
669 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
674 #define SET_DICT(type, meta, context, index)\
677 meta = &context->metadata;\
680 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
681 meta = &context->chapters[index]->metadata;\
684 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
685 meta = &context->programs[index]->metadata;\
688 break; /* handled separately below */ \
689 default: av_assert0(0);\
692 SET_DICT(type_in, meta_in, ic, idx_in);
693 SET_DICT(type_out, meta_out, oc, idx_out);
695 /* for input streams choose first matching stream */
696 if (type_in == 's') {
697 for (i = 0; i < ic->nb_streams; i++) {
698 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
699 meta_in = &ic->streams[i]->metadata;
705 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
710 if (type_out == 's') {
711 for (i = 0; i < oc->nb_streams; i++) {
712 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
713 meta_out = &oc->streams[i]->metadata;
714 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
719 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
724 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
726 OptionsContext *o = optctx;
728 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
729 struct tm time = *gmtime((time_t*)&recording_timestamp);
730 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
732 parse_option(o, "metadata", buf, options);
734 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
735 "tag instead.\n", opt);
739 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
741 const AVCodecDescriptor *desc;
742 const char *codec_string = encoder ? "encoder" : "decoder";
746 avcodec_find_encoder_by_name(name) :
747 avcodec_find_decoder_by_name(name);
749 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
750 codec = encoder ? avcodec_find_encoder(desc->id) :
751 avcodec_find_decoder(desc->id);
753 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
754 codec_string, codec->name, desc->name);
758 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
761 if (codec->type != type) {
762 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
768 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
770 char *codec_name = NULL;
772 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
774 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
775 st->codecpar->codec_id = codec->id;
778 return avcodec_find_decoder(st->codecpar->codec_id);
781 /* Add all the streams from the given input file to the global
782 * list of input streams. */
783 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
787 for (i = 0; i < ic->nb_streams; i++) {
788 AVStream *st = ic->streams[i];
789 AVCodecParameters *par = st->codecpar;
790 InputStream *ist = av_mallocz(sizeof(*ist));
791 char *framerate = NULL, *hwaccel_device = NULL;
792 const char *hwaccel = NULL;
793 char *hwaccel_output_format = NULL;
794 char *codec_tag = NULL;
796 char *discard_str = NULL;
797 const AVClass *cc = avcodec_get_class();
798 const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL, 0, 0);
803 GROW_ARRAY(input_streams, nb_input_streams);
804 input_streams[nb_input_streams - 1] = ist;
807 ist->file_index = nb_input_files;
809 st->discard = AVDISCARD_ALL;
811 ist->min_pts = INT64_MAX;
812 ist->max_pts = INT64_MIN;
815 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
818 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
820 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
822 uint32_t tag = strtol(codec_tag, &next, 0);
824 tag = AV_RL32(codec_tag);
825 st->codecpar->codec_tag = tag;
828 ist->dec = choose_decoder(o, ic, st);
829 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
831 ist->reinit_filters = -1;
832 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
834 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
835 ist->user_set_discard = AVDISCARD_NONE;
837 if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
838 (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ||
839 (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) ||
840 (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
841 ist->user_set_discard = AVDISCARD_ALL;
843 if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
844 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
849 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
851 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
853 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
857 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
859 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
864 ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
866 switch (par->codec_type) {
867 case AVMEDIA_TYPE_VIDEO:
869 ist->dec = avcodec_find_decoder(par->codec_id);
871 // avformat_find_stream_info() doesn't set this for us anymore.
872 ist->dec_ctx->framerate = st->avg_frame_rate;
874 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
875 if (framerate && av_parse_video_rate(&ist->framerate,
877 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
882 ist->top_field_first = -1;
883 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
885 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
886 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
887 hwaccel_output_format, ic, st);
889 if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "cuvid")) {
890 av_log(NULL, AV_LOG_WARNING,
891 "WARNING: defaulting hwaccel_output_format to cuda for compatibility "
892 "with old commandlines. This behaviour is DEPRECATED and will be removed "
893 "in the future. Please explicitly set \"-hwaccel_output_format cuda\".\n");
894 ist->hwaccel_output_format = AV_PIX_FMT_CUDA;
895 } else if (hwaccel_output_format) {
896 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
897 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
898 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
899 "format: %s", hwaccel_output_format);
902 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
906 // The NVDEC hwaccels use a CUDA device, so remap the name here.
907 if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
910 if (!strcmp(hwaccel, "none"))
911 ist->hwaccel_id = HWACCEL_NONE;
912 else if (!strcmp(hwaccel, "auto"))
913 ist->hwaccel_id = HWACCEL_AUTO;
915 enum AVHWDeviceType type;
917 for (i = 0; hwaccels[i].name; i++) {
918 if (!strcmp(hwaccels[i].name, hwaccel)) {
919 ist->hwaccel_id = hwaccels[i].id;
924 if (!ist->hwaccel_id) {
925 type = av_hwdevice_find_type_by_name(hwaccel);
926 if (type != AV_HWDEVICE_TYPE_NONE) {
927 ist->hwaccel_id = HWACCEL_GENERIC;
928 ist->hwaccel_device_type = type;
932 if (!ist->hwaccel_id) {
933 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
935 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
936 type = AV_HWDEVICE_TYPE_NONE;
937 while ((type = av_hwdevice_iterate_types(type)) !=
938 AV_HWDEVICE_TYPE_NONE)
939 av_log(NULL, AV_LOG_FATAL, "%s ",
940 av_hwdevice_get_type_name(type));
941 av_log(NULL, AV_LOG_FATAL, "\n");
947 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
948 if (hwaccel_device) {
949 ist->hwaccel_device = av_strdup(hwaccel_device);
950 if (!ist->hwaccel_device)
954 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
957 case AVMEDIA_TYPE_AUDIO:
958 ist->guess_layout_max = INT_MAX;
959 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
960 guess_input_channel_layout(ist);
962 case AVMEDIA_TYPE_DATA:
963 case AVMEDIA_TYPE_SUBTITLE: {
964 char *canvas_size = NULL;
966 ist->dec = avcodec_find_decoder(par->codec_id);
967 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
968 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
970 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
971 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
976 case AVMEDIA_TYPE_ATTACHMENT:
977 case AVMEDIA_TYPE_UNKNOWN:
983 ret = avcodec_parameters_from_context(par, ist->dec_ctx);
985 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
991 static void assert_file_overwrite(const char *filename)
993 const char *proto_name = avio_find_protocol_name(filename);
995 if (file_overwrite && no_file_overwrite) {
996 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
1000 if (!file_overwrite) {
1001 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
1002 if (stdin_interaction && !no_file_overwrite) {
1003 fprintf(stderr,"File '%s' already exists. Overwrite? [y/N] ", filename);
1006 signal(SIGINT, SIG_DFL);
1007 if (!read_yesno()) {
1008 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
1014 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
1020 if (proto_name && !strcmp(proto_name, "file")) {
1021 for (int i = 0; i < nb_input_files; i++) {
1022 InputFile *file = input_files[i];
1023 if (file->ctx->iformat->flags & AVFMT_NOFILE)
1025 if (!strcmp(filename, file->ctx->url)) {
1026 av_log(NULL, AV_LOG_FATAL, "Output %s same as Input #%d - exiting\n", filename, i);
1027 av_log(NULL, AV_LOG_WARNING, "FFmpeg cannot edit existing files in-place.\n");
1034 static void dump_attachment(AVStream *st, const char *filename)
1037 AVIOContext *out = NULL;
1038 AVDictionaryEntry *e;
1040 if (!st->codecpar->extradata_size) {
1041 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
1042 nb_input_files - 1, st->index);
1045 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
1046 filename = e->value;
1048 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
1049 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
1053 assert_file_overwrite(filename);
1055 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
1056 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
1061 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
1066 static int open_input_file(OptionsContext *o, const char *filename)
1069 AVFormatContext *ic;
1070 AVInputFormat *file_iformat = NULL;
1073 AVDictionary *unused_opts = NULL;
1074 AVDictionaryEntry *e = NULL;
1075 char * video_codec_name = NULL;
1076 char * audio_codec_name = NULL;
1077 char *subtitle_codec_name = NULL;
1078 char * data_codec_name = NULL;
1079 int scan_all_pmts_set = 0;
1081 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
1082 o->stop_time = INT64_MAX;
1083 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1086 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1087 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
1088 if (o->stop_time <= start_time) {
1089 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1092 o->recording_time = o->stop_time - start_time;
1097 if (!(file_iformat = av_find_input_format(o->format))) {
1098 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
1103 if (!strcmp(filename, "-"))
1106 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
1107 strcmp(filename, "/dev/stdin");
1109 /* get default parameters from command line */
1110 ic = avformat_alloc_context();
1112 print_error(filename, AVERROR(ENOMEM));
1115 if (o->nb_audio_sample_rate) {
1116 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
1118 if (o->nb_audio_channels) {
1119 /* because we set audio_channels based on both the "ac" and
1120 * "channel_layout" options, we need to check that the specified
1121 * demuxer actually has the "channels" option before setting it */
1122 if (file_iformat && file_iformat->priv_class &&
1123 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
1124 AV_OPT_SEARCH_FAKE_OBJ)) {
1125 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
1128 if (o->nb_frame_rates) {
1129 /* set the format-level framerate option;
1130 * this is important for video grabbers, e.g. x11 */
1131 if (file_iformat && file_iformat->priv_class &&
1132 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
1133 AV_OPT_SEARCH_FAKE_OBJ)) {
1134 av_dict_set(&o->g->format_opts, "framerate",
1135 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
1138 if (o->nb_frame_sizes) {
1139 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
1141 if (o->nb_frame_pix_fmts)
1142 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
1144 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
1145 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
1146 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
1147 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
1149 if (video_codec_name)
1150 ic->video_codec = find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
1151 if (audio_codec_name)
1152 ic->audio_codec = find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
1153 if (subtitle_codec_name)
1154 ic->subtitle_codec = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
1155 if (data_codec_name)
1156 ic->data_codec = find_codec_or_die(data_codec_name , AVMEDIA_TYPE_DATA , 0);
1158 ic->video_codec_id = video_codec_name ? ic->video_codec->id : AV_CODEC_ID_NONE;
1159 ic->audio_codec_id = audio_codec_name ? ic->audio_codec->id : AV_CODEC_ID_NONE;
1160 ic->subtitle_codec_id = subtitle_codec_name ? ic->subtitle_codec->id : AV_CODEC_ID_NONE;
1161 ic->data_codec_id = data_codec_name ? ic->data_codec->id : AV_CODEC_ID_NONE;
1163 ic->flags |= AVFMT_FLAG_NONBLOCK;
1165 ic->flags |= AVFMT_FLAG_BITEXACT;
1166 ic->interrupt_callback = int_cb;
1168 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
1169 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
1170 scan_all_pmts_set = 1;
1172 /* open the input file with generic avformat function */
1173 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1175 print_error(filename, err);
1176 if (err == AVERROR_PROTOCOL_NOT_FOUND)
1177 av_log(NULL, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1180 if (scan_all_pmts_set)
1181 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1182 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
1183 assert_avoptions(o->g->format_opts);
1185 /* apply forced codec ids */
1186 for (i = 0; i < ic->nb_streams; i++)
1187 choose_decoder(o, ic, ic->streams[i]);
1189 if (find_stream_info) {
1190 AVDictionary **opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
1191 int orig_nb_streams = ic->nb_streams;
1193 /* If not enough info to get the stream parameters, we decode the
1194 first frames to get it. (used in mpeg case for example) */
1195 ret = avformat_find_stream_info(ic, opts);
1197 for (i = 0; i < orig_nb_streams; i++)
1198 av_dict_free(&opts[i]);
1202 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
1203 if (ic->nb_streams == 0) {
1204 avformat_close_input(&ic);
1210 if (o->start_time != AV_NOPTS_VALUE && o->start_time_eof != AV_NOPTS_VALUE) {
1211 av_log(NULL, AV_LOG_WARNING, "Cannot use -ss and -sseof both, using -ss for %s\n", filename);
1212 o->start_time_eof = AV_NOPTS_VALUE;
1215 if (o->start_time_eof != AV_NOPTS_VALUE) {
1216 if (o->start_time_eof >= 0) {
1217 av_log(NULL, AV_LOG_ERROR, "-sseof value must be negative; aborting\n");
1220 if (ic->duration > 0) {
1221 o->start_time = o->start_time_eof + ic->duration;
1222 if (o->start_time < 0) {
1223 av_log(NULL, AV_LOG_WARNING, "-sseof value seeks to before start of file %s; ignored\n", filename);
1224 o->start_time = AV_NOPTS_VALUE;
1227 av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
1229 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
1230 /* add the stream start time */
1231 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1232 timestamp += ic->start_time;
1234 /* if seeking requested, we execute it */
1235 if (o->start_time != AV_NOPTS_VALUE) {
1236 int64_t seek_timestamp = timestamp;
1238 if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1239 int dts_heuristic = 0;
1240 for (i=0; i<ic->nb_streams; i++) {
1241 const AVCodecParameters *par = ic->streams[i]->codecpar;
1242 if (par->video_delay) {
1247 if (dts_heuristic) {
1248 seek_timestamp -= 3*AV_TIME_BASE / 23;
1251 ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1253 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
1254 filename, (double)timestamp / AV_TIME_BASE);
1258 /* update the current parameters so that they match the one of the input stream */
1259 add_input_streams(o, ic);
1261 /* dump the file content */
1262 av_dump_format(ic, nb_input_files, filename, 0);
1264 GROW_ARRAY(input_files, nb_input_files);
1265 f = av_mallocz(sizeof(*f));
1268 input_files[nb_input_files - 1] = f;
1271 f->ist_index = nb_input_streams - ic->nb_streams;
1272 f->start_time = o->start_time;
1273 f->recording_time = o->recording_time;
1274 f->input_ts_offset = o->input_ts_offset;
1275 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1276 f->nb_streams = ic->nb_streams;
1277 f->rate_emu = o->rate_emu;
1278 f->accurate_seek = o->accurate_seek;
1281 f->time_base = (AVRational){ 1, 1 };
1283 f->thread_queue_size = o->thread_queue_size;
1286 /* check if all codec options have been used */
1287 unused_opts = strip_specifiers(o->g->codec_opts);
1288 for (i = f->ist_index; i < nb_input_streams; i++) {
1290 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1291 AV_DICT_IGNORE_SUFFIX)))
1292 av_dict_set(&unused_opts, e->key, NULL, 0);
1296 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1297 const AVClass *class = avcodec_get_class();
1298 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1299 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1300 const AVClass *fclass = avformat_get_class();
1301 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
1302 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1303 if (!option || foption)
1307 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1308 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1309 "input file #%d (%s) is not a decoding option.\n", e->key,
1310 option->help ? option->help : "", nb_input_files - 1,
1315 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1316 "input file #%d (%s) has not been used for any stream. The most "
1317 "likely reason is either wrong type (e.g. a video option with "
1318 "no video streams) or that it is a private option of some decoder "
1319 "which was not actually used for any stream.\n", e->key,
1320 option->help ? option->help : "", nb_input_files - 1, filename);
1322 av_dict_free(&unused_opts);
1324 for (i = 0; i < o->nb_dump_attachment; i++) {
1327 for (j = 0; j < ic->nb_streams; j++) {
1328 AVStream *st = ic->streams[j];
1330 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1331 dump_attachment(st, o->dump_attachment[i].u.str);
1335 input_stream_potentially_available = 1;
1340 static uint8_t *get_line(AVIOContext *s)
1346 if (avio_open_dyn_buf(&line) < 0) {
1347 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1351 while ((c = avio_r8(s)) && c != '\n')
1354 avio_close_dyn_buf(line, &buf);
1359 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1362 char filename[1000];
1363 const char *base[3] = { getenv("AVCONV_DATADIR"),
1368 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1372 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1373 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1374 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1377 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1378 i != 1 ? "" : "/.avconv", preset_name);
1379 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1385 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1387 enum AVMediaType type = ost->st->codecpar->codec_type;
1388 char *codec_name = NULL;
1390 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
1391 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1393 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->url,
1394 NULL, ost->st->codecpar->codec_type);
1395 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
1397 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
1398 "output stream #%d:%d. Default encoder for format %s (codec %s) is "
1399 "probably disabled. Please choose an encoder manually.\n",
1400 ost->file_index, ost->index, s->oformat->name,
1401 avcodec_get_name(ost->st->codecpar->codec_id));
1402 return AVERROR_ENCODER_NOT_FOUND;
1404 } else if (!strcmp(codec_name, "copy"))
1405 ost->stream_copy = 1;
1407 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
1408 ost->st->codecpar->codec_id = ost->enc->id;
1410 ost->encoding_needed = !ost->stream_copy;
1412 /* no encoding supported for other media types */
1413 ost->stream_copy = 1;
1414 ost->encoding_needed = 0;
1420 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1423 AVStream *st = avformat_new_stream(oc, NULL);
1424 int idx = oc->nb_streams - 1, ret = 0;
1425 const char *bsfs = NULL, *time_base = NULL;
1426 char *next, *codec_tag = NULL;
1431 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1435 if (oc->nb_streams - 1 < o->nb_streamid_map)
1436 st->id = o->streamid_map[oc->nb_streams - 1];
1438 GROW_ARRAY(output_streams, nb_output_streams);
1439 if (!(ost = av_mallocz(sizeof(*ost))))
1441 output_streams[nb_output_streams - 1] = ost;
1443 ost->file_index = nb_output_files - 1;
1446 ost->forced_kf_ref_pts = AV_NOPTS_VALUE;
1447 st->codecpar->codec_type = type;
1449 ret = choose_encoder(o, oc, ost);
1451 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1452 "%d:%d\n", ost->file_index, ost->index);
1456 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1457 if (!ost->enc_ctx) {
1458 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1461 ost->enc_ctx->codec_type = type;
1463 ost->ref_par = avcodec_parameters_alloc();
1464 if (!ost->ref_par) {
1465 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding parameters.\n");
1470 AVIOContext *s = NULL;
1471 char *buf = NULL, *arg = NULL, *preset = NULL;
1473 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1475 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1477 MATCH_PER_STREAM_OPT(autoscale, i, ost->autoscale, oc, st);
1478 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1481 if (!buf[0] || buf[0] == '#') {
1485 if (!(arg = strchr(buf, '='))) {
1486 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1490 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1492 } while (!s->eof_reached);
1496 av_log(NULL, AV_LOG_FATAL,
1497 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1498 preset, ost->file_index, ost->index);
1502 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1507 ost->enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
1509 MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
1512 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1513 q.num <= 0 || q.den <= 0) {
1514 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1520 MATCH_PER_STREAM_OPT(enc_time_bases, str, time_base, oc, st);
1523 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1525 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1528 ost->enc_timebase = q;
1531 ost->max_frames = INT64_MAX;
1532 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1533 for (i = 0; i<o->nb_max_frames; i++) {
1534 char *p = o->max_frames[i].specifier;
1535 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1536 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1541 ost->copy_prior_start = -1;
1542 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1544 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1545 if (bsfs && *bsfs) {
1546 ret = av_bsf_list_parse_str(bsfs, &ost->bsf_ctx);
1548 av_log(NULL, AV_LOG_ERROR, "Error parsing bitstream filter sequence '%s': %s\n", bsfs, av_err2str(ret));
1553 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1555 uint32_t tag = strtol(codec_tag, &next, 0);
1557 tag = AV_RL32(codec_tag);
1558 ost->st->codecpar->codec_tag =
1559 ost->enc_ctx->codec_tag = tag;
1562 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1564 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1565 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1568 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1569 ost->disposition = av_strdup(ost->disposition);
1571 ost->max_muxing_queue_size = 128;
1572 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1573 ost->max_muxing_queue_size *= sizeof(AVPacket);
1575 ost->muxing_queue_data_size = 0;
1577 ost->muxing_queue_data_threshold = 50*1024*1024;
1578 MATCH_PER_STREAM_OPT(muxing_queue_data_threshold, i, ost->muxing_queue_data_threshold, oc, st);
1580 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1581 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1583 av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1585 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1586 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1587 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1589 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1591 ost->source_index = source_index;
1592 if (source_index >= 0) {
1593 ost->sync_ist = input_streams[source_index];
1594 input_streams[source_index]->discard = 0;
1595 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1597 ost->last_mux_dts = AV_NOPTS_VALUE;
1599 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1600 if (!ost->muxing_queue)
1606 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1609 const char *p = str;
1616 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1623 /* read file contents into a string */
1624 static uint8_t *read_file(const char *filename)
1626 AVIOContext *pb = NULL;
1627 AVIOContext *dyn_buf = NULL;
1628 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1629 uint8_t buf[1024], *str;
1632 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1636 ret = avio_open_dyn_buf(&dyn_buf);
1641 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1642 avio_write(dyn_buf, buf, ret);
1643 avio_w8(dyn_buf, 0);
1646 ret = avio_close_dyn_buf(dyn_buf, &str);
1652 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1655 AVStream *st = ost->st;
1657 if (ost->filters_script && ost->filters) {
1658 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1659 "output stream #%d:%d.\n", nb_output_files, st->index);
1663 if (ost->filters_script)
1664 return read_file(ost->filters_script);
1665 else if (ost->filters)
1666 return av_strdup(ost->filters);
1668 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1672 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1673 const OutputStream *ost, enum AVMediaType type)
1675 if (ost->filters_script || ost->filters) {
1676 av_log(NULL, AV_LOG_ERROR,
1677 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1678 "Filtering and streamcopy cannot be used together.\n",
1679 ost->filters ? "Filtergraph" : "Filtergraph script",
1680 ost->filters ? ost->filters : ost->filters_script,
1681 av_get_media_type_string(type), ost->file_index, ost->index);
1686 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1690 AVCodecContext *video_enc;
1691 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1693 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1695 video_enc = ost->enc_ctx;
1697 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1698 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1699 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1702 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1703 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1705 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1706 if (frame_aspect_ratio) {
1708 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1709 q.num <= 0 || q.den <= 0) {
1710 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1713 ost->frame_aspect_ratio = q;
1716 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1717 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1719 if (!ost->stream_copy) {
1720 const char *p = NULL;
1721 char *frame_size = NULL;
1722 char *frame_pix_fmt = NULL;
1723 char *intra_matrix = NULL, *inter_matrix = NULL;
1724 char *chroma_intra_matrix = NULL;
1728 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1729 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1730 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1734 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1735 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1736 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1737 ost->keep_pix_fmt = 1;
1738 if (!*++frame_pix_fmt)
1739 frame_pix_fmt = NULL;
1741 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1742 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1745 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1748 video_enc->gop_size = 0;
1749 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1751 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1752 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1755 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1757 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1758 if (chroma_intra_matrix) {
1759 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1761 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1764 video_enc->chroma_intra_matrix = p;
1765 parse_matrix_coeffs(p, chroma_intra_matrix);
1767 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1769 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1770 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1773 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1776 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1777 for (i = 0; p; i++) {
1779 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1781 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1784 video_enc->rc_override =
1785 av_realloc_array(video_enc->rc_override,
1786 i + 1, sizeof(RcOverride));
1787 if (!video_enc->rc_override) {
1788 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1791 video_enc->rc_override[i].start_frame = start;
1792 video_enc->rc_override[i].end_frame = end;
1794 video_enc->rc_override[i].qscale = q;
1795 video_enc->rc_override[i].quality_factor = 1.0;
1798 video_enc->rc_override[i].qscale = 0;
1799 video_enc->rc_override[i].quality_factor = -q/100.0;
1804 video_enc->rc_override_count = i;
1807 video_enc->flags|= AV_CODEC_FLAG_PSNR;
1810 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1813 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1814 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1817 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1818 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1822 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1823 if (ost->logfile_prefix &&
1824 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1828 char logfilename[1024];
1831 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1832 ost->logfile_prefix ? ost->logfile_prefix :
1833 DEFAULT_PASS_LOGFILENAME_PREFIX,
1835 if (!strcmp(ost->enc->name, "libx264")) {
1836 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1838 if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1839 char *logbuffer = read_file(logfilename);
1842 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1846 video_enc->stats_in = logbuffer;
1848 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1849 f = av_fopen_utf8(logfilename, "wb");
1851 av_log(NULL, AV_LOG_FATAL,
1852 "Cannot write log file '%s' for pass-1 encoding: %s\n",
1853 logfilename, strerror(errno));
1861 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1862 if (ost->forced_keyframes)
1863 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1865 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1867 ost->top_field_first = -1;
1868 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1871 ost->avfilter = get_ost_filters(o, oc, ost);
1875 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1878 if (ost->stream_copy)
1879 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1884 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1889 AVCodecContext *audio_enc;
1891 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1894 audio_enc = ost->enc_ctx;
1895 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1897 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1898 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1900 if (!ost->stream_copy) {
1901 char *sample_fmt = NULL;
1903 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1905 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1907 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1908 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1912 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1914 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1915 ost->apad = av_strdup(ost->apad);
1917 ost->avfilter = get_ost_filters(o, oc, ost);
1921 /* check for channel mapping for this audio stream */
1922 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1923 AudioChannelMap *map = &o->audio_channel_maps[n];
1924 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1925 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1928 if (map->channel_idx == -1) {
1930 } else if (ost->source_index < 0) {
1931 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1932 ost->file_index, ost->st->index);
1935 ist = input_streams[ost->source_index];
1938 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1939 if (av_reallocp_array(&ost->audio_channels_map,
1940 ost->audio_channels_mapped + 1,
1941 sizeof(*ost->audio_channels_map)
1945 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1951 if (ost->stream_copy)
1952 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1957 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1961 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1962 if (!ost->stream_copy) {
1963 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1970 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1974 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1975 if (!ost->stream_copy) {
1976 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1983 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1985 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1986 ost->stream_copy = 1;
1991 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1995 AVCodecContext *subtitle_enc;
1997 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1999 subtitle_enc = ost->enc_ctx;
2001 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
2003 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
2005 if (!ost->stream_copy) {
2006 char *frame_size = NULL;
2008 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
2009 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
2010 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
2018 /* arg format is "output-stream-index:streamid-value". */
2019 static int opt_streamid(void *optctx, const char *opt, const char *arg)
2021 OptionsContext *o = optctx;
2026 av_strlcpy(idx_str, arg, sizeof(idx_str));
2027 p = strchr(idx_str, ':');
2029 av_log(NULL, AV_LOG_FATAL,
2030 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
2035 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
2036 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
2037 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
2041 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
2043 AVFormatContext *is = ifile->ctx;
2044 AVFormatContext *os = ofile->ctx;
2048 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
2050 return AVERROR(ENOMEM);
2053 for (i = 0; i < is->nb_chapters; i++) {
2054 AVChapter *in_ch = is->chapters[i], *out_ch;
2055 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
2056 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
2057 AV_TIME_BASE_Q, in_ch->time_base);
2058 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
2059 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
2062 if (in_ch->end < ts_off)
2064 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
2067 out_ch = av_mallocz(sizeof(AVChapter));
2069 return AVERROR(ENOMEM);
2071 out_ch->id = in_ch->id;
2072 out_ch->time_base = in_ch->time_base;
2073 out_ch->start = FFMAX(0, in_ch->start - ts_off);
2074 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
2077 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
2079 os->chapters[os->nb_chapters++] = out_ch;
2084 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
2085 AVFormatContext *oc)
2089 switch (ofilter->type) {
2090 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
2091 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
2093 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
2098 ost->source_index = -1;
2099 ost->filter = ofilter;
2102 ofilter->format = -1;
2104 if (ost->stream_copy) {
2105 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
2106 "which is fed from a complex filtergraph. Filtering and streamcopy "
2107 "cannot be used together.\n", ost->file_index, ost->index);
2111 if (ost->avfilter && (ost->filters || ost->filters_script)) {
2112 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
2113 av_log(NULL, AV_LOG_ERROR,
2114 "%s '%s' was specified through the %s option "
2115 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
2116 "%s and -filter_complex cannot be used together for the same stream.\n",
2117 ost->filters ? "Filtergraph" : "Filtergraph script",
2118 ost->filters ? ost->filters : ost->filters_script,
2119 opt, ost->file_index, ost->index, opt);
2123 avfilter_inout_free(&ofilter->out_tmp);
2126 static int init_complex_filters(void)
2130 for (i = 0; i < nb_filtergraphs; i++) {
2131 ret = init_complex_filtergraph(filtergraphs[i]);
2138 static int open_output_file(OptionsContext *o, const char *filename)
2140 AVFormatContext *oc;
2145 AVDictionary *unused_opts = NULL;
2146 AVDictionaryEntry *e = NULL;
2147 int format_flags = 0;
2149 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
2150 o->stop_time = INT64_MAX;
2151 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
2154 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
2155 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
2156 if (o->stop_time <= start_time) {
2157 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
2160 o->recording_time = o->stop_time - start_time;
2164 GROW_ARRAY(output_files, nb_output_files);
2165 of = av_mallocz(sizeof(*of));
2168 output_files[nb_output_files - 1] = of;
2170 of->ost_index = nb_output_streams;
2171 of->recording_time = o->recording_time;
2172 of->start_time = o->start_time;
2173 of->limit_filesize = o->limit_filesize;
2174 of->shortest = o->shortest;
2175 av_dict_copy(&of->opts, o->g->format_opts, 0);
2177 if (!strcmp(filename, "-"))
2180 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
2182 print_error(filename, err);
2187 if (o->recording_time != INT64_MAX)
2188 oc->duration = o->recording_time;
2190 oc->interrupt_callback = int_cb;
2192 e = av_dict_get(o->g->format_opts, "fflags", NULL, 0);
2194 const AVOption *o = av_opt_find(oc, "fflags", NULL, 0, 0);
2195 av_opt_eval_flags(oc, o, e->value, &format_flags);
2198 format_flags |= AVFMT_FLAG_BITEXACT;
2199 oc->flags |= AVFMT_FLAG_BITEXACT;
2202 /* create streams for all unlabeled output pads */
2203 for (i = 0; i < nb_filtergraphs; i++) {
2204 FilterGraph *fg = filtergraphs[i];
2205 for (j = 0; j < fg->nb_outputs; j++) {
2206 OutputFilter *ofilter = fg->outputs[j];
2208 if (!ofilter->out_tmp || ofilter->out_tmp->name)
2211 switch (ofilter->type) {
2212 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
2213 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
2214 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
2216 init_output_filter(ofilter, o, oc);
2220 if (!o->nb_stream_maps) {
2221 char *subtitle_codec_name = NULL;
2222 /* pick the "best" stream of each type */
2224 /* video: highest resolution */
2225 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2226 int best_score = 0, idx = -1;
2227 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2228 for (i = 0; i < nb_input_streams; i++) {
2230 ist = input_streams[i];
2231 score = ist->st->codecpar->width * ist->st->codecpar->height
2232 + 100000000 * !!(ist->st->event_flags & AVSTREAM_EVENT_FLAG_NEW_PACKETS)
2233 + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
2234 if (ist->user_set_discard == AVDISCARD_ALL)
2236 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2238 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
2239 score > best_score) {
2240 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2247 new_video_stream(o, oc, idx);
2250 /* audio: most channels */
2251 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2252 int best_score = 0, idx = -1;
2253 for (i = 0; i < nb_input_streams; i++) {
2255 ist = input_streams[i];
2256 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames
2257 + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
2258 if (ist->user_set_discard == AVDISCARD_ALL)
2260 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
2261 score > best_score) {
2267 new_audio_stream(o, oc, idx);
2270 /* subtitles: pick first */
2271 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2272 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2273 for (i = 0; i < nb_input_streams; i++)
2274 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2275 AVCodecDescriptor const *input_descriptor =
2276 avcodec_descriptor_get(input_streams[i]->st->codecpar->codec_id);
2277 AVCodecDescriptor const *output_descriptor = NULL;
2278 AVCodec const *output_codec =
2279 avcodec_find_encoder(oc->oformat->subtitle_codec);
2280 int input_props = 0, output_props = 0;
2281 if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
2284 output_descriptor = avcodec_descriptor_get(output_codec->id);
2285 if (input_descriptor)
2286 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2287 if (output_descriptor)
2288 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2289 if (subtitle_codec_name ||
2290 input_props & output_props ||
2291 // Map dvb teletext which has neither property to any output subtitle encoder
2292 input_descriptor && output_descriptor &&
2293 (!input_descriptor->props ||
2294 !output_descriptor->props)) {
2295 new_subtitle_stream(o, oc, i);
2300 /* Data only if codec id match */
2301 if (!o->data_disable ) {
2302 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2303 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2304 if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
2306 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
2307 && input_streams[i]->st->codecpar->codec_id == codec_id )
2308 new_data_stream(o, oc, i);
2312 for (i = 0; i < o->nb_stream_maps; i++) {
2313 StreamMap *map = &o->stream_maps[i];
2318 if (map->linklabel) {
2320 OutputFilter *ofilter = NULL;
2323 for (j = 0; j < nb_filtergraphs; j++) {
2324 fg = filtergraphs[j];
2325 for (k = 0; k < fg->nb_outputs; k++) {
2326 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2327 if (out && !strcmp(out->name, map->linklabel)) {
2328 ofilter = fg->outputs[k];
2335 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2336 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2339 init_output_filter(ofilter, o, oc);
2341 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2343 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2344 if (ist->user_set_discard == AVDISCARD_ALL) {
2345 av_log(NULL, AV_LOG_FATAL, "Stream #%d:%d is disabled and cannot be mapped.\n",
2346 map->file_index, map->stream_index);
2349 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
2351 if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
2353 if(o-> video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
2355 if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2359 switch (ist->st->codecpar->codec_type) {
2360 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2361 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2362 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2363 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2364 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2365 case AVMEDIA_TYPE_UNKNOWN:
2366 if (copy_unknown_streams) {
2367 ost = new_unknown_stream (o, oc, src_idx);
2371 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2372 "Cannot map stream #%d:%d - unsupported type.\n",
2373 map->file_index, map->stream_index);
2374 if (!ignore_unknown_streams) {
2375 av_log(NULL, AV_LOG_FATAL,
2376 "If you want unsupported types ignored instead "
2377 "of failing, please use the -ignore_unknown option\n"
2378 "If you want them copied, please use -copy_unknown\n");
2383 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2384 + map->sync_stream_index];
2389 /* handle attached files */
2390 for (i = 0; i < o->nb_attachments; i++) {
2392 uint8_t *attachment;
2396 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2397 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2401 if ((len = avio_size(pb)) <= 0) {
2402 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2406 if (len > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE ||
2407 !(attachment = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE))) {
2408 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large.\n",
2412 avio_read(pb, attachment, len);
2413 memset(attachment + len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
2415 ost = new_attachment_stream(o, oc, -1);
2416 ost->stream_copy = 0;
2417 ost->attachment_filename = o->attachments[i];
2418 ost->st->codecpar->extradata = attachment;
2419 ost->st->codecpar->extradata_size = len;
2421 p = strrchr(o->attachments[i], '/');
2422 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2426 #if FF_API_LAVF_AVCTX
2427 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2428 AVDictionaryEntry *e;
2429 ost = output_streams[i];
2431 if ((ost->stream_copy || ost->attachment_filename)
2432 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2433 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2434 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2439 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2440 av_dump_format(oc, nb_output_files - 1, oc->url, 1);
2441 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2445 /* check if all codec options have been used */
2446 unused_opts = strip_specifiers(o->g->codec_opts);
2447 for (i = of->ost_index; i < nb_output_streams; i++) {
2449 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2450 AV_DICT_IGNORE_SUFFIX)))
2451 av_dict_set(&unused_opts, e->key, NULL, 0);
2455 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2456 const AVClass *class = avcodec_get_class();
2457 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2458 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2459 const AVClass *fclass = avformat_get_class();
2460 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2461 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2462 if (!option || foption)
2466 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2467 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2468 "output file #%d (%s) is not an encoding option.\n", e->key,
2469 option->help ? option->help : "", nb_output_files - 1,
2474 // gop_timecode is injected by generic code but not always used
2475 if (!strcmp(e->key, "gop_timecode"))
2478 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2479 "output file #%d (%s) has not been used for any stream. The most "
2480 "likely reason is either wrong type (e.g. a video option with "
2481 "no video streams) or that it is a private option of some encoder "
2482 "which was not actually used for any stream.\n", e->key,
2483 option->help ? option->help : "", nb_output_files - 1, filename);
2485 av_dict_free(&unused_opts);
2487 /* set the decoding_needed flags and create simple filtergraphs */
2488 for (i = of->ost_index; i < nb_output_streams; i++) {
2489 OutputStream *ost = output_streams[i];
2491 if (ost->encoding_needed && ost->source_index >= 0) {
2492 InputStream *ist = input_streams[ost->source_index];
2493 ist->decoding_needed |= DECODING_FOR_OST;
2495 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
2496 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2497 err = init_simple_filtergraph(ist, ost);
2499 av_log(NULL, AV_LOG_ERROR,
2500 "Error initializing a simple filtergraph between streams "
2501 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
2502 nb_output_files - 1, ost->st->index);
2508 /* set the filter output constraints */
2510 OutputFilter *f = ost->filter;
2512 switch (ost->enc_ctx->codec_type) {
2513 case AVMEDIA_TYPE_VIDEO:
2514 f->frame_rate = ost->frame_rate;
2515 f->width = ost->enc_ctx->width;
2516 f->height = ost->enc_ctx->height;
2517 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
2518 f->format = ost->enc_ctx->pix_fmt;
2519 } else if (ost->enc->pix_fmts) {
2521 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
2523 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2526 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
2529 case AVMEDIA_TYPE_AUDIO:
2530 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
2531 f->format = ost->enc_ctx->sample_fmt;
2532 } else if (ost->enc->sample_fmts) {
2534 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
2536 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2539 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
2541 if (ost->enc_ctx->sample_rate) {
2542 f->sample_rate = ost->enc_ctx->sample_rate;
2543 } else if (ost->enc->supported_samplerates) {
2545 while (ost->enc->supported_samplerates[count])
2547 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
2548 if (!f->sample_rates)
2550 memcpy(f->sample_rates, ost->enc->supported_samplerates,
2551 (count + 1) * sizeof(*f->sample_rates));
2553 if (ost->enc_ctx->channels) {
2554 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
2555 } else if (ost->enc->channel_layouts) {
2557 while (ost->enc->channel_layouts[count])
2559 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
2560 if (!f->channel_layouts)
2562 memcpy(f->channel_layouts, ost->enc->channel_layouts,
2563 (count + 1) * sizeof(*f->channel_layouts));
2570 /* check filename in case of an image number is expected */
2571 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2572 if (!av_filename_number_test(oc->url)) {
2573 print_error(oc->url, AVERROR(EINVAL));
2578 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2579 av_log(NULL, AV_LOG_ERROR,
2580 "No input streams but output needs an input stream\n");
2584 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2585 /* test if it already exists to avoid losing precious files */
2586 assert_file_overwrite(filename);
2589 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2590 &oc->interrupt_callback,
2592 print_error(filename, err);
2595 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2596 assert_file_overwrite(filename);
2598 if (o->mux_preload) {
2599 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2601 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2604 for (i = 0; i < o->nb_metadata_map; i++) {
2606 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2608 if (in_file_index >= nb_input_files) {
2609 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2612 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2613 in_file_index >= 0 ?
2614 input_files[in_file_index]->ctx : NULL, o);
2618 if (o->chapters_input_file >= nb_input_files) {
2619 if (o->chapters_input_file == INT_MAX) {
2620 /* copy chapters from the first input file that has them*/
2621 o->chapters_input_file = -1;
2622 for (i = 0; i < nb_input_files; i++)
2623 if (input_files[i]->ctx->nb_chapters) {
2624 o->chapters_input_file = i;
2628 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2629 o->chapters_input_file);
2633 if (o->chapters_input_file >= 0)
2634 copy_chapters(input_files[o->chapters_input_file], of,
2635 !o->metadata_chapters_manual);
2637 /* copy global metadata by default */
2638 if (!o->metadata_global_manual && nb_input_files){
2639 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2640 AV_DICT_DONT_OVERWRITE);
2641 if(o->recording_time != INT64_MAX)
2642 av_dict_set(&oc->metadata, "duration", NULL, 0);
2643 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2644 av_dict_set(&oc->metadata, "company_name", NULL, 0);
2645 av_dict_set(&oc->metadata, "product_name", NULL, 0);
2646 av_dict_set(&oc->metadata, "product_version", NULL, 0);
2648 if (!o->metadata_streams_manual)
2649 for (i = of->ost_index; i < nb_output_streams; i++) {
2651 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2653 ist = input_streams[output_streams[i]->source_index];
2654 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2655 if (!output_streams[i]->stream_copy) {
2656 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2660 /* process manually set programs */
2661 for (i = 0; i < o->nb_program; i++) {
2662 const char *p = o->program[i].u.str;
2667 const char *p2 = av_get_token(&p, ":");
2668 const char *to_dealloc = p2;
2675 key = av_get_token(&p2, "=");
2677 av_freep(&to_dealloc);
2683 if (!strcmp(key, "program_num"))
2684 progid = strtol(p2, NULL, 0);
2685 av_freep(&to_dealloc);
2689 program = av_new_program(oc, progid);
2691 p = o->program[i].u.str;
2693 const char *p2 = av_get_token(&p, ":");
2694 const char *to_dealloc = p2;
2700 key = av_get_token(&p2, "=");
2702 av_log(NULL, AV_LOG_FATAL,
2703 "No '=' character in program string %s.\n",
2711 if (!strcmp(key, "title")) {
2712 av_dict_set(&program->metadata, "title", p2, 0);
2713 } else if (!strcmp(key, "program_num")) {
2714 } else if (!strcmp(key, "st")) {
2715 int st_num = strtol(p2, NULL, 0);
2716 av_program_add_stream_index(oc, progid, st_num);
2718 av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2721 av_freep(&to_dealloc);
2726 /* process manually set metadata */
2727 for (i = 0; i < o->nb_metadata; i++) {
2730 const char *stream_spec;
2731 int index = 0, j, ret = 0;
2733 val = strchr(o->metadata[i].u.str, '=');
2735 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2736 o->metadata[i].u.str);
2741 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2743 for (j = 0; j < oc->nb_streams; j++) {
2744 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2745 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2746 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2748 double theta = av_strtod(val, &tail);
2750 ost->rotate_overridden = 1;
2751 ost->rotate_override_value = theta;
2754 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2766 if (index < 0 || index >= oc->nb_chapters) {
2767 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2770 m = &oc->chapters[index]->metadata;
2773 if (index < 0 || index >= oc->nb_programs) {
2774 av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2777 m = &oc->programs[index]->metadata;
2780 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2783 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2790 static int opt_target(void *optctx, const char *opt, const char *arg)
2792 OptionsContext *o = optctx;
2793 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2794 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2796 if (!strncmp(arg, "pal-", 4)) {
2799 } else if (!strncmp(arg, "ntsc-", 5)) {
2802 } else if (!strncmp(arg, "film-", 5)) {
2806 /* Try to determine PAL/NTSC by peeking in the input files */
2807 if (nb_input_files) {
2809 for (j = 0; j < nb_input_files; j++) {
2810 for (i = 0; i < input_files[j]->nb_streams; i++) {
2811 AVStream *st = input_files[j]->ctx->streams[i];
2813 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2815 fr = st->time_base.den * 1000LL / st->time_base.num;
2819 } else if ((fr == 29970) || (fr == 23976)) {
2824 if (norm != UNKNOWN)
2828 if (norm != UNKNOWN)
2829 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2832 if (norm == UNKNOWN) {
2833 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2834 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2835 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2839 if (!strcmp(arg, "vcd")) {
2840 opt_video_codec(o, "c:v", "mpeg1video");
2841 opt_audio_codec(o, "c:a", "mp2");
2842 parse_option(o, "f", "vcd", options);
2844 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2845 parse_option(o, "r", frame_rates[norm], options);
2846 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2848 opt_default(NULL, "b:v", "1150000");
2849 opt_default(NULL, "maxrate:v", "1150000");
2850 opt_default(NULL, "minrate:v", "1150000");
2851 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2853 opt_default(NULL, "b:a", "224000");
2854 parse_option(o, "ar", "44100", options);
2855 parse_option(o, "ac", "2", options);
2857 opt_default(NULL, "packetsize", "2324");
2858 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2860 /* We have to offset the PTS, so that it is consistent with the SCR.
2861 SCR starts at 36000, but the first two packs contain only padding
2862 and the first pack from the other stream, respectively, may also have
2863 been written before.
2864 So the real data starts at SCR 36000+3*1200. */
2865 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2866 } else if (!strcmp(arg, "svcd")) {
2868 opt_video_codec(o, "c:v", "mpeg2video");
2869 opt_audio_codec(o, "c:a", "mp2");
2870 parse_option(o, "f", "svcd", options);
2872 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2873 parse_option(o, "r", frame_rates[norm], options);
2874 parse_option(o, "pix_fmt", "yuv420p", options);
2875 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2877 opt_default(NULL, "b:v", "2040000");
2878 opt_default(NULL, "maxrate:v", "2516000");
2879 opt_default(NULL, "minrate:v", "0"); // 1145000;
2880 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2881 opt_default(NULL, "scan_offset", "1");
2883 opt_default(NULL, "b:a", "224000");
2884 parse_option(o, "ar", "44100", options);
2886 opt_default(NULL, "packetsize", "2324");
2888 } else if (!strcmp(arg, "dvd")) {
2890 opt_video_codec(o, "c:v", "mpeg2video");
2891 opt_audio_codec(o, "c:a", "ac3");
2892 parse_option(o, "f", "dvd", options);
2894 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2895 parse_option(o, "r", frame_rates[norm], options);
2896 parse_option(o, "pix_fmt", "yuv420p", options);
2897 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2899 opt_default(NULL, "b:v", "6000000");
2900 opt_default(NULL, "maxrate:v", "9000000");
2901 opt_default(NULL, "minrate:v", "0"); // 1500000;
2902 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2904 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2905 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2907 opt_default(NULL, "b:a", "448000");
2908 parse_option(o, "ar", "48000", options);
2910 } else if (!strncmp(arg, "dv", 2)) {
2912 parse_option(o, "f", "dv", options);
2914 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2915 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2916 norm == PAL ? "yuv420p" : "yuv411p", options);
2917 parse_option(o, "r", frame_rates[norm], options);
2919 parse_option(o, "ar", "48000", options);
2920 parse_option(o, "ac", "2", options);
2923 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2924 return AVERROR(EINVAL);
2927 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2928 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2933 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2935 av_free (vstats_filename);
2936 vstats_filename = av_strdup (arg);
2940 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2943 time_t today2 = time(NULL);
2944 struct tm *today = localtime(&today2);
2946 if (!today) { // maybe tomorrow
2947 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2951 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2953 return opt_vstats_file(NULL, opt, filename);
2956 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2958 OptionsContext *o = optctx;
2959 return parse_option(o, "frames:v", arg, options);
2962 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2964 OptionsContext *o = optctx;
2965 return parse_option(o, "frames:a", arg, options);
2968 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2970 OptionsContext *o = optctx;
2971 return parse_option(o, "frames:d", arg, options);
2974 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2977 AVDictionary *cbak = codec_opts;
2978 AVDictionary *fbak = format_opts;
2982 ret = opt_default(NULL, opt, arg);
2984 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2985 av_dict_copy(&o->g->format_opts, format_opts, 0);
2986 av_dict_free(&codec_opts);
2987 av_dict_free(&format_opts);
2994 static int opt_preset(void *optctx, const char *opt, const char *arg)
2996 OptionsContext *o = optctx;
2998 char filename[1000], line[1000], tmp_line[1000];
2999 const char *codec_name = NULL;
3003 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
3005 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
3006 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
3007 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
3009 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
3013 while (fgets(line, sizeof(line), f)) {
3014 char *key = tmp_line, *value, *endptr;
3016 if (strcspn(line, "#\n\r") == 0)
3018 av_strlcpy(tmp_line, line, sizeof(tmp_line));
3019 if (!av_strtok(key, "=", &value) ||
3020 !av_strtok(value, "\r\n", &endptr)) {
3021 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
3024 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
3026 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
3027 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
3028 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
3029 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
3030 else if (opt_default_new(o, key, value) < 0) {
3031 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
3032 filename, line, key, value);
3042 static int opt_old2new(void *optctx, const char *opt, const char *arg)
3044 OptionsContext *o = optctx;
3046 char *s = av_asprintf("%s:%c", opt + 1, *opt);
3048 return AVERROR(ENOMEM);
3049 ret = parse_option(o, s, arg, options);
3054 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
3056 OptionsContext *o = optctx;
3058 if(!strcmp(opt, "ab")){
3059 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
3061 } else if(!strcmp(opt, "b")){
3062 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
3063 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
3066 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3070 static int opt_qscale(void *optctx, const char *opt, const char *arg)
3072 OptionsContext *o = optctx;
3075 if(!strcmp(opt, "qscale")){
3076 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
3077 return parse_option(o, "q:v", arg, options);
3079 s = av_asprintf("q%s", opt + 6);
3081 return AVERROR(ENOMEM);
3082 ret = parse_option(o, s, arg, options);
3087 static int opt_profile(void *optctx, const char *opt, const char *arg)
3089 OptionsContext *o = optctx;
3090 if(!strcmp(opt, "profile")){
3091 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
3092 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
3095 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3099 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
3101 OptionsContext *o = optctx;
3102 return parse_option(o, "filter:v", arg, options);
3105 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
3107 OptionsContext *o = optctx;
3108 return parse_option(o, "filter:a", arg, options);
3111 static int opt_vsync(void *optctx, const char *opt, const char *arg)
3113 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
3114 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
3115 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
3116 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
3118 if (video_sync_method == VSYNC_AUTO)
3119 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
3123 static int opt_timecode(void *optctx, const char *opt, const char *arg)
3125 OptionsContext *o = optctx;
3127 char *tcr = av_asprintf("timecode=%s", arg);
3129 return AVERROR(ENOMEM);
3130 ret = parse_option(o, "metadata:g", tcr, options);
3132 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
3137 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
3139 OptionsContext *o = optctx;
3140 char layout_str[32];
3143 int ret, channels, ac_str_size;
3146 layout = av_get_channel_layout(arg);
3148 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
3149 return AVERROR(EINVAL);
3151 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
3152 ret = opt_default_new(o, opt, layout_str);
3156 /* set 'ac' option based on channel layout */
3157 channels = av_get_channel_layout_nb_channels(layout);
3158 snprintf(layout_str, sizeof(layout_str), "%d", channels);
3159 stream_str = strchr(opt, ':');
3160 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
3161 ac_str = av_mallocz(ac_str_size);
3163 return AVERROR(ENOMEM);
3164 av_strlcpy(ac_str, "ac", 3);
3166 av_strlcat(ac_str, stream_str, ac_str_size);
3167 ret = parse_option(o, ac_str, layout_str, options);
3173 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
3175 OptionsContext *o = optctx;
3176 return parse_option(o, "q:a", arg, options);
3179 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
3181 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3182 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3183 return AVERROR(ENOMEM);
3184 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3185 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
3186 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
3187 return AVERROR(ENOMEM);
3189 input_stream_potentially_available = 1;
3194 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
3196 uint8_t *graph_desc = read_file(arg);
3198 return AVERROR(EINVAL);
3200 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3201 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3202 return AVERROR(ENOMEM);
3203 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3204 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
3206 input_stream_potentially_available = 1;
3211 void show_help_default(const char *opt, const char *arg)
3213 /* per-file options have at least one of those set */
3214 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
3215 int show_advanced = 0, show_avoptions = 0;
3218 if (!strcmp(opt, "long"))
3220 else if (!strcmp(opt, "full"))
3221 show_advanced = show_avoptions = 1;
3223 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
3228 printf("Getting help:\n"
3229 " -h -- print basic options\n"
3230 " -h long -- print more options\n"
3231 " -h full -- print all options (including all format and codec specific options, very long)\n"
3232 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol\n"
3233 " See man %s for detailed description of the options.\n"
3234 "\n", program_name);
3236 show_help_options(options, "Print help / information / capabilities:",
3239 show_help_options(options, "Global options (affect whole program "
3240 "instead of just one file):",
3241 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
3243 show_help_options(options, "Advanced global options:", OPT_EXPERT,
3244 per_file | OPT_EXIT, 0);
3246 show_help_options(options, "Per-file main options:", 0,
3247 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
3248 OPT_EXIT, per_file);
3250 show_help_options(options, "Advanced per-file options:",
3251 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
3253 show_help_options(options, "Video options:",
3254 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
3256 show_help_options(options, "Advanced Video options:",
3257 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
3259 show_help_options(options, "Audio options:",
3260 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
3262 show_help_options(options, "Advanced Audio options:",
3263 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
3264 show_help_options(options, "Subtitle options:",
3265 OPT_SUBTITLE, 0, 0);
3268 if (show_avoptions) {
3269 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3270 show_help_children(avcodec_get_class(), flags);
3271 show_help_children(avformat_get_class(), flags);
3273 show_help_children(sws_get_class(), flags);
3275 #if CONFIG_SWRESAMPLE
3276 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
3278 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
3279 show_help_children(av_bsf_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_BSF_PARAM);
3283 void show_usage(void)
3285 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
3286 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3287 av_log(NULL, AV_LOG_INFO, "\n");
3295 static const OptionGroupDef groups[] = {
3296 [GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
3297 [GROUP_INFILE] = { "input url", "i", OPT_INPUT },
3300 static int open_files(OptionGroupList *l, const char *inout,
3301 int (*open_file)(OptionsContext*, const char*))
3305 for (i = 0; i < l->nb_groups; i++) {
3306 OptionGroup *g = &l->groups[i];
3312 ret = parse_optgroup(&o, g);
3314 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3315 "%s.\n", inout, g->arg);
3320 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3321 ret = open_file(&o, g->arg);
3324 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3328 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3334 int ffmpeg_parse_options(int argc, char **argv)
3336 OptionParseContext octx;
3340 memset(&octx, 0, sizeof(octx));
3342 /* split the commandline into an internal representation */
3343 ret = split_commandline(&octx, argc, argv, options, groups,
3344 FF_ARRAY_ELEMS(groups));
3346 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3350 /* apply global options */
3351 ret = parse_optgroup(NULL, &octx.global_opts);
3353 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3357 /* configure terminal and setup signal handlers */
3360 /* open input files */
3361 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3363 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3367 /* create the complex filtergraphs */
3368 ret = init_complex_filters();
3370 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3374 /* open output files */
3375 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3377 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3381 check_filter_outputs();
3384 uninit_parse_context(&octx);
3386 av_strerror(ret, error, sizeof(error));
3387 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3392 static int opt_progress(void *optctx, const char *opt, const char *arg)
3394 AVIOContext *avio = NULL;
3397 if (!strcmp(arg, "-"))
3399 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3401 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3402 arg, av_err2str(ret));
3405 progress_avio = avio;
3409 #define OFFSET(x) offsetof(OptionsContext, x)
3410 const OptionDef options[] = {
3412 CMDUTILS_COMMON_OPTIONS
3413 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3414 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3415 "force format", "fmt" },
3416 { "y", OPT_BOOL, { &file_overwrite },
3417 "overwrite output files" },
3418 { "n", OPT_BOOL, { &no_file_overwrite },
3419 "never overwrite output files" },
3420 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3421 "Ignore unknown stream types" },
3422 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
3423 "Copy unknown stream types" },
3424 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3425 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3426 "codec name", "codec" },
3427 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3428 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3429 "codec name", "codec" },
3430 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3431 OPT_OUTPUT, { .off = OFFSET(presets) },
3432 "preset name", "preset" },
3433 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3434 OPT_OUTPUT, { .func_arg = opt_map },
3435 "set input stream mapping",
3436 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3437 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3438 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3439 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3440 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3441 "set metadata information of outfile from infile",
3442 "outfile[,metadata]:infile[,metadata]" },
3443 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3444 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3445 "set chapters mapping", "input_file_index" },
3446 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3447 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3448 "record or transcode \"duration\" seconds of audio/video",
3450 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3451 "record or transcode stop time", "time_stop" },
3452 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3453 "set the limit file size in bytes", "limit_size" },
3454 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3455 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3456 "set the start time offset", "time_off" },
3457 { "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3458 OPT_INPUT, { .off = OFFSET(start_time_eof) },
3459 "set the start time offset relative to EOF", "time_off" },
3460 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3461 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3462 "enable/disable seeking by timestamp with -ss" },
3463 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3464 OPT_INPUT, { .off = OFFSET(accurate_seek) },
3465 "enable/disable accurate seeking with -ss" },
3466 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3467 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3468 "set the input ts offset", "time_off" },
3469 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3470 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3471 "set the input ts scale", "scale" },
3472 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3473 "set the recording timestamp ('now' to set the current time)", "time" },
3474 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3475 "add metadata", "string=string" },
3476 { "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3477 "add program with specified streams", "title=string:st=number..." },
3478 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3479 OPT_OUTPUT, { .func_arg = opt_data_frames },
3480 "set the number of data frames to output", "number" },
3481 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3482 "add timings for benchmarking" },
3483 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3484 "add timings for each task" },
3485 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3486 "write program-readable progress information", "url" },
3487 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3488 "enable or disable interaction on standard input" },
3489 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3490 "set max runtime in seconds in CPU user time", "limit" },
3491 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3492 "dump each input packet" },
3493 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3494 "when dumping packets, also dump the payload" },
3495 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3496 OPT_INPUT, { .off = OFFSET(rate_emu) },
3497 "read input at native frame rate", "" },
3498 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3499 "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3500 "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3501 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3502 "video sync method", "" },
3503 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3504 "frame drop threshold", "" },
3505 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3506 "audio sync method", "" },
3507 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3508 "audio drift threshold", "threshold" },
3509 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
3510 "copy timestamps" },
3511 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3512 "shift input timestamps to start at 0 when using copyts" },
3513 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
3514 "copy input stream time base when stream copying", "mode" },
3515 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3516 OPT_OUTPUT, { .off = OFFSET(shortest) },
3517 "finish encoding within shortest input" },
3518 { "bitexact", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3519 OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(bitexact) },
3521 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3522 OPT_OUTPUT, { .off = OFFSET(apad) },
3524 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3525 "timestamp discontinuity delta threshold", "threshold" },
3526 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3527 "timestamp error delta threshold", "threshold" },
3528 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3529 "exit on error", "error" },
3530 { "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3531 "abort on the specified condition flags", "flags" },
3532 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3533 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3534 "copy initial non-keyframes" },
3535 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3536 "copy or discard frames before start time" },
3537 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3538 "set the number of frames to output", "number" },
3539 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3540 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3541 "force codec tag/fourcc", "fourcc/tag" },
3542 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3543 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3544 "use fixed quality scale (VBR)", "q" },
3545 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3546 OPT_OUTPUT, { .func_arg = opt_qscale },
3547 "use fixed quality scale (VBR)", "q" },
3548 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3549 "set profile", "profile" },
3550 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3551 "set stream filtergraph", "filter_graph" },
3552 { "filter_threads", HAS_ARG | OPT_INT, { &filter_nbthreads },
3553 "number of non-complex filter threads" },
3554 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3555 "read stream filtergraph description from a file", "filename" },
3556 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3557 "reinit filtergraph on input parameter changes", "" },
3558 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3559 "create a complex filtergraph", "graph_description" },
3560 { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads },
3561 "number of threads for -filter_complex" },
3562 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3563 "create a complex filtergraph", "graph_description" },
3564 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3565 "read complex filtergraph description from a file", "filename" },
3566 { "auto_conversion_filters", OPT_BOOL | OPT_EXPERT, { &auto_conversion_filters },
3567 "enable automatic conversion filters globally" },
3568 { "stats", OPT_BOOL, { &print_stats },
3569 "print progress report during encoding", },
3570 { "stats_period", HAS_ARG | OPT_EXPERT, { .func_arg = opt_stats_period },
3571 "set the period at which ffmpeg updates stats and -progress output", "time" },
3572 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3573 OPT_OUTPUT, { .func_arg = opt_attach },
3574 "add an attachment to the output file", "filename" },
3575 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3576 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3577 "extract an attachment into a file", "filename" },
3578 { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3579 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3580 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3581 "print timestamp debugging info" },
3582 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3583 "ratio of decoding errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.", "maximum error rate" },
3584 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3585 OPT_INPUT, { .off = OFFSET(discard) },
3587 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3588 OPT_OUTPUT, { .off = OFFSET(disposition) },
3589 "disposition", "" },
3590 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3591 { .off = OFFSET(thread_queue_size) },
3592 "set the maximum number of queued packets from the demuxer" },
3593 { "find_stream_info", OPT_BOOL | OPT_PERFILE | OPT_INPUT | OPT_EXPERT, { &find_stream_info },
3594 "read and decode the streams to fill missing information with heuristics" },
3597 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3598 "set the number of video frames to output", "number" },
3599 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3600 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3601 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3602 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3603 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3604 "set frame size (WxH or abbreviation)", "size" },
3605 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3606 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3607 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3608 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3609 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3610 "set pixel format", "format" },
3611 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3612 "set the number of bits per raw sample", "number" },
3613 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3614 "deprecated use -g 1" },
3615 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3617 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3618 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3619 "rate control override for specific intervals", "override" },
3620 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3621 OPT_OUTPUT, { .func_arg = opt_video_codec },
3622 "force video codec ('copy' to copy stream)", "codec" },
3623 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3625 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3627 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3628 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3629 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3630 "select the pass number (1 to 3)", "n" },
3631 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3632 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3633 "select two pass log file name prefix", "prefix" },
3634 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3635 "this option is deprecated, use the yadif filter instead" },
3636 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3637 "calculate PSNR of compressed frames" },
3638 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3639 "dump video coding statistics to file" },
3640 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3641 "dump video coding statistics to file", "file" },
3642 { "vstats_version", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &vstats_version },
3643 "Version of the vstats format to use."},
3644 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3645 "set video filters", "filter_graph" },
3646 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3647 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3648 "specify intra matrix coeffs", "matrix" },
3649 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3650 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3651 "specify inter matrix coeffs", "matrix" },
3652 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3653 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3654 "specify intra matrix coeffs", "matrix" },
3655 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3656 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3657 "top=1/bottom=0/auto=-1 field first", "" },
3658 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3659 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3660 "force video tag/fourcc", "fourcc/tag" },
3661 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3662 "show QP histogram" },
3663 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3664 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3665 "force the selected framerate, disable the best supported framerate selection" },
3666 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3667 OPT_OUTPUT, { .func_arg = opt_streamid },
3668 "set the value of an outfile streamid", "streamIndex:value" },
3669 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3670 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3671 "force key frames at specified timestamps", "timestamps" },
3672 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3673 "audio bitrate (please use -b:a)", "bitrate" },
3674 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3675 "video bitrate (please use -b:v)", "bitrate" },
3676 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3677 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3678 "use HW accelerated decoding", "hwaccel name" },
3679 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3680 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3681 "select a device for HW acceleration", "devicename" },
3682 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3683 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
3684 "select output format used with HW accelerated decoding", "format" },
3685 #if CONFIG_VIDEOTOOLBOX
3686 { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3688 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3689 "show available HW acceleration methods" },
3690 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3691 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3692 "automatically insert correct rotate filters" },
3693 { "autoscale", HAS_ARG | OPT_BOOL | OPT_SPEC |
3694 OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(autoscale) },
3695 "automatically insert a scale filter at the end of the filter graph" },
3698 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3699 "set the number of audio frames to output", "number" },
3700 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3701 "set audio quality (codec-specific)", "quality", },
3702 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3703 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3704 "set audio sampling rate (in Hz)", "rate" },
3705 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3706 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3707 "set number of audio channels", "channels" },
3708 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3710 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3711 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3712 "force audio codec ('copy' to copy stream)", "codec" },
3713 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3714 OPT_OUTPUT, { .func_arg = opt_old2new },
3715 "force audio tag/fourcc", "fourcc/tag" },
3716 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3717 "change audio volume (256=normal)" , "volume" },
3718 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3719 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3720 "set sample format", "format" },
3721 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3722 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3723 "set channel layout", "layout" },
3724 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3725 "set audio filters", "filter_graph" },
3726 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3727 "set the maximum number of channels to try to guess the channel layout" },
3729 /* subtitle options */
3730 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3731 "disable subtitle" },
3732 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3733 "force subtitle codec ('copy' to copy stream)", "codec" },
3734 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3735 , "force subtitle tag/fourcc", "fourcc/tag" },
3736 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3737 "fix subtitles duration" },
3738 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3739 "set canvas size (WxH or abbreviation)", "size" },
3742 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3743 "deprecated, use -channel", "channel" },
3744 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3745 "deprecated, use -standard", "standard" },
3746 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3749 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3750 "set the maximum demux-decode delay", "seconds" },
3751 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3752 "set the initial demux-decode delay", "seconds" },
3753 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3754 "specify a file in which to print sdp information", "file" },
3756 { "time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(time_bases) },
3757 "set the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)", "ratio" },
3758 { "enc_time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(enc_time_bases) },
3759 "set the desired time base for the encoder (1:24, 1:48000 or 0.04166, 2.0833e-5). "
3760 "two special values are defined - "
3761 "0 = use frame rate (video) or sample rate (audio),"
3762 "-1 = match source time base", "ratio" },
3764 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3765 "A comma-separated list of bitstream filters", "bitstream_filters" },
3766 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3767 "deprecated", "audio bitstream_filters" },
3768 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3769 "deprecated", "video bitstream_filters" },
3771 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3772 "set the audio options to the indicated preset", "preset" },
3773 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3774 "set the video options to the indicated preset", "preset" },
3775 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3776 "set the subtitle options to the indicated preset", "preset" },
3777 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3778 "set options from indicated preset file", "filename" },
3780 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
3781 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
3782 { "muxing_queue_data_threshold", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(muxing_queue_data_threshold) },
3783 "set the threshold after which max_muxing_queue_size is taken into account", "bytes" },
3785 /* data codec support */
3786 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3787 "force data codec ('copy' to copy stream)", "codec" },
3788 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3792 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
3793 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
3797 { "qsv_device", HAS_ARG | OPT_STRING | OPT_EXPERT, { &qsv_device },
3798 "set QSV hardware device (DirectX adapter index, DRM path or X11 display name)", "device"},
3801 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
3802 "initialise hardware device", "args" },
3803 { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device },
3804 "set hardware device used when filtering", "device" },