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"
31 #include "libavfilter/avfiltergraph.h"
33 #include "libavutil/avassert.h"
34 #include "libavutil/avstring.h"
35 #include "libavutil/avutil.h"
36 #include "libavutil/channel_layout.h"
37 #include "libavutil/intreadwrite.h"
38 #include "libavutil/fifo.h"
39 #include "libavutil/mathematics.h"
40 #include "libavutil/opt.h"
41 #include "libavutil/parseutils.h"
42 #include "libavutil/pixdesc.h"
43 #include "libavutil/pixfmt.h"
45 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
48 for (i = 0; i < o->nb_ ## name; i++) {\
49 char *spec = o->name[i].specifier;\
50 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
51 outvar = o->name[i].u.type;\
57 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
60 for (i = 0; i < o->nb_ ## name; i++) {\
61 char *spec = o->name[i].specifier;\
62 if (!strcmp(spec, mediatype))\
63 outvar = o->name[i].u.type;\
66 char *vstats_filename;
68 float audio_drift_threshold = 0.1;
69 float dts_delta_threshold = 10;
70 float dts_error_threshold = 3600*30;
72 int audio_volume = 256;
73 int audio_sync_method = 0;
74 int video_sync_method = VSYNC_AUTO;
75 int do_deinterlace = 0;
77 int do_benchmark_all = 0;
83 int exit_on_error = 0;
86 int stdin_interaction = 1;
87 int frame_bits_per_raw_sample = 0;
90 static int intra_only = 0;
91 static int file_overwrite = 0;
92 static int no_file_overwrite = 0;
93 static int video_discard = 0;
94 static int intra_dc_precision = 8;
95 static int do_psnr = 0;
96 static int input_sync;
98 static int64_t recording_time = INT64_MAX;
100 static void uninit_options(OptionsContext *o, int is_input)
102 const OptionDef *po = options;
105 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
107 void *dst = (uint8_t*)o + po->u.off;
109 if (po->flags & OPT_SPEC) {
110 SpecifierOpt **so = dst;
111 int i, *count = (int*)(so + 1);
112 for (i = 0; i < *count; i++) {
113 av_freep(&(*so)[i].specifier);
114 if (po->flags & OPT_STRING)
115 av_freep(&(*so)[i].u.str);
119 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
124 for (i = 0; i < o->nb_stream_maps; i++)
125 av_freep(&o->stream_maps[i].linklabel);
126 av_freep(&o->stream_maps);
127 av_freep(&o->audio_channel_maps);
128 av_freep(&o->streamid_map);
129 av_freep(&o->attachments);
132 recording_time = o->recording_time;
134 recording_time = INT64_MAX;
137 static void init_options(OptionsContext *o, int is_input)
139 memset(o, 0, sizeof(*o));
141 if (!is_input && recording_time != INT64_MAX) {
142 o->recording_time = recording_time;
143 av_log(NULL, AV_LOG_WARNING,
144 "-t is not an input option, keeping it for the next output;"
145 " consider fixing your command line.\n");
147 o->recording_time = INT64_MAX;
148 o->stop_time = INT64_MAX;
149 o->mux_max_delay = 0.7;
150 o->limit_filesize = UINT64_MAX;
151 o->chapters_input_file = INT_MAX;
154 static int opt_sameq(void *optctx, const char *opt, const char *arg)
156 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
157 "If you are looking for an option to preserve the quality (which is not "
158 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
160 return AVERROR(EINVAL);
163 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
165 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
166 return opt_default(optctx, "channel", arg);
169 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
171 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
172 return opt_default(optctx, "standard", arg);
175 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
177 OptionsContext *o = optctx;
178 return parse_option(o, "codec:a", arg, options);
181 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
183 OptionsContext *o = optctx;
184 return parse_option(o, "codec:v", arg, options);
187 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
189 OptionsContext *o = optctx;
190 return parse_option(o, "codec:s", arg, options);
193 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
195 OptionsContext *o = optctx;
196 return parse_option(o, "codec:d", arg, options);
199 static int opt_map(void *optctx, const char *opt, const char *arg)
201 OptionsContext *o = optctx;
203 int i, negative = 0, file_idx;
204 int sync_file_idx = -1, sync_stream_idx = 0;
212 map = av_strdup(arg);
214 /* parse sync stream first, just pick first matching stream */
215 if (sync = strchr(map, ',')) {
217 sync_file_idx = strtol(sync + 1, &sync, 0);
218 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
219 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
224 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
225 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
226 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
230 if (i == input_files[sync_file_idx]->nb_streams) {
231 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
232 "match any streams.\n", arg);
239 /* this mapping refers to lavfi output */
240 const char *c = map + 1;
241 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
242 m = &o->stream_maps[o->nb_stream_maps - 1];
243 m->linklabel = av_get_token(&c, "]");
245 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
249 file_idx = strtol(map, &p, 0);
250 if (file_idx >= nb_input_files || file_idx < 0) {
251 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
255 /* disable some already defined maps */
256 for (i = 0; i < o->nb_stream_maps; i++) {
257 m = &o->stream_maps[i];
258 if (file_idx == m->file_index &&
259 check_stream_specifier(input_files[m->file_index]->ctx,
260 input_files[m->file_index]->ctx->streams[m->stream_index],
261 *p == ':' ? p + 1 : p) > 0)
265 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
266 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
267 *p == ':' ? p + 1 : p) <= 0)
269 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
270 m = &o->stream_maps[o->nb_stream_maps - 1];
272 m->file_index = file_idx;
275 if (sync_file_idx >= 0) {
276 m->sync_file_index = sync_file_idx;
277 m->sync_stream_index = sync_stream_idx;
279 m->sync_file_index = file_idx;
280 m->sync_stream_index = i;
286 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
294 static int opt_attach(void *optctx, const char *opt, const char *arg)
296 OptionsContext *o = optctx;
297 GROW_ARRAY(o->attachments, o->nb_attachments);
298 o->attachments[o->nb_attachments - 1] = arg;
302 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
304 OptionsContext *o = optctx;
309 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
310 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
312 /* muted channel syntax */
313 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
314 if ((n == 1 || n == 3) && m->channel_idx == -1) {
315 m->file_idx = m->stream_idx = -1;
317 m->ofile_idx = m->ostream_idx = -1;
322 n = sscanf(arg, "%d.%d.%d:%d.%d",
323 &m->file_idx, &m->stream_idx, &m->channel_idx,
324 &m->ofile_idx, &m->ostream_idx);
326 if (n != 3 && n != 5) {
327 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
328 "[file.stream.channel|-1][:syncfile:syncstream]\n");
332 if (n != 5) // only file.stream.channel specified
333 m->ofile_idx = m->ostream_idx = -1;
336 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
337 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
341 if (m->stream_idx < 0 ||
342 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
343 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
344 m->file_idx, m->stream_idx);
347 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
348 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
349 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
350 m->file_idx, m->stream_idx);
353 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
354 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
355 m->file_idx, m->stream_idx, m->channel_idx);
362 * Parse a metadata specifier passed as 'arg' parameter.
363 * @param arg metadata string to parse
364 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
365 * @param index for type c/p, chapter/program index is written here
366 * @param stream_spec for type s, the stream specifier is written here
368 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
376 if (*(++arg) && *arg != ':') {
377 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
380 *stream_spec = *arg == ':' ? arg + 1 : "";
385 *index = strtol(++arg, NULL, 0);
388 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
395 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
397 AVDictionary **meta_in = NULL;
398 AVDictionary **meta_out = NULL;
400 char type_in, type_out;
401 const char *istream_spec = NULL, *ostream_spec = NULL;
402 int idx_in = 0, idx_out = 0;
404 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
405 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
408 if (type_out == 'g' || !*outspec)
409 o->metadata_global_manual = 1;
410 if (type_out == 's' || !*outspec)
411 o->metadata_streams_manual = 1;
412 if (type_out == 'c' || !*outspec)
413 o->metadata_chapters_manual = 1;
417 if (type_in == 'g' || type_out == 'g')
418 o->metadata_global_manual = 1;
419 if (type_in == 's' || type_out == 's')
420 o->metadata_streams_manual = 1;
421 if (type_in == 'c' || type_out == 'c')
422 o->metadata_chapters_manual = 1;
424 /* ic is NULL when just disabling automatic mappings */
428 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
429 if ((index) < 0 || (index) >= (nb_elems)) {\
430 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
435 #define SET_DICT(type, meta, context, index)\
438 meta = &context->metadata;\
441 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
442 meta = &context->chapters[index]->metadata;\
445 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
446 meta = &context->programs[index]->metadata;\
449 break; /* handled separately below */ \
450 default: av_assert0(0);\
453 SET_DICT(type_in, meta_in, ic, idx_in);
454 SET_DICT(type_out, meta_out, oc, idx_out);
456 /* for input streams choose first matching stream */
457 if (type_in == 's') {
458 for (i = 0; i < ic->nb_streams; i++) {
459 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
460 meta_in = &ic->streams[i]->metadata;
466 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
471 if (type_out == 's') {
472 for (i = 0; i < oc->nb_streams; i++) {
473 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
474 meta_out = &oc->streams[i]->metadata;
475 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
480 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
485 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
487 OptionsContext *o = optctx;
489 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
490 struct tm time = *gmtime((time_t*)&recording_timestamp);
491 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
492 parse_option(o, "metadata", buf, options);
494 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
495 "tag instead.\n", opt);
499 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
501 const AVCodecDescriptor *desc;
502 const char *codec_string = encoder ? "encoder" : "decoder";
506 avcodec_find_encoder_by_name(name) :
507 avcodec_find_decoder_by_name(name);
509 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
510 codec = encoder ? avcodec_find_encoder(desc->id) :
511 avcodec_find_decoder(desc->id);
513 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
514 codec_string, codec->name, desc->name);
518 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
521 if (codec->type != type) {
522 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
528 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
530 char *codec_name = NULL;
532 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
534 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
535 st->codec->codec_id = codec->id;
538 return avcodec_find_decoder(st->codec->codec_id);
541 /* Add all the streams from the given input file to the global
542 * list of input streams. */
543 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
546 char *next, *codec_tag = NULL;
548 for (i = 0; i < ic->nb_streams; i++) {
549 AVStream *st = ic->streams[i];
550 AVCodecContext *dec = st->codec;
551 InputStream *ist = av_mallocz(sizeof(*ist));
552 char *framerate = NULL;
557 GROW_ARRAY(input_streams, nb_input_streams);
558 input_streams[nb_input_streams - 1] = ist;
561 ist->file_index = nb_input_files;
563 st->discard = AVDISCARD_ALL;
566 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
568 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
570 uint32_t tag = strtol(codec_tag, &next, 0);
572 tag = AV_RL32(codec_tag);
573 st->codec->codec_tag = tag;
576 ist->dec = choose_decoder(o, ic, st);
577 ist->opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
579 ist->reinit_filters = -1;
580 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
582 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
584 switch (dec->codec_type) {
585 case AVMEDIA_TYPE_VIDEO:
587 ist->dec = avcodec_find_decoder(dec->codec_id);
589 dec->flags |= CODEC_FLAG_EMU_EDGE;
592 ist->resample_height = dec->height;
593 ist->resample_width = dec->width;
594 ist->resample_pix_fmt = dec->pix_fmt;
596 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
597 if (framerate && av_parse_video_rate(&ist->framerate,
599 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
604 ist->top_field_first = -1;
605 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
608 case AVMEDIA_TYPE_AUDIO:
609 ist->guess_layout_max = INT_MAX;
610 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
611 guess_input_channel_layout(ist);
613 ist->resample_sample_fmt = dec->sample_fmt;
614 ist->resample_sample_rate = dec->sample_rate;
615 ist->resample_channels = dec->channels;
616 ist->resample_channel_layout = dec->channel_layout;
619 case AVMEDIA_TYPE_DATA:
620 case AVMEDIA_TYPE_SUBTITLE:
622 ist->dec = avcodec_find_decoder(dec->codec_id);
623 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
625 case AVMEDIA_TYPE_ATTACHMENT:
626 case AVMEDIA_TYPE_UNKNOWN:
634 static void assert_file_overwrite(const char *filename)
636 if ((!file_overwrite || no_file_overwrite) &&
637 (strchr(filename, ':') == NULL || filename[1] == ':' ||
638 av_strstart(filename, "file:", NULL))) {
639 if (avio_check(filename, 0) == 0) {
640 if (stdin_interaction && (!no_file_overwrite || file_overwrite)) {
641 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
644 signal(SIGINT, SIG_DFL);
646 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
652 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
659 static void dump_attachment(AVStream *st, const char *filename)
662 AVIOContext *out = NULL;
663 AVDictionaryEntry *e;
665 if (!st->codec->extradata_size) {
666 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
667 nb_input_files - 1, st->index);
670 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
673 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
674 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
678 assert_file_overwrite(filename);
680 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
681 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
686 avio_write(out, st->codec->extradata, st->codec->extradata_size);
691 static int open_input_file(OptionsContext *o, const char *filename)
694 AVInputFormat *file_iformat = NULL;
699 int orig_nb_streams; // number of streams before avformat_find_stream_info
700 char * video_codec_name = NULL;
701 char * audio_codec_name = NULL;
702 char *subtitle_codec_name = NULL;
705 if (!(file_iformat = av_find_input_format(o->format))) {
706 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
711 if (!strcmp(filename, "-"))
714 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
715 strcmp(filename, "/dev/stdin");
717 /* get default parameters from command line */
718 ic = avformat_alloc_context();
720 print_error(filename, AVERROR(ENOMEM));
723 if (o->nb_audio_sample_rate) {
724 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
725 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
727 if (o->nb_audio_channels) {
728 /* because we set audio_channels based on both the "ac" and
729 * "channel_layout" options, we need to check that the specified
730 * demuxer actually has the "channels" option before setting it */
731 if (file_iformat && file_iformat->priv_class &&
732 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
733 AV_OPT_SEARCH_FAKE_OBJ)) {
734 snprintf(buf, sizeof(buf), "%d",
735 o->audio_channels[o->nb_audio_channels - 1].u.i);
736 av_dict_set(&o->g->format_opts, "channels", buf, 0);
739 if (o->nb_frame_rates) {
740 /* set the format-level framerate option;
741 * this is important for video grabbers, e.g. x11 */
742 if (file_iformat && file_iformat->priv_class &&
743 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
744 AV_OPT_SEARCH_FAKE_OBJ)) {
745 av_dict_set(&o->g->format_opts, "framerate",
746 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
749 if (o->nb_frame_sizes) {
750 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
752 if (o->nb_frame_pix_fmts)
753 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
755 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
756 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
757 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
759 ic->video_codec_id = video_codec_name ?
760 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
761 ic->audio_codec_id = audio_codec_name ?
762 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
763 ic->subtitle_codec_id= subtitle_codec_name ?
764 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
765 ic->flags |= AVFMT_FLAG_NONBLOCK;
766 ic->interrupt_callback = int_cb;
768 /* open the input file with generic avformat function */
769 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
771 print_error(filename, err);
774 assert_avoptions(o->g->format_opts);
776 /* apply forced codec ids */
777 for (i = 0; i < ic->nb_streams; i++)
778 choose_decoder(o, ic, ic->streams[i]);
780 /* Set AVCodecContext options for avformat_find_stream_info */
781 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
782 orig_nb_streams = ic->nb_streams;
784 /* If not enough info to get the stream parameters, we decode the
785 first frames to get it. (used in mpeg case for example) */
786 ret = avformat_find_stream_info(ic, opts);
788 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
789 avformat_close_input(&ic);
793 timestamp = o->start_time;
794 /* add the stream start time */
795 if (ic->start_time != AV_NOPTS_VALUE)
796 timestamp += ic->start_time;
798 /* if seeking requested, we execute it */
799 if (o->start_time != 0) {
800 ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, timestamp, 0);
802 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
803 filename, (double)timestamp / AV_TIME_BASE);
807 /* update the current parameters so that they match the one of the input stream */
808 add_input_streams(o, ic);
810 /* dump the file content */
811 av_dump_format(ic, nb_input_files, filename, 0);
813 GROW_ARRAY(input_files, nb_input_files);
814 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
817 input_files[nb_input_files - 1]->ctx = ic;
818 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
819 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
820 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
821 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
823 for (i = 0; i < o->nb_dump_attachment; i++) {
826 for (j = 0; j < ic->nb_streams; j++) {
827 AVStream *st = ic->streams[j];
829 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
830 dump_attachment(st, o->dump_attachment[i].u.str);
834 for (i = 0; i < orig_nb_streams; i++)
835 av_dict_free(&opts[i]);
841 static uint8_t *get_line(AVIOContext *s)
847 if (avio_open_dyn_buf(&line) < 0) {
848 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
852 while ((c = avio_r8(s)) && c != '\n')
855 avio_close_dyn_buf(line, &buf);
860 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
864 const char *base[3] = { getenv("AVCONV_DATADIR"),
869 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
873 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
874 i != 1 ? "" : "/.avconv", codec_name, preset_name);
875 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
878 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
879 i != 1 ? "" : "/.avconv", preset_name);
880 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
886 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
888 char *codec_name = NULL;
890 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
892 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
893 NULL, ost->st->codec->codec_type);
894 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
895 } else if (!strcmp(codec_name, "copy"))
896 ost->stream_copy = 1;
898 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
899 ost->st->codec->codec_id = ost->enc->id;
903 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
906 AVStream *st = avformat_new_stream(oc, NULL);
907 int idx = oc->nb_streams - 1, ret = 0;
908 char *bsf = NULL, *next, *codec_tag = NULL;
909 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
913 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
917 if (oc->nb_streams - 1 < o->nb_streamid_map)
918 st->id = o->streamid_map[oc->nb_streams - 1];
920 GROW_ARRAY(output_streams, nb_output_streams);
921 if (!(ost = av_mallocz(sizeof(*ost))))
923 output_streams[nb_output_streams - 1] = ost;
925 ost->file_index = nb_output_files;
928 st->codec->codec_type = type;
929 choose_encoder(o, oc, ost);
931 AVIOContext *s = NULL;
932 char *buf = NULL, *arg = NULL, *preset = NULL;
934 ost->opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
936 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
937 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
940 if (!buf[0] || buf[0] == '#') {
944 if (!(arg = strchr(buf, '='))) {
945 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
949 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
951 } while (!s->eof_reached);
955 av_log(NULL, AV_LOG_FATAL,
956 "Preset %s specified for stream %d:%d, but could not be opened.\n",
957 preset, ost->file_index, ost->index);
962 avcodec_get_context_defaults3(st->codec, ost->enc);
963 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
965 ost->max_frames = INT64_MAX;
966 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
968 ost->copy_prior_start = -1;
969 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
971 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
973 if (next = strchr(bsf, ','))
975 if (!(bsfc = av_bitstream_filter_init(bsf))) {
976 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
980 bsfc_prev->next = bsfc;
982 ost->bitstream_filters = bsfc;
988 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
990 uint32_t tag = strtol(codec_tag, &next, 0);
992 tag = AV_RL32(codec_tag);
993 st->codec->codec_tag = tag;
996 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
998 st->codec->flags |= CODEC_FLAG_QSCALE;
999 st->codec->global_quality = FF_QP2LAMBDA * qscale;
1002 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1003 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
1005 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1007 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1008 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1009 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1011 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1013 ost->source_index = source_index;
1014 if (source_index >= 0) {
1015 ost->sync_ist = input_streams[source_index];
1016 input_streams[source_index]->discard = 0;
1017 input_streams[source_index]->st->discard = AVDISCARD_NONE;
1023 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1026 const char *p = str;
1033 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1040 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1044 AVCodecContext *video_enc;
1045 char *frame_rate = NULL;
1047 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1049 video_enc = st->codec;
1051 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1052 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1053 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1057 if (!ost->stream_copy) {
1058 const char *p = NULL;
1059 char *frame_size = NULL;
1060 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
1061 char *intra_matrix = NULL, *inter_matrix = NULL;
1062 const char *filters = "null";
1066 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1067 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1068 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1072 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1073 if (frame_aspect_ratio) {
1075 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1076 q.num <= 0 || q.den <= 0) {
1077 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1080 ost->frame_aspect_ratio = av_q2d(q);
1083 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1084 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1085 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1086 ost->keep_pix_fmt = 1;
1087 if (!*++frame_pix_fmt)
1088 frame_pix_fmt = NULL;
1090 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1091 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1094 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1097 video_enc->gop_size = 0;
1098 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1100 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1101 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1104 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1106 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1108 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1109 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1112 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1115 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1116 for (i = 0; p; i++) {
1118 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1120 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1123 /* FIXME realloc failure */
1124 video_enc->rc_override =
1125 av_realloc(video_enc->rc_override,
1126 sizeof(RcOverride) * (i + 1));
1127 video_enc->rc_override[i].start_frame = start;
1128 video_enc->rc_override[i].end_frame = end;
1130 video_enc->rc_override[i].qscale = q;
1131 video_enc->rc_override[i].quality_factor = 1.0;
1134 video_enc->rc_override[i].qscale = 0;
1135 video_enc->rc_override[i].quality_factor = -q/100.0;
1140 video_enc->rc_override_count = i;
1141 video_enc->intra_dc_precision = intra_dc_precision - 8;
1144 video_enc->flags|= CODEC_FLAG_PSNR;
1147 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1150 video_enc->flags |= CODEC_FLAG_PASS1;
1151 av_dict_set(&ost->opts, "flags", "+pass1", AV_DICT_APPEND);
1154 video_enc->flags |= CODEC_FLAG_PASS2;
1155 av_dict_set(&ost->opts, "flags", "+pass2", AV_DICT_APPEND);
1159 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1160 if (ost->logfile_prefix &&
1161 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1164 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1165 if (ost->forced_keyframes)
1166 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1168 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1170 ost->top_field_first = -1;
1171 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1173 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
1174 ost->avfilter = av_strdup(filters);
1176 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1182 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1187 AVCodecContext *audio_enc;
1189 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1192 audio_enc = st->codec;
1193 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1195 if (!ost->stream_copy) {
1196 char *sample_fmt = NULL;
1197 const char *filters = "anull";
1199 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1201 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1203 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1204 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1208 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1210 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
1212 av_assert1(filters);
1213 ost->avfilter = av_strdup(filters);
1215 /* check for channel mapping for this audio stream */
1216 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1217 AudioChannelMap *map = &o->audio_channel_maps[n];
1218 InputStream *ist = input_streams[ost->source_index];
1219 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
1220 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1221 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1222 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
1223 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1225 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
1226 ost->file_index, ost->st->index);
1234 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1238 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1239 if (!ost->stream_copy) {
1240 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1247 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1249 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1250 ost->stream_copy = 1;
1254 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1258 AVCodecContext *subtitle_enc;
1260 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1262 subtitle_enc = st->codec;
1264 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1266 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1268 if (!ost->stream_copy) {
1269 char *frame_size = NULL;
1271 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1272 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1273 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1281 /* arg format is "output-stream-index:streamid-value". */
1282 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1284 OptionsContext *o = optctx;
1289 av_strlcpy(idx_str, arg, sizeof(idx_str));
1290 p = strchr(idx_str, ':');
1292 av_log(NULL, AV_LOG_FATAL,
1293 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1298 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1299 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1300 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1304 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1306 AVFormatContext *is = ifile->ctx;
1307 AVFormatContext *os = ofile->ctx;
1311 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1313 return AVERROR(ENOMEM);
1316 for (i = 0; i < is->nb_chapters; i++) {
1317 AVChapter *in_ch = is->chapters[i], *out_ch;
1318 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
1319 AV_TIME_BASE_Q, in_ch->time_base);
1320 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1321 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1324 if (in_ch->end < ts_off)
1326 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1329 out_ch = av_mallocz(sizeof(AVChapter));
1331 return AVERROR(ENOMEM);
1333 out_ch->id = in_ch->id;
1334 out_ch->time_base = in_ch->time_base;
1335 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1336 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1339 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1341 os->chapters[os->nb_chapters++] = out_ch;
1346 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1349 AVFormatContext *ic = avformat_alloc_context();
1351 ic->interrupt_callback = int_cb;
1352 err = avformat_open_input(&ic, filename, NULL, NULL);
1355 /* copy stream format */
1356 for(i=0;i<ic->nb_streams;i++) {
1360 AVCodecContext *avctx;
1362 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
1363 ost = new_output_stream(o, s, codec->type, -1);
1368 // FIXME: a more elegant solution is needed
1369 memcpy(st, ic->streams[i], sizeof(AVStream));
1371 st->info = av_malloc(sizeof(*st->info));
1372 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
1374 avcodec_copy_context(st->codec, ic->streams[i]->codec);
1376 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
1377 choose_sample_fmt(st, codec);
1378 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
1379 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
1382 /* ffserver seeking with date=... needs a date reference */
1383 err = parse_option(o, "metadata", "creation_time=now", options);
1385 avformat_close_input(&ic);
1389 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1390 AVFormatContext *oc)
1394 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1395 ofilter->out_tmp->pad_idx)) {
1396 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
1397 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1399 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1404 ost->source_index = -1;
1405 ost->filter = ofilter;
1409 if (ost->stream_copy) {
1410 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1411 "which is fed from a complex filtergraph. Filtering and streamcopy "
1412 "cannot be used together.\n", ost->file_index, ost->index);
1416 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1417 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1420 avfilter_inout_free(&ofilter->out_tmp);
1423 static int configure_complex_filters(void)
1427 for (i = 0; i < nb_filtergraphs; i++)
1428 if (!filtergraphs[i]->graph &&
1429 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1434 static int open_output_file(OptionsContext *o, const char *filename)
1436 AVFormatContext *oc;
1438 AVOutputFormat *file_oformat;
1442 if (configure_complex_filters() < 0) {
1443 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1447 if (!strcmp(filename, "-"))
1450 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
1452 print_error(filename, err);
1455 file_oformat= oc->oformat;
1456 oc->interrupt_callback = int_cb;
1458 /* create streams for all unlabeled output pads */
1459 for (i = 0; i < nb_filtergraphs; i++) {
1460 FilterGraph *fg = filtergraphs[i];
1461 for (j = 0; j < fg->nb_outputs; j++) {
1462 OutputFilter *ofilter = fg->outputs[j];
1464 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1467 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1468 ofilter->out_tmp->pad_idx)) {
1469 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1470 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1471 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1473 init_output_filter(ofilter, o, oc);
1477 if (!strcmp(file_oformat->name, "ffm") &&
1478 av_strstart(filename, "http:", NULL)) {
1480 /* special case for files sent to ffserver: we get the stream
1481 parameters from ffserver */
1482 int err = read_ffserver_streams(o, oc, filename);
1484 print_error(filename, err);
1487 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
1488 ost = output_streams[j];
1489 for (i = 0; i < nb_input_streams; i++) {
1490 ist = input_streams[i];
1491 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
1493 ost->source_index= i;
1494 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
1495 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
1497 ist->st->discard = AVDISCARD_NONE;
1502 av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codec->codec_type));
1506 } else if (!o->nb_stream_maps) {
1507 char *subtitle_codec_name = NULL;
1508 /* pick the "best" stream of each type */
1510 /* video: highest resolution */
1511 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1512 int area = 0, idx = -1;
1513 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
1514 for (i = 0; i < nb_input_streams; i++) {
1516 ist = input_streams[i];
1517 new_area = ist->st->codec->width * ist->st->codec->height;
1518 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1520 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1522 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1529 new_video_stream(o, oc, idx);
1532 /* audio: most channels */
1533 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1534 int channels = 0, idx = -1;
1535 for (i = 0; i < nb_input_streams; i++) {
1536 ist = input_streams[i];
1537 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1538 ist->st->codec->channels > channels) {
1539 channels = ist->st->codec->channels;
1544 new_audio_stream(o, oc, idx);
1547 /* subtitles: pick first */
1548 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
1549 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != AV_CODEC_ID_NONE || subtitle_codec_name)) {
1550 for (i = 0; i < nb_input_streams; i++)
1551 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1552 new_subtitle_stream(o, oc, i);
1556 /* do something with data? */
1558 for (i = 0; i < o->nb_stream_maps; i++) {
1559 StreamMap *map = &o->stream_maps[i];
1560 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
1565 if (map->linklabel) {
1567 OutputFilter *ofilter = NULL;
1570 for (j = 0; j < nb_filtergraphs; j++) {
1571 fg = filtergraphs[j];
1572 for (k = 0; k < fg->nb_outputs; k++) {
1573 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1574 if (out && !strcmp(out->name, map->linklabel)) {
1575 ofilter = fg->outputs[k];
1582 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1583 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
1586 init_output_filter(ofilter, o, oc);
1588 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1589 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
1591 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1593 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1595 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
1598 switch (ist->st->codec->codec_type) {
1599 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
1600 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
1601 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
1602 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
1603 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
1605 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1606 map->file_index, map->stream_index);
1613 /* handle attached files */
1614 for (i = 0; i < o->nb_attachments; i++) {
1616 uint8_t *attachment;
1620 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1621 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1625 if ((len = avio_size(pb)) <= 0) {
1626 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1630 if (!(attachment = av_malloc(len))) {
1631 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1635 avio_read(pb, attachment, len);
1637 ost = new_attachment_stream(o, oc, -1);
1638 ost->stream_copy = 0;
1639 ost->attachment_filename = o->attachments[i];
1641 ost->st->codec->extradata = attachment;
1642 ost->st->codec->extradata_size = len;
1644 p = strrchr(o->attachments[i], '/');
1645 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1649 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
1650 AVDictionaryEntry *e;
1651 ost = output_streams[i];
1653 if ((ost->stream_copy || ost->attachment_filename)
1654 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
1655 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
1656 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
1660 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
1661 o->stop_time = INT64_MAX;
1662 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1665 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1666 if (o->stop_time <= o->start_time) {
1667 av_log(NULL, AV_LOG_WARNING, "-to value smaller than -ss; ignoring -to.\n");
1668 o->stop_time = INT64_MAX;
1670 o->recording_time = o->stop_time - o->start_time;
1674 GROW_ARRAY(output_files, nb_output_files);
1675 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
1678 output_files[nb_output_files - 1]->ctx = oc;
1679 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
1680 output_files[nb_output_files - 1]->recording_time = o->recording_time;
1681 if (o->recording_time != INT64_MAX)
1682 oc->duration = o->recording_time;
1683 output_files[nb_output_files - 1]->start_time = o->start_time;
1684 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
1685 output_files[nb_output_files - 1]->shortest = o->shortest;
1686 av_dict_copy(&output_files[nb_output_files - 1]->opts, o->g->format_opts, 0);
1688 /* check filename in case of an image number is expected */
1689 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1690 if (!av_filename_number_test(oc->filename)) {
1691 print_error(oc->filename, AVERROR(EINVAL));
1696 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1697 /* test if it already exists to avoid losing precious files */
1698 assert_file_overwrite(filename);
1701 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1702 &oc->interrupt_callback,
1703 &output_files[nb_output_files - 1]->opts)) < 0) {
1704 print_error(filename, err);
1709 if (o->mux_preload) {
1711 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1712 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
1714 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1717 for (i = 0; i < o->nb_metadata_map; i++) {
1719 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1721 if (in_file_index >= nb_input_files) {
1722 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1725 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1726 in_file_index >= 0 ?
1727 input_files[in_file_index]->ctx : NULL, o);
1731 if (o->chapters_input_file >= nb_input_files) {
1732 if (o->chapters_input_file == INT_MAX) {
1733 /* copy chapters from the first input file that has them*/
1734 o->chapters_input_file = -1;
1735 for (i = 0; i < nb_input_files; i++)
1736 if (input_files[i]->ctx->nb_chapters) {
1737 o->chapters_input_file = i;
1741 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1742 o->chapters_input_file);
1746 if (o->chapters_input_file >= 0)
1747 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
1748 !o->metadata_chapters_manual);
1750 /* copy global metadata by default */
1751 if (!o->metadata_global_manual && nb_input_files){
1752 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1753 AV_DICT_DONT_OVERWRITE);
1754 if(o->recording_time != INT64_MAX)
1755 av_dict_set(&oc->metadata, "duration", NULL, 0);
1756 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
1758 if (!o->metadata_streams_manual)
1759 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
1761 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1763 ist = input_streams[output_streams[i]->source_index];
1764 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1767 /* process manually set metadata */
1768 for (i = 0; i < o->nb_metadata; i++) {
1771 const char *stream_spec;
1772 int index = 0, j, ret = 0;
1774 val = strchr(o->metadata[i].u.str, '=');
1776 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1777 o->metadata[i].u.str);
1782 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1784 for (j = 0; j < oc->nb_streams; j++) {
1785 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1786 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1797 if (index < 0 || index >= oc->nb_chapters) {
1798 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1801 m = &oc->chapters[index]->metadata;
1804 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1807 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1814 static int opt_target(void *optctx, const char *opt, const char *arg)
1816 OptionsContext *o = optctx;
1817 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1818 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1820 if (!strncmp(arg, "pal-", 4)) {
1823 } else if (!strncmp(arg, "ntsc-", 5)) {
1826 } else if (!strncmp(arg, "film-", 5)) {
1830 /* Try to determine PAL/NTSC by peeking in the input files */
1831 if (nb_input_files) {
1833 for (j = 0; j < nb_input_files; j++) {
1834 for (i = 0; i < input_files[j]->nb_streams; i++) {
1835 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1836 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
1838 fr = c->time_base.den * 1000 / c->time_base.num;
1842 } else if ((fr == 29970) || (fr == 23976)) {
1847 if (norm != UNKNOWN)
1851 if (norm != UNKNOWN)
1852 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1855 if (norm == UNKNOWN) {
1856 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1857 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1858 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1862 if (!strcmp(arg, "vcd")) {
1863 opt_video_codec(o, "c:v", "mpeg1video");
1864 opt_audio_codec(o, "c:a", "mp2");
1865 parse_option(o, "f", "vcd", options);
1866 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
1868 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1869 parse_option(o, "r", frame_rates[norm], options);
1870 av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", 0);
1872 av_dict_set(&o->g->codec_opts, "b:v", "1150000", 0);
1873 av_dict_set(&o->g->codec_opts, "maxrate", "1150000", 0);
1874 av_dict_set(&o->g->codec_opts, "minrate", "1150000", 0);
1875 av_dict_set(&o->g->codec_opts, "bufsize", "327680", 0); // 40*1024*8;
1877 av_dict_set(&o->g->codec_opts, "b:a", "224000", 0);
1878 parse_option(o, "ar", "44100", options);
1879 parse_option(o, "ac", "2", options);
1881 av_dict_set(&o->g->format_opts, "packetsize", "2324", 0);
1882 av_dict_set(&o->g->format_opts, "muxrate", "1411200", 0); // 2352 * 75 * 8;
1884 /* We have to offset the PTS, so that it is consistent with the SCR.
1885 SCR starts at 36000, but the first two packs contain only padding
1886 and the first pack from the other stream, respectively, may also have
1887 been written before.
1888 So the real data starts at SCR 36000+3*1200. */
1889 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1890 } else if (!strcmp(arg, "svcd")) {
1892 opt_video_codec(o, "c:v", "mpeg2video");
1893 opt_audio_codec(o, "c:a", "mp2");
1894 parse_option(o, "f", "svcd", options);
1896 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1897 parse_option(o, "r", frame_rates[norm], options);
1898 parse_option(o, "pix_fmt", "yuv420p", options);
1899 av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", 0);
1901 av_dict_set(&o->g->codec_opts, "b:v", "2040000", 0);
1902 av_dict_set(&o->g->codec_opts, "maxrate", "2516000", 0);
1903 av_dict_set(&o->g->codec_opts, "minrate", "0", 0); // 1145000;
1904 av_dict_set(&o->g->codec_opts, "bufsize", "1835008", 0); // 224*1024*8;
1905 av_dict_set(&o->g->codec_opts, "scan_offset", "1", 0);
1907 av_dict_set(&o->g->codec_opts, "b:a", "224000", 0);
1908 parse_option(o, "ar", "44100", options);
1910 av_dict_set(&o->g->format_opts, "packetsize", "2324", 0);
1912 } else if (!strcmp(arg, "dvd")) {
1914 opt_video_codec(o, "c:v", "mpeg2video");
1915 opt_audio_codec(o, "c:a", "ac3");
1916 parse_option(o, "f", "dvd", options);
1918 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1919 parse_option(o, "r", frame_rates[norm], options);
1920 parse_option(o, "pix_fmt", "yuv420p", options);
1921 av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", 0);
1923 av_dict_set(&o->g->codec_opts, "b:v", "6000000", 0);
1924 av_dict_set(&o->g->codec_opts, "maxrate", "9000000", 0);
1925 av_dict_set(&o->g->codec_opts, "minrate", "0", 0); // 1500000;
1926 av_dict_set(&o->g->codec_opts, "bufsize", "1835008", 0); // 224*1024*8;
1928 av_dict_set(&o->g->format_opts, "packetsize", "2048", 0); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1929 av_dict_set(&o->g->format_opts, "muxrate", "10080000", 0); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
1931 av_dict_set(&o->g->codec_opts, "b:a", "448000", 0);
1932 parse_option(o, "ar", "48000", options);
1934 } else if (!strncmp(arg, "dv", 2)) {
1936 parse_option(o, "f", "dv", options);
1938 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1939 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1940 norm == PAL ? "yuv420p" : "yuv411p", options);
1941 parse_option(o, "r", frame_rates[norm], options);
1943 parse_option(o, "ar", "48000", options);
1944 parse_option(o, "ac", "2", options);
1947 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1948 return AVERROR(EINVAL);
1953 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1955 av_free (vstats_filename);
1956 vstats_filename = av_strdup (arg);
1960 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1963 time_t today2 = time(NULL);
1964 struct tm *today = localtime(&today2);
1966 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1968 return opt_vstats_file(NULL, opt, filename);
1971 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1973 OptionsContext *o = optctx;
1974 return parse_option(o, "frames:v", arg, options);
1977 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1979 OptionsContext *o = optctx;
1980 return parse_option(o, "frames:a", arg, options);
1983 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1985 OptionsContext *o = optctx;
1986 return parse_option(o, "frames:d", arg, options);
1989 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
1992 AVDictionary *cbak = codec_opts;
1993 AVDictionary *fbak = format_opts;
1997 ret = opt_default(NULL, opt, arg);
1999 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2000 av_dict_copy(&o->g->format_opts, format_opts, 0);
2001 av_dict_free(&codec_opts);
2002 av_dict_free(&format_opts);
2009 static int opt_preset(void *optctx, const char *opt, const char *arg)
2011 OptionsContext *o = optctx;
2013 char filename[1000], line[1000], tmp_line[1000];
2014 const char *codec_name = NULL;
2018 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2020 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2021 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2022 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2024 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2028 while (fgets(line, sizeof(line), f)) {
2029 char *key = tmp_line, *value, *endptr;
2031 if (strcspn(line, "#\n\r") == 0)
2033 strcpy(tmp_line, line);
2034 if (!av_strtok(key, "=", &value) ||
2035 !av_strtok(value, "\r\n", &endptr)) {
2036 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2039 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2041 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2042 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2043 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2044 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2045 else if (opt_default_new(o, key, value) < 0) {
2046 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2047 filename, line, key, value);
2057 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2059 OptionsContext *o = optctx;
2060 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2061 int ret = parse_option(o, s, arg, options);
2066 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2068 OptionsContext *o = optctx;
2069 if(!strcmp(opt, "b")){
2070 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2071 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2074 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2078 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2080 OptionsContext *o = optctx;
2083 if(!strcmp(opt, "qscale")){
2084 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2085 return parse_option(o, "q:v", arg, options);
2087 s = av_asprintf("q%s", opt + 6);
2088 ret = parse_option(o, s, arg, options);
2093 static int opt_profile(void *optctx, const char *opt, const char *arg)
2095 OptionsContext *o = optctx;
2096 if(!strcmp(opt, "profile")){
2097 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2098 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2101 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2105 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2107 OptionsContext *o = optctx;
2108 return parse_option(o, "filter:v", arg, options);
2111 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2113 OptionsContext *o = optctx;
2114 return parse_option(o, "filter:a", arg, options);
2117 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2119 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2120 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2121 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2122 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
2124 if (video_sync_method == VSYNC_AUTO)
2125 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2129 static int opt_deinterlace(void *optctx, const char *opt, const char *arg)
2131 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
2136 static int opt_timecode(void *optctx, const char *opt, const char *arg)
2138 OptionsContext *o = optctx;
2139 char *tcr = av_asprintf("timecode=%s", arg);
2140 int ret = parse_option(o, "metadata:g", tcr, options);
2142 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
2147 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2149 OptionsContext *o = optctx;
2150 char layout_str[32];
2153 int ret, channels, ac_str_size;
2156 layout = av_get_channel_layout(arg);
2158 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2159 return AVERROR(EINVAL);
2161 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2162 ret = opt_default_new(o, opt, layout_str);
2166 /* set 'ac' option based on channel layout */
2167 channels = av_get_channel_layout_nb_channels(layout);
2168 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2169 stream_str = strchr(opt, ':');
2170 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2171 ac_str = av_mallocz(ac_str_size);
2173 return AVERROR(ENOMEM);
2174 av_strlcpy(ac_str, "ac", 3);
2176 av_strlcat(ac_str, stream_str, ac_str_size);
2177 ret = parse_option(o, ac_str, layout_str, options);
2183 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2185 OptionsContext *o = optctx;
2186 return parse_option(o, "q:a", arg, options);
2189 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2191 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2192 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2193 return AVERROR(ENOMEM);
2194 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2195 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
2199 void show_help_default(const char *opt, const char *arg)
2201 /* per-file options have at least one of those set */
2202 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2203 int show_advanced = 0, show_avoptions = 0;
2206 if (!strcmp(opt, "long"))
2208 else if (!strcmp(opt, "full"))
2209 show_advanced = show_avoptions = 1;
2211 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2216 printf("Getting help:\n"
2217 " -h -- print basic options\n"
2218 " -h long -- print more options\n"
2219 " -h full -- print all options (including all format and codec specific options, very long)\n"
2220 " See man %s for detailed description of the options.\n"
2221 "\n", program_name);
2223 show_help_options(options, "Print help / information / capabilities:",
2226 show_help_options(options, "Global options (affect whole program "
2227 "instead of just one file:",
2228 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2230 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2231 per_file | OPT_EXIT, 0);
2233 show_help_options(options, "Per-file main options:", 0,
2234 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2235 OPT_EXIT, per_file);
2237 show_help_options(options, "Advanced per-file options:",
2238 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2240 show_help_options(options, "Video options:",
2241 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2243 show_help_options(options, "Advanced Video options:",
2244 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2246 show_help_options(options, "Audio options:",
2247 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2249 show_help_options(options, "Advanced Audio options:",
2250 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2251 show_help_options(options, "Subtitle options:",
2252 OPT_SUBTITLE, 0, 0);
2255 if (show_avoptions) {
2256 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2257 show_help_children(avcodec_get_class(), flags);
2258 show_help_children(avformat_get_class(), flags);
2259 show_help_children(sws_get_class(), flags);
2260 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2261 show_help_children(avfilter_get_class(), AV_OPT_FLAG_FILTERING_PARAM);
2265 void show_usage(void)
2267 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
2268 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2269 av_log(NULL, AV_LOG_INFO, "\n");
2277 static const OptionGroupDef groups[] = {
2278 [GROUP_OUTFILE] = { "output file", NULL },
2279 [GROUP_INFILE] = { "input file", "i" },
2282 static int open_files(OptionGroupList *l, const char *inout,
2283 int (*open_file)(OptionsContext*, const char*))
2287 for (i = 0; i < l->nb_groups; i++) {
2288 OptionGroup *g = &l->groups[i];
2291 init_options(&o, !strcmp(inout, "input"));
2294 ret = parse_optgroup(&o, g);
2296 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2297 "%s.\n", inout, g->arg);
2301 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2302 ret = open_file(&o, g->arg);
2303 uninit_options(&o, !strcmp(inout, "input"));
2305 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2309 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2315 int ffmpeg_parse_options(int argc, char **argv)
2317 OptionParseContext octx;
2321 memset(&octx, 0, sizeof(octx));
2323 /* split the commandline into an internal representation */
2324 ret = split_commandline(&octx, argc, argv, options, groups,
2325 FF_ARRAY_ELEMS(groups));
2327 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2331 /* apply global options */
2332 ret = parse_optgroup(NULL, &octx.global_opts);
2334 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2338 /* open input files */
2339 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2341 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2345 /* open output files */
2346 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2348 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2353 uninit_parse_context(&octx);
2355 av_strerror(ret, error, sizeof(error));
2356 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2361 static int opt_progress(void *optctx, const char *opt, const char *arg)
2363 AVIOContext *avio = NULL;
2366 if (!strcmp(arg, "-"))
2368 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
2370 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
2371 arg, av_err2str(ret));
2374 progress_avio = avio;
2378 #define OFFSET(x) offsetof(OptionsContext, x)
2379 const OptionDef options[] = {
2381 #include "cmdutils_common_opts.h"
2382 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, { .off = OFFSET(format) },
2383 "force format", "fmt" },
2384 { "y", OPT_BOOL, { &file_overwrite },
2385 "overwrite output files" },
2386 { "n", OPT_BOOL, { &no_file_overwrite },
2387 "do not overwrite output files" },
2388 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(codec_names) },
2389 "codec name", "codec" },
2390 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(codec_names) },
2391 "codec name", "codec" },
2392 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(presets) },
2393 "preset name", "preset" },
2394 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_map },
2395 "set input stream mapping",
2396 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2397 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_map_channel },
2398 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
2399 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(metadata_map) },
2400 "set metadata information of outfile from infile",
2401 "outfile[,metadata]:infile[,metadata]" },
2402 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(chapters_input_file) },
2403 "set chapters mapping", "input_file_index" },
2404 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, { .off = OFFSET(recording_time) },
2405 "record or transcode \"duration\" seconds of audio/video",
2407 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET, { .off = OFFSET(stop_time) },
2408 "record or transcode stop time", "time_stop" },
2409 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, { .off = OFFSET(limit_filesize) },
2410 "set the limit file size in bytes", "limit_size" },
2411 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, { .off = OFFSET(start_time) },
2412 "set the start time offset", "time_off" },
2413 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_EXPERT,{ .off = OFFSET(input_ts_offset) },
2414 "set the input ts offset", "time_off" },
2415 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(ts_scale) },
2416 "set the input ts scale", "scale" },
2417 { "timestamp", HAS_ARG | OPT_PERFILE, { .func_arg = opt_recording_timestamp },
2418 "set the recording timestamp ('now' to set the current time)", "time" },
2419 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(metadata) },
2420 "add metadata", "string=string" },
2421 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_data_frames },
2422 "set the number of data frames to record", "number" },
2423 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2424 "add timings for benchmarking" },
2425 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
2426 "add timings for each task" },
2427 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
2428 "write program-readable progress information", "url" },
2429 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
2430 "enable or disable interaction on standard input" },
2431 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2432 "set max runtime in seconds", "limit" },
2433 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2434 "dump each input packet" },
2435 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2436 "when dumping packets, also dump the payload" },
2437 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(rate_emu) },
2438 "read input at native frame rate", "" },
2439 { "target", HAS_ARG | OPT_PERFILE, { .func_arg = opt_target },
2440 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2441 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2442 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2443 "video sync method", "" },
2444 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2445 "audio sync method", "" },
2446 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2447 "audio drift threshold", "threshold" },
2448 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2449 "copy timestamps" },
2450 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
2451 "copy input stream time base when stream copying", "mode" },
2452 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(shortest) },
2453 "finish encoding within shortest input" },
2454 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2455 "timestamp discontinuity delta threshold", "threshold" },
2456 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
2457 "timestamp error delta threshold", "threshold" },
2458 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2459 "exit on error", "error" },
2460 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_initial_nonkeyframes) },
2461 "copy initial non-keyframes" },
2462 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_prior_start) },
2463 "copy or discard frames before start time" },
2464 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, { .off = OFFSET(max_frames) },
2465 "set the number of frames to record", "number" },
2466 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(codec_tags) },
2467 "force codec tag/fourcc", "fourcc/tag" },
2468 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC,{ .off = OFFSET(qscale) },
2469 "use fixed quality scale (VBR)", "q" },
2470 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_qscale },
2471 "use fixed quality scale (VBR)", "q" },
2472 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_profile },
2473 "set profile", "profile" },
2474 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(filters) },
2475 "set stream filtergraph", "filter_graph" },
2476 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(reinit_filters) },
2477 "reinit filtergraph on input parameter changes", "" },
2478 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2479 "create a complex filtergraph", "graph_description" },
2480 { "stats", OPT_BOOL, { &print_stats },
2481 "print progress report during encoding", },
2482 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_attach },
2483 "add an attachment to the output file", "filename" },
2484 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |OPT_EXPERT,{ .off = OFFSET(dump_attachment) },
2485 "extract an attachment into a file", "filename" },
2486 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
2487 "print timestamp debugging info" },
2490 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_frames },
2491 "set the number of video frames to record", "number" },
2492 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_rates) },
2493 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2494 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC,{ .off = OFFSET(frame_sizes) },
2495 "set frame size (WxH or abbreviation)", "size" },
2496 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_aspect_ratios) },
2497 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2498 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_pix_fmts) },
2499 "set pixel format", "format" },
2500 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
2501 "set the number of bits per raw sample", "number" },
2502 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
2503 "deprecated use -g 1" },
2504 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(video_disable) },
2506 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2507 "discard threshold", "n" },
2508 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(rc_overrides) },
2509 "rate control override for specific intervals", "override" },
2510 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_codec },
2511 "force video codec ('copy' to copy stream)", "codec" },
2512 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
2514 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
2516 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_timecode },
2517 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
2518 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT, { .off = OFFSET(pass) },
2519 "select the pass number (1 to 3)", "n" },
2520 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(passlogfiles) },
2521 "select two pass log file name prefix", "prefix" },
2522 { "deinterlace", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_deinterlace },
2523 "this option is deprecated, use the yadif filter instead" },
2524 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
2525 "calculate PSNR of compressed frames" },
2526 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2527 "dump video coding statistics to file" },
2528 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2529 "dump video coding statistics to file", "file" },
2530 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_filters },
2531 "set video filters", "filter_graph" },
2532 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(intra_matrices) },
2533 "specify intra matrix coeffs", "matrix" },
2534 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(inter_matrices) },
2535 "specify inter matrix coeffs", "matrix" },
2536 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC, { .off = OFFSET(top_field_first) },
2537 "top=1/bottom=0/auto=-1 field first", "" },
2538 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2539 "intra_dc_precision", "precision" },
2540 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new },
2541 "force video tag/fourcc", "fourcc/tag" },
2542 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2543 "show QP histogram" },
2544 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(force_fps) },
2545 "force the selected framerate, disable the best supported framerate selection" },
2546 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_streamid },
2547 "set the value of an outfile streamid", "streamIndex:value" },
2548 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_SPEC,
2549 { .off = OFFSET(forced_key_frames) },
2550 "force key frames at specified timestamps", "timestamps" },
2551 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_bitrate },
2552 "video bitrate (please use -b:v)", "bitrate" },
2555 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_frames },
2556 "set the number of audio frames to record", "number" },
2557 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_qscale },
2558 "set audio quality (codec-specific)", "quality", },
2559 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(audio_sample_rate) },
2560 "set audio sampling rate (in Hz)", "rate" },
2561 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(audio_channels) },
2562 "set number of audio channels", "channels" },
2563 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(audio_disable) },
2565 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_codec },
2566 "force audio codec ('copy' to copy stream)", "codec" },
2567 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new },
2568 "force audio tag/fourcc", "fourcc/tag" },
2569 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2570 "change audio volume (256=normal)" , "volume" },
2571 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_STRING, { .off = OFFSET(sample_fmts) },
2572 "set sample format", "format" },
2573 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_channel_layout },
2574 "set channel layout", "layout" },
2575 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_filters },
2576 "set audio filters", "filter_graph" },
2577 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT, { .off = OFFSET(guess_layout_max) },
2578 "set the maximum number of channels to try to guess the channel layout" },
2580 /* subtitle options */
2581 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(subtitle_disable) },
2582 "disable subtitle" },
2583 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE, { .func_arg = opt_subtitle_codec },
2584 "force subtitle codec ('copy' to copy stream)", "codec" },
2585 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new }
2586 , "force subtitle tag/fourcc", "fourcc/tag" },
2587 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC, { .off = OFFSET(fix_sub_duration) },
2588 "fix subtitles duration" },
2591 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
2592 "deprecated, use -channel", "channel" },
2593 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
2594 "deprecated, use -standard", "standard" },
2595 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2598 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(mux_max_delay) },
2599 "set the maximum demux-decode delay", "seconds" },
2600 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(mux_preload) },
2601 "set the initial demux-decode delay", "seconds" },
2603 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT, { .off = OFFSET(bitstream_filters) },
2604 "A comma-separated list of bitstream filters", "bitstream_filters" },
2605 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_old2new },
2606 "deprecated", "audio bitstream_filters" },
2607 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_old2new },
2608 "deprecated", "video bitstream_filters" },
2610 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2611 "set the audio options to the indicated preset", "preset" },
2612 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2613 "set the video options to the indicated preset", "preset" },
2614 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2615 "set the subtitle options to the indicated preset", "preset" },
2616 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2617 "set options from indicated preset file", "filename" },
2618 /* data codec support */
2619 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_data_codec },
2620 "force data codec ('copy' to copy stream)", "codec" },
2621 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, { .off = OFFSET(data_disable) },