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 },
81 #if CONFIG_VIDEOTOOLBOX
82 { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX,
83 AV_HWDEVICE_TYPE_NONE },
86 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV,
87 AV_HWDEVICE_TYPE_NONE },
90 { "vaapi", hwaccel_decode_init, HWACCEL_VAAPI, AV_PIX_FMT_VAAPI,
91 AV_HWDEVICE_TYPE_VAAPI },
94 { "cuvid", cuvid_init, HWACCEL_CUVID, AV_PIX_FMT_CUDA,
95 AV_HWDEVICE_TYPE_NONE },
99 AVBufferRef *hw_device_ctx;
100 HWDevice *filter_hw_device;
102 char *vstats_filename;
105 float audio_drift_threshold = 0.1;
106 float dts_delta_threshold = 10;
107 float dts_error_threshold = 3600*30;
109 int audio_volume = 256;
110 int audio_sync_method = 0;
111 int video_sync_method = VSYNC_AUTO;
112 float frame_drop_threshold = 0;
113 int do_deinterlace = 0;
114 int do_benchmark = 0;
115 int do_benchmark_all = 0;
119 int start_at_zero = 0;
122 int exit_on_error = 0;
123 int abort_on_flags = 0;
124 int print_stats = -1;
126 int stdin_interaction = 1;
127 int frame_bits_per_raw_sample = 0;
128 float max_error_rate = 2.0/3;
129 int filter_nbthreads = 0;
130 int filter_complex_nbthreads = 0;
131 int vstats_version = 2;
134 static int intra_only = 0;
135 static int file_overwrite = 0;
136 static int no_file_overwrite = 0;
137 static int do_psnr = 0;
138 static int input_sync;
139 static int override_ffserver = 0;
140 static int input_stream_potentially_available = 0;
141 static int ignore_unknown_streams = 0;
142 static int copy_unknown_streams = 0;
143 static int find_stream_info = 1;
145 static void uninit_options(OptionsContext *o)
147 const OptionDef *po = options;
150 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
152 void *dst = (uint8_t*)o + po->u.off;
154 if (po->flags & OPT_SPEC) {
155 SpecifierOpt **so = dst;
156 int i, *count = (int*)(so + 1);
157 for (i = 0; i < *count; i++) {
158 av_freep(&(*so)[i].specifier);
159 if (po->flags & OPT_STRING)
160 av_freep(&(*so)[i].u.str);
164 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
169 for (i = 0; i < o->nb_stream_maps; i++)
170 av_freep(&o->stream_maps[i].linklabel);
171 av_freep(&o->stream_maps);
172 av_freep(&o->audio_channel_maps);
173 av_freep(&o->streamid_map);
174 av_freep(&o->attachments);
177 static void init_options(OptionsContext *o)
179 memset(o, 0, sizeof(*o));
181 o->stop_time = INT64_MAX;
182 o->mux_max_delay = 0.7;
183 o->start_time = AV_NOPTS_VALUE;
184 o->start_time_eof = AV_NOPTS_VALUE;
185 o->recording_time = INT64_MAX;
186 o->limit_filesize = UINT64_MAX;
187 o->chapters_input_file = INT_MAX;
188 o->accurate_seek = 1;
191 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
195 printf("Hardware acceleration methods:\n");
196 for (i = 0; hwaccels[i].name; i++) {
197 printf("%s\n", hwaccels[i].name);
203 /* return a copy of the input with the stream specifiers removed from the keys */
204 static AVDictionary *strip_specifiers(AVDictionary *dict)
206 AVDictionaryEntry *e = NULL;
207 AVDictionary *ret = NULL;
209 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
210 char *p = strchr(e->key, ':');
214 av_dict_set(&ret, e->key, e->value, 0);
221 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
223 static const AVOption opts[] = {
224 { "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
225 { "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
228 static const AVClass class = {
230 .item_name = av_default_item_name,
232 .version = LIBAVUTIL_VERSION_INT,
234 const AVClass *pclass = &class;
236 return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
239 static int opt_sameq(void *optctx, const char *opt, const char *arg)
241 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
242 "If you are looking for an option to preserve the quality (which is not "
243 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
245 return AVERROR(EINVAL);
248 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
250 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
251 return opt_default(optctx, "channel", arg);
254 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
256 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
257 return opt_default(optctx, "standard", arg);
260 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
262 OptionsContext *o = optctx;
263 return parse_option(o, "codec:a", arg, options);
266 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
268 OptionsContext *o = optctx;
269 return parse_option(o, "codec:v", arg, options);
272 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
274 OptionsContext *o = optctx;
275 return parse_option(o, "codec:s", arg, options);
278 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
280 OptionsContext *o = optctx;
281 return parse_option(o, "codec:d", arg, options);
284 static int opt_map(void *optctx, const char *opt, const char *arg)
286 OptionsContext *o = optctx;
288 int i, negative = 0, file_idx;
289 int sync_file_idx = -1, sync_stream_idx = 0;
298 map = av_strdup(arg);
300 return AVERROR(ENOMEM);
302 /* parse sync stream first, just pick first matching stream */
303 if (sync = strchr(map, ',')) {
305 sync_file_idx = strtol(sync + 1, &sync, 0);
306 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
307 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
312 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
313 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
314 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
318 if (i == input_files[sync_file_idx]->nb_streams) {
319 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
320 "match any streams.\n", arg);
327 /* this mapping refers to lavfi output */
328 const char *c = map + 1;
329 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
330 m = &o->stream_maps[o->nb_stream_maps - 1];
331 m->linklabel = av_get_token(&c, "]");
333 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
337 if (allow_unused = strchr(map, '?'))
339 file_idx = strtol(map, &p, 0);
340 if (file_idx >= nb_input_files || file_idx < 0) {
341 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
345 /* disable some already defined maps */
346 for (i = 0; i < o->nb_stream_maps; i++) {
347 m = &o->stream_maps[i];
348 if (file_idx == m->file_index &&
349 check_stream_specifier(input_files[m->file_index]->ctx,
350 input_files[m->file_index]->ctx->streams[m->stream_index],
351 *p == ':' ? p + 1 : p) > 0)
355 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
356 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
357 *p == ':' ? p + 1 : p) <= 0)
359 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
360 m = &o->stream_maps[o->nb_stream_maps - 1];
362 m->file_index = file_idx;
365 if (sync_file_idx >= 0) {
366 m->sync_file_index = sync_file_idx;
367 m->sync_stream_index = sync_stream_idx;
369 m->sync_file_index = file_idx;
370 m->sync_stream_index = i;
377 av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
379 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
380 "To ignore this, add a trailing '?' to the map.\n", arg);
389 static int opt_attach(void *optctx, const char *opt, const char *arg)
391 OptionsContext *o = optctx;
392 GROW_ARRAY(o->attachments, o->nb_attachments);
393 o->attachments[o->nb_attachments - 1] = arg;
397 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
399 OptionsContext *o = optctx;
405 mapchan = av_strdup(arg);
407 return AVERROR(ENOMEM);
409 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
410 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
412 /* muted channel syntax */
413 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
414 if ((n == 1 || n == 3) && m->channel_idx == -1) {
415 m->file_idx = m->stream_idx = -1;
417 m->ofile_idx = m->ostream_idx = -1;
423 n = sscanf(arg, "%d.%d.%d:%d.%d",
424 &m->file_idx, &m->stream_idx, &m->channel_idx,
425 &m->ofile_idx, &m->ostream_idx);
427 if (n != 3 && n != 5) {
428 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
429 "[file.stream.channel|-1][:syncfile:syncstream]\n");
433 if (n != 5) // only file.stream.channel specified
434 m->ofile_idx = m->ostream_idx = -1;
437 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
438 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
442 if (m->stream_idx < 0 ||
443 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
444 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
445 m->file_idx, m->stream_idx);
448 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
449 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
450 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
451 m->file_idx, m->stream_idx);
454 /* allow trailing ? to map_channel */
455 if (allow_unused = strchr(mapchan, '?'))
457 if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels) {
459 av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
460 m->file_idx, m->stream_idx, m->channel_idx);
462 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n"
463 "To ignore this, add a trailing '?' to the map_channel.\n",
464 m->file_idx, m->stream_idx, m->channel_idx);
473 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
475 av_free(sdp_filename);
476 sdp_filename = av_strdup(arg);
481 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
484 const char *prefix = "vaapi:";
487 tmp = av_asprintf("%s%s", prefix, arg);
489 return AVERROR(ENOMEM);
490 err = hw_device_init_from_string(tmp, &dev);
494 hw_device_ctx = av_buffer_ref(dev->device_ref);
496 return AVERROR(ENOMEM);
501 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
503 if (!strcmp(arg, "list")) {
504 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
505 printf("Supported hardware device types:\n");
506 while ((type = av_hwdevice_iterate_types(type)) !=
507 AV_HWDEVICE_TYPE_NONE)
508 printf("%s\n", av_hwdevice_get_type_name(type));
512 return hw_device_init_from_string(arg, NULL);
516 static int opt_filter_hw_device(void *optctx, const char *opt, const char *arg)
518 if (filter_hw_device) {
519 av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
520 return AVERROR(EINVAL);
522 filter_hw_device = hw_device_get_by_name(arg);
523 if (!filter_hw_device) {
524 av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg);
525 return AVERROR(EINVAL);
531 * Parse a metadata specifier passed as 'arg' parameter.
532 * @param arg metadata string to parse
533 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
534 * @param index for type c/p, chapter/program index is written here
535 * @param stream_spec for type s, the stream specifier is written here
537 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
545 if (*(++arg) && *arg != ':') {
546 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
549 *stream_spec = *arg == ':' ? arg + 1 : "";
554 *index = strtol(++arg, NULL, 0);
557 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
564 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
566 AVDictionary **meta_in = NULL;
567 AVDictionary **meta_out = NULL;
569 char type_in, type_out;
570 const char *istream_spec = NULL, *ostream_spec = NULL;
571 int idx_in = 0, idx_out = 0;
573 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
574 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
577 if (type_out == 'g' || !*outspec)
578 o->metadata_global_manual = 1;
579 if (type_out == 's' || !*outspec)
580 o->metadata_streams_manual = 1;
581 if (type_out == 'c' || !*outspec)
582 o->metadata_chapters_manual = 1;
586 if (type_in == 'g' || type_out == 'g')
587 o->metadata_global_manual = 1;
588 if (type_in == 's' || type_out == 's')
589 o->metadata_streams_manual = 1;
590 if (type_in == 'c' || type_out == 'c')
591 o->metadata_chapters_manual = 1;
593 /* ic is NULL when just disabling automatic mappings */
597 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
598 if ((index) < 0 || (index) >= (nb_elems)) {\
599 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
604 #define SET_DICT(type, meta, context, index)\
607 meta = &context->metadata;\
610 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
611 meta = &context->chapters[index]->metadata;\
614 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
615 meta = &context->programs[index]->metadata;\
618 break; /* handled separately below */ \
619 default: av_assert0(0);\
622 SET_DICT(type_in, meta_in, ic, idx_in);
623 SET_DICT(type_out, meta_out, oc, idx_out);
625 /* for input streams choose first matching stream */
626 if (type_in == 's') {
627 for (i = 0; i < ic->nb_streams; i++) {
628 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
629 meta_in = &ic->streams[i]->metadata;
635 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
640 if (type_out == 's') {
641 for (i = 0; i < oc->nb_streams; i++) {
642 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
643 meta_out = &oc->streams[i]->metadata;
644 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
649 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
654 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
656 OptionsContext *o = optctx;
658 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
659 struct tm time = *gmtime((time_t*)&recording_timestamp);
660 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
662 parse_option(o, "metadata", buf, options);
664 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
665 "tag instead.\n", opt);
669 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
671 const AVCodecDescriptor *desc;
672 const char *codec_string = encoder ? "encoder" : "decoder";
676 avcodec_find_encoder_by_name(name) :
677 avcodec_find_decoder_by_name(name);
679 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
680 codec = encoder ? avcodec_find_encoder(desc->id) :
681 avcodec_find_decoder(desc->id);
683 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
684 codec_string, codec->name, desc->name);
688 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
691 if (codec->type != type) {
692 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
698 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
700 char *codec_name = NULL;
702 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
704 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
705 st->codecpar->codec_id = codec->id;
708 return avcodec_find_decoder(st->codecpar->codec_id);
711 /* Add all the streams from the given input file to the global
712 * list of input streams. */
713 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
717 for (i = 0; i < ic->nb_streams; i++) {
718 AVStream *st = ic->streams[i];
719 AVCodecParameters *par = st->codecpar;
720 InputStream *ist = av_mallocz(sizeof(*ist));
721 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
722 char *hwaccel_output_format = NULL;
723 char *codec_tag = NULL;
725 char *discard_str = NULL;
726 const AVClass *cc = avcodec_get_class();
727 const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL, 0, 0);
732 GROW_ARRAY(input_streams, nb_input_streams);
733 input_streams[nb_input_streams - 1] = ist;
736 ist->file_index = nb_input_files;
738 st->discard = AVDISCARD_ALL;
740 ist->min_pts = INT64_MAX;
741 ist->max_pts = INT64_MIN;
744 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
747 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
749 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
751 uint32_t tag = strtol(codec_tag, &next, 0);
753 tag = AV_RL32(codec_tag);
754 st->codecpar->codec_tag = tag;
757 ist->dec = choose_decoder(o, ic, st);
758 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
760 ist->reinit_filters = -1;
761 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
763 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
764 ist->user_set_discard = AVDISCARD_NONE;
765 if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
766 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
771 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
773 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
775 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
779 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
781 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
786 ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
788 switch (par->codec_type) {
789 case AVMEDIA_TYPE_VIDEO:
791 ist->dec = avcodec_find_decoder(par->codec_id);
793 if (av_codec_get_lowres(st->codec)) {
794 av_codec_set_lowres(ist->dec_ctx, av_codec_get_lowres(st->codec));
795 ist->dec_ctx->width = st->codec->width;
796 ist->dec_ctx->height = st->codec->height;
797 ist->dec_ctx->coded_width = st->codec->coded_width;
798 ist->dec_ctx->coded_height = st->codec->coded_height;
800 ist->dec_ctx->flags |= CODEC_FLAG_EMU_EDGE;
805 // avformat_find_stream_info() doesn't set this for us anymore.
806 ist->dec_ctx->framerate = st->avg_frame_rate;
808 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
809 if (framerate && av_parse_video_rate(&ist->framerate,
811 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
816 ist->top_field_first = -1;
817 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
819 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
821 if (!strcmp(hwaccel, "none"))
822 ist->hwaccel_id = HWACCEL_NONE;
823 else if (!strcmp(hwaccel, "auto"))
824 ist->hwaccel_id = HWACCEL_AUTO;
827 for (i = 0; hwaccels[i].name; i++) {
828 if (!strcmp(hwaccels[i].name, hwaccel)) {
829 ist->hwaccel_id = hwaccels[i].id;
834 if (!ist->hwaccel_id) {
835 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
837 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
838 for (i = 0; hwaccels[i].name; i++)
839 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
840 av_log(NULL, AV_LOG_FATAL, "\n");
846 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
847 if (hwaccel_device) {
848 ist->hwaccel_device = av_strdup(hwaccel_device);
849 if (!ist->hwaccel_device)
853 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
854 hwaccel_output_format, ic, st);
855 if (hwaccel_output_format) {
856 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
857 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
858 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
859 "format: %s", hwaccel_output_format);
862 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
865 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
868 case AVMEDIA_TYPE_AUDIO:
869 ist->guess_layout_max = INT_MAX;
870 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
871 guess_input_channel_layout(ist);
873 case AVMEDIA_TYPE_DATA:
874 case AVMEDIA_TYPE_SUBTITLE: {
875 char *canvas_size = NULL;
877 ist->dec = avcodec_find_decoder(par->codec_id);
878 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
879 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
881 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
882 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
887 case AVMEDIA_TYPE_ATTACHMENT:
888 case AVMEDIA_TYPE_UNKNOWN:
894 ret = avcodec_parameters_from_context(par, ist->dec_ctx);
896 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
902 static void assert_file_overwrite(const char *filename)
904 if (file_overwrite && no_file_overwrite) {
905 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
909 if (!file_overwrite) {
910 const char *proto_name = avio_find_protocol_name(filename);
911 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
912 if (stdin_interaction && !no_file_overwrite) {
913 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
916 signal(SIGINT, SIG_DFL);
918 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
924 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
931 static void dump_attachment(AVStream *st, const char *filename)
934 AVIOContext *out = NULL;
935 AVDictionaryEntry *e;
937 if (!st->codecpar->extradata_size) {
938 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
939 nb_input_files - 1, st->index);
942 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
945 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
946 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
950 assert_file_overwrite(filename);
952 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
953 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
958 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
963 static int open_input_file(OptionsContext *o, const char *filename)
967 AVInputFormat *file_iformat = NULL;
970 AVDictionary *unused_opts = NULL;
971 AVDictionaryEntry *e = NULL;
972 char * video_codec_name = NULL;
973 char * audio_codec_name = NULL;
974 char *subtitle_codec_name = NULL;
975 char * data_codec_name = NULL;
976 int scan_all_pmts_set = 0;
979 if (!(file_iformat = av_find_input_format(o->format))) {
980 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
985 if (!strcmp(filename, "-"))
988 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
989 strcmp(filename, "/dev/stdin");
991 /* get default parameters from command line */
992 ic = avformat_alloc_context();
994 print_error(filename, AVERROR(ENOMEM));
997 ic->flags |= AVFMT_FLAG_KEEP_SIDE_DATA;
998 if (o->nb_audio_sample_rate) {
999 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
1001 if (o->nb_audio_channels) {
1002 /* because we set audio_channels based on both the "ac" and
1003 * "channel_layout" options, we need to check that the specified
1004 * demuxer actually has the "channels" option before setting it */
1005 if (file_iformat && file_iformat->priv_class &&
1006 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
1007 AV_OPT_SEARCH_FAKE_OBJ)) {
1008 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
1011 if (o->nb_frame_rates) {
1012 /* set the format-level framerate option;
1013 * this is important for video grabbers, e.g. x11 */
1014 if (file_iformat && file_iformat->priv_class &&
1015 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
1016 AV_OPT_SEARCH_FAKE_OBJ)) {
1017 av_dict_set(&o->g->format_opts, "framerate",
1018 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
1021 if (o->nb_frame_sizes) {
1022 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
1024 if (o->nb_frame_pix_fmts)
1025 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
1027 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
1028 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
1029 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
1030 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
1032 ic->video_codec_id = video_codec_name ?
1033 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
1034 ic->audio_codec_id = audio_codec_name ?
1035 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
1036 ic->subtitle_codec_id= subtitle_codec_name ?
1037 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
1038 ic->data_codec_id = data_codec_name ?
1039 find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0)->id : AV_CODEC_ID_NONE;
1041 if (video_codec_name)
1042 av_format_set_video_codec (ic, find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0));
1043 if (audio_codec_name)
1044 av_format_set_audio_codec (ic, find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0));
1045 if (subtitle_codec_name)
1046 av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
1047 if (data_codec_name)
1048 av_format_set_data_codec(ic, find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0));
1050 ic->flags |= AVFMT_FLAG_NONBLOCK;
1052 ic->flags |= AVFMT_FLAG_BITEXACT;
1053 ic->interrupt_callback = int_cb;
1055 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
1056 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
1057 scan_all_pmts_set = 1;
1059 /* open the input file with generic avformat function */
1060 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1062 print_error(filename, err);
1063 if (err == AVERROR_PROTOCOL_NOT_FOUND)
1064 av_log(NULL, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1067 if (scan_all_pmts_set)
1068 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1069 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
1070 assert_avoptions(o->g->format_opts);
1072 /* apply forced codec ids */
1073 for (i = 0; i < ic->nb_streams; i++)
1074 choose_decoder(o, ic, ic->streams[i]);
1076 if (find_stream_info) {
1077 AVDictionary **opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
1078 int orig_nb_streams = ic->nb_streams;
1080 /* If not enough info to get the stream parameters, we decode the
1081 first frames to get it. (used in mpeg case for example) */
1082 ret = avformat_find_stream_info(ic, opts);
1084 for (i = 0; i < orig_nb_streams; i++)
1085 av_dict_free(&opts[i]);
1089 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
1090 if (ic->nb_streams == 0) {
1091 avformat_close_input(&ic);
1097 if (o->start_time_eof != AV_NOPTS_VALUE) {
1098 if (ic->duration>0) {
1099 o->start_time = o->start_time_eof + ic->duration;
1101 av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
1103 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
1104 /* add the stream start time */
1105 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1106 timestamp += ic->start_time;
1108 /* if seeking requested, we execute it */
1109 if (o->start_time != AV_NOPTS_VALUE) {
1110 int64_t seek_timestamp = timestamp;
1112 if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1113 int dts_heuristic = 0;
1114 for (i=0; i<ic->nb_streams; i++) {
1115 const AVCodecParameters *par = ic->streams[i]->codecpar;
1116 if (par->video_delay)
1119 if (dts_heuristic) {
1120 seek_timestamp -= 3*AV_TIME_BASE / 23;
1123 ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1125 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
1126 filename, (double)timestamp / AV_TIME_BASE);
1130 /* update the current parameters so that they match the one of the input stream */
1131 add_input_streams(o, ic);
1133 /* dump the file content */
1134 av_dump_format(ic, nb_input_files, filename, 0);
1136 GROW_ARRAY(input_files, nb_input_files);
1137 f = av_mallocz(sizeof(*f));
1140 input_files[nb_input_files - 1] = f;
1143 f->ist_index = nb_input_streams - ic->nb_streams;
1144 f->start_time = o->start_time;
1145 f->recording_time = o->recording_time;
1146 f->input_ts_offset = o->input_ts_offset;
1147 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1148 f->nb_streams = ic->nb_streams;
1149 f->rate_emu = o->rate_emu;
1150 f->accurate_seek = o->accurate_seek;
1153 f->time_base = (AVRational){ 1, 1 };
1155 f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
1158 /* check if all codec options have been used */
1159 unused_opts = strip_specifiers(o->g->codec_opts);
1160 for (i = f->ist_index; i < nb_input_streams; i++) {
1162 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1163 AV_DICT_IGNORE_SUFFIX)))
1164 av_dict_set(&unused_opts, e->key, NULL, 0);
1168 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1169 const AVClass *class = avcodec_get_class();
1170 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1171 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1172 const AVClass *fclass = avformat_get_class();
1173 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
1174 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1175 if (!option || foption)
1179 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1180 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1181 "input file #%d (%s) is not a decoding option.\n", e->key,
1182 option->help ? option->help : "", nb_input_files - 1,
1187 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1188 "input file #%d (%s) has not been used for any stream. The most "
1189 "likely reason is either wrong type (e.g. a video option with "
1190 "no video streams) or that it is a private option of some decoder "
1191 "which was not actually used for any stream.\n", e->key,
1192 option->help ? option->help : "", nb_input_files - 1, filename);
1194 av_dict_free(&unused_opts);
1196 for (i = 0; i < o->nb_dump_attachment; i++) {
1199 for (j = 0; j < ic->nb_streams; j++) {
1200 AVStream *st = ic->streams[j];
1202 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1203 dump_attachment(st, o->dump_attachment[i].u.str);
1207 input_stream_potentially_available = 1;
1212 static uint8_t *get_line(AVIOContext *s)
1218 if (avio_open_dyn_buf(&line) < 0) {
1219 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1223 while ((c = avio_r8(s)) && c != '\n')
1226 avio_close_dyn_buf(line, &buf);
1231 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1234 char filename[1000];
1235 const char *base[3] = { getenv("AVCONV_DATADIR"),
1240 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1244 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1245 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1246 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1249 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1250 i != 1 ? "" : "/.avconv", preset_name);
1251 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1257 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1259 enum AVMediaType type = ost->st->codecpar->codec_type;
1260 char *codec_name = NULL;
1262 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
1263 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1265 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
1266 NULL, ost->st->codecpar->codec_type);
1267 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
1269 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
1270 "output stream #%d:%d. Default encoder for format %s (codec %s) is "
1271 "probably disabled. Please choose an encoder manually.\n",
1272 ost->file_index, ost->index, s->oformat->name,
1273 avcodec_get_name(ost->st->codecpar->codec_id));
1274 return AVERROR_ENCODER_NOT_FOUND;
1276 } else if (!strcmp(codec_name, "copy"))
1277 ost->stream_copy = 1;
1279 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
1280 ost->st->codecpar->codec_id = ost->enc->id;
1282 ost->encoding_needed = !ost->stream_copy;
1284 /* no encoding supported for other media types */
1285 ost->stream_copy = 1;
1286 ost->encoding_needed = 0;
1292 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1295 AVStream *st = avformat_new_stream(oc, NULL);
1296 int idx = oc->nb_streams - 1, ret = 0;
1297 const char *bsfs = NULL, *time_base = NULL;
1298 char *next, *codec_tag = NULL;
1303 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1307 if (oc->nb_streams - 1 < o->nb_streamid_map)
1308 st->id = o->streamid_map[oc->nb_streams - 1];
1310 GROW_ARRAY(output_streams, nb_output_streams);
1311 if (!(ost = av_mallocz(sizeof(*ost))))
1313 output_streams[nb_output_streams - 1] = ost;
1315 ost->file_index = nb_output_files - 1;
1318 st->codecpar->codec_type = type;
1320 ret = choose_encoder(o, oc, ost);
1322 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1323 "%d:%d\n", ost->file_index, ost->index);
1327 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1328 if (!ost->enc_ctx) {
1329 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1332 ost->enc_ctx->codec_type = type;
1334 ost->ref_par = avcodec_parameters_alloc();
1335 if (!ost->ref_par) {
1336 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding parameters.\n");
1341 AVIOContext *s = NULL;
1342 char *buf = NULL, *arg = NULL, *preset = NULL;
1344 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1346 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1347 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1350 if (!buf[0] || buf[0] == '#') {
1354 if (!(arg = strchr(buf, '='))) {
1355 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1359 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1361 } while (!s->eof_reached);
1365 av_log(NULL, AV_LOG_FATAL,
1366 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1367 preset, ost->file_index, ost->index);
1371 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1376 ost->enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
1378 MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
1381 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1382 q.num <= 0 || q.den <= 0) {
1383 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1389 MATCH_PER_STREAM_OPT(enc_time_bases, str, time_base, oc, st);
1392 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1394 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1397 ost->enc_timebase = q;
1400 ost->max_frames = INT64_MAX;
1401 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1402 for (i = 0; i<o->nb_max_frames; i++) {
1403 char *p = o->max_frames[i].specifier;
1404 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1405 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1410 ost->copy_prior_start = -1;
1411 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1413 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1414 while (bsfs && *bsfs) {
1415 const AVBitStreamFilter *filter;
1416 char *bsf, *bsf_options_str, *bsf_name;
1418 bsf = av_get_token(&bsfs, ",");
1421 bsf_name = av_strtok(bsf, "=", &bsf_options_str);
1425 filter = av_bsf_get_by_name(bsf_name);
1427 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
1431 ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
1432 ost->nb_bitstream_filters + 1,
1433 sizeof(*ost->bsf_ctx));
1437 ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
1439 av_log(NULL, AV_LOG_ERROR, "Error allocating a bitstream filter context\n");
1443 ost->nb_bitstream_filters++;
1445 if (bsf_options_str && filter->priv_class) {
1446 const AVOption *opt = av_opt_next(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, NULL);
1447 const char * shorthand[2] = {NULL};
1450 shorthand[0] = opt->name;
1452 ret = av_opt_set_from_string(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, bsf_options_str, shorthand, "=", ":");
1454 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
1464 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1466 uint32_t tag = strtol(codec_tag, &next, 0);
1468 tag = AV_RL32(codec_tag);
1469 ost->st->codecpar->codec_tag =
1470 ost->enc_ctx->codec_tag = tag;
1473 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1475 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1476 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1479 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1480 ost->disposition = av_strdup(ost->disposition);
1482 ost->max_muxing_queue_size = 128;
1483 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1484 ost->max_muxing_queue_size *= sizeof(AVPacket);
1486 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1487 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1489 av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1491 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1492 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1493 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1495 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1497 ost->source_index = source_index;
1498 if (source_index >= 0) {
1499 ost->sync_ist = input_streams[source_index];
1500 input_streams[source_index]->discard = 0;
1501 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1503 ost->last_mux_dts = AV_NOPTS_VALUE;
1505 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1506 if (!ost->muxing_queue)
1512 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1515 const char *p = str;
1522 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1529 /* read file contents into a string */
1530 static uint8_t *read_file(const char *filename)
1532 AVIOContext *pb = NULL;
1533 AVIOContext *dyn_buf = NULL;
1534 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1535 uint8_t buf[1024], *str;
1538 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1542 ret = avio_open_dyn_buf(&dyn_buf);
1547 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1548 avio_write(dyn_buf, buf, ret);
1549 avio_w8(dyn_buf, 0);
1552 ret = avio_close_dyn_buf(dyn_buf, &str);
1558 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1561 AVStream *st = ost->st;
1563 if (ost->filters_script && ost->filters) {
1564 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1565 "output stream #%d:%d.\n", nb_output_files, st->index);
1569 if (ost->filters_script)
1570 return read_file(ost->filters_script);
1571 else if (ost->filters)
1572 return av_strdup(ost->filters);
1574 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1578 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1579 const OutputStream *ost, enum AVMediaType type)
1581 if (ost->filters_script || ost->filters) {
1582 av_log(NULL, AV_LOG_ERROR,
1583 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1584 "Filtering and streamcopy cannot be used together.\n",
1585 ost->filters ? "Filtergraph" : "Filtergraph script",
1586 ost->filters ? ost->filters : ost->filters_script,
1587 av_get_media_type_string(type), ost->file_index, ost->index);
1592 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1596 AVCodecContext *video_enc;
1597 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1599 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1601 video_enc = ost->enc_ctx;
1603 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1604 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1605 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1608 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1609 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1611 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1612 if (frame_aspect_ratio) {
1614 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1615 q.num <= 0 || q.den <= 0) {
1616 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1619 ost->frame_aspect_ratio = q;
1622 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1623 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1625 if (!ost->stream_copy) {
1626 const char *p = NULL;
1627 char *frame_size = NULL;
1628 char *frame_pix_fmt = NULL;
1629 char *intra_matrix = NULL, *inter_matrix = NULL;
1630 char *chroma_intra_matrix = NULL;
1634 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1635 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1636 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1640 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1641 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1642 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1643 ost->keep_pix_fmt = 1;
1644 if (!*++frame_pix_fmt)
1645 frame_pix_fmt = NULL;
1647 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1648 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1651 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1654 video_enc->gop_size = 0;
1655 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1657 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1658 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1661 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1663 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1664 if (chroma_intra_matrix) {
1665 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1667 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1670 av_codec_set_chroma_intra_matrix(video_enc, p);
1671 parse_matrix_coeffs(p, chroma_intra_matrix);
1673 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1675 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1676 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1679 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1682 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1683 for (i = 0; p; i++) {
1685 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1687 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1690 video_enc->rc_override =
1691 av_realloc_array(video_enc->rc_override,
1692 i + 1, sizeof(RcOverride));
1693 if (!video_enc->rc_override) {
1694 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1697 video_enc->rc_override[i].start_frame = start;
1698 video_enc->rc_override[i].end_frame = end;
1700 video_enc->rc_override[i].qscale = q;
1701 video_enc->rc_override[i].quality_factor = 1.0;
1704 video_enc->rc_override[i].qscale = 0;
1705 video_enc->rc_override[i].quality_factor = -q/100.0;
1710 video_enc->rc_override_count = i;
1713 video_enc->flags|= AV_CODEC_FLAG_PSNR;
1716 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1719 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1720 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1723 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1724 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1728 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1729 if (ost->logfile_prefix &&
1730 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1734 char logfilename[1024];
1737 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1738 ost->logfile_prefix ? ost->logfile_prefix :
1739 DEFAULT_PASS_LOGFILENAME_PREFIX,
1741 if (!strcmp(ost->enc->name, "libx264")) {
1742 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1744 if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1745 char *logbuffer = read_file(logfilename);
1748 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1752 video_enc->stats_in = logbuffer;
1754 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1755 f = av_fopen_utf8(logfilename, "wb");
1757 av_log(NULL, AV_LOG_FATAL,
1758 "Cannot write log file '%s' for pass-1 encoding: %s\n",
1759 logfilename, strerror(errno));
1767 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1768 if (ost->forced_keyframes)
1769 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1771 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1773 ost->top_field_first = -1;
1774 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1777 ost->avfilter = get_ost_filters(o, oc, ost);
1781 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1784 if (ost->stream_copy)
1785 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1790 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1795 AVCodecContext *audio_enc;
1797 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1800 audio_enc = ost->enc_ctx;
1801 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1803 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1804 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1806 if (!ost->stream_copy) {
1807 char *sample_fmt = NULL;
1809 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1811 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1813 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1814 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1818 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1820 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1821 ost->apad = av_strdup(ost->apad);
1823 ost->avfilter = get_ost_filters(o, oc, ost);
1827 /* check for channel mapping for this audio stream */
1828 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1829 AudioChannelMap *map = &o->audio_channel_maps[n];
1830 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1831 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1834 if (map->channel_idx == -1) {
1836 } else if (ost->source_index < 0) {
1837 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1838 ost->file_index, ost->st->index);
1841 ist = input_streams[ost->source_index];
1844 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1845 if (av_reallocp_array(&ost->audio_channels_map,
1846 ost->audio_channels_mapped + 1,
1847 sizeof(*ost->audio_channels_map)
1851 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1857 if (ost->stream_copy)
1858 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1863 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1867 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1868 if (!ost->stream_copy) {
1869 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1876 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1880 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1881 if (!ost->stream_copy) {
1882 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1889 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1891 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1892 ost->stream_copy = 1;
1897 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1901 AVCodecContext *subtitle_enc;
1903 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1905 subtitle_enc = ost->enc_ctx;
1907 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1909 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1911 if (!ost->stream_copy) {
1912 char *frame_size = NULL;
1914 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1915 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1916 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1924 /* arg format is "output-stream-index:streamid-value". */
1925 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1927 OptionsContext *o = optctx;
1932 av_strlcpy(idx_str, arg, sizeof(idx_str));
1933 p = strchr(idx_str, ':');
1935 av_log(NULL, AV_LOG_FATAL,
1936 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1941 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1942 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1943 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1947 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1949 AVFormatContext *is = ifile->ctx;
1950 AVFormatContext *os = ofile->ctx;
1954 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1956 return AVERROR(ENOMEM);
1959 for (i = 0; i < is->nb_chapters; i++) {
1960 AVChapter *in_ch = is->chapters[i], *out_ch;
1961 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1962 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1963 AV_TIME_BASE_Q, in_ch->time_base);
1964 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1965 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1968 if (in_ch->end < ts_off)
1970 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1973 out_ch = av_mallocz(sizeof(AVChapter));
1975 return AVERROR(ENOMEM);
1977 out_ch->id = in_ch->id;
1978 out_ch->time_base = in_ch->time_base;
1979 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1980 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1983 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1985 os->chapters[os->nb_chapters++] = out_ch;
1990 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1993 AVFormatContext *ic = avformat_alloc_context();
1995 ic->flags |= AVFMT_FLAG_KEEP_SIDE_DATA;
1996 ic->interrupt_callback = int_cb;
1997 err = avformat_open_input(&ic, filename, NULL, NULL);
2000 /* copy stream format */
2001 for(i=0;i<ic->nb_streams;i++) {
2005 const char *enc_config;
2007 codec = avcodec_find_encoder(ic->streams[i]->codecpar->codec_id);
2009 av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codecpar->codec_id);
2010 return AVERROR(EINVAL);
2012 if (codec->type == AVMEDIA_TYPE_AUDIO)
2013 opt_audio_codec(o, "c:a", codec->name);
2014 else if (codec->type == AVMEDIA_TYPE_VIDEO)
2015 opt_video_codec(o, "c:v", codec->name);
2016 ost = new_output_stream(o, s, codec->type, -1);
2019 avcodec_get_context_defaults3(st->codec, codec);
2020 enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
2022 AVDictionary *opts = NULL;
2023 av_dict_parse_string(&opts, enc_config, "=", ",", 0);
2024 av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
2025 av_dict_free(&opts);
2028 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
2029 choose_sample_fmt(st, codec);
2030 else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
2031 choose_pixel_fmt(st, st->codec, codec, st->codecpar->format);
2032 avcodec_copy_context(ost->enc_ctx, st->codec);
2034 av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
2037 avformat_close_input(&ic);
2041 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
2042 AVFormatContext *oc)
2046 switch (ofilter->type) {
2047 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
2048 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
2050 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
2055 ost->source_index = -1;
2056 ost->filter = ofilter;
2059 ofilter->format = -1;
2061 if (ost->stream_copy) {
2062 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
2063 "which is fed from a complex filtergraph. Filtering and streamcopy "
2064 "cannot be used together.\n", ost->file_index, ost->index);
2068 if (ost->avfilter && (ost->filters || ost->filters_script)) {
2069 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
2070 av_log(NULL, AV_LOG_ERROR,
2071 "%s '%s' was specified through the %s option "
2072 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
2073 "%s and -filter_complex cannot be used together for the same stream.\n",
2074 ost->filters ? "Filtergraph" : "Filtergraph script",
2075 ost->filters ? ost->filters : ost->filters_script,
2076 opt, ost->file_index, ost->index, opt);
2080 avfilter_inout_free(&ofilter->out_tmp);
2083 static int init_complex_filters(void)
2087 for (i = 0; i < nb_filtergraphs; i++) {
2088 ret = init_complex_filtergraph(filtergraphs[i]);
2095 static int open_output_file(OptionsContext *o, const char *filename)
2097 AVFormatContext *oc;
2099 AVOutputFormat *file_oformat;
2103 AVDictionary *unused_opts = NULL;
2104 AVDictionaryEntry *e = NULL;
2105 int format_flags = 0;
2107 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
2108 o->stop_time = INT64_MAX;
2109 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
2112 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
2113 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
2114 if (o->stop_time <= start_time) {
2115 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
2118 o->recording_time = o->stop_time - start_time;
2122 GROW_ARRAY(output_files, nb_output_files);
2123 of = av_mallocz(sizeof(*of));
2126 output_files[nb_output_files - 1] = of;
2128 of->ost_index = nb_output_streams;
2129 of->recording_time = o->recording_time;
2130 of->start_time = o->start_time;
2131 of->limit_filesize = o->limit_filesize;
2132 of->shortest = o->shortest;
2133 av_dict_copy(&of->opts, o->g->format_opts, 0);
2135 if (!strcmp(filename, "-"))
2138 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
2140 print_error(filename, err);
2145 if (o->recording_time != INT64_MAX)
2146 oc->duration = o->recording_time;
2148 file_oformat= oc->oformat;
2149 oc->interrupt_callback = int_cb;
2151 e = av_dict_get(o->g->format_opts, "fflags", NULL, 0);
2153 const AVOption *o = av_opt_find(oc, "fflags", NULL, 0, 0);
2154 av_opt_eval_flags(oc, o, e->value, &format_flags);
2157 format_flags |= AVFMT_FLAG_BITEXACT;
2158 oc->flags |= AVFMT_FLAG_BITEXACT;
2161 /* create streams for all unlabeled output pads */
2162 for (i = 0; i < nb_filtergraphs; i++) {
2163 FilterGraph *fg = filtergraphs[i];
2164 for (j = 0; j < fg->nb_outputs; j++) {
2165 OutputFilter *ofilter = fg->outputs[j];
2167 if (!ofilter->out_tmp || ofilter->out_tmp->name)
2170 switch (ofilter->type) {
2171 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
2172 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
2173 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
2175 init_output_filter(ofilter, o, oc);
2179 /* ffserver seeking with date=... needs a date reference */
2180 if (!strcmp(file_oformat->name, "ffm") &&
2181 !(format_flags & AVFMT_FLAG_BITEXACT) &&
2182 av_strstart(filename, "http:", NULL)) {
2183 int err = parse_option(o, "metadata", "creation_time=now", options);
2185 print_error(filename, err);
2190 if (!strcmp(file_oformat->name, "ffm") && !override_ffserver &&
2191 av_strstart(filename, "http:", NULL)) {
2193 /* special case for files sent to ffserver: we get the stream
2194 parameters from ffserver */
2195 int err = read_ffserver_streams(o, oc, filename);
2197 print_error(filename, err);
2200 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
2201 ost = output_streams[j];
2202 for (i = 0; i < nb_input_streams; i++) {
2203 ist = input_streams[i];
2204 if(ist->st->codecpar->codec_type == ost->st->codecpar->codec_type){
2206 ost->source_index= i;
2207 if(ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
2208 if(ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
2210 ist->st->discard = ist->user_set_discard;
2215 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));
2219 } else if (!o->nb_stream_maps) {
2220 char *subtitle_codec_name = NULL;
2221 /* pick the "best" stream of each type */
2223 /* video: highest resolution */
2224 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2225 int area = 0, idx = -1;
2226 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2227 for (i = 0; i < nb_input_streams; i++) {
2229 ist = input_streams[i];
2230 new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames;
2231 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2233 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
2235 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2242 new_video_stream(o, oc, idx);
2245 /* audio: most channels */
2246 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2247 int best_score = 0, idx = -1;
2248 for (i = 0; i < nb_input_streams; i++) {
2250 ist = input_streams[i];
2251 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames;
2252 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
2253 score > best_score) {
2259 new_audio_stream(o, oc, idx);
2262 /* subtitles: pick first */
2263 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2264 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2265 for (i = 0; i < nb_input_streams; i++)
2266 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2267 AVCodecDescriptor const *input_descriptor =
2268 avcodec_descriptor_get(input_streams[i]->st->codecpar->codec_id);
2269 AVCodecDescriptor const *output_descriptor = NULL;
2270 AVCodec const *output_codec =
2271 avcodec_find_encoder(oc->oformat->subtitle_codec);
2272 int input_props = 0, output_props = 0;
2274 output_descriptor = avcodec_descriptor_get(output_codec->id);
2275 if (input_descriptor)
2276 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2277 if (output_descriptor)
2278 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2279 if (subtitle_codec_name ||
2280 input_props & output_props ||
2281 // Map dvb teletext which has neither property to any output subtitle encoder
2282 input_descriptor && output_descriptor &&
2283 (!input_descriptor->props ||
2284 !output_descriptor->props)) {
2285 new_subtitle_stream(o, oc, i);
2290 /* Data only if codec id match */
2291 if (!o->data_disable ) {
2292 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2293 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2294 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
2295 && input_streams[i]->st->codecpar->codec_id == codec_id )
2296 new_data_stream(o, oc, i);
2300 for (i = 0; i < o->nb_stream_maps; i++) {
2301 StreamMap *map = &o->stream_maps[i];
2306 if (map->linklabel) {
2308 OutputFilter *ofilter = NULL;
2311 for (j = 0; j < nb_filtergraphs; j++) {
2312 fg = filtergraphs[j];
2313 for (k = 0; k < fg->nb_outputs; k++) {
2314 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2315 if (out && !strcmp(out->name, map->linklabel)) {
2316 ofilter = fg->outputs[k];
2323 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2324 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2327 init_output_filter(ofilter, o, oc);
2329 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2331 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2332 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
2334 if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
2336 if(o-> video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
2338 if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2342 switch (ist->st->codecpar->codec_type) {
2343 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2344 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2345 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2346 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2347 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2348 case AVMEDIA_TYPE_UNKNOWN:
2349 if (copy_unknown_streams) {
2350 ost = new_unknown_stream (o, oc, src_idx);
2354 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2355 "Cannot map stream #%d:%d - unsupported type.\n",
2356 map->file_index, map->stream_index);
2357 if (!ignore_unknown_streams) {
2358 av_log(NULL, AV_LOG_FATAL,
2359 "If you want unsupported types ignored instead "
2360 "of failing, please use the -ignore_unknown option\n"
2361 "If you want them copied, please use -copy_unknown\n");
2366 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2367 + map->sync_stream_index];
2372 /* handle attached files */
2373 for (i = 0; i < o->nb_attachments; i++) {
2375 uint8_t *attachment;
2379 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2380 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2384 if ((len = avio_size(pb)) <= 0) {
2385 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2389 if (!(attachment = av_malloc(len))) {
2390 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
2394 avio_read(pb, attachment, len);
2396 ost = new_attachment_stream(o, oc, -1);
2397 ost->stream_copy = 0;
2398 ost->attachment_filename = o->attachments[i];
2399 ost->st->codecpar->extradata = attachment;
2400 ost->st->codecpar->extradata_size = len;
2402 p = strrchr(o->attachments[i], '/');
2403 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2407 #if FF_API_LAVF_AVCTX
2408 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2409 AVDictionaryEntry *e;
2410 ost = output_streams[i];
2412 if ((ost->stream_copy || ost->attachment_filename)
2413 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2414 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2415 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2420 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2421 av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
2422 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2426 /* check if all codec options have been used */
2427 unused_opts = strip_specifiers(o->g->codec_opts);
2428 for (i = of->ost_index; i < nb_output_streams; i++) {
2430 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2431 AV_DICT_IGNORE_SUFFIX)))
2432 av_dict_set(&unused_opts, e->key, NULL, 0);
2436 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2437 const AVClass *class = avcodec_get_class();
2438 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2439 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2440 const AVClass *fclass = avformat_get_class();
2441 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2442 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2443 if (!option || foption)
2447 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2448 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2449 "output file #%d (%s) is not an encoding option.\n", e->key,
2450 option->help ? option->help : "", nb_output_files - 1,
2455 // gop_timecode is injected by generic code but not always used
2456 if (!strcmp(e->key, "gop_timecode"))
2459 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2460 "output file #%d (%s) has not been used for any stream. The most "
2461 "likely reason is either wrong type (e.g. a video option with "
2462 "no video streams) or that it is a private option of some encoder "
2463 "which was not actually used for any stream.\n", e->key,
2464 option->help ? option->help : "", nb_output_files - 1, filename);
2466 av_dict_free(&unused_opts);
2468 /* set the decoding_needed flags and create simple filtergraphs */
2469 for (i = of->ost_index; i < nb_output_streams; i++) {
2470 OutputStream *ost = output_streams[i];
2472 if (ost->encoding_needed && ost->source_index >= 0) {
2473 InputStream *ist = input_streams[ost->source_index];
2474 ist->decoding_needed |= DECODING_FOR_OST;
2476 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
2477 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2478 err = init_simple_filtergraph(ist, ost);
2480 av_log(NULL, AV_LOG_ERROR,
2481 "Error initializing a simple filtergraph between streams "
2482 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
2483 nb_output_files - 1, ost->st->index);
2489 /* set the filter output constraints */
2491 OutputFilter *f = ost->filter;
2493 switch (ost->enc_ctx->codec_type) {
2494 case AVMEDIA_TYPE_VIDEO:
2495 f->frame_rate = ost->frame_rate;
2496 f->width = ost->enc_ctx->width;
2497 f->height = ost->enc_ctx->height;
2498 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
2499 f->format = ost->enc_ctx->pix_fmt;
2500 } else if (ost->enc->pix_fmts) {
2502 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
2504 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2507 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
2510 case AVMEDIA_TYPE_AUDIO:
2511 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
2512 f->format = ost->enc_ctx->sample_fmt;
2513 } else if (ost->enc->sample_fmts) {
2515 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
2517 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2520 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
2522 if (ost->enc_ctx->sample_rate) {
2523 f->sample_rate = ost->enc_ctx->sample_rate;
2524 } else if (ost->enc->supported_samplerates) {
2526 while (ost->enc->supported_samplerates[count])
2528 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
2529 if (!f->sample_rates)
2531 memcpy(f->sample_rates, ost->enc->supported_samplerates,
2532 (count + 1) * sizeof(*f->sample_rates));
2534 if (ost->enc_ctx->channels) {
2535 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
2536 } else if (ost->enc->channel_layouts) {
2538 while (ost->enc->channel_layouts[count])
2540 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
2541 if (!f->channel_layouts)
2543 memcpy(f->channel_layouts, ost->enc->channel_layouts,
2544 (count + 1) * sizeof(*f->channel_layouts));
2551 /* check filename in case of an image number is expected */
2552 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2553 if (!av_filename_number_test(oc->filename)) {
2554 print_error(oc->filename, AVERROR(EINVAL));
2559 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2560 av_log(NULL, AV_LOG_ERROR,
2561 "No input streams but output needs an input stream\n");
2565 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2566 /* test if it already exists to avoid losing precious files */
2567 assert_file_overwrite(filename);
2570 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2571 &oc->interrupt_callback,
2573 print_error(filename, err);
2576 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2577 assert_file_overwrite(filename);
2579 if (o->mux_preload) {
2580 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2582 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2585 for (i = 0; i < o->nb_metadata_map; i++) {
2587 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2589 if (in_file_index >= nb_input_files) {
2590 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2593 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2594 in_file_index >= 0 ?
2595 input_files[in_file_index]->ctx : NULL, o);
2599 if (o->chapters_input_file >= nb_input_files) {
2600 if (o->chapters_input_file == INT_MAX) {
2601 /* copy chapters from the first input file that has them*/
2602 o->chapters_input_file = -1;
2603 for (i = 0; i < nb_input_files; i++)
2604 if (input_files[i]->ctx->nb_chapters) {
2605 o->chapters_input_file = i;
2609 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2610 o->chapters_input_file);
2614 if (o->chapters_input_file >= 0)
2615 copy_chapters(input_files[o->chapters_input_file], of,
2616 !o->metadata_chapters_manual);
2618 /* copy global metadata by default */
2619 if (!o->metadata_global_manual && nb_input_files){
2620 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2621 AV_DICT_DONT_OVERWRITE);
2622 if(o->recording_time != INT64_MAX)
2623 av_dict_set(&oc->metadata, "duration", NULL, 0);
2624 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2626 if (!o->metadata_streams_manual)
2627 for (i = of->ost_index; i < nb_output_streams; i++) {
2629 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2631 ist = input_streams[output_streams[i]->source_index];
2632 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2633 if (!output_streams[i]->stream_copy) {
2634 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2638 /* process manually set programs */
2639 for (i = 0; i < o->nb_program; i++) {
2640 const char *p = o->program[i].u.str;
2645 const char *p2 = av_get_token(&p, ":");
2646 const char *to_dealloc = p2;
2653 key = av_get_token(&p2, "=");
2655 av_freep(&to_dealloc);
2661 if (!strcmp(key, "program_num"))
2662 progid = strtol(p2, NULL, 0);
2663 av_freep(&to_dealloc);
2667 program = av_new_program(oc, progid);
2669 p = o->program[i].u.str;
2671 const char *p2 = av_get_token(&p, ":");
2672 const char *to_dealloc = p2;
2678 key = av_get_token(&p2, "=");
2680 av_log(NULL, AV_LOG_FATAL,
2681 "No '=' character in program string %s.\n",
2689 if (!strcmp(key, "title")) {
2690 av_dict_set(&program->metadata, "title", p2, 0);
2691 } else if (!strcmp(key, "program_num")) {
2692 } else if (!strcmp(key, "st")) {
2693 int st_num = strtol(p2, NULL, 0);
2694 av_program_add_stream_index(oc, progid, st_num);
2696 av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2699 av_freep(&to_dealloc);
2704 /* process manually set metadata */
2705 for (i = 0; i < o->nb_metadata; i++) {
2708 const char *stream_spec;
2709 int index = 0, j, ret = 0;
2711 val = strchr(o->metadata[i].u.str, '=');
2713 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2714 o->metadata[i].u.str);
2719 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2721 for (j = 0; j < oc->nb_streams; j++) {
2722 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2723 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2724 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2726 double theta = av_strtod(val, &tail);
2728 ost->rotate_overridden = 1;
2729 ost->rotate_override_value = theta;
2732 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2744 if (index < 0 || index >= oc->nb_chapters) {
2745 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2748 m = &oc->chapters[index]->metadata;
2751 if (index < 0 || index >= oc->nb_programs) {
2752 av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2755 m = &oc->programs[index]->metadata;
2758 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2761 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2768 static int opt_target(void *optctx, const char *opt, const char *arg)
2770 OptionsContext *o = optctx;
2771 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2772 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2774 if (!strncmp(arg, "pal-", 4)) {
2777 } else if (!strncmp(arg, "ntsc-", 5)) {
2780 } else if (!strncmp(arg, "film-", 5)) {
2784 /* Try to determine PAL/NTSC by peeking in the input files */
2785 if (nb_input_files) {
2787 for (j = 0; j < nb_input_files; j++) {
2788 for (i = 0; i < input_files[j]->nb_streams; i++) {
2789 AVStream *st = input_files[j]->ctx->streams[i];
2790 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2792 fr = st->time_base.den * 1000 / st->time_base.num;
2796 } else if ((fr == 29970) || (fr == 23976)) {
2801 if (norm != UNKNOWN)
2805 if (norm != UNKNOWN)
2806 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2809 if (norm == UNKNOWN) {
2810 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2811 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2812 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2816 if (!strcmp(arg, "vcd")) {
2817 opt_video_codec(o, "c:v", "mpeg1video");
2818 opt_audio_codec(o, "c:a", "mp2");
2819 parse_option(o, "f", "vcd", options);
2821 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2822 parse_option(o, "r", frame_rates[norm], options);
2823 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2825 opt_default(NULL, "b:v", "1150000");
2826 opt_default(NULL, "maxrate:v", "1150000");
2827 opt_default(NULL, "minrate:v", "1150000");
2828 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2830 opt_default(NULL, "b:a", "224000");
2831 parse_option(o, "ar", "44100", options);
2832 parse_option(o, "ac", "2", options);
2834 opt_default(NULL, "packetsize", "2324");
2835 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2837 /* We have to offset the PTS, so that it is consistent with the SCR.
2838 SCR starts at 36000, but the first two packs contain only padding
2839 and the first pack from the other stream, respectively, may also have
2840 been written before.
2841 So the real data starts at SCR 36000+3*1200. */
2842 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2843 } else if (!strcmp(arg, "svcd")) {
2845 opt_video_codec(o, "c:v", "mpeg2video");
2846 opt_audio_codec(o, "c:a", "mp2");
2847 parse_option(o, "f", "svcd", options);
2849 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2850 parse_option(o, "r", frame_rates[norm], options);
2851 parse_option(o, "pix_fmt", "yuv420p", options);
2852 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2854 opt_default(NULL, "b:v", "2040000");
2855 opt_default(NULL, "maxrate:v", "2516000");
2856 opt_default(NULL, "minrate:v", "0"); // 1145000;
2857 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2858 opt_default(NULL, "scan_offset", "1");
2860 opt_default(NULL, "b:a", "224000");
2861 parse_option(o, "ar", "44100", options);
2863 opt_default(NULL, "packetsize", "2324");
2865 } else if (!strcmp(arg, "dvd")) {
2867 opt_video_codec(o, "c:v", "mpeg2video");
2868 opt_audio_codec(o, "c:a", "ac3");
2869 parse_option(o, "f", "dvd", options);
2871 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2872 parse_option(o, "r", frame_rates[norm], options);
2873 parse_option(o, "pix_fmt", "yuv420p", options);
2874 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2876 opt_default(NULL, "b:v", "6000000");
2877 opt_default(NULL, "maxrate:v", "9000000");
2878 opt_default(NULL, "minrate:v", "0"); // 1500000;
2879 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2881 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2882 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2884 opt_default(NULL, "b:a", "448000");
2885 parse_option(o, "ar", "48000", options);
2887 } else if (!strncmp(arg, "dv", 2)) {
2889 parse_option(o, "f", "dv", options);
2891 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2892 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2893 norm == PAL ? "yuv420p" : "yuv411p", options);
2894 parse_option(o, "r", frame_rates[norm], options);
2896 parse_option(o, "ar", "48000", options);
2897 parse_option(o, "ac", "2", options);
2900 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2901 return AVERROR(EINVAL);
2904 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2905 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2910 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2912 av_free (vstats_filename);
2913 vstats_filename = av_strdup (arg);
2917 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2920 time_t today2 = time(NULL);
2921 struct tm *today = localtime(&today2);
2923 if (!today) { // maybe tomorrow
2924 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2928 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2930 return opt_vstats_file(NULL, opt, filename);
2933 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2935 OptionsContext *o = optctx;
2936 return parse_option(o, "frames:v", arg, options);
2939 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2941 OptionsContext *o = optctx;
2942 return parse_option(o, "frames:a", arg, options);
2945 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2947 OptionsContext *o = optctx;
2948 return parse_option(o, "frames:d", arg, options);
2951 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2954 AVDictionary *cbak = codec_opts;
2955 AVDictionary *fbak = format_opts;
2959 ret = opt_default(NULL, opt, arg);
2961 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2962 av_dict_copy(&o->g->format_opts, format_opts, 0);
2963 av_dict_free(&codec_opts);
2964 av_dict_free(&format_opts);
2971 static int opt_preset(void *optctx, const char *opt, const char *arg)
2973 OptionsContext *o = optctx;
2975 char filename[1000], line[1000], tmp_line[1000];
2976 const char *codec_name = NULL;
2980 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2982 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2983 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2984 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2986 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2990 while (fgets(line, sizeof(line), f)) {
2991 char *key = tmp_line, *value, *endptr;
2993 if (strcspn(line, "#\n\r") == 0)
2995 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2996 if (!av_strtok(key, "=", &value) ||
2997 !av_strtok(value, "\r\n", &endptr)) {
2998 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
3001 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
3003 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
3004 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
3005 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
3006 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
3007 else if (opt_default_new(o, key, value) < 0) {
3008 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
3009 filename, line, key, value);
3019 static int opt_old2new(void *optctx, const char *opt, const char *arg)
3021 OptionsContext *o = optctx;
3022 char *s = av_asprintf("%s:%c", opt + 1, *opt);
3023 int ret = parse_option(o, s, arg, options);
3028 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
3030 OptionsContext *o = optctx;
3032 if(!strcmp(opt, "ab")){
3033 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
3035 } else if(!strcmp(opt, "b")){
3036 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
3037 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
3040 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3044 static int opt_qscale(void *optctx, const char *opt, const char *arg)
3046 OptionsContext *o = optctx;
3049 if(!strcmp(opt, "qscale")){
3050 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
3051 return parse_option(o, "q:v", arg, options);
3053 s = av_asprintf("q%s", opt + 6);
3054 ret = parse_option(o, s, arg, options);
3059 static int opt_profile(void *optctx, const char *opt, const char *arg)
3061 OptionsContext *o = optctx;
3062 if(!strcmp(opt, "profile")){
3063 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
3064 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
3067 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3071 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
3073 OptionsContext *o = optctx;
3074 return parse_option(o, "filter:v", arg, options);
3077 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
3079 OptionsContext *o = optctx;
3080 return parse_option(o, "filter:a", arg, options);
3083 static int opt_vsync(void *optctx, const char *opt, const char *arg)
3085 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
3086 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
3087 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
3088 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
3090 if (video_sync_method == VSYNC_AUTO)
3091 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
3095 static int opt_timecode(void *optctx, const char *opt, const char *arg)
3097 OptionsContext *o = optctx;
3098 char *tcr = av_asprintf("timecode=%s", arg);
3099 int ret = parse_option(o, "metadata:g", tcr, options);
3101 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
3106 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
3108 OptionsContext *o = optctx;
3109 char layout_str[32];
3112 int ret, channels, ac_str_size;
3115 layout = av_get_channel_layout(arg);
3117 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
3118 return AVERROR(EINVAL);
3120 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
3121 ret = opt_default_new(o, opt, layout_str);
3125 /* set 'ac' option based on channel layout */
3126 channels = av_get_channel_layout_nb_channels(layout);
3127 snprintf(layout_str, sizeof(layout_str), "%d", channels);
3128 stream_str = strchr(opt, ':');
3129 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
3130 ac_str = av_mallocz(ac_str_size);
3132 return AVERROR(ENOMEM);
3133 av_strlcpy(ac_str, "ac", 3);
3135 av_strlcat(ac_str, stream_str, ac_str_size);
3136 ret = parse_option(o, ac_str, layout_str, options);
3142 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
3144 OptionsContext *o = optctx;
3145 return parse_option(o, "q:a", arg, options);
3148 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
3150 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3151 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3152 return AVERROR(ENOMEM);
3153 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3154 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
3155 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
3156 return AVERROR(ENOMEM);
3158 input_stream_potentially_available = 1;
3163 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
3165 uint8_t *graph_desc = read_file(arg);
3167 return AVERROR(EINVAL);
3169 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3170 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3171 return AVERROR(ENOMEM);
3172 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3173 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
3175 input_stream_potentially_available = 1;
3180 void show_help_default(const char *opt, const char *arg)
3182 /* per-file options have at least one of those set */
3183 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
3184 int show_advanced = 0, show_avoptions = 0;
3187 if (!strcmp(opt, "long"))
3189 else if (!strcmp(opt, "full"))
3190 show_advanced = show_avoptions = 1;
3192 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
3197 printf("Getting help:\n"
3198 " -h -- print basic options\n"
3199 " -h long -- print more options\n"
3200 " -h full -- print all options (including all format and codec specific options, very long)\n"
3201 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
3202 " See man %s for detailed description of the options.\n"
3203 "\n", program_name);
3205 show_help_options(options, "Print help / information / capabilities:",
3208 show_help_options(options, "Global options (affect whole program "
3209 "instead of just one file:",
3210 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
3212 show_help_options(options, "Advanced global options:", OPT_EXPERT,
3213 per_file | OPT_EXIT, 0);
3215 show_help_options(options, "Per-file main options:", 0,
3216 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
3217 OPT_EXIT, per_file);
3219 show_help_options(options, "Advanced per-file options:",
3220 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
3222 show_help_options(options, "Video options:",
3223 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
3225 show_help_options(options, "Advanced Video options:",
3226 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
3228 show_help_options(options, "Audio options:",
3229 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
3231 show_help_options(options, "Advanced Audio options:",
3232 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
3233 show_help_options(options, "Subtitle options:",
3234 OPT_SUBTITLE, 0, 0);
3237 if (show_avoptions) {
3238 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3239 show_help_children(avcodec_get_class(), flags);
3240 show_help_children(avformat_get_class(), flags);
3242 show_help_children(sws_get_class(), flags);
3244 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
3245 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
3249 void show_usage(void)
3251 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
3252 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3253 av_log(NULL, AV_LOG_INFO, "\n");
3261 static const OptionGroupDef groups[] = {
3262 [GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
3263 [GROUP_INFILE] = { "input url", "i", OPT_INPUT },
3266 static int open_files(OptionGroupList *l, const char *inout,
3267 int (*open_file)(OptionsContext*, const char*))
3271 for (i = 0; i < l->nb_groups; i++) {
3272 OptionGroup *g = &l->groups[i];
3278 ret = parse_optgroup(&o, g);
3280 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3281 "%s.\n", inout, g->arg);
3285 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3286 ret = open_file(&o, g->arg);
3289 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3293 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3299 int ffmpeg_parse_options(int argc, char **argv)
3301 OptionParseContext octx;
3305 memset(&octx, 0, sizeof(octx));
3307 /* split the commandline into an internal representation */
3308 ret = split_commandline(&octx, argc, argv, options, groups,
3309 FF_ARRAY_ELEMS(groups));
3311 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3315 /* apply global options */
3316 ret = parse_optgroup(NULL, &octx.global_opts);
3318 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3322 /* configure terminal and setup signal handlers */
3325 /* open input files */
3326 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3328 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3332 /* create the complex filtergraphs */
3333 ret = init_complex_filters();
3335 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3339 /* open output files */
3340 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3342 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3346 check_filter_outputs();
3349 uninit_parse_context(&octx);
3351 av_strerror(ret, error, sizeof(error));
3352 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3357 static int opt_progress(void *optctx, const char *opt, const char *arg)
3359 AVIOContext *avio = NULL;
3362 if (!strcmp(arg, "-"))
3364 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3366 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3367 arg, av_err2str(ret));
3370 progress_avio = avio;
3374 #define OFFSET(x) offsetof(OptionsContext, x)
3375 const OptionDef options[] = {
3377 CMDUTILS_COMMON_OPTIONS
3378 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3379 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3380 "force format", "fmt" },
3381 { "y", OPT_BOOL, { &file_overwrite },
3382 "overwrite output files" },
3383 { "n", OPT_BOOL, { &no_file_overwrite },
3384 "never overwrite output files" },
3385 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3386 "Ignore unknown stream types" },
3387 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
3388 "Copy unknown stream types" },
3389 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3390 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3391 "codec name", "codec" },
3392 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3393 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3394 "codec name", "codec" },
3395 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3396 OPT_OUTPUT, { .off = OFFSET(presets) },
3397 "preset name", "preset" },
3398 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3399 OPT_OUTPUT, { .func_arg = opt_map },
3400 "set input stream mapping",
3401 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3402 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3403 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3404 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3405 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3406 "set metadata information of outfile from infile",
3407 "outfile[,metadata]:infile[,metadata]" },
3408 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3409 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3410 "set chapters mapping", "input_file_index" },
3411 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3412 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3413 "record or transcode \"duration\" seconds of audio/video",
3415 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3416 "record or transcode stop time", "time_stop" },
3417 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3418 "set the limit file size in bytes", "limit_size" },
3419 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3420 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3421 "set the start time offset", "time_off" },
3422 { "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3423 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time_eof) },
3424 "set the start time offset relative to EOF", "time_off" },
3425 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3426 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3427 "enable/disable seeking by timestamp with -ss" },
3428 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3429 OPT_INPUT, { .off = OFFSET(accurate_seek) },
3430 "enable/disable accurate seeking with -ss" },
3431 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3432 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3433 "set the input ts offset", "time_off" },
3434 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3435 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3436 "set the input ts scale", "scale" },
3437 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3438 "set the recording timestamp ('now' to set the current time)", "time" },
3439 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3440 "add metadata", "string=string" },
3441 { "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3442 "add program with specified streams", "title=string:st=number..." },
3443 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3444 OPT_OUTPUT, { .func_arg = opt_data_frames },
3445 "set the number of data frames to output", "number" },
3446 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3447 "add timings for benchmarking" },
3448 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3449 "add timings for each task" },
3450 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3451 "write program-readable progress information", "url" },
3452 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3453 "enable or disable interaction on standard input" },
3454 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3455 "set max runtime in seconds", "limit" },
3456 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3457 "dump each input packet" },
3458 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3459 "when dumping packets, also dump the payload" },
3460 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3461 OPT_INPUT, { .off = OFFSET(rate_emu) },
3462 "read input at native frame rate", "" },
3463 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3464 "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3465 "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3466 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3467 "video sync method", "" },
3468 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3469 "frame drop threshold", "" },
3470 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3471 "audio sync method", "" },
3472 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3473 "audio drift threshold", "threshold" },
3474 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
3475 "copy timestamps" },
3476 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3477 "shift input timestamps to start at 0 when using copyts" },
3478 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
3479 "copy input stream time base when stream copying", "mode" },
3480 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3481 OPT_OUTPUT, { .off = OFFSET(shortest) },
3482 "finish encoding within shortest input" },
3483 { "bitexact", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3484 OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(bitexact) },
3486 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3487 OPT_OUTPUT, { .off = OFFSET(apad) },
3489 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3490 "timestamp discontinuity delta threshold", "threshold" },
3491 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3492 "timestamp error delta threshold", "threshold" },
3493 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3494 "exit on error", "error" },
3495 { "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3496 "abort on the specified condition flags", "flags" },
3497 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3498 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3499 "copy initial non-keyframes" },
3500 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3501 "copy or discard frames before start time" },
3502 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3503 "set the number of frames to output", "number" },
3504 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3505 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3506 "force codec tag/fourcc", "fourcc/tag" },
3507 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3508 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3509 "use fixed quality scale (VBR)", "q" },
3510 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3511 OPT_OUTPUT, { .func_arg = opt_qscale },
3512 "use fixed quality scale (VBR)", "q" },
3513 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3514 "set profile", "profile" },
3515 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3516 "set stream filtergraph", "filter_graph" },
3517 { "filter_threads", HAS_ARG | OPT_INT, { &filter_nbthreads },
3518 "number of non-complex filter threads" },
3519 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3520 "read stream filtergraph description from a file", "filename" },
3521 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3522 "reinit filtergraph on input parameter changes", "" },
3523 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3524 "create a complex filtergraph", "graph_description" },
3525 { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads },
3526 "number of threads for -filter_complex" },
3527 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3528 "create a complex filtergraph", "graph_description" },
3529 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3530 "read complex filtergraph description from a file", "filename" },
3531 { "stats", OPT_BOOL, { &print_stats },
3532 "print progress report during encoding", },
3533 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3534 OPT_OUTPUT, { .func_arg = opt_attach },
3535 "add an attachment to the output file", "filename" },
3536 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3537 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3538 "extract an attachment into a file", "filename" },
3539 { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3540 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3541 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3542 "print timestamp debugging info" },
3543 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3544 "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
3545 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3546 OPT_INPUT, { .off = OFFSET(discard) },
3548 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3549 OPT_OUTPUT, { .off = OFFSET(disposition) },
3550 "disposition", "" },
3551 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3552 { .off = OFFSET(thread_queue_size) },
3553 "set the maximum number of queued packets from the demuxer" },
3554 { "find_stream_info", OPT_BOOL | OPT_PERFILE | OPT_INPUT | OPT_EXPERT, { &find_stream_info },
3555 "read and decode the streams to fill missing information with heuristics" },
3558 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3559 "set the number of video frames to output", "number" },
3560 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3561 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3562 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3563 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3564 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3565 "set frame size (WxH or abbreviation)", "size" },
3566 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3567 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3568 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3569 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3570 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3571 "set pixel format", "format" },
3572 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3573 "set the number of bits per raw sample", "number" },
3574 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3575 "deprecated use -g 1" },
3576 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3578 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3579 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3580 "rate control override for specific intervals", "override" },
3581 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3582 OPT_OUTPUT, { .func_arg = opt_video_codec },
3583 "force video codec ('copy' to copy stream)", "codec" },
3584 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3586 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3588 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3589 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3590 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3591 "select the pass number (1 to 3)", "n" },
3592 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3593 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3594 "select two pass log file name prefix", "prefix" },
3595 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3596 "this option is deprecated, use the yadif filter instead" },
3597 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3598 "calculate PSNR of compressed frames" },
3599 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3600 "dump video coding statistics to file" },
3601 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3602 "dump video coding statistics to file", "file" },
3603 { "vstats_version", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &vstats_version },
3604 "Version of the vstats format to use."},
3605 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3606 "set video filters", "filter_graph" },
3607 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3608 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3609 "specify intra matrix coeffs", "matrix" },
3610 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3611 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3612 "specify inter matrix coeffs", "matrix" },
3613 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3614 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3615 "specify intra matrix coeffs", "matrix" },
3616 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3617 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3618 "top=1/bottom=0/auto=-1 field first", "" },
3619 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3620 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3621 "force video tag/fourcc", "fourcc/tag" },
3622 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3623 "show QP histogram" },
3624 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3625 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3626 "force the selected framerate, disable the best supported framerate selection" },
3627 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3628 OPT_OUTPUT, { .func_arg = opt_streamid },
3629 "set the value of an outfile streamid", "streamIndex:value" },
3630 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3631 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3632 "force key frames at specified timestamps", "timestamps" },
3633 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3634 "audio bitrate (please use -b:a)", "bitrate" },
3635 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3636 "video bitrate (please use -b:v)", "bitrate" },
3637 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3638 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3639 "use HW accelerated decoding", "hwaccel name" },
3640 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3641 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3642 "select a device for HW acceleration", "devicename" },
3643 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3644 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
3645 "select output format used with HW accelerated decoding", "format" },
3646 #if CONFIG_VIDEOTOOLBOX
3647 { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3649 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3650 "show available HW acceleration methods" },
3651 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3652 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3653 "automatically insert correct rotate filters" },
3656 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3657 "set the number of audio frames to output", "number" },
3658 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3659 "set audio quality (codec-specific)", "quality", },
3660 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3661 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3662 "set audio sampling rate (in Hz)", "rate" },
3663 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3664 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3665 "set number of audio channels", "channels" },
3666 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3668 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3669 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3670 "force audio codec ('copy' to copy stream)", "codec" },
3671 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3672 OPT_OUTPUT, { .func_arg = opt_old2new },
3673 "force audio tag/fourcc", "fourcc/tag" },
3674 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3675 "change audio volume (256=normal)" , "volume" },
3676 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3677 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3678 "set sample format", "format" },
3679 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3680 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3681 "set channel layout", "layout" },
3682 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3683 "set audio filters", "filter_graph" },
3684 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3685 "set the maximum number of channels to try to guess the channel layout" },
3687 /* subtitle options */
3688 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3689 "disable subtitle" },
3690 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3691 "force subtitle codec ('copy' to copy stream)", "codec" },
3692 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3693 , "force subtitle tag/fourcc", "fourcc/tag" },
3694 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3695 "fix subtitles duration" },
3696 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3697 "set canvas size (WxH or abbreviation)", "size" },
3700 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3701 "deprecated, use -channel", "channel" },
3702 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3703 "deprecated, use -standard", "standard" },
3704 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3707 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3708 "set the maximum demux-decode delay", "seconds" },
3709 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3710 "set the initial demux-decode delay", "seconds" },
3711 { "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
3712 "override the options from ffserver", "" },
3713 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3714 "specify a file in which to print sdp information", "file" },
3716 { "time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(time_bases) },
3717 "set the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)", "ratio" },
3718 { "enc_time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(enc_time_bases) },
3719 "set the desired time base for the encoder (1:24, 1:48000 or 0.04166, 2.0833e-5). "
3720 "two special values are defined - "
3721 "0 = use frame rate (video) or sample rate (audio),"
3722 "-1 = match source time base", "ratio" },
3724 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3725 "A comma-separated list of bitstream filters", "bitstream_filters" },
3726 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3727 "deprecated", "audio bitstream_filters" },
3728 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3729 "deprecated", "video bitstream_filters" },
3731 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3732 "set the audio options to the indicated preset", "preset" },
3733 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3734 "set the video options to the indicated preset", "preset" },
3735 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3736 "set the subtitle options to the indicated preset", "preset" },
3737 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3738 "set options from indicated preset file", "filename" },
3740 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
3741 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
3743 /* data codec support */
3744 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3745 "force data codec ('copy' to copy stream)", "codec" },
3746 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3750 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
3751 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
3755 { "qsv_device", HAS_ARG | OPT_STRING | OPT_EXPERT, { &qsv_device },
3756 "set QSV hardware device (DirectX adapter index, DRM path or X11 display name)", "device"},
3759 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
3760 "initialise hardware device", "args" },
3761 { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device },
3762 "set hardware device used when filtering", "device" },