2 * ffmpeg option parsing
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavformat/avformat.h"
28 #include "libavcodec/avcodec.h"
30 #include "libavfilter/avfilter.h"
32 #include "libavutil/avassert.h"
33 #include "libavutil/avstring.h"
34 #include "libavutil/avutil.h"
35 #include "libavutil/channel_layout.h"
36 #include "libavutil/intreadwrite.h"
37 #include "libavutil/fifo.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/opt.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/pixdesc.h"
42 #include "libavutil/pixfmt.h"
44 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
46 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
49 for (i = 0; i < o->nb_ ## name; i++) {\
50 char *spec = o->name[i].specifier;\
51 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
52 outvar = o->name[i].u.type;\
58 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
61 for (i = 0; i < o->nb_ ## name; i++) {\
62 char *spec = o->name[i].specifier;\
63 if (!strcmp(spec, mediatype))\
64 outvar = o->name[i].u.type;\
68 const HWAccel hwaccels[] = {
70 { "vdpau", hwaccel_decode_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU,
71 AV_HWDEVICE_TYPE_VDPAU },
74 { "d3d11va", hwaccel_decode_init, HWACCEL_D3D11VA, AV_PIX_FMT_D3D11,
75 AV_HWDEVICE_TYPE_D3D11VA },
78 { "dxva2", hwaccel_decode_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD,
79 AV_HWDEVICE_TYPE_DXVA2 },
82 { "vda", videotoolbox_init, HWACCEL_VDA, AV_PIX_FMT_VDA,
83 AV_HWDEVICE_TYPE_NONE },
85 #if CONFIG_VIDEOTOOLBOX
86 { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX,
87 AV_HWDEVICE_TYPE_NONE },
90 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV,
91 AV_HWDEVICE_TYPE_NONE },
94 { "vaapi", hwaccel_decode_init, HWACCEL_VAAPI, AV_PIX_FMT_VAAPI,
95 AV_HWDEVICE_TYPE_VAAPI },
98 { "cuvid", cuvid_init, HWACCEL_CUVID, AV_PIX_FMT_CUDA,
99 AV_HWDEVICE_TYPE_NONE },
103 int hwaccel_lax_profile_check = 0;
104 AVBufferRef *hw_device_ctx;
105 HWDevice *filter_hw_device;
107 char *vstats_filename;
110 float audio_drift_threshold = 0.1;
111 float dts_delta_threshold = 10;
112 float dts_error_threshold = 3600*30;
114 int audio_volume = 256;
115 int audio_sync_method = 0;
116 int video_sync_method = VSYNC_AUTO;
117 float frame_drop_threshold = 0;
118 int do_deinterlace = 0;
119 int do_benchmark = 0;
120 int do_benchmark_all = 0;
124 int start_at_zero = 0;
127 int exit_on_error = 0;
128 int abort_on_flags = 0;
129 int print_stats = -1;
131 int stdin_interaction = 1;
132 int frame_bits_per_raw_sample = 0;
133 float max_error_rate = 2.0/3;
134 int filter_nbthreads = 0;
135 int filter_complex_nbthreads = 0;
136 int vstats_version = 2;
139 static int intra_only = 0;
140 static int file_overwrite = 0;
141 static int no_file_overwrite = 0;
142 static int do_psnr = 0;
143 static int input_sync;
144 static int override_ffserver = 0;
145 static int input_stream_potentially_available = 0;
146 static int ignore_unknown_streams = 0;
147 static int copy_unknown_streams = 0;
149 static void uninit_options(OptionsContext *o)
151 const OptionDef *po = options;
154 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
156 void *dst = (uint8_t*)o + po->u.off;
158 if (po->flags & OPT_SPEC) {
159 SpecifierOpt **so = dst;
160 int i, *count = (int*)(so + 1);
161 for (i = 0; i < *count; i++) {
162 av_freep(&(*so)[i].specifier);
163 if (po->flags & OPT_STRING)
164 av_freep(&(*so)[i].u.str);
168 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
173 for (i = 0; i < o->nb_stream_maps; i++)
174 av_freep(&o->stream_maps[i].linklabel);
175 av_freep(&o->stream_maps);
176 av_freep(&o->audio_channel_maps);
177 av_freep(&o->streamid_map);
178 av_freep(&o->attachments);
181 static void init_options(OptionsContext *o)
183 memset(o, 0, sizeof(*o));
185 o->stop_time = INT64_MAX;
186 o->mux_max_delay = 0.7;
187 o->start_time = AV_NOPTS_VALUE;
188 o->start_time_eof = AV_NOPTS_VALUE;
189 o->recording_time = INT64_MAX;
190 o->limit_filesize = UINT64_MAX;
191 o->chapters_input_file = INT_MAX;
192 o->accurate_seek = 1;
195 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
199 printf("Hardware acceleration methods:\n");
200 for (i = 0; hwaccels[i].name; i++) {
201 printf("%s\n", hwaccels[i].name);
207 /* return a copy of the input with the stream specifiers removed from the keys */
208 static AVDictionary *strip_specifiers(AVDictionary *dict)
210 AVDictionaryEntry *e = NULL;
211 AVDictionary *ret = NULL;
213 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
214 char *p = strchr(e->key, ':');
218 av_dict_set(&ret, e->key, e->value, 0);
225 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
227 static const AVOption opts[] = {
228 { "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
229 { "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
232 static const AVClass class = {
234 .item_name = av_default_item_name,
236 .version = LIBAVUTIL_VERSION_INT,
238 const AVClass *pclass = &class;
240 return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
243 static int opt_sameq(void *optctx, const char *opt, const char *arg)
245 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
246 "If you are looking for an option to preserve the quality (which is not "
247 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
249 return AVERROR(EINVAL);
252 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
254 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
255 return opt_default(optctx, "channel", arg);
258 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
260 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
261 return opt_default(optctx, "standard", arg);
264 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
266 OptionsContext *o = optctx;
267 return parse_option(o, "codec:a", arg, options);
270 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
272 OptionsContext *o = optctx;
273 return parse_option(o, "codec:v", arg, options);
276 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
278 OptionsContext *o = optctx;
279 return parse_option(o, "codec:s", arg, options);
282 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
284 OptionsContext *o = optctx;
285 return parse_option(o, "codec:d", arg, options);
288 static int opt_map(void *optctx, const char *opt, const char *arg)
290 OptionsContext *o = optctx;
292 int i, negative = 0, file_idx;
293 int sync_file_idx = -1, sync_stream_idx = 0;
302 map = av_strdup(arg);
304 return AVERROR(ENOMEM);
306 /* parse sync stream first, just pick first matching stream */
307 if (sync = strchr(map, ',')) {
309 sync_file_idx = strtol(sync + 1, &sync, 0);
310 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
311 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
316 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
317 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
318 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
322 if (i == input_files[sync_file_idx]->nb_streams) {
323 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
324 "match any streams.\n", arg);
331 /* this mapping refers to lavfi output */
332 const char *c = map + 1;
333 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
334 m = &o->stream_maps[o->nb_stream_maps - 1];
335 m->linklabel = av_get_token(&c, "]");
337 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
341 if (allow_unused = strchr(map, '?'))
343 file_idx = strtol(map, &p, 0);
344 if (file_idx >= nb_input_files || file_idx < 0) {
345 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
349 /* disable some already defined maps */
350 for (i = 0; i < o->nb_stream_maps; i++) {
351 m = &o->stream_maps[i];
352 if (file_idx == m->file_index &&
353 check_stream_specifier(input_files[m->file_index]->ctx,
354 input_files[m->file_index]->ctx->streams[m->stream_index],
355 *p == ':' ? p + 1 : p) > 0)
359 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
360 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
361 *p == ':' ? p + 1 : p) <= 0)
363 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
364 m = &o->stream_maps[o->nb_stream_maps - 1];
366 m->file_index = file_idx;
369 if (sync_file_idx >= 0) {
370 m->sync_file_index = sync_file_idx;
371 m->sync_stream_index = sync_stream_idx;
373 m->sync_file_index = file_idx;
374 m->sync_stream_index = i;
381 av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
383 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
384 "To ignore this, add a trailing '?' to the map.\n", arg);
393 static int opt_attach(void *optctx, const char *opt, const char *arg)
395 OptionsContext *o = optctx;
396 GROW_ARRAY(o->attachments, o->nb_attachments);
397 o->attachments[o->nb_attachments - 1] = arg;
401 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
403 OptionsContext *o = optctx;
408 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
409 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
411 /* muted channel syntax */
412 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
413 if ((n == 1 || n == 3) && m->channel_idx == -1) {
414 m->file_idx = m->stream_idx = -1;
416 m->ofile_idx = m->ostream_idx = -1;
421 n = sscanf(arg, "%d.%d.%d:%d.%d",
422 &m->file_idx, &m->stream_idx, &m->channel_idx,
423 &m->ofile_idx, &m->ostream_idx);
425 if (n != 3 && n != 5) {
426 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
427 "[file.stream.channel|-1][:syncfile:syncstream]\n");
431 if (n != 5) // only file.stream.channel specified
432 m->ofile_idx = m->ostream_idx = -1;
435 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
436 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
440 if (m->stream_idx < 0 ||
441 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
442 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
443 m->file_idx, m->stream_idx);
446 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
447 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
448 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
449 m->file_idx, m->stream_idx);
452 if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels) {
453 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
454 m->file_idx, m->stream_idx, m->channel_idx);
460 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
462 av_free(sdp_filename);
463 sdp_filename = av_strdup(arg);
468 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
471 const char *prefix = "vaapi:";
474 tmp = av_asprintf("%s%s", prefix, arg);
476 return AVERROR(ENOMEM);
477 err = hw_device_init_from_string(tmp, &dev);
481 hw_device_ctx = av_buffer_ref(dev->device_ref);
483 return AVERROR(ENOMEM);
488 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
490 if (!strcmp(arg, "list")) {
491 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
492 printf("Supported hardware device types:\n");
493 while ((type = av_hwdevice_iterate_types(type)) !=
494 AV_HWDEVICE_TYPE_NONE)
495 printf("%s\n", av_hwdevice_get_type_name(type));
499 return hw_device_init_from_string(arg, NULL);
503 static int opt_filter_hw_device(void *optctx, const char *opt, const char *arg)
505 if (filter_hw_device) {
506 av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
507 return AVERROR(EINVAL);
509 filter_hw_device = hw_device_get_by_name(arg);
510 if (!filter_hw_device) {
511 av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg);
512 return AVERROR(EINVAL);
518 * Parse a metadata specifier passed as 'arg' parameter.
519 * @param arg metadata string to parse
520 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
521 * @param index for type c/p, chapter/program index is written here
522 * @param stream_spec for type s, the stream specifier is written here
524 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
532 if (*(++arg) && *arg != ':') {
533 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
536 *stream_spec = *arg == ':' ? arg + 1 : "";
541 *index = strtol(++arg, NULL, 0);
544 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
551 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
553 AVDictionary **meta_in = NULL;
554 AVDictionary **meta_out = NULL;
556 char type_in, type_out;
557 const char *istream_spec = NULL, *ostream_spec = NULL;
558 int idx_in = 0, idx_out = 0;
560 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
561 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
564 if (type_out == 'g' || !*outspec)
565 o->metadata_global_manual = 1;
566 if (type_out == 's' || !*outspec)
567 o->metadata_streams_manual = 1;
568 if (type_out == 'c' || !*outspec)
569 o->metadata_chapters_manual = 1;
573 if (type_in == 'g' || type_out == 'g')
574 o->metadata_global_manual = 1;
575 if (type_in == 's' || type_out == 's')
576 o->metadata_streams_manual = 1;
577 if (type_in == 'c' || type_out == 'c')
578 o->metadata_chapters_manual = 1;
580 /* ic is NULL when just disabling automatic mappings */
584 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
585 if ((index) < 0 || (index) >= (nb_elems)) {\
586 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
591 #define SET_DICT(type, meta, context, index)\
594 meta = &context->metadata;\
597 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
598 meta = &context->chapters[index]->metadata;\
601 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
602 meta = &context->programs[index]->metadata;\
605 break; /* handled separately below */ \
606 default: av_assert0(0);\
609 SET_DICT(type_in, meta_in, ic, idx_in);
610 SET_DICT(type_out, meta_out, oc, idx_out);
612 /* for input streams choose first matching stream */
613 if (type_in == 's') {
614 for (i = 0; i < ic->nb_streams; i++) {
615 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
616 meta_in = &ic->streams[i]->metadata;
622 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
627 if (type_out == 's') {
628 for (i = 0; i < oc->nb_streams; i++) {
629 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
630 meta_out = &oc->streams[i]->metadata;
631 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
636 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
641 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
643 OptionsContext *o = optctx;
645 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
646 struct tm time = *gmtime((time_t*)&recording_timestamp);
647 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
649 parse_option(o, "metadata", buf, options);
651 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
652 "tag instead.\n", opt);
656 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
658 const AVCodecDescriptor *desc;
659 const char *codec_string = encoder ? "encoder" : "decoder";
663 avcodec_find_encoder_by_name(name) :
664 avcodec_find_decoder_by_name(name);
666 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
667 codec = encoder ? avcodec_find_encoder(desc->id) :
668 avcodec_find_decoder(desc->id);
670 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
671 codec_string, codec->name, desc->name);
675 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
678 if (codec->type != type) {
679 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
685 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
687 char *codec_name = NULL;
689 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
691 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
692 st->codecpar->codec_id = codec->id;
695 return avcodec_find_decoder(st->codecpar->codec_id);
698 /* Add all the streams from the given input file to the global
699 * list of input streams. */
700 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
704 for (i = 0; i < ic->nb_streams; i++) {
705 AVStream *st = ic->streams[i];
706 AVCodecParameters *par = st->codecpar;
707 InputStream *ist = av_mallocz(sizeof(*ist));
708 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
709 char *hwaccel_output_format = NULL;
710 char *codec_tag = NULL;
712 char *discard_str = NULL;
713 const AVClass *cc = avcodec_get_class();
714 const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL, 0, 0);
719 GROW_ARRAY(input_streams, nb_input_streams);
720 input_streams[nb_input_streams - 1] = ist;
723 ist->file_index = nb_input_files;
725 st->discard = AVDISCARD_ALL;
727 ist->min_pts = INT64_MAX;
728 ist->max_pts = INT64_MIN;
731 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
734 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
736 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
738 uint32_t tag = strtol(codec_tag, &next, 0);
740 tag = AV_RL32(codec_tag);
741 st->codecpar->codec_tag = tag;
744 ist->dec = choose_decoder(o, ic, st);
745 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
747 ist->reinit_filters = -1;
748 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
750 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
751 ist->user_set_discard = AVDISCARD_NONE;
752 if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
753 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
758 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
760 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
762 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
766 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
768 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
772 switch (par->codec_type) {
773 case AVMEDIA_TYPE_VIDEO:
775 ist->dec = avcodec_find_decoder(par->codec_id);
777 if (av_codec_get_lowres(st->codec)) {
778 av_codec_set_lowres(ist->dec_ctx, av_codec_get_lowres(st->codec));
779 ist->dec_ctx->width = st->codec->width;
780 ist->dec_ctx->height = st->codec->height;
781 ist->dec_ctx->coded_width = st->codec->coded_width;
782 ist->dec_ctx->coded_height = st->codec->coded_height;
783 ist->dec_ctx->flags |= CODEC_FLAG_EMU_EDGE;
787 // avformat_find_stream_info() doesn't set this for us anymore.
788 ist->dec_ctx->framerate = st->avg_frame_rate;
790 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
791 if (framerate && av_parse_video_rate(&ist->framerate,
793 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
798 ist->top_field_first = -1;
799 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
801 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
803 if (!strcmp(hwaccel, "none"))
804 ist->hwaccel_id = HWACCEL_NONE;
805 else if (!strcmp(hwaccel, "auto"))
806 ist->hwaccel_id = HWACCEL_AUTO;
809 for (i = 0; hwaccels[i].name; i++) {
810 if (!strcmp(hwaccels[i].name, hwaccel)) {
811 ist->hwaccel_id = hwaccels[i].id;
816 if (!ist->hwaccel_id) {
817 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
819 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
820 for (i = 0; hwaccels[i].name; i++)
821 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
822 av_log(NULL, AV_LOG_FATAL, "\n");
828 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
829 if (hwaccel_device) {
830 ist->hwaccel_device = av_strdup(hwaccel_device);
831 if (!ist->hwaccel_device)
835 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
836 hwaccel_output_format, ic, st);
837 if (hwaccel_output_format) {
838 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
839 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
840 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
841 "format: %s", hwaccel_output_format);
844 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
847 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
850 case AVMEDIA_TYPE_AUDIO:
851 ist->guess_layout_max = INT_MAX;
852 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
853 guess_input_channel_layout(ist);
855 case AVMEDIA_TYPE_DATA:
856 case AVMEDIA_TYPE_SUBTITLE: {
857 char *canvas_size = NULL;
859 ist->dec = avcodec_find_decoder(par->codec_id);
860 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
861 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
863 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
864 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
869 case AVMEDIA_TYPE_ATTACHMENT:
870 case AVMEDIA_TYPE_UNKNOWN:
876 ret = avcodec_parameters_from_context(par, ist->dec_ctx);
878 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
884 static void assert_file_overwrite(const char *filename)
886 if (file_overwrite && no_file_overwrite) {
887 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
891 if (!file_overwrite) {
892 const char *proto_name = avio_find_protocol_name(filename);
893 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
894 if (stdin_interaction && !no_file_overwrite) {
895 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
898 signal(SIGINT, SIG_DFL);
900 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
906 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
913 static void dump_attachment(AVStream *st, const char *filename)
916 AVIOContext *out = NULL;
917 AVDictionaryEntry *e;
919 if (!st->codecpar->extradata_size) {
920 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
921 nb_input_files - 1, st->index);
924 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
927 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
928 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
932 assert_file_overwrite(filename);
934 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
935 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
940 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
945 static int open_input_file(OptionsContext *o, const char *filename)
949 AVInputFormat *file_iformat = NULL;
953 AVDictionary *unused_opts = NULL;
954 AVDictionaryEntry *e = NULL;
955 int orig_nb_streams; // number of streams before avformat_find_stream_info
956 char * video_codec_name = NULL;
957 char * audio_codec_name = NULL;
958 char *subtitle_codec_name = NULL;
959 char * data_codec_name = NULL;
960 int scan_all_pmts_set = 0;
963 if (!(file_iformat = av_find_input_format(o->format))) {
964 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
969 if (!strcmp(filename, "-"))
972 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
973 strcmp(filename, "/dev/stdin");
975 /* get default parameters from command line */
976 ic = avformat_alloc_context();
978 print_error(filename, AVERROR(ENOMEM));
981 ic->flags |= AVFMT_FLAG_KEEP_SIDE_DATA;
982 if (o->nb_audio_sample_rate) {
983 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
985 if (o->nb_audio_channels) {
986 /* because we set audio_channels based on both the "ac" and
987 * "channel_layout" options, we need to check that the specified
988 * demuxer actually has the "channels" option before setting it */
989 if (file_iformat && file_iformat->priv_class &&
990 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
991 AV_OPT_SEARCH_FAKE_OBJ)) {
992 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
995 if (o->nb_frame_rates) {
996 /* set the format-level framerate option;
997 * this is important for video grabbers, e.g. x11 */
998 if (file_iformat && file_iformat->priv_class &&
999 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
1000 AV_OPT_SEARCH_FAKE_OBJ)) {
1001 av_dict_set(&o->g->format_opts, "framerate",
1002 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
1005 if (o->nb_frame_sizes) {
1006 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
1008 if (o->nb_frame_pix_fmts)
1009 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
1011 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
1012 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
1013 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
1014 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
1016 ic->video_codec_id = video_codec_name ?
1017 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
1018 ic->audio_codec_id = audio_codec_name ?
1019 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
1020 ic->subtitle_codec_id= subtitle_codec_name ?
1021 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
1022 ic->data_codec_id = data_codec_name ?
1023 find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0)->id : AV_CODEC_ID_NONE;
1025 if (video_codec_name)
1026 av_format_set_video_codec (ic, find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0));
1027 if (audio_codec_name)
1028 av_format_set_audio_codec (ic, find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0));
1029 if (subtitle_codec_name)
1030 av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
1031 if (data_codec_name)
1032 av_format_set_data_codec(ic, find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0));
1034 ic->flags |= AVFMT_FLAG_NONBLOCK;
1035 ic->interrupt_callback = int_cb;
1037 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
1038 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
1039 scan_all_pmts_set = 1;
1041 /* open the input file with generic avformat function */
1042 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1044 print_error(filename, err);
1045 if (err == AVERROR_PROTOCOL_NOT_FOUND)
1046 av_log(NULL, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1049 if (scan_all_pmts_set)
1050 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1051 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
1052 assert_avoptions(o->g->format_opts);
1054 /* apply forced codec ids */
1055 for (i = 0; i < ic->nb_streams; i++)
1056 choose_decoder(o, ic, ic->streams[i]);
1058 /* Set AVCodecContext options for avformat_find_stream_info */
1059 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
1060 orig_nb_streams = ic->nb_streams;
1062 /* If not enough info to get the stream parameters, we decode the
1063 first frames to get it. (used in mpeg case for example) */
1064 ret = avformat_find_stream_info(ic, opts);
1066 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
1067 if (ic->nb_streams == 0) {
1068 avformat_close_input(&ic);
1073 if (o->start_time_eof != AV_NOPTS_VALUE) {
1074 if (ic->duration>0) {
1075 o->start_time = o->start_time_eof + ic->duration;
1077 av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
1079 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
1080 /* add the stream start time */
1081 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1082 timestamp += ic->start_time;
1084 /* if seeking requested, we execute it */
1085 if (o->start_time != AV_NOPTS_VALUE) {
1086 int64_t seek_timestamp = timestamp;
1088 if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1089 int dts_heuristic = 0;
1090 for (i=0; i<ic->nb_streams; i++) {
1091 const AVCodecParameters *par = ic->streams[i]->codecpar;
1092 if (par->video_delay)
1095 if (dts_heuristic) {
1096 seek_timestamp -= 3*AV_TIME_BASE / 23;
1099 ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1101 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
1102 filename, (double)timestamp / AV_TIME_BASE);
1106 /* update the current parameters so that they match the one of the input stream */
1107 add_input_streams(o, ic);
1109 /* dump the file content */
1110 av_dump_format(ic, nb_input_files, filename, 0);
1112 GROW_ARRAY(input_files, nb_input_files);
1113 f = av_mallocz(sizeof(*f));
1116 input_files[nb_input_files - 1] = f;
1119 f->ist_index = nb_input_streams - ic->nb_streams;
1120 f->start_time = o->start_time;
1121 f->recording_time = o->recording_time;
1122 f->input_ts_offset = o->input_ts_offset;
1123 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1124 f->nb_streams = ic->nb_streams;
1125 f->rate_emu = o->rate_emu;
1126 f->accurate_seek = o->accurate_seek;
1129 f->time_base = (AVRational){ 1, 1 };
1131 f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
1134 /* check if all codec options have been used */
1135 unused_opts = strip_specifiers(o->g->codec_opts);
1136 for (i = f->ist_index; i < nb_input_streams; i++) {
1138 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1139 AV_DICT_IGNORE_SUFFIX)))
1140 av_dict_set(&unused_opts, e->key, NULL, 0);
1144 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1145 const AVClass *class = avcodec_get_class();
1146 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1147 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1148 const AVClass *fclass = avformat_get_class();
1149 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
1150 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1151 if (!option || foption)
1155 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1156 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1157 "input file #%d (%s) is not a decoding option.\n", e->key,
1158 option->help ? option->help : "", nb_input_files - 1,
1163 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1164 "input file #%d (%s) has not been used for any stream. The most "
1165 "likely reason is either wrong type (e.g. a video option with "
1166 "no video streams) or that it is a private option of some decoder "
1167 "which was not actually used for any stream.\n", e->key,
1168 option->help ? option->help : "", nb_input_files - 1, filename);
1170 av_dict_free(&unused_opts);
1172 for (i = 0; i < o->nb_dump_attachment; i++) {
1175 for (j = 0; j < ic->nb_streams; j++) {
1176 AVStream *st = ic->streams[j];
1178 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1179 dump_attachment(st, o->dump_attachment[i].u.str);
1183 for (i = 0; i < orig_nb_streams; i++)
1184 av_dict_free(&opts[i]);
1187 input_stream_potentially_available = 1;
1192 static uint8_t *get_line(AVIOContext *s)
1198 if (avio_open_dyn_buf(&line) < 0) {
1199 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1203 while ((c = avio_r8(s)) && c != '\n')
1206 avio_close_dyn_buf(line, &buf);
1211 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1214 char filename[1000];
1215 const char *base[3] = { getenv("AVCONV_DATADIR"),
1220 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1224 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1225 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1226 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1229 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1230 i != 1 ? "" : "/.avconv", preset_name);
1231 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1237 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1239 enum AVMediaType type = ost->st->codecpar->codec_type;
1240 char *codec_name = NULL;
1242 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
1243 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1245 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
1246 NULL, ost->st->codecpar->codec_type);
1247 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
1249 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
1250 "output stream #%d:%d. Default encoder for format %s (codec %s) is "
1251 "probably disabled. Please choose an encoder manually.\n",
1252 ost->file_index, ost->index, s->oformat->name,
1253 avcodec_get_name(ost->st->codecpar->codec_id));
1254 return AVERROR_ENCODER_NOT_FOUND;
1256 } else if (!strcmp(codec_name, "copy"))
1257 ost->stream_copy = 1;
1259 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
1260 ost->st->codecpar->codec_id = ost->enc->id;
1262 ost->encoding_needed = !ost->stream_copy;
1264 /* no encoding supported for other media types */
1265 ost->stream_copy = 1;
1266 ost->encoding_needed = 0;
1272 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1275 AVStream *st = avformat_new_stream(oc, NULL);
1276 int idx = oc->nb_streams - 1, ret = 0;
1277 const char *bsfs = NULL, *time_base = NULL;
1278 char *next, *codec_tag = NULL;
1283 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1287 if (oc->nb_streams - 1 < o->nb_streamid_map)
1288 st->id = o->streamid_map[oc->nb_streams - 1];
1290 GROW_ARRAY(output_streams, nb_output_streams);
1291 if (!(ost = av_mallocz(sizeof(*ost))))
1293 output_streams[nb_output_streams - 1] = ost;
1295 ost->file_index = nb_output_files - 1;
1298 st->codecpar->codec_type = type;
1300 ret = choose_encoder(o, oc, ost);
1302 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1303 "%d:%d\n", ost->file_index, ost->index);
1307 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1308 if (!ost->enc_ctx) {
1309 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1312 ost->enc_ctx->codec_type = type;
1314 ost->ref_par = avcodec_parameters_alloc();
1315 if (!ost->ref_par) {
1316 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding parameters.\n");
1321 AVIOContext *s = NULL;
1322 char *buf = NULL, *arg = NULL, *preset = NULL;
1324 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1326 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1327 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1330 if (!buf[0] || buf[0] == '#') {
1334 if (!(arg = strchr(buf, '='))) {
1335 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1339 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1341 } while (!s->eof_reached);
1345 av_log(NULL, AV_LOG_FATAL,
1346 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1347 preset, ost->file_index, ost->index);
1351 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1354 MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
1357 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1358 q.num <= 0 || q.den <= 0) {
1359 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1365 MATCH_PER_STREAM_OPT(enc_time_bases, str, time_base, oc, st);
1368 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1370 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1373 ost->enc_timebase = q;
1376 ost->max_frames = INT64_MAX;
1377 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1378 for (i = 0; i<o->nb_max_frames; i++) {
1379 char *p = o->max_frames[i].specifier;
1380 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1381 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1386 ost->copy_prior_start = -1;
1387 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1389 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1390 while (bsfs && *bsfs) {
1391 const AVBitStreamFilter *filter;
1392 char *bsf, *bsf_options_str, *bsf_name;
1394 bsf = av_get_token(&bsfs, ",");
1397 bsf_name = av_strtok(bsf, "=", &bsf_options_str);
1401 filter = av_bsf_get_by_name(bsf_name);
1403 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
1407 ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
1408 ost->nb_bitstream_filters + 1,
1409 sizeof(*ost->bsf_ctx));
1413 ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
1415 av_log(NULL, AV_LOG_ERROR, "Error allocating a bitstream filter context\n");
1419 ost->nb_bitstream_filters++;
1421 if (bsf_options_str && filter->priv_class) {
1422 const AVOption *opt = av_opt_next(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, NULL);
1423 const char * shorthand[2] = {NULL};
1426 shorthand[0] = opt->name;
1428 ret = av_opt_set_from_string(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, bsf_options_str, shorthand, "=", ":");
1430 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
1440 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1442 uint32_t tag = strtol(codec_tag, &next, 0);
1444 tag = AV_RL32(codec_tag);
1445 ost->st->codecpar->codec_tag =
1446 ost->enc_ctx->codec_tag = tag;
1449 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1451 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1452 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1455 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1456 ost->disposition = av_strdup(ost->disposition);
1458 ost->max_muxing_queue_size = 128;
1459 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1460 ost->max_muxing_queue_size *= sizeof(AVPacket);
1462 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1463 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1465 av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1467 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1468 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1469 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1471 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1473 ost->source_index = source_index;
1474 if (source_index >= 0) {
1475 ost->sync_ist = input_streams[source_index];
1476 input_streams[source_index]->discard = 0;
1477 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1479 ost->last_mux_dts = AV_NOPTS_VALUE;
1481 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1482 if (!ost->muxing_queue)
1488 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1491 const char *p = str;
1498 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1505 /* read file contents into a string */
1506 static uint8_t *read_file(const char *filename)
1508 AVIOContext *pb = NULL;
1509 AVIOContext *dyn_buf = NULL;
1510 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1511 uint8_t buf[1024], *str;
1514 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1518 ret = avio_open_dyn_buf(&dyn_buf);
1523 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1524 avio_write(dyn_buf, buf, ret);
1525 avio_w8(dyn_buf, 0);
1528 ret = avio_close_dyn_buf(dyn_buf, &str);
1534 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1537 AVStream *st = ost->st;
1539 if (ost->filters_script && ost->filters) {
1540 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1541 "output stream #%d:%d.\n", nb_output_files, st->index);
1545 if (ost->filters_script)
1546 return read_file(ost->filters_script);
1547 else if (ost->filters)
1548 return av_strdup(ost->filters);
1550 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1554 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1555 const OutputStream *ost, enum AVMediaType type)
1557 if (ost->filters_script || ost->filters) {
1558 av_log(NULL, AV_LOG_ERROR,
1559 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1560 "Filtering and streamcopy cannot be used together.\n",
1561 ost->filters ? "Filtergraph" : "Filtergraph script",
1562 ost->filters ? ost->filters : ost->filters_script,
1563 av_get_media_type_string(type), ost->file_index, ost->index);
1568 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1572 AVCodecContext *video_enc;
1573 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1575 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1577 video_enc = ost->enc_ctx;
1579 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1580 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1581 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1584 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1585 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1587 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1588 if (frame_aspect_ratio) {
1590 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1591 q.num <= 0 || q.den <= 0) {
1592 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1595 ost->frame_aspect_ratio = q;
1598 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1599 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1601 if (!ost->stream_copy) {
1602 const char *p = NULL;
1603 char *frame_size = NULL;
1604 char *frame_pix_fmt = NULL;
1605 char *intra_matrix = NULL, *inter_matrix = NULL;
1606 char *chroma_intra_matrix = NULL;
1610 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1611 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1612 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1616 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1617 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1618 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1619 ost->keep_pix_fmt = 1;
1620 if (!*++frame_pix_fmt)
1621 frame_pix_fmt = NULL;
1623 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1624 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1627 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1630 video_enc->gop_size = 0;
1631 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1633 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1634 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1637 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1639 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1640 if (chroma_intra_matrix) {
1641 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1643 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1646 av_codec_set_chroma_intra_matrix(video_enc, p);
1647 parse_matrix_coeffs(p, chroma_intra_matrix);
1649 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1651 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1652 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1655 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1658 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1659 for (i = 0; p; i++) {
1661 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1663 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1666 video_enc->rc_override =
1667 av_realloc_array(video_enc->rc_override,
1668 i + 1, sizeof(RcOverride));
1669 if (!video_enc->rc_override) {
1670 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1673 video_enc->rc_override[i].start_frame = start;
1674 video_enc->rc_override[i].end_frame = end;
1676 video_enc->rc_override[i].qscale = q;
1677 video_enc->rc_override[i].quality_factor = 1.0;
1680 video_enc->rc_override[i].qscale = 0;
1681 video_enc->rc_override[i].quality_factor = -q/100.0;
1686 video_enc->rc_override_count = i;
1689 video_enc->flags|= AV_CODEC_FLAG_PSNR;
1692 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1695 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1696 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1699 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1700 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1704 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1705 if (ost->logfile_prefix &&
1706 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1710 char logfilename[1024];
1713 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1714 ost->logfile_prefix ? ost->logfile_prefix :
1715 DEFAULT_PASS_LOGFILENAME_PREFIX,
1717 if (!strcmp(ost->enc->name, "libx264")) {
1718 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1720 if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1721 char *logbuffer = read_file(logfilename);
1724 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1728 video_enc->stats_in = logbuffer;
1730 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1731 f = av_fopen_utf8(logfilename, "wb");
1733 av_log(NULL, AV_LOG_FATAL,
1734 "Cannot write log file '%s' for pass-1 encoding: %s\n",
1735 logfilename, strerror(errno));
1743 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1744 if (ost->forced_keyframes)
1745 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1747 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1749 ost->top_field_first = -1;
1750 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1753 ost->avfilter = get_ost_filters(o, oc, ost);
1757 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1760 if (ost->stream_copy)
1761 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1766 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1771 AVCodecContext *audio_enc;
1773 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1776 audio_enc = ost->enc_ctx;
1777 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1779 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1780 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1782 if (!ost->stream_copy) {
1783 char *sample_fmt = NULL;
1785 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1787 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1789 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1790 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1794 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1796 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1797 ost->apad = av_strdup(ost->apad);
1799 ost->avfilter = get_ost_filters(o, oc, ost);
1803 /* check for channel mapping for this audio stream */
1804 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1805 AudioChannelMap *map = &o->audio_channel_maps[n];
1806 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1807 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1810 if (map->channel_idx == -1) {
1812 } else if (ost->source_index < 0) {
1813 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1814 ost->file_index, ost->st->index);
1817 ist = input_streams[ost->source_index];
1820 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1821 if (av_reallocp_array(&ost->audio_channels_map,
1822 ost->audio_channels_mapped + 1,
1823 sizeof(*ost->audio_channels_map)
1827 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1833 if (ost->stream_copy)
1834 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1839 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1843 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1844 if (!ost->stream_copy) {
1845 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1852 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1856 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1857 if (!ost->stream_copy) {
1858 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1865 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1867 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1868 ost->stream_copy = 1;
1873 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1877 AVCodecContext *subtitle_enc;
1879 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1881 subtitle_enc = ost->enc_ctx;
1883 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1885 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1887 if (!ost->stream_copy) {
1888 char *frame_size = NULL;
1890 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1891 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1892 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1900 /* arg format is "output-stream-index:streamid-value". */
1901 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1903 OptionsContext *o = optctx;
1908 av_strlcpy(idx_str, arg, sizeof(idx_str));
1909 p = strchr(idx_str, ':');
1911 av_log(NULL, AV_LOG_FATAL,
1912 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1917 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1918 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1919 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1923 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1925 AVFormatContext *is = ifile->ctx;
1926 AVFormatContext *os = ofile->ctx;
1930 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1932 return AVERROR(ENOMEM);
1935 for (i = 0; i < is->nb_chapters; i++) {
1936 AVChapter *in_ch = is->chapters[i], *out_ch;
1937 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1938 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1939 AV_TIME_BASE_Q, in_ch->time_base);
1940 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1941 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1944 if (in_ch->end < ts_off)
1946 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1949 out_ch = av_mallocz(sizeof(AVChapter));
1951 return AVERROR(ENOMEM);
1953 out_ch->id = in_ch->id;
1954 out_ch->time_base = in_ch->time_base;
1955 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1956 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1959 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1961 os->chapters[os->nb_chapters++] = out_ch;
1966 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1969 AVFormatContext *ic = avformat_alloc_context();
1971 ic->flags |= AVFMT_FLAG_KEEP_SIDE_DATA;
1972 ic->interrupt_callback = int_cb;
1973 err = avformat_open_input(&ic, filename, NULL, NULL);
1976 /* copy stream format */
1977 for(i=0;i<ic->nb_streams;i++) {
1981 const char *enc_config;
1983 codec = avcodec_find_encoder(ic->streams[i]->codecpar->codec_id);
1985 av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codecpar->codec_id);
1986 return AVERROR(EINVAL);
1988 if (codec->type == AVMEDIA_TYPE_AUDIO)
1989 opt_audio_codec(o, "c:a", codec->name);
1990 else if (codec->type == AVMEDIA_TYPE_VIDEO)
1991 opt_video_codec(o, "c:v", codec->name);
1992 ost = new_output_stream(o, s, codec->type, -1);
1995 avcodec_get_context_defaults3(st->codec, codec);
1996 enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
1998 AVDictionary *opts = NULL;
1999 av_dict_parse_string(&opts, enc_config, "=", ",", 0);
2000 av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
2001 av_dict_free(&opts);
2004 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
2005 choose_sample_fmt(st, codec);
2006 else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
2007 choose_pixel_fmt(st, st->codec, codec, st->codecpar->format);
2008 avcodec_copy_context(ost->enc_ctx, st->codec);
2010 av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
2013 avformat_close_input(&ic);
2017 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
2018 AVFormatContext *oc)
2022 switch (ofilter->type) {
2023 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
2024 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
2026 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
2031 ost->source_index = -1;
2032 ost->filter = ofilter;
2035 ofilter->format = -1;
2037 if (ost->stream_copy) {
2038 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
2039 "which is fed from a complex filtergraph. Filtering and streamcopy "
2040 "cannot be used together.\n", ost->file_index, ost->index);
2044 if (ost->avfilter && (ost->filters || ost->filters_script)) {
2045 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
2046 av_log(NULL, AV_LOG_ERROR,
2047 "%s '%s' was specified through the %s option "
2048 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
2049 "%s and -filter_complex cannot be used together for the same stream.\n",
2050 ost->filters ? "Filtergraph" : "Filtergraph script",
2051 ost->filters ? ost->filters : ost->filters_script,
2052 opt, ost->file_index, ost->index, opt);
2056 avfilter_inout_free(&ofilter->out_tmp);
2059 static int init_complex_filters(void)
2063 for (i = 0; i < nb_filtergraphs; i++) {
2064 ret = init_complex_filtergraph(filtergraphs[i]);
2071 static int open_output_file(OptionsContext *o, const char *filename)
2073 AVFormatContext *oc;
2075 AVOutputFormat *file_oformat;
2079 AVDictionary *unused_opts = NULL;
2080 AVDictionaryEntry *e = NULL;
2081 int format_flags = 0;
2083 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
2084 o->stop_time = INT64_MAX;
2085 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
2088 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
2089 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
2090 if (o->stop_time <= start_time) {
2091 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
2094 o->recording_time = o->stop_time - start_time;
2098 GROW_ARRAY(output_files, nb_output_files);
2099 of = av_mallocz(sizeof(*of));
2102 output_files[nb_output_files - 1] = of;
2104 of->ost_index = nb_output_streams;
2105 of->recording_time = o->recording_time;
2106 of->start_time = o->start_time;
2107 of->limit_filesize = o->limit_filesize;
2108 of->shortest = o->shortest;
2109 av_dict_copy(&of->opts, o->g->format_opts, 0);
2111 if (!strcmp(filename, "-"))
2114 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
2116 print_error(filename, err);
2121 if (o->recording_time != INT64_MAX)
2122 oc->duration = o->recording_time;
2124 file_oformat= oc->oformat;
2125 oc->interrupt_callback = int_cb;
2127 e = av_dict_get(o->g->format_opts, "fflags", NULL, 0);
2129 const AVOption *o = av_opt_find(oc, "fflags", NULL, 0, 0);
2130 av_opt_eval_flags(oc, o, e->value, &format_flags);
2133 /* create streams for all unlabeled output pads */
2134 for (i = 0; i < nb_filtergraphs; i++) {
2135 FilterGraph *fg = filtergraphs[i];
2136 for (j = 0; j < fg->nb_outputs; j++) {
2137 OutputFilter *ofilter = fg->outputs[j];
2139 if (!ofilter->out_tmp || ofilter->out_tmp->name)
2142 switch (ofilter->type) {
2143 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
2144 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
2145 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
2147 init_output_filter(ofilter, o, oc);
2151 /* ffserver seeking with date=... needs a date reference */
2152 if (!strcmp(file_oformat->name, "ffm") &&
2153 !(format_flags & AVFMT_FLAG_BITEXACT) &&
2154 av_strstart(filename, "http:", NULL)) {
2155 int err = parse_option(o, "metadata", "creation_time=now", options);
2157 print_error(filename, err);
2162 if (!strcmp(file_oformat->name, "ffm") && !override_ffserver &&
2163 av_strstart(filename, "http:", NULL)) {
2165 /* special case for files sent to ffserver: we get the stream
2166 parameters from ffserver */
2167 int err = read_ffserver_streams(o, oc, filename);
2169 print_error(filename, err);
2172 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
2173 ost = output_streams[j];
2174 for (i = 0; i < nb_input_streams; i++) {
2175 ist = input_streams[i];
2176 if(ist->st->codecpar->codec_type == ost->st->codecpar->codec_type){
2178 ost->source_index= i;
2179 if(ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
2180 if(ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
2182 ist->st->discard = ist->user_set_discard;
2187 av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codecpar->codec_type));
2191 } else if (!o->nb_stream_maps) {
2192 char *subtitle_codec_name = NULL;
2193 /* pick the "best" stream of each type */
2195 /* video: highest resolution */
2196 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2197 int area = 0, idx = -1;
2198 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2199 for (i = 0; i < nb_input_streams; i++) {
2201 ist = input_streams[i];
2202 new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames;
2203 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2205 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
2207 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2214 new_video_stream(o, oc, idx);
2217 /* audio: most channels */
2218 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2219 int best_score = 0, idx = -1;
2220 for (i = 0; i < nb_input_streams; i++) {
2222 ist = input_streams[i];
2223 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames;
2224 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
2225 score > best_score) {
2231 new_audio_stream(o, oc, idx);
2234 /* subtitles: pick first */
2235 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2236 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2237 for (i = 0; i < nb_input_streams; i++)
2238 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2239 AVCodecDescriptor const *input_descriptor =
2240 avcodec_descriptor_get(input_streams[i]->st->codecpar->codec_id);
2241 AVCodecDescriptor const *output_descriptor = NULL;
2242 AVCodec const *output_codec =
2243 avcodec_find_encoder(oc->oformat->subtitle_codec);
2244 int input_props = 0, output_props = 0;
2246 output_descriptor = avcodec_descriptor_get(output_codec->id);
2247 if (input_descriptor)
2248 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2249 if (output_descriptor)
2250 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2251 if (subtitle_codec_name ||
2252 input_props & output_props ||
2253 // Map dvb teletext which has neither property to any output subtitle encoder
2254 input_descriptor && output_descriptor &&
2255 (!input_descriptor->props ||
2256 !output_descriptor->props)) {
2257 new_subtitle_stream(o, oc, i);
2262 /* Data only if codec id match */
2263 if (!o->data_disable ) {
2264 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2265 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2266 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
2267 && input_streams[i]->st->codecpar->codec_id == codec_id )
2268 new_data_stream(o, oc, i);
2272 for (i = 0; i < o->nb_stream_maps; i++) {
2273 StreamMap *map = &o->stream_maps[i];
2278 if (map->linklabel) {
2280 OutputFilter *ofilter = NULL;
2283 for (j = 0; j < nb_filtergraphs; j++) {
2284 fg = filtergraphs[j];
2285 for (k = 0; k < fg->nb_outputs; k++) {
2286 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2287 if (out && !strcmp(out->name, map->linklabel)) {
2288 ofilter = fg->outputs[k];
2295 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2296 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2299 init_output_filter(ofilter, o, oc);
2301 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2303 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2304 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
2306 if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
2308 if(o-> video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
2310 if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2314 switch (ist->st->codecpar->codec_type) {
2315 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2316 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2317 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2318 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2319 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2320 case AVMEDIA_TYPE_UNKNOWN:
2321 if (copy_unknown_streams) {
2322 ost = new_unknown_stream (o, oc, src_idx);
2326 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2327 "Cannot map stream #%d:%d - unsupported type.\n",
2328 map->file_index, map->stream_index);
2329 if (!ignore_unknown_streams) {
2330 av_log(NULL, AV_LOG_FATAL,
2331 "If you want unsupported types ignored instead "
2332 "of failing, please use the -ignore_unknown option\n"
2333 "If you want them copied, please use -copy_unknown\n");
2338 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2339 + map->sync_stream_index];
2344 /* handle attached files */
2345 for (i = 0; i < o->nb_attachments; i++) {
2347 uint8_t *attachment;
2351 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2352 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2356 if ((len = avio_size(pb)) <= 0) {
2357 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2361 if (!(attachment = av_malloc(len))) {
2362 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
2366 avio_read(pb, attachment, len);
2368 ost = new_attachment_stream(o, oc, -1);
2369 ost->stream_copy = 0;
2370 ost->attachment_filename = o->attachments[i];
2371 ost->st->codecpar->extradata = attachment;
2372 ost->st->codecpar->extradata_size = len;
2374 p = strrchr(o->attachments[i], '/');
2375 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2379 #if FF_API_LAVF_AVCTX
2380 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2381 AVDictionaryEntry *e;
2382 ost = output_streams[i];
2384 if ((ost->stream_copy || ost->attachment_filename)
2385 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2386 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2387 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2392 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2393 av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
2394 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2398 /* check if all codec options have been used */
2399 unused_opts = strip_specifiers(o->g->codec_opts);
2400 for (i = of->ost_index; i < nb_output_streams; i++) {
2402 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2403 AV_DICT_IGNORE_SUFFIX)))
2404 av_dict_set(&unused_opts, e->key, NULL, 0);
2408 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2409 const AVClass *class = avcodec_get_class();
2410 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2411 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2412 const AVClass *fclass = avformat_get_class();
2413 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2414 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2415 if (!option || foption)
2419 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2420 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2421 "output file #%d (%s) is not an encoding option.\n", e->key,
2422 option->help ? option->help : "", nb_output_files - 1,
2427 // gop_timecode is injected by generic code but not always used
2428 if (!strcmp(e->key, "gop_timecode"))
2431 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2432 "output file #%d (%s) has not been used for any stream. The most "
2433 "likely reason is either wrong type (e.g. a video option with "
2434 "no video streams) or that it is a private option of some encoder "
2435 "which was not actually used for any stream.\n", e->key,
2436 option->help ? option->help : "", nb_output_files - 1, filename);
2438 av_dict_free(&unused_opts);
2440 /* set the decoding_needed flags and create simple filtergraphs */
2441 for (i = of->ost_index; i < nb_output_streams; i++) {
2442 OutputStream *ost = output_streams[i];
2444 if (ost->encoding_needed && ost->source_index >= 0) {
2445 InputStream *ist = input_streams[ost->source_index];
2446 ist->decoding_needed |= DECODING_FOR_OST;
2448 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
2449 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2450 err = init_simple_filtergraph(ist, ost);
2452 av_log(NULL, AV_LOG_ERROR,
2453 "Error initializing a simple filtergraph between streams "
2454 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
2455 nb_output_files - 1, ost->st->index);
2461 /* set the filter output constraints */
2463 OutputFilter *f = ost->filter;
2465 switch (ost->enc_ctx->codec_type) {
2466 case AVMEDIA_TYPE_VIDEO:
2467 f->frame_rate = ost->frame_rate;
2468 f->width = ost->enc_ctx->width;
2469 f->height = ost->enc_ctx->height;
2470 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
2471 f->format = ost->enc_ctx->pix_fmt;
2472 } else if (ost->enc->pix_fmts) {
2474 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
2476 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2479 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
2482 case AVMEDIA_TYPE_AUDIO:
2483 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
2484 f->format = ost->enc_ctx->sample_fmt;
2485 } else if (ost->enc->sample_fmts) {
2487 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
2489 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2492 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
2494 if (ost->enc_ctx->sample_rate) {
2495 f->sample_rate = ost->enc_ctx->sample_rate;
2496 } else if (ost->enc->supported_samplerates) {
2498 while (ost->enc->supported_samplerates[count])
2500 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
2501 if (!f->sample_rates)
2503 memcpy(f->sample_rates, ost->enc->supported_samplerates,
2504 (count + 1) * sizeof(*f->sample_rates));
2506 if (ost->enc_ctx->channels) {
2507 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
2508 } else if (ost->enc->channel_layouts) {
2510 while (ost->enc->channel_layouts[count])
2512 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
2513 if (!f->channel_layouts)
2515 memcpy(f->channel_layouts, ost->enc->channel_layouts,
2516 (count + 1) * sizeof(*f->channel_layouts));
2523 /* check filename in case of an image number is expected */
2524 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2525 if (!av_filename_number_test(oc->filename)) {
2526 print_error(oc->filename, AVERROR(EINVAL));
2531 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2532 av_log(NULL, AV_LOG_ERROR,
2533 "No input streams but output needs an input stream\n");
2537 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2538 /* test if it already exists to avoid losing precious files */
2539 assert_file_overwrite(filename);
2542 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2543 &oc->interrupt_callback,
2545 print_error(filename, err);
2548 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2549 assert_file_overwrite(filename);
2551 if (o->mux_preload) {
2552 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2554 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2557 for (i = 0; i < o->nb_metadata_map; i++) {
2559 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2561 if (in_file_index >= nb_input_files) {
2562 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2565 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2566 in_file_index >= 0 ?
2567 input_files[in_file_index]->ctx : NULL, o);
2571 if (o->chapters_input_file >= nb_input_files) {
2572 if (o->chapters_input_file == INT_MAX) {
2573 /* copy chapters from the first input file that has them*/
2574 o->chapters_input_file = -1;
2575 for (i = 0; i < nb_input_files; i++)
2576 if (input_files[i]->ctx->nb_chapters) {
2577 o->chapters_input_file = i;
2581 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2582 o->chapters_input_file);
2586 if (o->chapters_input_file >= 0)
2587 copy_chapters(input_files[o->chapters_input_file], of,
2588 !o->metadata_chapters_manual);
2590 /* copy global metadata by default */
2591 if (!o->metadata_global_manual && nb_input_files){
2592 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2593 AV_DICT_DONT_OVERWRITE);
2594 if(o->recording_time != INT64_MAX)
2595 av_dict_set(&oc->metadata, "duration", NULL, 0);
2596 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2598 if (!o->metadata_streams_manual)
2599 for (i = of->ost_index; i < nb_output_streams; i++) {
2601 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2603 ist = input_streams[output_streams[i]->source_index];
2604 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2605 if (!output_streams[i]->stream_copy) {
2606 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2610 /* process manually set programs */
2611 for (i = 0; i < o->nb_program; i++) {
2612 const char *p = o->program[i].u.str;
2617 const char *p2 = av_get_token(&p, ":");
2618 const char *to_dealloc = p2;
2625 key = av_get_token(&p2, "=");
2627 av_freep(&to_dealloc);
2633 if (!strcmp(key, "program_num"))
2634 progid = strtol(p2, NULL, 0);
2635 av_freep(&to_dealloc);
2639 program = av_new_program(oc, progid);
2641 p = o->program[i].u.str;
2643 const char *p2 = av_get_token(&p, ":");
2644 const char *to_dealloc = p2;
2650 key = av_get_token(&p2, "=");
2652 av_log(NULL, AV_LOG_FATAL,
2653 "No '=' character in program string %s.\n",
2661 if (!strcmp(key, "title")) {
2662 av_dict_set(&program->metadata, "title", p2, 0);
2663 } else if (!strcmp(key, "program_num")) {
2664 } else if (!strcmp(key, "st")) {
2665 int st_num = strtol(p2, NULL, 0);
2666 av_program_add_stream_index(oc, progid, st_num);
2668 av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2671 av_freep(&to_dealloc);
2676 /* process manually set metadata */
2677 for (i = 0; i < o->nb_metadata; i++) {
2680 const char *stream_spec;
2681 int index = 0, j, ret = 0;
2683 val = strchr(o->metadata[i].u.str, '=');
2685 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2686 o->metadata[i].u.str);
2691 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2693 for (j = 0; j < oc->nb_streams; j++) {
2694 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2695 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2696 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2698 double theta = av_strtod(val, &tail);
2700 ost->rotate_overridden = 1;
2701 ost->rotate_override_value = theta;
2704 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2716 if (index < 0 || index >= oc->nb_chapters) {
2717 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2720 m = &oc->chapters[index]->metadata;
2723 if (index < 0 || index >= oc->nb_programs) {
2724 av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2727 m = &oc->programs[index]->metadata;
2730 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2733 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2740 static int opt_target(void *optctx, const char *opt, const char *arg)
2742 OptionsContext *o = optctx;
2743 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2744 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2746 if (!strncmp(arg, "pal-", 4)) {
2749 } else if (!strncmp(arg, "ntsc-", 5)) {
2752 } else if (!strncmp(arg, "film-", 5)) {
2756 /* Try to determine PAL/NTSC by peeking in the input files */
2757 if (nb_input_files) {
2759 for (j = 0; j < nb_input_files; j++) {
2760 for (i = 0; i < input_files[j]->nb_streams; i++) {
2761 AVStream *st = input_files[j]->ctx->streams[i];
2762 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2764 fr = st->time_base.den * 1000 / st->time_base.num;
2768 } else if ((fr == 29970) || (fr == 23976)) {
2773 if (norm != UNKNOWN)
2777 if (norm != UNKNOWN)
2778 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2781 if (norm == UNKNOWN) {
2782 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2783 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2784 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2788 if (!strcmp(arg, "vcd")) {
2789 opt_video_codec(o, "c:v", "mpeg1video");
2790 opt_audio_codec(o, "c:a", "mp2");
2791 parse_option(o, "f", "vcd", options);
2793 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2794 parse_option(o, "r", frame_rates[norm], options);
2795 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2797 opt_default(NULL, "b:v", "1150000");
2798 opt_default(NULL, "maxrate:v", "1150000");
2799 opt_default(NULL, "minrate:v", "1150000");
2800 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2802 opt_default(NULL, "b:a", "224000");
2803 parse_option(o, "ar", "44100", options);
2804 parse_option(o, "ac", "2", options);
2806 opt_default(NULL, "packetsize", "2324");
2807 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2809 /* We have to offset the PTS, so that it is consistent with the SCR.
2810 SCR starts at 36000, but the first two packs contain only padding
2811 and the first pack from the other stream, respectively, may also have
2812 been written before.
2813 So the real data starts at SCR 36000+3*1200. */
2814 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2815 } else if (!strcmp(arg, "svcd")) {
2817 opt_video_codec(o, "c:v", "mpeg2video");
2818 opt_audio_codec(o, "c:a", "mp2");
2819 parse_option(o, "f", "svcd", options);
2821 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2822 parse_option(o, "r", frame_rates[norm], options);
2823 parse_option(o, "pix_fmt", "yuv420p", options);
2824 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2826 opt_default(NULL, "b:v", "2040000");
2827 opt_default(NULL, "maxrate:v", "2516000");
2828 opt_default(NULL, "minrate:v", "0"); // 1145000;
2829 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2830 opt_default(NULL, "scan_offset", "1");
2832 opt_default(NULL, "b:a", "224000");
2833 parse_option(o, "ar", "44100", options);
2835 opt_default(NULL, "packetsize", "2324");
2837 } else if (!strcmp(arg, "dvd")) {
2839 opt_video_codec(o, "c:v", "mpeg2video");
2840 opt_audio_codec(o, "c:a", "ac3");
2841 parse_option(o, "f", "dvd", options);
2843 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2844 parse_option(o, "r", frame_rates[norm], options);
2845 parse_option(o, "pix_fmt", "yuv420p", options);
2846 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2848 opt_default(NULL, "b:v", "6000000");
2849 opt_default(NULL, "maxrate:v", "9000000");
2850 opt_default(NULL, "minrate:v", "0"); // 1500000;
2851 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2853 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2854 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2856 opt_default(NULL, "b:a", "448000");
2857 parse_option(o, "ar", "48000", options);
2859 } else if (!strncmp(arg, "dv", 2)) {
2861 parse_option(o, "f", "dv", options);
2863 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2864 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2865 norm == PAL ? "yuv420p" : "yuv411p", options);
2866 parse_option(o, "r", frame_rates[norm], options);
2868 parse_option(o, "ar", "48000", options);
2869 parse_option(o, "ac", "2", options);
2872 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2873 return AVERROR(EINVAL);
2876 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2877 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2882 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2884 av_free (vstats_filename);
2885 vstats_filename = av_strdup (arg);
2889 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2892 time_t today2 = time(NULL);
2893 struct tm *today = localtime(&today2);
2895 if (!today) { // maybe tomorrow
2896 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2900 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2902 return opt_vstats_file(NULL, opt, filename);
2905 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2907 OptionsContext *o = optctx;
2908 return parse_option(o, "frames:v", arg, options);
2911 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2913 OptionsContext *o = optctx;
2914 return parse_option(o, "frames:a", arg, options);
2917 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2919 OptionsContext *o = optctx;
2920 return parse_option(o, "frames:d", arg, options);
2923 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2926 AVDictionary *cbak = codec_opts;
2927 AVDictionary *fbak = format_opts;
2931 ret = opt_default(NULL, opt, arg);
2933 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2934 av_dict_copy(&o->g->format_opts, format_opts, 0);
2935 av_dict_free(&codec_opts);
2936 av_dict_free(&format_opts);
2943 static int opt_preset(void *optctx, const char *opt, const char *arg)
2945 OptionsContext *o = optctx;
2947 char filename[1000], line[1000], tmp_line[1000];
2948 const char *codec_name = NULL;
2952 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2954 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2955 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2956 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2958 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2962 while (fgets(line, sizeof(line), f)) {
2963 char *key = tmp_line, *value, *endptr;
2965 if (strcspn(line, "#\n\r") == 0)
2967 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2968 if (!av_strtok(key, "=", &value) ||
2969 !av_strtok(value, "\r\n", &endptr)) {
2970 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2973 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2975 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2976 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2977 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2978 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2979 else if (opt_default_new(o, key, value) < 0) {
2980 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2981 filename, line, key, value);
2991 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2993 OptionsContext *o = optctx;
2994 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2995 int ret = parse_option(o, s, arg, options);
3000 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
3002 OptionsContext *o = optctx;
3004 if(!strcmp(opt, "ab")){
3005 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
3007 } else if(!strcmp(opt, "b")){
3008 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
3009 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
3012 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3016 static int opt_qscale(void *optctx, const char *opt, const char *arg)
3018 OptionsContext *o = optctx;
3021 if(!strcmp(opt, "qscale")){
3022 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
3023 return parse_option(o, "q:v", arg, options);
3025 s = av_asprintf("q%s", opt + 6);
3026 ret = parse_option(o, s, arg, options);
3031 static int opt_profile(void *optctx, const char *opt, const char *arg)
3033 OptionsContext *o = optctx;
3034 if(!strcmp(opt, "profile")){
3035 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
3036 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
3039 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3043 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
3045 OptionsContext *o = optctx;
3046 return parse_option(o, "filter:v", arg, options);
3049 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
3051 OptionsContext *o = optctx;
3052 return parse_option(o, "filter:a", arg, options);
3055 static int opt_vsync(void *optctx, const char *opt, const char *arg)
3057 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
3058 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
3059 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
3060 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
3062 if (video_sync_method == VSYNC_AUTO)
3063 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
3067 static int opt_timecode(void *optctx, const char *opt, const char *arg)
3069 OptionsContext *o = optctx;
3070 char *tcr = av_asprintf("timecode=%s", arg);
3071 int ret = parse_option(o, "metadata:g", tcr, options);
3073 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
3078 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
3080 OptionsContext *o = optctx;
3081 char layout_str[32];
3084 int ret, channels, ac_str_size;
3087 layout = av_get_channel_layout(arg);
3089 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
3090 return AVERROR(EINVAL);
3092 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
3093 ret = opt_default_new(o, opt, layout_str);
3097 /* set 'ac' option based on channel layout */
3098 channels = av_get_channel_layout_nb_channels(layout);
3099 snprintf(layout_str, sizeof(layout_str), "%d", channels);
3100 stream_str = strchr(opt, ':');
3101 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
3102 ac_str = av_mallocz(ac_str_size);
3104 return AVERROR(ENOMEM);
3105 av_strlcpy(ac_str, "ac", 3);
3107 av_strlcat(ac_str, stream_str, ac_str_size);
3108 ret = parse_option(o, ac_str, layout_str, options);
3114 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
3116 OptionsContext *o = optctx;
3117 return parse_option(o, "q:a", arg, options);
3120 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
3122 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3123 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3124 return AVERROR(ENOMEM);
3125 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3126 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
3127 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
3128 return AVERROR(ENOMEM);
3130 input_stream_potentially_available = 1;
3135 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
3137 uint8_t *graph_desc = read_file(arg);
3139 return AVERROR(EINVAL);
3141 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3142 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3143 return AVERROR(ENOMEM);
3144 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3145 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
3147 input_stream_potentially_available = 1;
3152 void show_help_default(const char *opt, const char *arg)
3154 /* per-file options have at least one of those set */
3155 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
3156 int show_advanced = 0, show_avoptions = 0;
3159 if (!strcmp(opt, "long"))
3161 else if (!strcmp(opt, "full"))
3162 show_advanced = show_avoptions = 1;
3164 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
3169 printf("Getting help:\n"
3170 " -h -- print basic options\n"
3171 " -h long -- print more options\n"
3172 " -h full -- print all options (including all format and codec specific options, very long)\n"
3173 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
3174 " See man %s for detailed description of the options.\n"
3175 "\n", program_name);
3177 show_help_options(options, "Print help / information / capabilities:",
3180 show_help_options(options, "Global options (affect whole program "
3181 "instead of just one file:",
3182 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
3184 show_help_options(options, "Advanced global options:", OPT_EXPERT,
3185 per_file | OPT_EXIT, 0);
3187 show_help_options(options, "Per-file main options:", 0,
3188 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
3189 OPT_EXIT, per_file);
3191 show_help_options(options, "Advanced per-file options:",
3192 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
3194 show_help_options(options, "Video options:",
3195 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
3197 show_help_options(options, "Advanced Video options:",
3198 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
3200 show_help_options(options, "Audio options:",
3201 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
3203 show_help_options(options, "Advanced Audio options:",
3204 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
3205 show_help_options(options, "Subtitle options:",
3206 OPT_SUBTITLE, 0, 0);
3209 if (show_avoptions) {
3210 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3211 show_help_children(avcodec_get_class(), flags);
3212 show_help_children(avformat_get_class(), flags);
3214 show_help_children(sws_get_class(), flags);
3216 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
3217 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
3221 void show_usage(void)
3223 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
3224 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3225 av_log(NULL, AV_LOG_INFO, "\n");
3233 static const OptionGroupDef groups[] = {
3234 [GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
3235 [GROUP_INFILE] = { "input url", "i", OPT_INPUT },
3238 static int open_files(OptionGroupList *l, const char *inout,
3239 int (*open_file)(OptionsContext*, const char*))
3243 for (i = 0; i < l->nb_groups; i++) {
3244 OptionGroup *g = &l->groups[i];
3250 ret = parse_optgroup(&o, g);
3252 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3253 "%s.\n", inout, g->arg);
3257 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3258 ret = open_file(&o, g->arg);
3261 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3265 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3271 int ffmpeg_parse_options(int argc, char **argv)
3273 OptionParseContext octx;
3277 memset(&octx, 0, sizeof(octx));
3279 /* split the commandline into an internal representation */
3280 ret = split_commandline(&octx, argc, argv, options, groups,
3281 FF_ARRAY_ELEMS(groups));
3283 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3287 /* apply global options */
3288 ret = parse_optgroup(NULL, &octx.global_opts);
3290 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3294 /* configure terminal and setup signal handlers */
3297 /* open input files */
3298 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3300 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3304 /* create the complex filtergraphs */
3305 ret = init_complex_filters();
3307 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3311 /* open output files */
3312 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3314 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3318 check_filter_outputs();
3321 uninit_parse_context(&octx);
3323 av_strerror(ret, error, sizeof(error));
3324 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3329 static int opt_progress(void *optctx, const char *opt, const char *arg)
3331 AVIOContext *avio = NULL;
3334 if (!strcmp(arg, "-"))
3336 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3338 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3339 arg, av_err2str(ret));
3342 progress_avio = avio;
3346 #define OFFSET(x) offsetof(OptionsContext, x)
3347 const OptionDef options[] = {
3349 CMDUTILS_COMMON_OPTIONS
3350 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3351 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3352 "force format", "fmt" },
3353 { "y", OPT_BOOL, { &file_overwrite },
3354 "overwrite output files" },
3355 { "n", OPT_BOOL, { &no_file_overwrite },
3356 "never overwrite output files" },
3357 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3358 "Ignore unknown stream types" },
3359 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
3360 "Copy unknown stream types" },
3361 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3362 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3363 "codec name", "codec" },
3364 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3365 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3366 "codec name", "codec" },
3367 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3368 OPT_OUTPUT, { .off = OFFSET(presets) },
3369 "preset name", "preset" },
3370 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3371 OPT_OUTPUT, { .func_arg = opt_map },
3372 "set input stream mapping",
3373 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3374 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3375 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3376 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3377 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3378 "set metadata information of outfile from infile",
3379 "outfile[,metadata]:infile[,metadata]" },
3380 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3381 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3382 "set chapters mapping", "input_file_index" },
3383 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3384 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3385 "record or transcode \"duration\" seconds of audio/video",
3387 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3388 "record or transcode stop time", "time_stop" },
3389 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3390 "set the limit file size in bytes", "limit_size" },
3391 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3392 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3393 "set the start time offset", "time_off" },
3394 { "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3395 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time_eof) },
3396 "set the start time offset relative to EOF", "time_off" },
3397 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3398 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3399 "enable/disable seeking by timestamp with -ss" },
3400 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3401 OPT_INPUT, { .off = OFFSET(accurate_seek) },
3402 "enable/disable accurate seeking with -ss" },
3403 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3404 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3405 "set the input ts offset", "time_off" },
3406 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3407 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3408 "set the input ts scale", "scale" },
3409 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3410 "set the recording timestamp ('now' to set the current time)", "time" },
3411 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3412 "add metadata", "string=string" },
3413 { "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3414 "add program with specified streams", "title=string:st=number..." },
3415 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3416 OPT_OUTPUT, { .func_arg = opt_data_frames },
3417 "set the number of data frames to output", "number" },
3418 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3419 "add timings for benchmarking" },
3420 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3421 "add timings for each task" },
3422 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3423 "write program-readable progress information", "url" },
3424 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3425 "enable or disable interaction on standard input" },
3426 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3427 "set max runtime in seconds", "limit" },
3428 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3429 "dump each input packet" },
3430 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3431 "when dumping packets, also dump the payload" },
3432 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3433 OPT_INPUT, { .off = OFFSET(rate_emu) },
3434 "read input at native frame rate", "" },
3435 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3436 "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3437 "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3438 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3439 "video sync method", "" },
3440 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3441 "frame drop threshold", "" },
3442 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3443 "audio sync method", "" },
3444 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3445 "audio drift threshold", "threshold" },
3446 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
3447 "copy timestamps" },
3448 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3449 "shift input timestamps to start at 0 when using copyts" },
3450 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
3451 "copy input stream time base when stream copying", "mode" },
3452 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3453 OPT_OUTPUT, { .off = OFFSET(shortest) },
3454 "finish encoding within shortest input" },
3455 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3456 OPT_OUTPUT, { .off = OFFSET(apad) },
3458 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3459 "timestamp discontinuity delta threshold", "threshold" },
3460 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3461 "timestamp error delta threshold", "threshold" },
3462 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3463 "exit on error", "error" },
3464 { "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3465 "abort on the specified condition flags", "flags" },
3466 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3467 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3468 "copy initial non-keyframes" },
3469 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3470 "copy or discard frames before start time" },
3471 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3472 "set the number of frames to output", "number" },
3473 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3474 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3475 "force codec tag/fourcc", "fourcc/tag" },
3476 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3477 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3478 "use fixed quality scale (VBR)", "q" },
3479 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3480 OPT_OUTPUT, { .func_arg = opt_qscale },
3481 "use fixed quality scale (VBR)", "q" },
3482 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3483 "set profile", "profile" },
3484 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3485 "set stream filtergraph", "filter_graph" },
3486 { "filter_threads", HAS_ARG | OPT_INT, { &filter_nbthreads },
3487 "number of non-complex filter threads" },
3488 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3489 "read stream filtergraph description from a file", "filename" },
3490 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3491 "reinit filtergraph on input parameter changes", "" },
3492 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3493 "create a complex filtergraph", "graph_description" },
3494 { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads },
3495 "number of threads for -filter_complex" },
3496 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3497 "create a complex filtergraph", "graph_description" },
3498 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3499 "read complex filtergraph description from a file", "filename" },
3500 { "stats", OPT_BOOL, { &print_stats },
3501 "print progress report during encoding", },
3502 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3503 OPT_OUTPUT, { .func_arg = opt_attach },
3504 "add an attachment to the output file", "filename" },
3505 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3506 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3507 "extract an attachment into a file", "filename" },
3508 { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3509 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3510 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3511 "print timestamp debugging info" },
3512 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3513 "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
3514 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3515 OPT_INPUT, { .off = OFFSET(discard) },
3517 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3518 OPT_OUTPUT, { .off = OFFSET(disposition) },
3519 "disposition", "" },
3520 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3521 { .off = OFFSET(thread_queue_size) },
3522 "set the maximum number of queued packets from the demuxer" },
3525 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3526 "set the number of video frames to output", "number" },
3527 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3528 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3529 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3530 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3531 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3532 "set frame size (WxH or abbreviation)", "size" },
3533 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3534 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3535 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3536 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3537 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3538 "set pixel format", "format" },
3539 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3540 "set the number of bits per raw sample", "number" },
3541 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3542 "deprecated use -g 1" },
3543 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3545 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3546 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3547 "rate control override for specific intervals", "override" },
3548 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3549 OPT_OUTPUT, { .func_arg = opt_video_codec },
3550 "force video codec ('copy' to copy stream)", "codec" },
3551 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3553 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3555 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3556 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3557 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3558 "select the pass number (1 to 3)", "n" },
3559 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3560 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3561 "select two pass log file name prefix", "prefix" },
3562 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3563 "this option is deprecated, use the yadif filter instead" },
3564 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3565 "calculate PSNR of compressed frames" },
3566 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3567 "dump video coding statistics to file" },
3568 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3569 "dump video coding statistics to file", "file" },
3570 { "vstats_version", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &vstats_version },
3571 "Version of the vstats format to use."},
3572 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3573 "set video filters", "filter_graph" },
3574 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3575 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3576 "specify intra matrix coeffs", "matrix" },
3577 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3578 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3579 "specify inter matrix coeffs", "matrix" },
3580 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3581 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3582 "specify intra matrix coeffs", "matrix" },
3583 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3584 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3585 "top=1/bottom=0/auto=-1 field first", "" },
3586 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3587 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3588 "force video tag/fourcc", "fourcc/tag" },
3589 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3590 "show QP histogram" },
3591 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3592 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3593 "force the selected framerate, disable the best supported framerate selection" },
3594 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3595 OPT_OUTPUT, { .func_arg = opt_streamid },
3596 "set the value of an outfile streamid", "streamIndex:value" },
3597 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3598 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3599 "force key frames at specified timestamps", "timestamps" },
3600 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3601 "audio bitrate (please use -b:a)", "bitrate" },
3602 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3603 "video bitrate (please use -b:v)", "bitrate" },
3604 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3605 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3606 "use HW accelerated decoding", "hwaccel name" },
3607 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3608 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3609 "select a device for HW acceleration", "devicename" },
3610 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3611 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
3612 "select output format used with HW accelerated decoding", "format" },
3613 #if CONFIG_VDA || CONFIG_VIDEOTOOLBOX
3614 { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3616 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3617 "show available HW acceleration methods" },
3618 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3619 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3620 "automatically insert correct rotate filters" },
3621 { "hwaccel_lax_profile_check", OPT_BOOL | OPT_EXPERT, { &hwaccel_lax_profile_check},
3622 "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream" },
3625 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3626 "set the number of audio frames to output", "number" },
3627 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3628 "set audio quality (codec-specific)", "quality", },
3629 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3630 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3631 "set audio sampling rate (in Hz)", "rate" },
3632 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3633 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3634 "set number of audio channels", "channels" },
3635 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3637 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3638 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3639 "force audio codec ('copy' to copy stream)", "codec" },
3640 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3641 OPT_OUTPUT, { .func_arg = opt_old2new },
3642 "force audio tag/fourcc", "fourcc/tag" },
3643 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3644 "change audio volume (256=normal)" , "volume" },
3645 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3646 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3647 "set sample format", "format" },
3648 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3649 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3650 "set channel layout", "layout" },
3651 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3652 "set audio filters", "filter_graph" },
3653 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3654 "set the maximum number of channels to try to guess the channel layout" },
3656 /* subtitle options */
3657 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3658 "disable subtitle" },
3659 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3660 "force subtitle codec ('copy' to copy stream)", "codec" },
3661 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3662 , "force subtitle tag/fourcc", "fourcc/tag" },
3663 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3664 "fix subtitles duration" },
3665 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3666 "set canvas size (WxH or abbreviation)", "size" },
3669 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3670 "deprecated, use -channel", "channel" },
3671 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3672 "deprecated, use -standard", "standard" },
3673 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3676 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3677 "set the maximum demux-decode delay", "seconds" },
3678 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3679 "set the initial demux-decode delay", "seconds" },
3680 { "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
3681 "override the options from ffserver", "" },
3682 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3683 "specify a file in which to print sdp information", "file" },
3685 { "time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(time_bases) },
3686 "set the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)", "ratio" },
3687 { "enc_time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(enc_time_bases) },
3688 "set the desired time base for the encoder (1:24, 1:48000 or 0.04166, 2.0833e-5). "
3689 "two special values are defined - "
3690 "0 = use frame rate (video) or sample rate (audio),"
3691 "-1 = match source time base", "ratio" },
3693 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3694 "A comma-separated list of bitstream filters", "bitstream_filters" },
3695 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3696 "deprecated", "audio bitstream_filters" },
3697 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3698 "deprecated", "video bitstream_filters" },
3700 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3701 "set the audio options to the indicated preset", "preset" },
3702 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3703 "set the video options to the indicated preset", "preset" },
3704 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3705 "set the subtitle options to the indicated preset", "preset" },
3706 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3707 "set options from indicated preset file", "filename" },
3709 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
3710 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
3712 /* data codec support */
3713 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3714 "force data codec ('copy' to copy stream)", "codec" },
3715 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3719 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
3720 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
3724 { "qsv_device", HAS_ARG | OPT_STRING | OPT_EXPERT, { &qsv_device },
3725 "set QSV hardware device (DirectX adapter index, DRM path or X11 display name)", "device"},
3728 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
3729 "initialise hardware device", "args" },
3730 { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device },
3731 "set hardware device used when filtering", "device" },