3 * ffmpeg option parsing
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavformat/avformat.h"
29 #include "libavcodec/avcodec.h"
31 #include "libavfilter/avfilter.h"
33 #include "libavutil/avassert.h"
34 #include "libavutil/avstring.h"
35 #include "libavutil/avutil.h"
36 #include "libavutil/channel_layout.h"
37 #include "libavutil/intreadwrite.h"
38 #include "libavutil/fifo.h"
39 #include "libavutil/mathematics.h"
40 #include "libavutil/opt.h"
41 #include "libavutil/parseutils.h"
42 #include "libavutil/pixdesc.h"
43 #include "libavutil/pixfmt.h"
45 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
47 #define SPECIFIER_OPT_FMT_str "%s"
48 #define SPECIFIER_OPT_FMT_i "%i"
49 #define SPECIFIER_OPT_FMT_i64 "%"PRId64
50 #define SPECIFIER_OPT_FMT_ui64 "%"PRIu64
51 #define SPECIFIER_OPT_FMT_f "%f"
52 #define SPECIFIER_OPT_FMT_dbl "%lf"
54 static const char *opt_name_codec_names[] = {"c", "codec", "acodec", "vcodec", "scodec", "dcodec", NULL};
55 static const char *opt_name_audio_channels[] = {"ac", NULL};
56 static const char *opt_name_audio_sample_rate[] = {"ar", NULL};
57 static const char *opt_name_frame_rates[] = {"r", NULL};
58 static const char *opt_name_frame_sizes[] = {"s", NULL};
59 static const char *opt_name_frame_pix_fmts[] = {"pix_fmt", NULL};
60 static const char *opt_name_ts_scale[] = {"itsscale", NULL};
61 static const char *opt_name_hwaccels[] = {"hwaccel", NULL};
62 static const char *opt_name_hwaccel_devices[] = {"hwaccel_device", NULL};
63 static const char *opt_name_hwaccel_output_formats[] = {"hwaccel_output_format", NULL};
64 static const char *opt_name_autorotate[] = {"autorotate", NULL};
65 static const char *opt_name_max_frames[] = {"frames", "aframes", "vframes", "dframes", NULL};
66 static const char *opt_name_bitstream_filters[] = {"bsf", "absf", "vbsf", NULL};
67 static const char *opt_name_codec_tags[] = {"tag", "atag", "vtag", "stag", NULL};
68 static const char *opt_name_sample_fmts[] = {"sample_fmt", NULL};
69 static const char *opt_name_qscale[] = {"q", "qscale", NULL};
70 static const char *opt_name_forced_key_frames[] = {"forced_key_frames", NULL};
71 static const char *opt_name_force_fps[] = {"force_fps", NULL};
72 static const char *opt_name_frame_aspect_ratios[] = {"aspect", NULL};
73 static const char *opt_name_rc_overrides[] = {"rc_override", NULL};
74 static const char *opt_name_intra_matrices[] = {"intra_matrix", NULL};
75 static const char *opt_name_inter_matrices[] = {"inter_matrix", NULL};
76 static const char *opt_name_chroma_intra_matrices[] = {"chroma_intra_matrix", NULL};
77 static const char *opt_name_top_field_first[] = {"top", NULL};
78 static const char *opt_name_presets[] = {"pre", "apre", "vpre", "spre", NULL};
79 static const char *opt_name_copy_initial_nonkeyframes[] = {"copyinkfr", NULL};
80 static const char *opt_name_copy_prior_start[] = {"copypriorss", NULL};
81 static const char *opt_name_filters[] = {"filter", "af", "vf", NULL};
82 static const char *opt_name_filter_scripts[] = {"filter_script", NULL};
83 static const char *opt_name_reinit_filters[] = {"reinit_filter", NULL};
84 static const char *opt_name_fix_sub_duration[] = {"fix_sub_duration", NULL};
85 static const char *opt_name_canvas_sizes[] = {"canvas_size", NULL};
86 static const char *opt_name_pass[] = {"pass", NULL};
87 static const char *opt_name_passlogfiles[] = {"passlogfile", NULL};
88 static const char *opt_name_max_muxing_queue_size[] = {"max_muxing_queue_size", NULL};
89 static const char *opt_name_guess_layout_max[] = {"guess_layout_max", NULL};
90 static const char *opt_name_apad[] = {"apad", NULL};
91 static const char *opt_name_discard[] = {"discard", NULL};
92 static const char *opt_name_disposition[] = {"disposition", NULL};
93 static const char *opt_name_time_bases[] = {"time_base", NULL};
94 static const char *opt_name_enc_time_bases[] = {"enc_time_base", NULL};
96 #define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\
98 char namestr[128] = "";\
99 const char *spec = so->specifier && so->specifier[0] ? so->specifier : "";\
100 for (i = 0; opt_name_##name[i]; i++)\
101 av_strlcatf(namestr, sizeof(namestr), "-%s%s", opt_name_##name[i], opt_name_##name[i+1] ? (opt_name_##name[i+2] ? ", " : " or ") : "");\
102 av_log(NULL, AV_LOG_WARNING, "Multiple %s options specified for stream %d, only the last option '-%s%s%s "SPECIFIER_OPT_FMT_##type"' will be used.\n",\
103 namestr, st->index, opt_name_##name[0], spec[0] ? ":" : "", spec, so->u.type);\
106 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
108 int i, ret, matches = 0;\
110 for (i = 0; i < o->nb_ ## name; i++) {\
111 char *spec = o->name[i].specifier;\
112 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0) {\
113 outvar = o->name[i].u.type;\
120 WARN_MULTIPLE_OPT_USAGE(name, type, so, st);\
123 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
126 for (i = 0; i < o->nb_ ## name; i++) {\
127 char *spec = o->name[i].specifier;\
128 if (!strcmp(spec, mediatype))\
129 outvar = o->name[i].u.type;\
133 const HWAccel hwaccels[] = {
134 #if CONFIG_VIDEOTOOLBOX
135 { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
138 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
142 AVBufferRef *hw_device_ctx;
143 HWDevice *filter_hw_device;
145 char *vstats_filename;
148 float audio_drift_threshold = 0.1;
149 float dts_delta_threshold = 10;
150 float dts_error_threshold = 3600*30;
152 int audio_volume = 256;
153 int audio_sync_method = 0;
154 int video_sync_method = VSYNC_AUTO;
155 float frame_drop_threshold = 0;
156 int do_deinterlace = 0;
157 int do_benchmark = 0;
158 int do_benchmark_all = 0;
162 int start_at_zero = 0;
165 int exit_on_error = 0;
166 int abort_on_flags = 0;
167 int print_stats = -1;
169 int stdin_interaction = 1;
170 int frame_bits_per_raw_sample = 0;
171 float max_error_rate = 2.0/3;
172 int filter_nbthreads = 0;
173 int filter_complex_nbthreads = 0;
174 int vstats_version = 2;
177 static int intra_only = 0;
178 static int file_overwrite = 0;
179 static int no_file_overwrite = 0;
180 static int do_psnr = 0;
181 static int input_sync;
182 static int input_stream_potentially_available = 0;
183 static int ignore_unknown_streams = 0;
184 static int copy_unknown_streams = 0;
185 static int find_stream_info = 1;
187 static void uninit_options(OptionsContext *o)
189 const OptionDef *po = options;
192 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
194 void *dst = (uint8_t*)o + po->u.off;
196 if (po->flags & OPT_SPEC) {
197 SpecifierOpt **so = dst;
198 int i, *count = (int*)(so + 1);
199 for (i = 0; i < *count; i++) {
200 av_freep(&(*so)[i].specifier);
201 if (po->flags & OPT_STRING)
202 av_freep(&(*so)[i].u.str);
206 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
211 for (i = 0; i < o->nb_stream_maps; i++)
212 av_freep(&o->stream_maps[i].linklabel);
213 av_freep(&o->stream_maps);
214 av_freep(&o->audio_channel_maps);
215 av_freep(&o->streamid_map);
216 av_freep(&o->attachments);
219 static void init_options(OptionsContext *o)
221 memset(o, 0, sizeof(*o));
223 o->stop_time = INT64_MAX;
224 o->mux_max_delay = 0.7;
225 o->start_time = AV_NOPTS_VALUE;
226 o->start_time_eof = AV_NOPTS_VALUE;
227 o->recording_time = INT64_MAX;
228 o->limit_filesize = UINT64_MAX;
229 o->chapters_input_file = INT_MAX;
230 o->accurate_seek = 1;
233 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
235 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
238 printf("Hardware acceleration methods:\n");
239 while ((type = av_hwdevice_iterate_types(type)) !=
240 AV_HWDEVICE_TYPE_NONE)
241 printf("%s\n", av_hwdevice_get_type_name(type));
242 for (i = 0; hwaccels[i].name; i++)
243 printf("%s\n", hwaccels[i].name);
248 /* return a copy of the input with the stream specifiers removed from the keys */
249 static AVDictionary *strip_specifiers(AVDictionary *dict)
251 AVDictionaryEntry *e = NULL;
252 AVDictionary *ret = NULL;
254 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
255 char *p = strchr(e->key, ':');
259 av_dict_set(&ret, e->key, e->value, 0);
266 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
268 static const AVOption opts[] = {
269 { "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
270 { "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
273 static const AVClass class = {
275 .item_name = av_default_item_name,
277 .version = LIBAVUTIL_VERSION_INT,
279 const AVClass *pclass = &class;
281 return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
284 static int opt_sameq(void *optctx, const char *opt, const char *arg)
286 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
287 "If you are looking for an option to preserve the quality (which is not "
288 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
290 return AVERROR(EINVAL);
293 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
295 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
296 return opt_default(optctx, "channel", arg);
299 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
301 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
302 return opt_default(optctx, "standard", arg);
305 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
307 OptionsContext *o = optctx;
308 return parse_option(o, "codec:a", arg, options);
311 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
313 OptionsContext *o = optctx;
314 return parse_option(o, "codec:v", arg, options);
317 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
319 OptionsContext *o = optctx;
320 return parse_option(o, "codec:s", arg, options);
323 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
325 OptionsContext *o = optctx;
326 return parse_option(o, "codec:d", arg, options);
329 static int opt_map(void *optctx, const char *opt, const char *arg)
331 OptionsContext *o = optctx;
333 int i, negative = 0, file_idx, disabled = 0;
334 int sync_file_idx = -1, sync_stream_idx = 0;
343 map = av_strdup(arg);
345 return AVERROR(ENOMEM);
347 /* parse sync stream first, just pick first matching stream */
348 if (sync = strchr(map, ',')) {
350 sync_file_idx = strtol(sync + 1, &sync, 0);
351 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
352 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
357 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
358 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
359 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
363 if (i == input_files[sync_file_idx]->nb_streams) {
364 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
365 "match any streams.\n", arg);
368 if (input_streams[input_files[sync_file_idx]->ist_index + sync_stream_idx]->user_set_discard == AVDISCARD_ALL) {
369 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s matches a disabled input "
377 /* this mapping refers to lavfi output */
378 const char *c = map + 1;
379 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
380 m = &o->stream_maps[o->nb_stream_maps - 1];
381 m->linklabel = av_get_token(&c, "]");
383 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
387 if (allow_unused = strchr(map, '?'))
389 file_idx = strtol(map, &p, 0);
390 if (file_idx >= nb_input_files || file_idx < 0) {
391 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
395 /* disable some already defined maps */
396 for (i = 0; i < o->nb_stream_maps; i++) {
397 m = &o->stream_maps[i];
398 if (file_idx == m->file_index &&
399 check_stream_specifier(input_files[m->file_index]->ctx,
400 input_files[m->file_index]->ctx->streams[m->stream_index],
401 *p == ':' ? p + 1 : p) > 0)
405 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
406 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
407 *p == ':' ? p + 1 : p) <= 0)
409 if (input_streams[input_files[file_idx]->ist_index + i]->user_set_discard == AVDISCARD_ALL) {
413 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
414 m = &o->stream_maps[o->nb_stream_maps - 1];
416 m->file_index = file_idx;
419 if (sync_file_idx >= 0) {
420 m->sync_file_index = sync_file_idx;
421 m->sync_stream_index = sync_stream_idx;
423 m->sync_file_index = file_idx;
424 m->sync_stream_index = i;
431 av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
432 } else if (disabled) {
433 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches disabled streams.\n"
434 "To ignore this, add a trailing '?' to the map.\n", arg);
437 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
438 "To ignore this, add a trailing '?' to the map.\n", arg);
447 static int opt_attach(void *optctx, const char *opt, const char *arg)
449 OptionsContext *o = optctx;
450 GROW_ARRAY(o->attachments, o->nb_attachments);
451 o->attachments[o->nb_attachments - 1] = arg;
455 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
457 OptionsContext *o = optctx;
463 mapchan = av_strdup(arg);
465 return AVERROR(ENOMEM);
467 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
468 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
470 /* muted channel syntax */
471 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
472 if ((n == 1 || n == 3) && m->channel_idx == -1) {
473 m->file_idx = m->stream_idx = -1;
475 m->ofile_idx = m->ostream_idx = -1;
481 n = sscanf(arg, "%d.%d.%d:%d.%d",
482 &m->file_idx, &m->stream_idx, &m->channel_idx,
483 &m->ofile_idx, &m->ostream_idx);
485 if (n != 3 && n != 5) {
486 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
487 "[file.stream.channel|-1][:syncfile:syncstream]\n");
491 if (n != 5) // only file.stream.channel specified
492 m->ofile_idx = m->ostream_idx = -1;
495 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
496 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
500 if (m->stream_idx < 0 ||
501 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
502 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
503 m->file_idx, m->stream_idx);
506 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
507 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
508 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
509 m->file_idx, m->stream_idx);
512 /* allow trailing ? to map_channel */
513 if (allow_unused = strchr(mapchan, '?'))
515 if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels ||
516 input_streams[input_files[m->file_idx]->ist_index + m->stream_idx]->user_set_discard == AVDISCARD_ALL) {
518 av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
519 m->file_idx, m->stream_idx, m->channel_idx);
521 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n"
522 "To ignore this, add a trailing '?' to the map_channel.\n",
523 m->file_idx, m->stream_idx, m->channel_idx);
532 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
534 av_free(sdp_filename);
535 sdp_filename = av_strdup(arg);
540 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
543 const char *prefix = "vaapi:";
546 tmp = av_asprintf("%s%s", prefix, arg);
548 return AVERROR(ENOMEM);
549 err = hw_device_init_from_string(tmp, &dev);
553 hw_device_ctx = av_buffer_ref(dev->device_ref);
555 return AVERROR(ENOMEM);
560 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
562 if (!strcmp(arg, "list")) {
563 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
564 printf("Supported hardware device types:\n");
565 while ((type = av_hwdevice_iterate_types(type)) !=
566 AV_HWDEVICE_TYPE_NONE)
567 printf("%s\n", av_hwdevice_get_type_name(type));
571 return hw_device_init_from_string(arg, NULL);
575 static int opt_filter_hw_device(void *optctx, const char *opt, const char *arg)
577 if (filter_hw_device) {
578 av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
579 return AVERROR(EINVAL);
581 filter_hw_device = hw_device_get_by_name(arg);
582 if (!filter_hw_device) {
583 av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg);
584 return AVERROR(EINVAL);
590 * Parse a metadata specifier passed as 'arg' parameter.
591 * @param arg metadata string to parse
592 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
593 * @param index for type c/p, chapter/program index is written here
594 * @param stream_spec for type s, the stream specifier is written here
596 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
604 if (*(++arg) && *arg != ':') {
605 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
608 *stream_spec = *arg == ':' ? arg + 1 : "";
613 *index = strtol(++arg, NULL, 0);
616 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
623 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
625 AVDictionary **meta_in = NULL;
626 AVDictionary **meta_out = NULL;
628 char type_in, type_out;
629 const char *istream_spec = NULL, *ostream_spec = NULL;
630 int idx_in = 0, idx_out = 0;
632 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
633 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
636 if (type_out == 'g' || !*outspec)
637 o->metadata_global_manual = 1;
638 if (type_out == 's' || !*outspec)
639 o->metadata_streams_manual = 1;
640 if (type_out == 'c' || !*outspec)
641 o->metadata_chapters_manual = 1;
645 if (type_in == 'g' || type_out == 'g')
646 o->metadata_global_manual = 1;
647 if (type_in == 's' || type_out == 's')
648 o->metadata_streams_manual = 1;
649 if (type_in == 'c' || type_out == 'c')
650 o->metadata_chapters_manual = 1;
652 /* ic is NULL when just disabling automatic mappings */
656 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
657 if ((index) < 0 || (index) >= (nb_elems)) {\
658 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
663 #define SET_DICT(type, meta, context, index)\
666 meta = &context->metadata;\
669 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
670 meta = &context->chapters[index]->metadata;\
673 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
674 meta = &context->programs[index]->metadata;\
677 break; /* handled separately below */ \
678 default: av_assert0(0);\
681 SET_DICT(type_in, meta_in, ic, idx_in);
682 SET_DICT(type_out, meta_out, oc, idx_out);
684 /* for input streams choose first matching stream */
685 if (type_in == 's') {
686 for (i = 0; i < ic->nb_streams; i++) {
687 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
688 meta_in = &ic->streams[i]->metadata;
694 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
699 if (type_out == 's') {
700 for (i = 0; i < oc->nb_streams; i++) {
701 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
702 meta_out = &oc->streams[i]->metadata;
703 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
708 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
713 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
715 OptionsContext *o = optctx;
717 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
718 struct tm time = *gmtime((time_t*)&recording_timestamp);
719 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
721 parse_option(o, "metadata", buf, options);
723 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
724 "tag instead.\n", opt);
728 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
730 const AVCodecDescriptor *desc;
731 const char *codec_string = encoder ? "encoder" : "decoder";
735 avcodec_find_encoder_by_name(name) :
736 avcodec_find_decoder_by_name(name);
738 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
739 codec = encoder ? avcodec_find_encoder(desc->id) :
740 avcodec_find_decoder(desc->id);
742 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
743 codec_string, codec->name, desc->name);
747 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
750 if (codec->type != type) {
751 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
757 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
759 char *codec_name = NULL;
761 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
763 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
764 st->codecpar->codec_id = codec->id;
767 return avcodec_find_decoder(st->codecpar->codec_id);
770 /* Add all the streams from the given input file to the global
771 * list of input streams. */
772 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
776 for (i = 0; i < ic->nb_streams; i++) {
777 AVStream *st = ic->streams[i];
778 AVCodecParameters *par = st->codecpar;
779 InputStream *ist = av_mallocz(sizeof(*ist));
780 char *framerate = NULL, *hwaccel_device = NULL;
781 const char *hwaccel = NULL;
782 char *hwaccel_output_format = NULL;
783 char *codec_tag = NULL;
785 char *discard_str = NULL;
786 const AVClass *cc = avcodec_get_class();
787 const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL, 0, 0);
792 GROW_ARRAY(input_streams, nb_input_streams);
793 input_streams[nb_input_streams - 1] = ist;
796 ist->file_index = nb_input_files;
798 st->discard = AVDISCARD_ALL;
800 ist->min_pts = INT64_MAX;
801 ist->max_pts = INT64_MIN;
804 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
807 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
809 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
811 uint32_t tag = strtol(codec_tag, &next, 0);
813 tag = AV_RL32(codec_tag);
814 st->codecpar->codec_tag = tag;
817 ist->dec = choose_decoder(o, ic, st);
818 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
820 ist->reinit_filters = -1;
821 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
823 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
824 ist->user_set_discard = AVDISCARD_NONE;
826 if ((o->video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ||
827 (o->audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ||
828 (o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) ||
829 (o->data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA))
830 ist->user_set_discard = AVDISCARD_ALL;
832 if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
833 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
838 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
840 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
842 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
846 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
848 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
853 ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
855 switch (par->codec_type) {
856 case AVMEDIA_TYPE_VIDEO:
858 ist->dec = avcodec_find_decoder(par->codec_id);
860 if (st->codec->lowres) {
861 ist->dec_ctx->lowres = st->codec->lowres;
862 ist->dec_ctx->width = st->codec->width;
863 ist->dec_ctx->height = st->codec->height;
864 ist->dec_ctx->coded_width = st->codec->coded_width;
865 ist->dec_ctx->coded_height = st->codec->coded_height;
869 // avformat_find_stream_info() doesn't set this for us anymore.
870 ist->dec_ctx->framerate = st->avg_frame_rate;
872 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
873 if (framerate && av_parse_video_rate(&ist->framerate,
875 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
880 ist->top_field_first = -1;
881 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
883 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
884 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
885 hwaccel_output_format, ic, st);
887 if (!hwaccel_output_format && hwaccel && !strcmp(hwaccel, "cuvid")) {
888 av_log(NULL, AV_LOG_WARNING,
889 "WARNING: defaulting hwaccel_output_format to cuda for compatibility "
890 "with old commandlines. This behaviour is DEPRECATED and will be removed "
891 "in the future. Please explicitly set \"-hwaccel_output_format cuda\".\n");
892 ist->hwaccel_output_format = AV_PIX_FMT_CUDA;
893 } else if (hwaccel_output_format) {
894 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
895 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
896 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
897 "format: %s", hwaccel_output_format);
900 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
904 // The NVDEC hwaccels use a CUDA device, so remap the name here.
905 if (!strcmp(hwaccel, "nvdec") || !strcmp(hwaccel, "cuvid"))
908 if (!strcmp(hwaccel, "none"))
909 ist->hwaccel_id = HWACCEL_NONE;
910 else if (!strcmp(hwaccel, "auto"))
911 ist->hwaccel_id = HWACCEL_AUTO;
913 enum AVHWDeviceType type;
915 for (i = 0; hwaccels[i].name; i++) {
916 if (!strcmp(hwaccels[i].name, hwaccel)) {
917 ist->hwaccel_id = hwaccels[i].id;
922 if (!ist->hwaccel_id) {
923 type = av_hwdevice_find_type_by_name(hwaccel);
924 if (type != AV_HWDEVICE_TYPE_NONE) {
925 ist->hwaccel_id = HWACCEL_GENERIC;
926 ist->hwaccel_device_type = type;
930 if (!ist->hwaccel_id) {
931 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
933 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
934 type = AV_HWDEVICE_TYPE_NONE;
935 while ((type = av_hwdevice_iterate_types(type)) !=
936 AV_HWDEVICE_TYPE_NONE)
937 av_log(NULL, AV_LOG_FATAL, "%s ",
938 av_hwdevice_get_type_name(type));
939 for (i = 0; hwaccels[i].name; i++)
940 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
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 > 0 ? o->thread_queue_size : 8;
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);
1476 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1479 if (!buf[0] || buf[0] == '#') {
1483 if (!(arg = strchr(buf, '='))) {
1484 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1488 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1490 } while (!s->eof_reached);
1494 av_log(NULL, AV_LOG_FATAL,
1495 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1496 preset, ost->file_index, ost->index);
1500 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1505 ost->enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
1507 MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
1510 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1511 q.num <= 0 || q.den <= 0) {
1512 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1518 MATCH_PER_STREAM_OPT(enc_time_bases, str, time_base, oc, st);
1521 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1523 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1526 ost->enc_timebase = q;
1529 ost->max_frames = INT64_MAX;
1530 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1531 for (i = 0; i<o->nb_max_frames; i++) {
1532 char *p = o->max_frames[i].specifier;
1533 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1534 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1539 ost->copy_prior_start = -1;
1540 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1542 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1543 while (bsfs && *bsfs) {
1544 const AVBitStreamFilter *filter;
1545 char *bsf, *bsf_options_str, *bsf_name;
1547 bsf = av_get_token(&bsfs, ",");
1550 bsf_name = av_strtok(bsf, "=", &bsf_options_str);
1554 filter = av_bsf_get_by_name(bsf_name);
1556 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
1560 ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
1561 ost->nb_bitstream_filters + 1,
1562 sizeof(*ost->bsf_ctx));
1566 ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
1568 av_log(NULL, AV_LOG_ERROR, "Error allocating a bitstream filter context\n");
1572 ost->nb_bitstream_filters++;
1574 if (bsf_options_str && filter->priv_class) {
1575 const AVOption *opt = av_opt_next(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, NULL);
1576 const char * shorthand[2] = {NULL};
1579 shorthand[0] = opt->name;
1581 ret = av_opt_set_from_string(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, bsf_options_str, shorthand, "=", ":");
1583 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
1593 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1595 uint32_t tag = strtol(codec_tag, &next, 0);
1597 tag = AV_RL32(codec_tag);
1598 ost->st->codecpar->codec_tag =
1599 ost->enc_ctx->codec_tag = tag;
1602 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1604 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1605 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1608 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1609 ost->disposition = av_strdup(ost->disposition);
1611 ost->max_muxing_queue_size = 128;
1612 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1613 ost->max_muxing_queue_size *= sizeof(AVPacket);
1615 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1616 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1618 av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1620 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1621 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1622 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1624 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1626 ost->source_index = source_index;
1627 if (source_index >= 0) {
1628 ost->sync_ist = input_streams[source_index];
1629 input_streams[source_index]->discard = 0;
1630 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1632 ost->last_mux_dts = AV_NOPTS_VALUE;
1634 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1635 if (!ost->muxing_queue)
1641 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1644 const char *p = str;
1651 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1658 /* read file contents into a string */
1659 static uint8_t *read_file(const char *filename)
1661 AVIOContext *pb = NULL;
1662 AVIOContext *dyn_buf = NULL;
1663 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1664 uint8_t buf[1024], *str;
1667 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1671 ret = avio_open_dyn_buf(&dyn_buf);
1676 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1677 avio_write(dyn_buf, buf, ret);
1678 avio_w8(dyn_buf, 0);
1681 ret = avio_close_dyn_buf(dyn_buf, &str);
1687 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1690 AVStream *st = ost->st;
1692 if (ost->filters_script && ost->filters) {
1693 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1694 "output stream #%d:%d.\n", nb_output_files, st->index);
1698 if (ost->filters_script)
1699 return read_file(ost->filters_script);
1700 else if (ost->filters)
1701 return av_strdup(ost->filters);
1703 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1707 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1708 const OutputStream *ost, enum AVMediaType type)
1710 if (ost->filters_script || ost->filters) {
1711 av_log(NULL, AV_LOG_ERROR,
1712 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1713 "Filtering and streamcopy cannot be used together.\n",
1714 ost->filters ? "Filtergraph" : "Filtergraph script",
1715 ost->filters ? ost->filters : ost->filters_script,
1716 av_get_media_type_string(type), ost->file_index, ost->index);
1721 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1725 AVCodecContext *video_enc;
1726 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1728 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1730 video_enc = ost->enc_ctx;
1732 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1733 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1734 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1737 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1738 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1740 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1741 if (frame_aspect_ratio) {
1743 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1744 q.num <= 0 || q.den <= 0) {
1745 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1748 ost->frame_aspect_ratio = q;
1751 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1752 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1754 if (!ost->stream_copy) {
1755 const char *p = NULL;
1756 char *frame_size = NULL;
1757 char *frame_pix_fmt = NULL;
1758 char *intra_matrix = NULL, *inter_matrix = NULL;
1759 char *chroma_intra_matrix = NULL;
1763 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1764 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1765 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1769 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1770 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1771 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1772 ost->keep_pix_fmt = 1;
1773 if (!*++frame_pix_fmt)
1774 frame_pix_fmt = NULL;
1776 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1777 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1780 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1783 video_enc->gop_size = 0;
1784 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1786 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1787 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1790 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1792 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1793 if (chroma_intra_matrix) {
1794 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1796 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1799 video_enc->chroma_intra_matrix = p;
1800 parse_matrix_coeffs(p, chroma_intra_matrix);
1802 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1804 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1805 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1808 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1811 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1812 for (i = 0; p; i++) {
1814 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1816 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1819 video_enc->rc_override =
1820 av_realloc_array(video_enc->rc_override,
1821 i + 1, sizeof(RcOverride));
1822 if (!video_enc->rc_override) {
1823 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1826 video_enc->rc_override[i].start_frame = start;
1827 video_enc->rc_override[i].end_frame = end;
1829 video_enc->rc_override[i].qscale = q;
1830 video_enc->rc_override[i].quality_factor = 1.0;
1833 video_enc->rc_override[i].qscale = 0;
1834 video_enc->rc_override[i].quality_factor = -q/100.0;
1839 video_enc->rc_override_count = i;
1842 video_enc->flags|= AV_CODEC_FLAG_PSNR;
1845 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1848 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1849 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1852 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1853 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1857 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1858 if (ost->logfile_prefix &&
1859 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1863 char logfilename[1024];
1866 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1867 ost->logfile_prefix ? ost->logfile_prefix :
1868 DEFAULT_PASS_LOGFILENAME_PREFIX,
1870 if (!strcmp(ost->enc->name, "libx264")) {
1871 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1873 if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1874 char *logbuffer = read_file(logfilename);
1877 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1881 video_enc->stats_in = logbuffer;
1883 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1884 f = av_fopen_utf8(logfilename, "wb");
1886 av_log(NULL, AV_LOG_FATAL,
1887 "Cannot write log file '%s' for pass-1 encoding: %s\n",
1888 logfilename, strerror(errno));
1896 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1897 if (ost->forced_keyframes)
1898 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1900 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1902 ost->top_field_first = -1;
1903 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1906 ost->avfilter = get_ost_filters(o, oc, ost);
1910 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1913 if (ost->stream_copy)
1914 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1919 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1924 AVCodecContext *audio_enc;
1926 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1929 audio_enc = ost->enc_ctx;
1930 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1932 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1933 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1935 if (!ost->stream_copy) {
1936 char *sample_fmt = NULL;
1938 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1940 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1942 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1943 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1947 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1949 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1950 ost->apad = av_strdup(ost->apad);
1952 ost->avfilter = get_ost_filters(o, oc, ost);
1956 /* check for channel mapping for this audio stream */
1957 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1958 AudioChannelMap *map = &o->audio_channel_maps[n];
1959 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1960 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1963 if (map->channel_idx == -1) {
1965 } else if (ost->source_index < 0) {
1966 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1967 ost->file_index, ost->st->index);
1970 ist = input_streams[ost->source_index];
1973 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1974 if (av_reallocp_array(&ost->audio_channels_map,
1975 ost->audio_channels_mapped + 1,
1976 sizeof(*ost->audio_channels_map)
1980 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1986 if (ost->stream_copy)
1987 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1992 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1996 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1997 if (!ost->stream_copy) {
1998 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
2005 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
2009 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
2010 if (!ost->stream_copy) {
2011 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
2018 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
2020 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
2021 ost->stream_copy = 1;
2026 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
2030 AVCodecContext *subtitle_enc;
2032 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
2034 subtitle_enc = ost->enc_ctx;
2036 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
2038 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
2040 if (!ost->stream_copy) {
2041 char *frame_size = NULL;
2043 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
2044 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
2045 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
2053 /* arg format is "output-stream-index:streamid-value". */
2054 static int opt_streamid(void *optctx, const char *opt, const char *arg)
2056 OptionsContext *o = optctx;
2061 av_strlcpy(idx_str, arg, sizeof(idx_str));
2062 p = strchr(idx_str, ':');
2064 av_log(NULL, AV_LOG_FATAL,
2065 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
2070 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
2071 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
2072 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
2076 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
2078 AVFormatContext *is = ifile->ctx;
2079 AVFormatContext *os = ofile->ctx;
2083 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
2085 return AVERROR(ENOMEM);
2088 for (i = 0; i < is->nb_chapters; i++) {
2089 AVChapter *in_ch = is->chapters[i], *out_ch;
2090 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
2091 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
2092 AV_TIME_BASE_Q, in_ch->time_base);
2093 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
2094 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
2097 if (in_ch->end < ts_off)
2099 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
2102 out_ch = av_mallocz(sizeof(AVChapter));
2104 return AVERROR(ENOMEM);
2106 out_ch->id = in_ch->id;
2107 out_ch->time_base = in_ch->time_base;
2108 out_ch->start = FFMAX(0, in_ch->start - ts_off);
2109 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
2112 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
2114 os->chapters[os->nb_chapters++] = out_ch;
2119 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
2120 AVFormatContext *oc)
2124 switch (ofilter->type) {
2125 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
2126 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
2128 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
2133 ost->source_index = -1;
2134 ost->filter = ofilter;
2137 ofilter->format = -1;
2139 if (ost->stream_copy) {
2140 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
2141 "which is fed from a complex filtergraph. Filtering and streamcopy "
2142 "cannot be used together.\n", ost->file_index, ost->index);
2146 if (ost->avfilter && (ost->filters || ost->filters_script)) {
2147 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
2148 av_log(NULL, AV_LOG_ERROR,
2149 "%s '%s' was specified through the %s option "
2150 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
2151 "%s and -filter_complex cannot be used together for the same stream.\n",
2152 ost->filters ? "Filtergraph" : "Filtergraph script",
2153 ost->filters ? ost->filters : ost->filters_script,
2154 opt, ost->file_index, ost->index, opt);
2158 avfilter_inout_free(&ofilter->out_tmp);
2161 static int init_complex_filters(void)
2165 for (i = 0; i < nb_filtergraphs; i++) {
2166 ret = init_complex_filtergraph(filtergraphs[i]);
2173 static int open_output_file(OptionsContext *o, const char *filename)
2175 AVFormatContext *oc;
2180 AVDictionary *unused_opts = NULL;
2181 AVDictionaryEntry *e = NULL;
2182 int format_flags = 0;
2184 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
2185 o->stop_time = INT64_MAX;
2186 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
2189 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
2190 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
2191 if (o->stop_time <= start_time) {
2192 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
2195 o->recording_time = o->stop_time - start_time;
2199 GROW_ARRAY(output_files, nb_output_files);
2200 of = av_mallocz(sizeof(*of));
2203 output_files[nb_output_files - 1] = of;
2205 of->ost_index = nb_output_streams;
2206 of->recording_time = o->recording_time;
2207 of->start_time = o->start_time;
2208 of->limit_filesize = o->limit_filesize;
2209 of->shortest = o->shortest;
2210 av_dict_copy(&of->opts, o->g->format_opts, 0);
2212 if (!strcmp(filename, "-"))
2215 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
2217 print_error(filename, err);
2222 if (o->recording_time != INT64_MAX)
2223 oc->duration = o->recording_time;
2225 oc->interrupt_callback = int_cb;
2227 e = av_dict_get(o->g->format_opts, "fflags", NULL, 0);
2229 const AVOption *o = av_opt_find(oc, "fflags", NULL, 0, 0);
2230 av_opt_eval_flags(oc, o, e->value, &format_flags);
2233 format_flags |= AVFMT_FLAG_BITEXACT;
2234 oc->flags |= AVFMT_FLAG_BITEXACT;
2237 /* create streams for all unlabeled output pads */
2238 for (i = 0; i < nb_filtergraphs; i++) {
2239 FilterGraph *fg = filtergraphs[i];
2240 for (j = 0; j < fg->nb_outputs; j++) {
2241 OutputFilter *ofilter = fg->outputs[j];
2243 if (!ofilter->out_tmp || ofilter->out_tmp->name)
2246 switch (ofilter->type) {
2247 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
2248 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
2249 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
2251 init_output_filter(ofilter, o, oc);
2255 if (!o->nb_stream_maps) {
2256 char *subtitle_codec_name = NULL;
2257 /* pick the "best" stream of each type */
2259 /* video: highest resolution */
2260 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2261 int area = 0, idx = -1;
2262 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2263 for (i = 0; i < nb_input_streams; i++) {
2265 ist = input_streams[i];
2266 new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames
2267 + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
2268 if (ist->user_set_discard == AVDISCARD_ALL)
2270 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2272 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
2274 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2281 new_video_stream(o, oc, idx);
2284 /* audio: most channels */
2285 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2286 int best_score = 0, idx = -1;
2287 for (i = 0; i < nb_input_streams; i++) {
2289 ist = input_streams[i];
2290 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames
2291 + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
2292 if (ist->user_set_discard == AVDISCARD_ALL)
2294 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
2295 score > best_score) {
2301 new_audio_stream(o, oc, idx);
2304 /* subtitles: pick first */
2305 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2306 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2307 for (i = 0; i < nb_input_streams; i++)
2308 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2309 AVCodecDescriptor const *input_descriptor =
2310 avcodec_descriptor_get(input_streams[i]->st->codecpar->codec_id);
2311 AVCodecDescriptor const *output_descriptor = NULL;
2312 AVCodec const *output_codec =
2313 avcodec_find_encoder(oc->oformat->subtitle_codec);
2314 int input_props = 0, output_props = 0;
2315 if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
2318 output_descriptor = avcodec_descriptor_get(output_codec->id);
2319 if (input_descriptor)
2320 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2321 if (output_descriptor)
2322 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2323 if (subtitle_codec_name ||
2324 input_props & output_props ||
2325 // Map dvb teletext which has neither property to any output subtitle encoder
2326 input_descriptor && output_descriptor &&
2327 (!input_descriptor->props ||
2328 !output_descriptor->props)) {
2329 new_subtitle_stream(o, oc, i);
2334 /* Data only if codec id match */
2335 if (!o->data_disable ) {
2336 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2337 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2338 if (input_streams[i]->user_set_discard == AVDISCARD_ALL)
2340 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
2341 && input_streams[i]->st->codecpar->codec_id == codec_id )
2342 new_data_stream(o, oc, i);
2346 for (i = 0; i < o->nb_stream_maps; i++) {
2347 StreamMap *map = &o->stream_maps[i];
2352 if (map->linklabel) {
2354 OutputFilter *ofilter = NULL;
2357 for (j = 0; j < nb_filtergraphs; j++) {
2358 fg = filtergraphs[j];
2359 for (k = 0; k < fg->nb_outputs; k++) {
2360 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2361 if (out && !strcmp(out->name, map->linklabel)) {
2362 ofilter = fg->outputs[k];
2369 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2370 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2373 init_output_filter(ofilter, o, oc);
2375 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2377 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2378 if (ist->user_set_discard == AVDISCARD_ALL) {
2379 av_log(NULL, AV_LOG_FATAL, "Stream #%d:%d is disabled and cannot be mapped.\n",
2380 map->file_index, map->stream_index);
2383 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
2385 if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
2387 if(o-> video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
2389 if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2393 switch (ist->st->codecpar->codec_type) {
2394 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2395 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2396 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2397 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2398 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2399 case AVMEDIA_TYPE_UNKNOWN:
2400 if (copy_unknown_streams) {
2401 ost = new_unknown_stream (o, oc, src_idx);
2405 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2406 "Cannot map stream #%d:%d - unsupported type.\n",
2407 map->file_index, map->stream_index);
2408 if (!ignore_unknown_streams) {
2409 av_log(NULL, AV_LOG_FATAL,
2410 "If you want unsupported types ignored instead "
2411 "of failing, please use the -ignore_unknown option\n"
2412 "If you want them copied, please use -copy_unknown\n");
2417 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2418 + map->sync_stream_index];
2423 /* handle attached files */
2424 for (i = 0; i < o->nb_attachments; i++) {
2426 uint8_t *attachment;
2430 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2431 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2435 if ((len = avio_size(pb)) <= 0) {
2436 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2440 if (!(attachment = av_malloc(len))) {
2441 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
2445 avio_read(pb, attachment, len);
2447 ost = new_attachment_stream(o, oc, -1);
2448 ost->stream_copy = 0;
2449 ost->attachment_filename = o->attachments[i];
2450 ost->st->codecpar->extradata = attachment;
2451 ost->st->codecpar->extradata_size = len;
2453 p = strrchr(o->attachments[i], '/');
2454 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2458 #if FF_API_LAVF_AVCTX
2459 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2460 AVDictionaryEntry *e;
2461 ost = output_streams[i];
2463 if ((ost->stream_copy || ost->attachment_filename)
2464 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2465 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2466 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2471 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2472 av_dump_format(oc, nb_output_files - 1, oc->url, 1);
2473 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2477 /* check if all codec options have been used */
2478 unused_opts = strip_specifiers(o->g->codec_opts);
2479 for (i = of->ost_index; i < nb_output_streams; i++) {
2481 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2482 AV_DICT_IGNORE_SUFFIX)))
2483 av_dict_set(&unused_opts, e->key, NULL, 0);
2487 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2488 const AVClass *class = avcodec_get_class();
2489 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2490 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2491 const AVClass *fclass = avformat_get_class();
2492 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2493 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2494 if (!option || foption)
2498 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2499 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2500 "output file #%d (%s) is not an encoding option.\n", e->key,
2501 option->help ? option->help : "", nb_output_files - 1,
2506 // gop_timecode is injected by generic code but not always used
2507 if (!strcmp(e->key, "gop_timecode"))
2510 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2511 "output file #%d (%s) has not been used for any stream. The most "
2512 "likely reason is either wrong type (e.g. a video option with "
2513 "no video streams) or that it is a private option of some encoder "
2514 "which was not actually used for any stream.\n", e->key,
2515 option->help ? option->help : "", nb_output_files - 1, filename);
2517 av_dict_free(&unused_opts);
2519 /* set the decoding_needed flags and create simple filtergraphs */
2520 for (i = of->ost_index; i < nb_output_streams; i++) {
2521 OutputStream *ost = output_streams[i];
2523 if (ost->encoding_needed && ost->source_index >= 0) {
2524 InputStream *ist = input_streams[ost->source_index];
2525 ist->decoding_needed |= DECODING_FOR_OST;
2527 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
2528 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2529 err = init_simple_filtergraph(ist, ost);
2531 av_log(NULL, AV_LOG_ERROR,
2532 "Error initializing a simple filtergraph between streams "
2533 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
2534 nb_output_files - 1, ost->st->index);
2540 /* set the filter output constraints */
2542 OutputFilter *f = ost->filter;
2544 switch (ost->enc_ctx->codec_type) {
2545 case AVMEDIA_TYPE_VIDEO:
2546 f->frame_rate = ost->frame_rate;
2547 f->width = ost->enc_ctx->width;
2548 f->height = ost->enc_ctx->height;
2549 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
2550 f->format = ost->enc_ctx->pix_fmt;
2551 } else if (ost->enc->pix_fmts) {
2553 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
2555 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2558 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
2561 case AVMEDIA_TYPE_AUDIO:
2562 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
2563 f->format = ost->enc_ctx->sample_fmt;
2564 } else if (ost->enc->sample_fmts) {
2566 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
2568 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2571 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
2573 if (ost->enc_ctx->sample_rate) {
2574 f->sample_rate = ost->enc_ctx->sample_rate;
2575 } else if (ost->enc->supported_samplerates) {
2577 while (ost->enc->supported_samplerates[count])
2579 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
2580 if (!f->sample_rates)
2582 memcpy(f->sample_rates, ost->enc->supported_samplerates,
2583 (count + 1) * sizeof(*f->sample_rates));
2585 if (ost->enc_ctx->channels) {
2586 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
2587 } else if (ost->enc->channel_layouts) {
2589 while (ost->enc->channel_layouts[count])
2591 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
2592 if (!f->channel_layouts)
2594 memcpy(f->channel_layouts, ost->enc->channel_layouts,
2595 (count + 1) * sizeof(*f->channel_layouts));
2602 /* check filename in case of an image number is expected */
2603 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2604 if (!av_filename_number_test(oc->url)) {
2605 print_error(oc->url, AVERROR(EINVAL));
2610 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2611 av_log(NULL, AV_LOG_ERROR,
2612 "No input streams but output needs an input stream\n");
2616 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2617 /* test if it already exists to avoid losing precious files */
2618 assert_file_overwrite(filename);
2621 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2622 &oc->interrupt_callback,
2624 print_error(filename, err);
2627 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2628 assert_file_overwrite(filename);
2630 if (o->mux_preload) {
2631 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2633 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2636 for (i = 0; i < o->nb_metadata_map; i++) {
2638 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2640 if (in_file_index >= nb_input_files) {
2641 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2644 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2645 in_file_index >= 0 ?
2646 input_files[in_file_index]->ctx : NULL, o);
2650 if (o->chapters_input_file >= nb_input_files) {
2651 if (o->chapters_input_file == INT_MAX) {
2652 /* copy chapters from the first input file that has them*/
2653 o->chapters_input_file = -1;
2654 for (i = 0; i < nb_input_files; i++)
2655 if (input_files[i]->ctx->nb_chapters) {
2656 o->chapters_input_file = i;
2660 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2661 o->chapters_input_file);
2665 if (o->chapters_input_file >= 0)
2666 copy_chapters(input_files[o->chapters_input_file], of,
2667 !o->metadata_chapters_manual);
2669 /* copy global metadata by default */
2670 if (!o->metadata_global_manual && nb_input_files){
2671 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2672 AV_DICT_DONT_OVERWRITE);
2673 if(o->recording_time != INT64_MAX)
2674 av_dict_set(&oc->metadata, "duration", NULL, 0);
2675 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2677 if (!o->metadata_streams_manual)
2678 for (i = of->ost_index; i < nb_output_streams; i++) {
2680 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2682 ist = input_streams[output_streams[i]->source_index];
2683 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2684 if (!output_streams[i]->stream_copy) {
2685 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2689 /* process manually set programs */
2690 for (i = 0; i < o->nb_program; i++) {
2691 const char *p = o->program[i].u.str;
2696 const char *p2 = av_get_token(&p, ":");
2697 const char *to_dealloc = p2;
2704 key = av_get_token(&p2, "=");
2706 av_freep(&to_dealloc);
2712 if (!strcmp(key, "program_num"))
2713 progid = strtol(p2, NULL, 0);
2714 av_freep(&to_dealloc);
2718 program = av_new_program(oc, progid);
2720 p = o->program[i].u.str;
2722 const char *p2 = av_get_token(&p, ":");
2723 const char *to_dealloc = p2;
2729 key = av_get_token(&p2, "=");
2731 av_log(NULL, AV_LOG_FATAL,
2732 "No '=' character in program string %s.\n",
2740 if (!strcmp(key, "title")) {
2741 av_dict_set(&program->metadata, "title", p2, 0);
2742 } else if (!strcmp(key, "program_num")) {
2743 } else if (!strcmp(key, "st")) {
2744 int st_num = strtol(p2, NULL, 0);
2745 av_program_add_stream_index(oc, progid, st_num);
2747 av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2750 av_freep(&to_dealloc);
2755 /* process manually set metadata */
2756 for (i = 0; i < o->nb_metadata; i++) {
2759 const char *stream_spec;
2760 int index = 0, j, ret = 0;
2762 val = strchr(o->metadata[i].u.str, '=');
2764 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2765 o->metadata[i].u.str);
2770 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2772 for (j = 0; j < oc->nb_streams; j++) {
2773 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2774 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2775 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2777 double theta = av_strtod(val, &tail);
2779 ost->rotate_overridden = 1;
2780 ost->rotate_override_value = theta;
2783 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2795 if (index < 0 || index >= oc->nb_chapters) {
2796 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2799 m = &oc->chapters[index]->metadata;
2802 if (index < 0 || index >= oc->nb_programs) {
2803 av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2806 m = &oc->programs[index]->metadata;
2809 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2812 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2819 static int opt_target(void *optctx, const char *opt, const char *arg)
2821 OptionsContext *o = optctx;
2822 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2823 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2825 if (!strncmp(arg, "pal-", 4)) {
2828 } else if (!strncmp(arg, "ntsc-", 5)) {
2831 } else if (!strncmp(arg, "film-", 5)) {
2835 /* Try to determine PAL/NTSC by peeking in the input files */
2836 if (nb_input_files) {
2838 for (j = 0; j < nb_input_files; j++) {
2839 for (i = 0; i < input_files[j]->nb_streams; i++) {
2840 AVStream *st = input_files[j]->ctx->streams[i];
2842 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2844 fr = st->time_base.den * 1000LL / st->time_base.num;
2848 } else if ((fr == 29970) || (fr == 23976)) {
2853 if (norm != UNKNOWN)
2857 if (norm != UNKNOWN)
2858 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2861 if (norm == UNKNOWN) {
2862 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2863 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2864 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2868 if (!strcmp(arg, "vcd")) {
2869 opt_video_codec(o, "c:v", "mpeg1video");
2870 opt_audio_codec(o, "c:a", "mp2");
2871 parse_option(o, "f", "vcd", options);
2873 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2874 parse_option(o, "r", frame_rates[norm], options);
2875 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2877 opt_default(NULL, "b:v", "1150000");
2878 opt_default(NULL, "maxrate:v", "1150000");
2879 opt_default(NULL, "minrate:v", "1150000");
2880 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2882 opt_default(NULL, "b:a", "224000");
2883 parse_option(o, "ar", "44100", options);
2884 parse_option(o, "ac", "2", options);
2886 opt_default(NULL, "packetsize", "2324");
2887 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2889 /* We have to offset the PTS, so that it is consistent with the SCR.
2890 SCR starts at 36000, but the first two packs contain only padding
2891 and the first pack from the other stream, respectively, may also have
2892 been written before.
2893 So the real data starts at SCR 36000+3*1200. */
2894 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2895 } else if (!strcmp(arg, "svcd")) {
2897 opt_video_codec(o, "c:v", "mpeg2video");
2898 opt_audio_codec(o, "c:a", "mp2");
2899 parse_option(o, "f", "svcd", options);
2901 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2902 parse_option(o, "r", frame_rates[norm], options);
2903 parse_option(o, "pix_fmt", "yuv420p", options);
2904 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2906 opt_default(NULL, "b:v", "2040000");
2907 opt_default(NULL, "maxrate:v", "2516000");
2908 opt_default(NULL, "minrate:v", "0"); // 1145000;
2909 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2910 opt_default(NULL, "scan_offset", "1");
2912 opt_default(NULL, "b:a", "224000");
2913 parse_option(o, "ar", "44100", options);
2915 opt_default(NULL, "packetsize", "2324");
2917 } else if (!strcmp(arg, "dvd")) {
2919 opt_video_codec(o, "c:v", "mpeg2video");
2920 opt_audio_codec(o, "c:a", "ac3");
2921 parse_option(o, "f", "dvd", options);
2923 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2924 parse_option(o, "r", frame_rates[norm], options);
2925 parse_option(o, "pix_fmt", "yuv420p", options);
2926 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2928 opt_default(NULL, "b:v", "6000000");
2929 opt_default(NULL, "maxrate:v", "9000000");
2930 opt_default(NULL, "minrate:v", "0"); // 1500000;
2931 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2933 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2934 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2936 opt_default(NULL, "b:a", "448000");
2937 parse_option(o, "ar", "48000", options);
2939 } else if (!strncmp(arg, "dv", 2)) {
2941 parse_option(o, "f", "dv", options);
2943 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2944 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2945 norm == PAL ? "yuv420p" : "yuv411p", options);
2946 parse_option(o, "r", frame_rates[norm], options);
2948 parse_option(o, "ar", "48000", options);
2949 parse_option(o, "ac", "2", options);
2952 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2953 return AVERROR(EINVAL);
2956 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2957 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2962 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2964 av_free (vstats_filename);
2965 vstats_filename = av_strdup (arg);
2969 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2972 time_t today2 = time(NULL);
2973 struct tm *today = localtime(&today2);
2975 if (!today) { // maybe tomorrow
2976 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2980 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2982 return opt_vstats_file(NULL, opt, filename);
2985 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2987 OptionsContext *o = optctx;
2988 return parse_option(o, "frames:v", arg, options);
2991 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2993 OptionsContext *o = optctx;
2994 return parse_option(o, "frames:a", arg, options);
2997 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2999 OptionsContext *o = optctx;
3000 return parse_option(o, "frames:d", arg, options);
3003 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
3006 AVDictionary *cbak = codec_opts;
3007 AVDictionary *fbak = format_opts;
3011 ret = opt_default(NULL, opt, arg);
3013 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
3014 av_dict_copy(&o->g->format_opts, format_opts, 0);
3015 av_dict_free(&codec_opts);
3016 av_dict_free(&format_opts);
3023 static int opt_preset(void *optctx, const char *opt, const char *arg)
3025 OptionsContext *o = optctx;
3027 char filename[1000], line[1000], tmp_line[1000];
3028 const char *codec_name = NULL;
3032 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
3034 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
3035 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
3036 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
3038 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
3042 while (fgets(line, sizeof(line), f)) {
3043 char *key = tmp_line, *value, *endptr;
3045 if (strcspn(line, "#\n\r") == 0)
3047 av_strlcpy(tmp_line, line, sizeof(tmp_line));
3048 if (!av_strtok(key, "=", &value) ||
3049 !av_strtok(value, "\r\n", &endptr)) {
3050 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
3053 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
3055 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
3056 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
3057 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
3058 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
3059 else if (opt_default_new(o, key, value) < 0) {
3060 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
3061 filename, line, key, value);
3071 static int opt_old2new(void *optctx, const char *opt, const char *arg)
3073 OptionsContext *o = optctx;
3075 char *s = av_asprintf("%s:%c", opt + 1, *opt);
3077 return AVERROR(ENOMEM);
3078 ret = parse_option(o, s, arg, options);
3083 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
3085 OptionsContext *o = optctx;
3087 if(!strcmp(opt, "ab")){
3088 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
3090 } else if(!strcmp(opt, "b")){
3091 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
3092 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
3095 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3099 static int opt_qscale(void *optctx, const char *opt, const char *arg)
3101 OptionsContext *o = optctx;
3104 if(!strcmp(opt, "qscale")){
3105 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
3106 return parse_option(o, "q:v", arg, options);
3108 s = av_asprintf("q%s", opt + 6);
3110 return AVERROR(ENOMEM);
3111 ret = parse_option(o, s, arg, options);
3116 static int opt_profile(void *optctx, const char *opt, const char *arg)
3118 OptionsContext *o = optctx;
3119 if(!strcmp(opt, "profile")){
3120 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
3121 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
3124 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3128 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
3130 OptionsContext *o = optctx;
3131 return parse_option(o, "filter:v", arg, options);
3134 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
3136 OptionsContext *o = optctx;
3137 return parse_option(o, "filter:a", arg, options);
3140 static int opt_vsync(void *optctx, const char *opt, const char *arg)
3142 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
3143 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
3144 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
3145 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
3147 if (video_sync_method == VSYNC_AUTO)
3148 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
3152 static int opt_timecode(void *optctx, const char *opt, const char *arg)
3154 OptionsContext *o = optctx;
3156 char *tcr = av_asprintf("timecode=%s", arg);
3158 return AVERROR(ENOMEM);
3159 ret = parse_option(o, "metadata:g", tcr, options);
3161 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
3166 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
3168 OptionsContext *o = optctx;
3169 char layout_str[32];
3172 int ret, channels, ac_str_size;
3175 layout = av_get_channel_layout(arg);
3177 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
3178 return AVERROR(EINVAL);
3180 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
3181 ret = opt_default_new(o, opt, layout_str);
3185 /* set 'ac' option based on channel layout */
3186 channels = av_get_channel_layout_nb_channels(layout);
3187 snprintf(layout_str, sizeof(layout_str), "%d", channels);
3188 stream_str = strchr(opt, ':');
3189 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
3190 ac_str = av_mallocz(ac_str_size);
3192 return AVERROR(ENOMEM);
3193 av_strlcpy(ac_str, "ac", 3);
3195 av_strlcat(ac_str, stream_str, ac_str_size);
3196 ret = parse_option(o, ac_str, layout_str, options);
3202 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
3204 OptionsContext *o = optctx;
3205 return parse_option(o, "q:a", arg, options);
3208 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
3210 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3211 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3212 return AVERROR(ENOMEM);
3213 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3214 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
3215 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
3216 return AVERROR(ENOMEM);
3218 input_stream_potentially_available = 1;
3223 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
3225 uint8_t *graph_desc = read_file(arg);
3227 return AVERROR(EINVAL);
3229 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3230 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3231 return AVERROR(ENOMEM);
3232 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3233 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
3235 input_stream_potentially_available = 1;
3240 void show_help_default(const char *opt, const char *arg)
3242 /* per-file options have at least one of those set */
3243 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
3244 int show_advanced = 0, show_avoptions = 0;
3247 if (!strcmp(opt, "long"))
3249 else if (!strcmp(opt, "full"))
3250 show_advanced = show_avoptions = 1;
3252 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
3257 printf("Getting help:\n"
3258 " -h -- print basic options\n"
3259 " -h long -- print more options\n"
3260 " -h full -- print all options (including all format and codec specific options, very long)\n"
3261 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol\n"
3262 " See man %s for detailed description of the options.\n"
3263 "\n", program_name);
3265 show_help_options(options, "Print help / information / capabilities:",
3268 show_help_options(options, "Global options (affect whole program "
3269 "instead of just one file):",
3270 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
3272 show_help_options(options, "Advanced global options:", OPT_EXPERT,
3273 per_file | OPT_EXIT, 0);
3275 show_help_options(options, "Per-file main options:", 0,
3276 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
3277 OPT_EXIT, per_file);
3279 show_help_options(options, "Advanced per-file options:",
3280 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
3282 show_help_options(options, "Video options:",
3283 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
3285 show_help_options(options, "Advanced Video options:",
3286 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
3288 show_help_options(options, "Audio options:",
3289 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
3291 show_help_options(options, "Advanced Audio options:",
3292 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
3293 show_help_options(options, "Subtitle options:",
3294 OPT_SUBTITLE, 0, 0);
3297 if (show_avoptions) {
3298 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3299 show_help_children(avcodec_get_class(), flags);
3300 show_help_children(avformat_get_class(), flags);
3302 show_help_children(sws_get_class(), flags);
3304 #if CONFIG_SWRESAMPLE
3305 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
3307 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
3308 show_help_children(av_bsf_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_BSF_PARAM);
3312 void show_usage(void)
3314 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
3315 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3316 av_log(NULL, AV_LOG_INFO, "\n");
3324 static const OptionGroupDef groups[] = {
3325 [GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
3326 [GROUP_INFILE] = { "input url", "i", OPT_INPUT },
3329 static int open_files(OptionGroupList *l, const char *inout,
3330 int (*open_file)(OptionsContext*, const char*))
3334 for (i = 0; i < l->nb_groups; i++) {
3335 OptionGroup *g = &l->groups[i];
3341 ret = parse_optgroup(&o, g);
3343 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3344 "%s.\n", inout, g->arg);
3349 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3350 ret = open_file(&o, g->arg);
3353 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3357 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3363 int ffmpeg_parse_options(int argc, char **argv)
3365 OptionParseContext octx;
3369 memset(&octx, 0, sizeof(octx));
3371 /* split the commandline into an internal representation */
3372 ret = split_commandline(&octx, argc, argv, options, groups,
3373 FF_ARRAY_ELEMS(groups));
3375 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3379 /* apply global options */
3380 ret = parse_optgroup(NULL, &octx.global_opts);
3382 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3386 /* configure terminal and setup signal handlers */
3389 /* open input files */
3390 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3392 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3396 /* create the complex filtergraphs */
3397 ret = init_complex_filters();
3399 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3403 /* open output files */
3404 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3406 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3410 check_filter_outputs();
3413 uninit_parse_context(&octx);
3415 av_strerror(ret, error, sizeof(error));
3416 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3421 static int opt_progress(void *optctx, const char *opt, const char *arg)
3423 AVIOContext *avio = NULL;
3426 if (!strcmp(arg, "-"))
3428 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3430 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3431 arg, av_err2str(ret));
3434 progress_avio = avio;
3438 #define OFFSET(x) offsetof(OptionsContext, x)
3439 const OptionDef options[] = {
3441 CMDUTILS_COMMON_OPTIONS
3442 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3443 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3444 "force format", "fmt" },
3445 { "y", OPT_BOOL, { &file_overwrite },
3446 "overwrite output files" },
3447 { "n", OPT_BOOL, { &no_file_overwrite },
3448 "never overwrite output files" },
3449 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3450 "Ignore unknown stream types" },
3451 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
3452 "Copy unknown stream types" },
3453 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3454 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3455 "codec name", "codec" },
3456 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3457 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3458 "codec name", "codec" },
3459 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3460 OPT_OUTPUT, { .off = OFFSET(presets) },
3461 "preset name", "preset" },
3462 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3463 OPT_OUTPUT, { .func_arg = opt_map },
3464 "set input stream mapping",
3465 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3466 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3467 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3468 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3469 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3470 "set metadata information of outfile from infile",
3471 "outfile[,metadata]:infile[,metadata]" },
3472 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3473 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3474 "set chapters mapping", "input_file_index" },
3475 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3476 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3477 "record or transcode \"duration\" seconds of audio/video",
3479 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3480 "record or transcode stop time", "time_stop" },
3481 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3482 "set the limit file size in bytes", "limit_size" },
3483 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3484 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3485 "set the start time offset", "time_off" },
3486 { "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3487 OPT_INPUT, { .off = OFFSET(start_time_eof) },
3488 "set the start time offset relative to EOF", "time_off" },
3489 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3490 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3491 "enable/disable seeking by timestamp with -ss" },
3492 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3493 OPT_INPUT, { .off = OFFSET(accurate_seek) },
3494 "enable/disable accurate seeking with -ss" },
3495 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3496 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3497 "set the input ts offset", "time_off" },
3498 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3499 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3500 "set the input ts scale", "scale" },
3501 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3502 "set the recording timestamp ('now' to set the current time)", "time" },
3503 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3504 "add metadata", "string=string" },
3505 { "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3506 "add program with specified streams", "title=string:st=number..." },
3507 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3508 OPT_OUTPUT, { .func_arg = opt_data_frames },
3509 "set the number of data frames to output", "number" },
3510 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3511 "add timings for benchmarking" },
3512 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3513 "add timings for each task" },
3514 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3515 "write program-readable progress information", "url" },
3516 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3517 "enable or disable interaction on standard input" },
3518 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3519 "set max runtime in seconds in CPU user time", "limit" },
3520 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3521 "dump each input packet" },
3522 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3523 "when dumping packets, also dump the payload" },
3524 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3525 OPT_INPUT, { .off = OFFSET(rate_emu) },
3526 "read input at native frame rate", "" },
3527 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3528 "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3529 "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3530 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3531 "video sync method", "" },
3532 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3533 "frame drop threshold", "" },
3534 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3535 "audio sync method", "" },
3536 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3537 "audio drift threshold", "threshold" },
3538 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
3539 "copy timestamps" },
3540 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3541 "shift input timestamps to start at 0 when using copyts" },
3542 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
3543 "copy input stream time base when stream copying", "mode" },
3544 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3545 OPT_OUTPUT, { .off = OFFSET(shortest) },
3546 "finish encoding within shortest input" },
3547 { "bitexact", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3548 OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(bitexact) },
3550 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3551 OPT_OUTPUT, { .off = OFFSET(apad) },
3553 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3554 "timestamp discontinuity delta threshold", "threshold" },
3555 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3556 "timestamp error delta threshold", "threshold" },
3557 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3558 "exit on error", "error" },
3559 { "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3560 "abort on the specified condition flags", "flags" },
3561 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3562 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3563 "copy initial non-keyframes" },
3564 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3565 "copy or discard frames before start time" },
3566 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3567 "set the number of frames to output", "number" },
3568 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3569 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3570 "force codec tag/fourcc", "fourcc/tag" },
3571 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3572 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3573 "use fixed quality scale (VBR)", "q" },
3574 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3575 OPT_OUTPUT, { .func_arg = opt_qscale },
3576 "use fixed quality scale (VBR)", "q" },
3577 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3578 "set profile", "profile" },
3579 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3580 "set stream filtergraph", "filter_graph" },
3581 { "filter_threads", HAS_ARG | OPT_INT, { &filter_nbthreads },
3582 "number of non-complex filter threads" },
3583 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3584 "read stream filtergraph description from a file", "filename" },
3585 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3586 "reinit filtergraph on input parameter changes", "" },
3587 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3588 "create a complex filtergraph", "graph_description" },
3589 { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads },
3590 "number of threads for -filter_complex" },
3591 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3592 "create a complex filtergraph", "graph_description" },
3593 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3594 "read complex filtergraph description from a file", "filename" },
3595 { "stats", OPT_BOOL, { &print_stats },
3596 "print progress report during encoding", },
3597 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3598 OPT_OUTPUT, { .func_arg = opt_attach },
3599 "add an attachment to the output file", "filename" },
3600 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3601 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3602 "extract an attachment into a file", "filename" },
3603 { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3604 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3605 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3606 "print timestamp debugging info" },
3607 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3608 "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.", "maximum error rate" },
3609 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3610 OPT_INPUT, { .off = OFFSET(discard) },
3612 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3613 OPT_OUTPUT, { .off = OFFSET(disposition) },
3614 "disposition", "" },
3615 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3616 { .off = OFFSET(thread_queue_size) },
3617 "set the maximum number of queued packets from the demuxer" },
3618 { "find_stream_info", OPT_BOOL | OPT_PERFILE | OPT_INPUT | OPT_EXPERT, { &find_stream_info },
3619 "read and decode the streams to fill missing information with heuristics" },
3622 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3623 "set the number of video frames to output", "number" },
3624 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3625 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3626 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3627 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3628 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3629 "set frame size (WxH or abbreviation)", "size" },
3630 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3631 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3632 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3633 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3634 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3635 "set pixel format", "format" },
3636 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3637 "set the number of bits per raw sample", "number" },
3638 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3639 "deprecated use -g 1" },
3640 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3642 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3643 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3644 "rate control override for specific intervals", "override" },
3645 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3646 OPT_OUTPUT, { .func_arg = opt_video_codec },
3647 "force video codec ('copy' to copy stream)", "codec" },
3648 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3650 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3652 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3653 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3654 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3655 "select the pass number (1 to 3)", "n" },
3656 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3657 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3658 "select two pass log file name prefix", "prefix" },
3659 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3660 "this option is deprecated, use the yadif filter instead" },
3661 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3662 "calculate PSNR of compressed frames" },
3663 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3664 "dump video coding statistics to file" },
3665 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3666 "dump video coding statistics to file", "file" },
3667 { "vstats_version", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &vstats_version },
3668 "Version of the vstats format to use."},
3669 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3670 "set video filters", "filter_graph" },
3671 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3672 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3673 "specify intra matrix coeffs", "matrix" },
3674 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3675 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3676 "specify inter matrix coeffs", "matrix" },
3677 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3678 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3679 "specify intra matrix coeffs", "matrix" },
3680 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3681 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3682 "top=1/bottom=0/auto=-1 field first", "" },
3683 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3684 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3685 "force video tag/fourcc", "fourcc/tag" },
3686 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3687 "show QP histogram" },
3688 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3689 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3690 "force the selected framerate, disable the best supported framerate selection" },
3691 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3692 OPT_OUTPUT, { .func_arg = opt_streamid },
3693 "set the value of an outfile streamid", "streamIndex:value" },
3694 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3695 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3696 "force key frames at specified timestamps", "timestamps" },
3697 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3698 "audio bitrate (please use -b:a)", "bitrate" },
3699 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3700 "video bitrate (please use -b:v)", "bitrate" },
3701 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3702 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3703 "use HW accelerated decoding", "hwaccel name" },
3704 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3705 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3706 "select a device for HW acceleration", "devicename" },
3707 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3708 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
3709 "select output format used with HW accelerated decoding", "format" },
3710 #if CONFIG_VIDEOTOOLBOX
3711 { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3713 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3714 "show available HW acceleration methods" },
3715 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3716 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3717 "automatically insert correct rotate filters" },
3720 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3721 "set the number of audio frames to output", "number" },
3722 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3723 "set audio quality (codec-specific)", "quality", },
3724 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3725 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3726 "set audio sampling rate (in Hz)", "rate" },
3727 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3728 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3729 "set number of audio channels", "channels" },
3730 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3732 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3733 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3734 "force audio codec ('copy' to copy stream)", "codec" },
3735 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3736 OPT_OUTPUT, { .func_arg = opt_old2new },
3737 "force audio tag/fourcc", "fourcc/tag" },
3738 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3739 "change audio volume (256=normal)" , "volume" },
3740 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3741 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3742 "set sample format", "format" },
3743 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3744 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3745 "set channel layout", "layout" },
3746 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3747 "set audio filters", "filter_graph" },
3748 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3749 "set the maximum number of channels to try to guess the channel layout" },
3751 /* subtitle options */
3752 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3753 "disable subtitle" },
3754 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3755 "force subtitle codec ('copy' to copy stream)", "codec" },
3756 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3757 , "force subtitle tag/fourcc", "fourcc/tag" },
3758 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3759 "fix subtitles duration" },
3760 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3761 "set canvas size (WxH or abbreviation)", "size" },
3764 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3765 "deprecated, use -channel", "channel" },
3766 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3767 "deprecated, use -standard", "standard" },
3768 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3771 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3772 "set the maximum demux-decode delay", "seconds" },
3773 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3774 "set the initial demux-decode delay", "seconds" },
3775 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3776 "specify a file in which to print sdp information", "file" },
3778 { "time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(time_bases) },
3779 "set the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)", "ratio" },
3780 { "enc_time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(enc_time_bases) },
3781 "set the desired time base for the encoder (1:24, 1:48000 or 0.04166, 2.0833e-5). "
3782 "two special values are defined - "
3783 "0 = use frame rate (video) or sample rate (audio),"
3784 "-1 = match source time base", "ratio" },
3786 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3787 "A comma-separated list of bitstream filters", "bitstream_filters" },
3788 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3789 "deprecated", "audio bitstream_filters" },
3790 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3791 "deprecated", "video bitstream_filters" },
3793 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3794 "set the audio options to the indicated preset", "preset" },
3795 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3796 "set the video options to the indicated preset", "preset" },
3797 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3798 "set the subtitle options to the indicated preset", "preset" },
3799 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3800 "set options from indicated preset file", "filename" },
3802 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
3803 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
3805 /* data codec support */
3806 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3807 "force data codec ('copy' to copy stream)", "codec" },
3808 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3812 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
3813 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
3817 { "qsv_device", HAS_ARG | OPT_STRING | OPT_EXPERT, { &qsv_device },
3818 "set QSV hardware device (DirectX adapter index, DRM path or X11 display name)", "device"},
3821 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
3822 "initialise hardware device", "args" },
3823 { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device },
3824 "set hardware device used when filtering", "device" },