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/audioconvert.h"
34 #include "libavutil/avassert.h"
35 #include "libavutil/avstring.h"
36 #include "libavutil/avutil.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 void reset_options(OptionsContext *o, int is_input)
100 const OptionDef *po = options;
101 OptionsContext bak= *o;
104 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
106 void *dst = (uint8_t*)o + po->u.off;
108 if (po->flags & OPT_SPEC) {
109 SpecifierOpt **so = dst;
110 int i, *count = (int*)(so + 1);
111 for (i = 0; i < *count; i++) {
112 av_freep(&(*so)[i].specifier);
113 if (po->flags & OPT_STRING)
114 av_freep(&(*so)[i].u.str);
118 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
123 for (i = 0; i < o->nb_stream_maps; i++)
124 av_freep(&o->stream_maps[i].linklabel);
125 av_freep(&o->stream_maps);
126 av_freep(&o->audio_channel_maps);
127 av_freep(&o->streamid_map);
129 memset(o, 0, sizeof(*o));
132 o->recording_time = bak.recording_time;
133 if (o->recording_time != INT64_MAX)
134 av_log(NULL, AV_LOG_WARNING,
135 "-t is not an input option, keeping it for the next output;"
136 " consider fixing your command line.\n");
138 o->recording_time = INT64_MAX;
139 o->mux_max_delay = 0.7;
140 o->limit_filesize = UINT64_MAX;
141 o->chapters_input_file = INT_MAX;
148 static int opt_frame_crop(void *optctx, const char *opt, const char *arg)
150 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
151 return AVERROR(EINVAL);
154 static int opt_pad(void *optctx, const char *opt, const char *arg)
156 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
160 static int opt_sameq(void *optctx, const char *opt, const char *arg)
162 av_log(NULL, AV_LOG_WARNING, "Ignoring option '%s'\n", opt);
166 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
168 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
169 return opt_default(optctx, "channel", arg);
172 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
174 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
175 return opt_default(optctx, "standard", arg);
178 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
180 OptionsContext *o = optctx;
181 return parse_option(o, "codec:a", arg, options);
184 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
186 OptionsContext *o = optctx;
187 return parse_option(o, "codec:v", arg, options);
190 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
192 OptionsContext *o = optctx;
193 return parse_option(o, "codec:s", arg, options);
196 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
198 OptionsContext *o = optctx;
199 return parse_option(o, "codec:d", arg, options);
202 static int opt_map(void *optctx, const char *opt, const char *arg)
204 OptionsContext *o = optctx;
206 int i, negative = 0, file_idx;
207 int sync_file_idx = -1, sync_stream_idx = 0;
215 map = av_strdup(arg);
217 /* parse sync stream first, just pick first matching stream */
218 if (sync = strchr(map, ',')) {
220 sync_file_idx = strtol(sync + 1, &sync, 0);
221 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
222 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
227 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
228 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
229 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
233 if (i == input_files[sync_file_idx]->nb_streams) {
234 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
235 "match any streams.\n", arg);
242 /* this mapping refers to lavfi output */
243 const char *c = map + 1;
244 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
245 &o->nb_stream_maps, o->nb_stream_maps + 1);
246 m = &o->stream_maps[o->nb_stream_maps - 1];
247 m->linklabel = av_get_token(&c, "]");
249 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
253 file_idx = strtol(map, &p, 0);
254 if (file_idx >= nb_input_files || file_idx < 0) {
255 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
259 /* disable some already defined maps */
260 for (i = 0; i < o->nb_stream_maps; i++) {
261 m = &o->stream_maps[i];
262 if (file_idx == m->file_index &&
263 check_stream_specifier(input_files[m->file_index]->ctx,
264 input_files[m->file_index]->ctx->streams[m->stream_index],
265 *p == ':' ? p + 1 : p) > 0)
269 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
270 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
271 *p == ':' ? p + 1 : p) <= 0)
273 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
274 &o->nb_stream_maps, o->nb_stream_maps + 1);
275 m = &o->stream_maps[o->nb_stream_maps - 1];
277 m->file_index = file_idx;
280 if (sync_file_idx >= 0) {
281 m->sync_file_index = sync_file_idx;
282 m->sync_stream_index = sync_stream_idx;
284 m->sync_file_index = file_idx;
285 m->sync_stream_index = i;
291 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
299 static int opt_attach(void *optctx, const char *opt, const char *arg)
301 OptionsContext *o = optctx;
302 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
303 &o->nb_attachments, o->nb_attachments + 1);
304 o->attachments[o->nb_attachments - 1] = arg;
308 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
310 OptionsContext *o = optctx;
315 o->audio_channel_maps =
316 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
317 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
318 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
320 /* muted channel syntax */
321 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
322 if ((n == 1 || n == 3) && m->channel_idx == -1) {
323 m->file_idx = m->stream_idx = -1;
325 m->ofile_idx = m->ostream_idx = -1;
330 n = sscanf(arg, "%d.%d.%d:%d.%d",
331 &m->file_idx, &m->stream_idx, &m->channel_idx,
332 &m->ofile_idx, &m->ostream_idx);
334 if (n != 3 && n != 5) {
335 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
336 "[file.stream.channel|-1][:syncfile:syncstream]\n");
340 if (n != 5) // only file.stream.channel specified
341 m->ofile_idx = m->ostream_idx = -1;
344 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
345 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
349 if (m->stream_idx < 0 ||
350 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
351 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
352 m->file_idx, m->stream_idx);
355 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
356 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
357 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
358 m->file_idx, m->stream_idx);
361 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
362 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
363 m->file_idx, m->stream_idx, m->channel_idx);
370 * Parse a metadata specifier passed as 'arg' parameter.
371 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
372 * @param index for type c/p, chapter/program index is written here
373 * @param stream_spec for type s, the stream specifier is written here
375 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
383 if (*(++arg) && *arg != ':') {
384 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
387 *stream_spec = *arg == ':' ? arg + 1 : "";
392 *index = strtol(++arg, NULL, 0);
395 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
402 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
404 AVDictionary **meta_in = NULL;
405 AVDictionary **meta_out = NULL;
407 char type_in, type_out;
408 const char *istream_spec = NULL, *ostream_spec = NULL;
409 int idx_in = 0, idx_out = 0;
411 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
412 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
415 if (type_out == 'g' || !*outspec)
416 o->metadata_global_manual = 1;
417 if (type_out == 's' || !*outspec)
418 o->metadata_streams_manual = 1;
419 if (type_out == 'c' || !*outspec)
420 o->metadata_chapters_manual = 1;
424 if (type_in == 'g' || type_out == 'g')
425 o->metadata_global_manual = 1;
426 if (type_in == 's' || type_out == 's')
427 o->metadata_streams_manual = 1;
428 if (type_in == 'c' || type_out == 'c')
429 o->metadata_chapters_manual = 1;
431 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
432 if ((index) < 0 || (index) >= (nb_elems)) {\
433 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
438 #define SET_DICT(type, meta, context, index)\
441 meta = &context->metadata;\
444 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
445 meta = &context->chapters[index]->metadata;\
448 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
449 meta = &context->programs[index]->metadata;\
451 default: av_assert0(0);\
456 SET_DICT(type_in, meta_in, ic, idx_in);
457 SET_DICT(type_out, meta_out, oc, idx_out);
459 /* for input streams choose first matching stream */
460 if (type_in == 's') {
461 for (i = 0; i < ic->nb_streams; i++) {
462 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
463 meta_in = &ic->streams[i]->metadata;
469 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
474 if (type_out == 's') {
475 for (i = 0; i < oc->nb_streams; i++) {
476 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
477 meta_out = &oc->streams[i]->metadata;
478 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
483 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
488 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
490 OptionsContext *o = optctx;
492 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
493 struct tm time = *gmtime((time_t*)&recording_timestamp);
494 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
495 parse_option(o, "metadata", buf, options);
497 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
498 "tag instead.\n", opt);
502 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
504 const AVCodecDescriptor *desc;
505 const char *codec_string = encoder ? "encoder" : "decoder";
509 avcodec_find_encoder_by_name(name) :
510 avcodec_find_decoder_by_name(name);
512 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
513 codec = encoder ? avcodec_find_encoder(desc->id) :
514 avcodec_find_decoder(desc->id);
516 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
517 codec_string, codec->name, desc->name);
521 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
524 if (codec->type != type) {
525 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
531 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
533 char *codec_name = NULL;
535 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
537 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
538 st->codec->codec_id = codec->id;
541 return avcodec_find_decoder(st->codec->codec_id);
544 /* Add all the streams from the given input file to the global
545 * list of input streams. */
546 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
549 char *next, *codec_tag = NULL;
551 for (i = 0; i < ic->nb_streams; i++) {
552 AVStream *st = ic->streams[i];
553 AVCodecContext *dec = st->codec;
554 InputStream *ist = av_mallocz(sizeof(*ist));
555 char *framerate = NULL;
560 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
561 input_streams[nb_input_streams - 1] = ist;
564 ist->file_index = nb_input_files;
566 st->discard = AVDISCARD_ALL;
567 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st, choose_decoder(o, ic, st));
570 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
572 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
574 uint32_t tag = strtol(codec_tag, &next, 0);
576 tag = AV_RL32(codec_tag);
577 st->codec->codec_tag = tag;
580 ist->dec = choose_decoder(o, ic, st);
582 ist->reinit_filters = -1;
583 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
585 switch (dec->codec_type) {
586 case AVMEDIA_TYPE_VIDEO:
588 ist->dec = avcodec_find_decoder(dec->codec_id);
590 dec->flags |= CODEC_FLAG_EMU_EDGE;
593 ist->resample_height = dec->height;
594 ist->resample_width = dec->width;
595 ist->resample_pix_fmt = dec->pix_fmt;
597 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
598 if (framerate && av_parse_video_rate(&ist->framerate,
600 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
605 ist->top_field_first = -1;
606 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
609 case AVMEDIA_TYPE_AUDIO:
610 guess_input_channel_layout(ist);
612 ist->resample_sample_fmt = dec->sample_fmt;
613 ist->resample_sample_rate = dec->sample_rate;
614 ist->resample_channels = dec->channels;
615 ist->resample_channel_layout = dec->channel_layout;
618 case AVMEDIA_TYPE_DATA:
619 case AVMEDIA_TYPE_SUBTITLE:
621 ist->dec = avcodec_find_decoder(dec->codec_id);
622 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
624 case AVMEDIA_TYPE_ATTACHMENT:
625 case AVMEDIA_TYPE_UNKNOWN:
633 static void assert_file_overwrite(const char *filename)
635 if ((!file_overwrite || no_file_overwrite) &&
636 (strchr(filename, ':') == NULL || filename[1] == ':' ||
637 av_strstart(filename, "file:", NULL))) {
638 if (avio_check(filename, 0) == 0) {
639 if (stdin_interaction && (!no_file_overwrite || file_overwrite)) {
640 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
643 signal(SIGINT, SIG_DFL);
645 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
651 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
658 static void dump_attachment(AVStream *st, const char *filename)
661 AVIOContext *out = NULL;
662 AVDictionaryEntry *e;
664 if (!st->codec->extradata_size) {
665 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
666 nb_input_files - 1, st->index);
669 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
672 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
673 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
677 assert_file_overwrite(filename);
679 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
680 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
685 avio_write(out, st->codec->extradata, st->codec->extradata_size);
690 static int opt_input_file(void *optctx, const char *opt, const char *filename)
692 OptionsContext *o = optctx;
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(&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(&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(&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(&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(&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, &format_opts);
771 print_error(filename, err);
774 assert_avoptions(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, 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 = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
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 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
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]);
842 static uint8_t *get_line(AVIOContext *s)
848 if (avio_open_dyn_buf(&line) < 0) {
849 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
853 while ((c = avio_r8(s)) && c != '\n')
856 avio_close_dyn_buf(line, &buf);
861 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
865 const char *base[3] = { getenv("AVCONV_DATADIR"),
870 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
874 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
875 i != 1 ? "" : "/.avconv", codec_name, preset_name);
876 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
879 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
880 i != 1 ? "" : "/.avconv", preset_name);
881 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
887 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
889 char *codec_name = NULL;
891 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
893 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
894 NULL, ost->st->codec->codec_type);
895 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
896 } else if (!strcmp(codec_name, "copy"))
897 ost->stream_copy = 1;
899 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
900 ost->st->codec->codec_id = ost->enc->id;
904 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
907 AVStream *st = avformat_new_stream(oc, NULL);
908 int idx = oc->nb_streams - 1, ret = 0;
909 char *bsf = NULL, *next, *codec_tag = NULL;
910 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
912 char *buf = NULL, *arg = NULL, *preset = NULL;
913 AVIOContext *s = NULL;
916 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
920 if (oc->nb_streams - 1 < o->nb_streamid_map)
921 st->id = o->streamid_map[oc->nb_streams - 1];
923 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
924 nb_output_streams + 1);
925 if (!(ost = av_mallocz(sizeof(*ost))))
927 output_streams[nb_output_streams - 1] = ost;
929 ost->file_index = nb_output_files;
932 st->codec->codec_type = type;
933 choose_encoder(o, oc, ost);
935 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st, ost->enc);
938 avcodec_get_context_defaults3(st->codec, ost->enc);
939 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
941 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
942 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
945 if (!buf[0] || buf[0] == '#') {
949 if (!(arg = strchr(buf, '='))) {
950 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
954 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
956 } while (!s->eof_reached);
960 av_log(NULL, AV_LOG_FATAL,
961 "Preset %s specified for stream %d:%d, but could not be opened.\n",
962 preset, ost->file_index, ost->index);
966 ost->max_frames = INT64_MAX;
967 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
969 ost->copy_prior_start = -1;
970 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
972 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
974 if (next = strchr(bsf, ','))
976 if (!(bsfc = av_bitstream_filter_init(bsf))) {
977 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
981 bsfc_prev->next = bsfc;
983 ost->bitstream_filters = bsfc;
989 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
991 uint32_t tag = strtol(codec_tag, &next, 0);
993 tag = AV_RL32(codec_tag);
994 st->codec->codec_tag = tag;
997 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
999 st->codec->flags |= CODEC_FLAG_QSCALE;
1000 st->codec->global_quality = FF_QP2LAMBDA * qscale;
1003 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1004 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
1006 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
1007 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
1008 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
1010 ost->source_index = source_index;
1011 if (source_index >= 0) {
1012 ost->sync_ist = input_streams[source_index];
1013 input_streams[source_index]->discard = 0;
1014 input_streams[source_index]->st->discard = AVDISCARD_NONE;
1020 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1023 const char *p = str;
1030 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1037 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1041 AVCodecContext *video_enc;
1042 char *frame_rate = NULL;
1044 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1046 video_enc = st->codec;
1048 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1049 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1050 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1054 if (!ost->stream_copy) {
1055 const char *p = NULL;
1056 char *frame_size = NULL;
1057 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
1058 char *intra_matrix = NULL, *inter_matrix = NULL;
1059 const char *filters = "null";
1063 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1064 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1065 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1069 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1070 if (frame_aspect_ratio) {
1072 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1073 q.num <= 0 || q.den <= 0) {
1074 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1077 ost->frame_aspect_ratio = av_q2d(q);
1080 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1081 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1082 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1083 ost->keep_pix_fmt = 1;
1084 if (!*++frame_pix_fmt)
1085 frame_pix_fmt = NULL;
1087 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1088 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1091 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1094 video_enc->gop_size = 0;
1095 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1097 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1098 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1101 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1103 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1105 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1106 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1109 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1112 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1113 for (i = 0; p; i++) {
1115 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1117 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1120 /* FIXME realloc failure */
1121 video_enc->rc_override =
1122 av_realloc(video_enc->rc_override,
1123 sizeof(RcOverride) * (i + 1));
1124 video_enc->rc_override[i].start_frame = start;
1125 video_enc->rc_override[i].end_frame = end;
1127 video_enc->rc_override[i].qscale = q;
1128 video_enc->rc_override[i].quality_factor = 1.0;
1131 video_enc->rc_override[i].qscale = 0;
1132 video_enc->rc_override[i].quality_factor = -q/100.0;
1137 video_enc->rc_override_count = i;
1138 if (!video_enc->rc_initial_buffer_occupancy)
1139 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
1140 video_enc->intra_dc_precision = intra_dc_precision - 8;
1143 video_enc->flags|= CODEC_FLAG_PSNR;
1146 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1149 video_enc->flags |= CODEC_FLAG_PASS1;
1152 video_enc->flags |= CODEC_FLAG_PASS2;
1156 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1157 if (ost->logfile_prefix &&
1158 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1161 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1162 if (ost->forced_keyframes)
1163 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1165 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1167 ost->top_field_first = -1;
1168 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1170 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
1171 ost->avfilter = av_strdup(filters);
1173 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1179 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1184 AVCodecContext *audio_enc;
1186 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1189 audio_enc = st->codec;
1190 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1192 if (!ost->stream_copy) {
1193 char *sample_fmt = NULL;
1194 const char *filters = "anull";
1196 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1198 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1200 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1201 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1205 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1207 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
1209 av_assert1(filters);
1210 ost->avfilter = av_strdup(filters);
1212 /* check for channel mapping for this audio stream */
1213 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1214 AudioChannelMap *map = &o->audio_channel_maps[n];
1215 InputStream *ist = input_streams[ost->source_index];
1216 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
1217 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1218 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1219 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
1220 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1222 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
1223 ost->file_index, ost->st->index);
1231 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1235 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1236 if (!ost->stream_copy) {
1237 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1244 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1246 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1247 ost->stream_copy = 1;
1251 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1255 AVCodecContext *subtitle_enc;
1257 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1259 subtitle_enc = st->codec;
1261 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1263 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1265 if (!ost->stream_copy) {
1266 char *frame_size = NULL;
1268 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1269 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1270 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1278 /* arg format is "output-stream-index:streamid-value". */
1279 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1281 OptionsContext *o = optctx;
1286 av_strlcpy(idx_str, arg, sizeof(idx_str));
1287 p = strchr(idx_str, ':');
1289 av_log(NULL, AV_LOG_FATAL,
1290 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1295 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1296 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1297 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1301 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1303 AVFormatContext *is = ifile->ctx;
1304 AVFormatContext *os = ofile->ctx;
1308 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1310 return AVERROR(ENOMEM);
1313 for (i = 0; i < is->nb_chapters; i++) {
1314 AVChapter *in_ch = is->chapters[i], *out_ch;
1315 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
1316 AV_TIME_BASE_Q, in_ch->time_base);
1317 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1318 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1321 if (in_ch->end < ts_off)
1323 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1326 out_ch = av_mallocz(sizeof(AVChapter));
1328 return AVERROR(ENOMEM);
1330 out_ch->id = in_ch->id;
1331 out_ch->time_base = in_ch->time_base;
1332 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1333 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1336 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1338 os->chapters[os->nb_chapters++] = out_ch;
1343 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1346 AVFormatContext *ic = avformat_alloc_context();
1348 ic->interrupt_callback = int_cb;
1349 err = avformat_open_input(&ic, filename, NULL, NULL);
1352 /* copy stream format */
1353 for(i=0;i<ic->nb_streams;i++) {
1357 AVCodecContext *avctx;
1359 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
1360 ost = new_output_stream(o, s, codec->type, -1);
1365 // FIXME: a more elegant solution is needed
1366 memcpy(st, ic->streams[i], sizeof(AVStream));
1368 st->info = av_malloc(sizeof(*st->info));
1369 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
1371 avcodec_copy_context(st->codec, ic->streams[i]->codec);
1373 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
1374 choose_sample_fmt(st, codec);
1375 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
1376 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
1379 /* ffserver seeking with date=... needs a date reference */
1380 err = parse_option(o, "metadata", "creation_time=now", options);
1382 avformat_close_input(&ic);
1386 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1387 AVFormatContext *oc)
1391 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1392 ofilter->out_tmp->pad_idx)) {
1393 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
1394 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1396 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1401 ost->source_index = -1;
1402 ost->filter = ofilter;
1406 if (ost->stream_copy) {
1407 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1408 "which is fed from a complex filtergraph. Filtering and streamcopy "
1409 "cannot be used together.\n", ost->file_index, ost->index);
1413 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1414 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1417 avfilter_inout_free(&ofilter->out_tmp);
1420 static int configure_complex_filters(void)
1424 for (i = 0; i < nb_filtergraphs; i++)
1425 if (!filtergraphs[i]->graph &&
1426 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1431 void opt_output_file(void *optctx, const char *filename)
1433 OptionsContext *o = optctx;
1434 AVFormatContext *oc;
1436 AVOutputFormat *file_oformat;
1440 if (configure_complex_filters() < 0) {
1441 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1445 if (!strcmp(filename, "-"))
1448 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
1450 print_error(filename, err);
1453 file_oformat= oc->oformat;
1454 oc->interrupt_callback = int_cb;
1456 /* create streams for all unlabeled output pads */
1457 for (i = 0; i < nb_filtergraphs; i++) {
1458 FilterGraph *fg = filtergraphs[i];
1459 for (j = 0; j < fg->nb_outputs; j++) {
1460 OutputFilter *ofilter = fg->outputs[j];
1462 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1465 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1466 ofilter->out_tmp->pad_idx)) {
1467 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1468 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1469 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1471 init_output_filter(ofilter, o, oc);
1475 if (!strcmp(file_oformat->name, "ffm") &&
1476 av_strstart(filename, "http:", NULL)) {
1478 /* special case for files sent to ffserver: we get the stream
1479 parameters from ffserver */
1480 int err = read_ffserver_streams(o, oc, filename);
1482 print_error(filename, err);
1485 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
1486 ost = output_streams[j];
1487 for (i = 0; i < nb_input_streams; i++) {
1488 ist = input_streams[i];
1489 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
1491 ost->source_index= i;
1492 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
1493 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
1495 ist->st->discard = AVDISCARD_NONE;
1500 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));
1504 } else if (!o->nb_stream_maps) {
1505 char *subtitle_codec_name = NULL;
1506 /* pick the "best" stream of each type */
1508 /* video: highest resolution */
1509 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1510 int area = 0, idx = -1;
1511 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
1512 for (i = 0; i < nb_input_streams; i++) {
1514 ist = input_streams[i];
1515 new_area = ist->st->codec->width * ist->st->codec->height;
1516 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1518 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1520 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1527 new_video_stream(o, oc, idx);
1530 /* audio: most channels */
1531 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1532 int channels = 0, idx = -1;
1533 for (i = 0; i < nb_input_streams; i++) {
1534 ist = input_streams[i];
1535 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1536 ist->st->codec->channels > channels) {
1537 channels = ist->st->codec->channels;
1542 new_audio_stream(o, oc, idx);
1545 /* subtitles: pick first */
1546 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
1547 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != AV_CODEC_ID_NONE || subtitle_codec_name)) {
1548 for (i = 0; i < nb_input_streams; i++)
1549 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1550 new_subtitle_stream(o, oc, i);
1554 /* do something with data? */
1556 for (i = 0; i < o->nb_stream_maps; i++) {
1557 StreamMap *map = &o->stream_maps[i];
1558 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
1563 if (map->linklabel) {
1565 OutputFilter *ofilter = NULL;
1568 for (j = 0; j < nb_filtergraphs; j++) {
1569 fg = filtergraphs[j];
1570 for (k = 0; k < fg->nb_outputs; k++) {
1571 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1572 if (out && !strcmp(out->name, map->linklabel)) {
1573 ofilter = fg->outputs[k];
1580 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1581 "in any defined filter graph.\n", map->linklabel);
1584 init_output_filter(ofilter, o, oc);
1586 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1587 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
1589 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1591 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1593 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
1596 switch (ist->st->codec->codec_type) {
1597 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
1598 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
1599 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
1600 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
1601 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
1603 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1604 map->file_index, map->stream_index);
1612 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
1613 AVDictionaryEntry *e;
1614 ost = output_streams[i];
1616 if ( ost->stream_copy
1617 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
1618 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
1619 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
1623 /* handle attached files */
1624 for (i = 0; i < o->nb_attachments; i++) {
1626 uint8_t *attachment;
1630 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1631 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1635 if ((len = avio_size(pb)) <= 0) {
1636 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1640 if (!(attachment = av_malloc(len))) {
1641 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1645 avio_read(pb, attachment, len);
1647 ost = new_attachment_stream(o, oc, -1);
1648 ost->stream_copy = 0;
1649 ost->attachment_filename = o->attachments[i];
1650 ost->st->codec->extradata = attachment;
1651 ost->st->codec->extradata_size = len;
1653 p = strrchr(o->attachments[i], '/');
1654 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1658 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
1659 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
1662 output_files[nb_output_files - 1]->ctx = oc;
1663 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
1664 output_files[nb_output_files - 1]->recording_time = o->recording_time;
1665 if (o->recording_time != INT64_MAX)
1666 oc->duration = o->recording_time;
1667 output_files[nb_output_files - 1]->start_time = o->start_time;
1668 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
1669 output_files[nb_output_files - 1]->shortest = o->shortest;
1670 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
1672 /* check filename in case of an image number is expected */
1673 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1674 if (!av_filename_number_test(oc->filename)) {
1675 print_error(oc->filename, AVERROR(EINVAL));
1680 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1681 /* test if it already exists to avoid losing precious files */
1682 assert_file_overwrite(filename);
1685 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1686 &oc->interrupt_callback,
1687 &output_files[nb_output_files - 1]->opts)) < 0) {
1688 print_error(filename, err);
1693 if (o->mux_preload) {
1695 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1696 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
1698 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1701 for (i = 0; i < o->nb_metadata_map; i++) {
1703 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1705 if (in_file_index >= nb_input_files) {
1706 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1709 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
1713 if (o->chapters_input_file >= nb_input_files) {
1714 if (o->chapters_input_file == INT_MAX) {
1715 /* copy chapters from the first input file that has them*/
1716 o->chapters_input_file = -1;
1717 for (i = 0; i < nb_input_files; i++)
1718 if (input_files[i]->ctx->nb_chapters) {
1719 o->chapters_input_file = i;
1723 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1724 o->chapters_input_file);
1728 if (o->chapters_input_file >= 0)
1729 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
1730 !o->metadata_chapters_manual);
1732 /* copy global metadata by default */
1733 if (!o->metadata_global_manual && nb_input_files){
1734 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1735 AV_DICT_DONT_OVERWRITE);
1736 if(o->recording_time != INT64_MAX)
1737 av_dict_set(&oc->metadata, "duration", NULL, 0);
1738 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
1740 if (!o->metadata_streams_manual)
1741 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
1743 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1745 ist = input_streams[output_streams[i]->source_index];
1746 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1749 /* process manually set metadata */
1750 for (i = 0; i < o->nb_metadata; i++) {
1753 const char *stream_spec;
1754 int index = 0, j, ret = 0;
1756 val = strchr(o->metadata[i].u.str, '=');
1758 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1759 o->metadata[i].u.str);
1764 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1766 for (j = 0; j < oc->nb_streams; j++) {
1767 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1768 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1779 if (index < 0 || index >= oc->nb_chapters) {
1780 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1783 m = &oc->chapters[index]->metadata;
1786 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1789 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1793 reset_options(o, 0);
1796 static int opt_target(void *optctx, const char *opt, const char *arg)
1798 OptionsContext *o = optctx;
1799 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1800 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1802 if (!strncmp(arg, "pal-", 4)) {
1805 } else if (!strncmp(arg, "ntsc-", 5)) {
1808 } else if (!strncmp(arg, "film-", 5)) {
1812 /* Try to determine PAL/NTSC by peeking in the input files */
1813 if (nb_input_files) {
1815 for (j = 0; j < nb_input_files; j++) {
1816 for (i = 0; i < input_files[j]->nb_streams; i++) {
1817 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1818 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
1820 fr = c->time_base.den * 1000 / c->time_base.num;
1824 } else if ((fr == 29970) || (fr == 23976)) {
1829 if (norm != UNKNOWN)
1833 if (norm != UNKNOWN)
1834 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1837 if (norm == UNKNOWN) {
1838 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1839 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1840 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1844 if (!strcmp(arg, "vcd")) {
1845 opt_video_codec(o, "c:v", "mpeg1video");
1846 opt_audio_codec(o, "c:a", "mp2");
1847 parse_option(o, "f", "vcd", options);
1849 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1850 parse_option(o, "r", frame_rates[norm], options);
1851 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1853 opt_default(NULL, "b:v", "1150000");
1854 opt_default(NULL, "maxrate", "1150000");
1855 opt_default(NULL, "minrate", "1150000");
1856 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
1858 opt_default(NULL, "b:a", "224000");
1859 parse_option(o, "ar", "44100", options);
1860 parse_option(o, "ac", "2", options);
1862 opt_default(NULL, "packetsize", "2324");
1863 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
1865 /* We have to offset the PTS, so that it is consistent with the SCR.
1866 SCR starts at 36000, but the first two packs contain only padding
1867 and the first pack from the other stream, respectively, may also have
1868 been written before.
1869 So the real data starts at SCR 36000+3*1200. */
1870 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1871 } else if (!strcmp(arg, "svcd")) {
1873 opt_video_codec(o, "c:v", "mpeg2video");
1874 opt_audio_codec(o, "c:a", "mp2");
1875 parse_option(o, "f", "svcd", options);
1877 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1878 parse_option(o, "r", frame_rates[norm], options);
1879 parse_option(o, "pix_fmt", "yuv420p", options);
1880 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1882 opt_default(NULL, "b:v", "2040000");
1883 opt_default(NULL, "maxrate", "2516000");
1884 opt_default(NULL, "minrate", "0"); // 1145000;
1885 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1886 opt_default(NULL, "scan_offset", "1");
1888 opt_default(NULL, "b:a", "224000");
1889 parse_option(o, "ar", "44100", options);
1891 opt_default(NULL, "packetsize", "2324");
1893 } else if (!strcmp(arg, "dvd")) {
1895 opt_video_codec(o, "c:v", "mpeg2video");
1896 opt_audio_codec(o, "c:a", "ac3");
1897 parse_option(o, "f", "dvd", options);
1899 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1900 parse_option(o, "r", frame_rates[norm], options);
1901 parse_option(o, "pix_fmt", "yuv420p", options);
1902 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1904 opt_default(NULL, "b:v", "6000000");
1905 opt_default(NULL, "maxrate", "9000000");
1906 opt_default(NULL, "minrate", "0"); // 1500000;
1907 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1909 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1910 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
1912 opt_default(NULL, "b:a", "448000");
1913 parse_option(o, "ar", "48000", options);
1915 } else if (!strncmp(arg, "dv", 2)) {
1917 parse_option(o, "f", "dv", options);
1919 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1920 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1921 norm == PAL ? "yuv420p" : "yuv411p", options);
1922 parse_option(o, "r", frame_rates[norm], options);
1924 parse_option(o, "ar", "48000", options);
1925 parse_option(o, "ac", "2", options);
1928 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1929 return AVERROR(EINVAL);
1934 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1936 av_free (vstats_filename);
1937 vstats_filename = av_strdup (arg);
1941 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1944 time_t today2 = time(NULL);
1945 struct tm *today = localtime(&today2);
1947 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1949 return opt_vstats_file(NULL, opt, filename);
1952 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1954 OptionsContext *o = optctx;
1955 return parse_option(o, "frames:v", arg, options);
1958 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1960 OptionsContext *o = optctx;
1961 return parse_option(o, "frames:a", arg, options);
1964 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1966 OptionsContext *o = optctx;
1967 return parse_option(o, "frames:d", arg, options);
1970 static int opt_preset(void *optctx, const char *opt, const char *arg)
1972 OptionsContext *o = optctx;
1974 char filename[1000], line[1000], tmp_line[1000];
1975 const char *codec_name = NULL;
1979 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
1981 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
1982 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
1983 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
1985 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
1989 while (fgets(line, sizeof(line), f)) {
1990 char *key = tmp_line, *value, *endptr;
1992 if (strcspn(line, "#\n\r") == 0)
1994 strcpy(tmp_line, line);
1995 if (!av_strtok(key, "=", &value) ||
1996 !av_strtok(value, "\r\n", &endptr)) {
1997 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2000 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2002 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2003 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2004 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2005 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2006 else if (opt_default(NULL, key, value) < 0) {
2007 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2008 filename, line, key, value);
2018 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2020 OptionsContext *o = optctx;
2021 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2022 int ret = parse_option(o, s, arg, options);
2027 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2029 OptionsContext *o = optctx;
2030 if(!strcmp(opt, "b")){
2031 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2032 return parse_option(o, "b:v", arg, options);
2034 return opt_default(optctx, opt, arg);
2037 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2039 OptionsContext *o = optctx;
2042 if(!strcmp(opt, "qscale")){
2043 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2044 return parse_option(o, "q:v", arg, options);
2046 s = av_asprintf("q%s", opt + 6);
2047 ret = parse_option(o, s, arg, options);
2052 static int opt_profile(void *optctx, const char *opt, const char *arg)
2054 OptionsContext *o = optctx;
2055 if(!strcmp(opt, "profile")){
2056 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2057 return parse_option(o, "profile:v", arg, options);
2059 return opt_default(optctx, opt, arg);
2063 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2065 OptionsContext *o = optctx;
2066 return parse_option(o, "filter:v", arg, options);
2069 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2071 OptionsContext *o = optctx;
2072 return parse_option(o, "filter:a", arg, options);
2075 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2077 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2078 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2079 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2080 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
2082 if (video_sync_method == VSYNC_AUTO)
2083 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2087 static int opt_deinterlace(void *optctx, const char *opt, const char *arg)
2089 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
2094 static int opt_timecode(void *optctx, const char *opt, const char *arg)
2096 OptionsContext *o = optctx;
2097 char *tcr = av_asprintf("timecode=%s", arg);
2098 int ret = parse_option(o, "metadata:g", tcr, options);
2100 ret = opt_default(optctx, "gop_timecode", arg);
2105 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2107 OptionsContext *o = optctx;
2108 char layout_str[32];
2111 int ret, channels, ac_str_size;
2114 layout = av_get_channel_layout(arg);
2116 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2117 return AVERROR(EINVAL);
2119 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2120 ret = opt_default(NULL, opt, layout_str);
2124 /* set 'ac' option based on channel layout */
2125 channels = av_get_channel_layout_nb_channels(layout);
2126 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2127 stream_str = strchr(opt, ':');
2128 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2129 ac_str = av_mallocz(ac_str_size);
2131 return AVERROR(ENOMEM);
2132 av_strlcpy(ac_str, "ac", 3);
2134 av_strlcat(ac_str, stream_str, ac_str_size);
2135 ret = parse_option(o, ac_str, layout_str, options);
2141 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2143 OptionsContext *o = optctx;
2144 return parse_option(o, "q:a", arg, options);
2147 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2149 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
2150 &nb_filtergraphs, nb_filtergraphs + 1);
2151 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2152 return AVERROR(ENOMEM);
2153 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2154 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
2158 void show_help_default(const char *opt, const char *arg)
2160 /* per-file options have at least one of those set */
2161 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2162 int show_advanced = 0, show_avoptions = 0;
2165 if (!strcmp(opt, "long"))
2167 else if (!strcmp(opt, "full"))
2168 show_advanced = show_avoptions = 1;
2170 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2175 printf("Getting help:\n"
2176 " -h -- print basic options\n"
2177 " -h long -- print more options\n"
2178 " -h full -- print all options (including all format and codec specific options, very long)\n"
2179 " See man %s for detailed description of the options.\n"
2180 "\n", program_name);
2182 show_help_options(options, "Print help / information / capabilities:",
2185 show_help_options(options, "Global options (affect whole program "
2186 "instead of just one file:",
2187 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2189 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2190 per_file | OPT_EXIT, 0);
2192 show_help_options(options, "Per-file main options:", 0,
2193 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2194 OPT_EXIT, per_file);
2196 show_help_options(options, "Advanced per-file options:",
2197 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2199 show_help_options(options, "Video options:",
2200 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2202 show_help_options(options, "Advanced Video options:",
2203 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2205 show_help_options(options, "Audio options:",
2206 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2208 show_help_options(options, "Advanced Audio options:",
2209 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2210 show_help_options(options, "Subtitle options:",
2211 OPT_SUBTITLE, 0, 0);
2214 if (show_avoptions) {
2215 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2216 show_help_children(avcodec_get_class(), flags);
2217 show_help_children(avformat_get_class(), flags);
2218 show_help_children(sws_get_class(), flags);
2219 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2220 show_help_children(avfilter_get_class(), AV_OPT_FLAG_FILTERING_PARAM);
2224 void show_usage(void)
2226 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
2227 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2228 av_log(NULL, AV_LOG_INFO, "\n");
2232 static int opt_progress(void *optctx, const char *opt, const char *arg)
2234 AVIOContext *avio = NULL;
2237 if (!strcmp(arg, "-"))
2239 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
2241 av_log(0, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
2242 arg, av_err2str(ret));
2245 progress_avio = avio;
2249 #define OFFSET(x) offsetof(OptionsContext, x)
2250 const OptionDef options[] = {
2252 #include "cmdutils_common_opts.h"
2253 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, { .off = OFFSET(format) },
2254 "force format", "fmt" },
2255 { "i", HAS_ARG | OPT_PERFILE, { .func_arg = opt_input_file },
2256 "input file name", "filename" },
2257 { "y", OPT_BOOL, { &file_overwrite },
2258 "overwrite output files" },
2259 { "n", OPT_BOOL, { &no_file_overwrite },
2260 "do not overwrite output files" },
2261 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(codec_names) },
2262 "codec name", "codec" },
2263 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(codec_names) },
2264 "codec name", "codec" },
2265 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(presets) },
2266 "preset name", "preset" },
2267 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_map },
2268 "set input stream mapping",
2269 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2270 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_map_channel },
2271 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
2272 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(metadata_map) },
2273 "set metadata information of outfile from infile",
2274 "outfile[,metadata]:infile[,metadata]" },
2275 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(chapters_input_file) },
2276 "set chapters mapping", "input_file_index" },
2277 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, { .off = OFFSET(recording_time) },
2278 "record or transcode \"duration\" seconds of audio/video",
2280 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, { .off = OFFSET(limit_filesize) },
2281 "set the limit file size in bytes", "limit_size" },
2282 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, { .off = OFFSET(start_time) },
2283 "set the start time offset", "time_off" },
2284 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_EXPERT,{ .off = OFFSET(input_ts_offset) },
2285 "set the input ts offset", "time_off" },
2286 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(ts_scale) },
2287 "set the input ts scale", "scale" },
2288 { "timestamp", HAS_ARG | OPT_PERFILE, { .func_arg = opt_recording_timestamp },
2289 "set the recording timestamp ('now' to set the current time)", "time" },
2290 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(metadata) },
2291 "add metadata", "string=string" },
2292 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_data_frames },
2293 "set the number of data frames to record", "number" },
2294 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2295 "add timings for benchmarking" },
2296 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
2297 "add timings for each task" },
2298 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
2299 "write program-readable progress information", "url" },
2300 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
2301 "enable or disable interaction on standard input" },
2302 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2303 "set max runtime in seconds", "limit" },
2304 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2305 "dump each input packet" },
2306 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2307 "when dumping packets, also dump the payload" },
2308 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(rate_emu) },
2309 "read input at native frame rate", "" },
2310 { "target", HAS_ARG | OPT_PERFILE, { .func_arg = opt_target },
2311 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2312 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2313 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2314 "video sync method", "" },
2315 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2316 "audio sync method", "" },
2317 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2318 "audio drift threshold", "threshold" },
2319 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2320 "copy timestamps" },
2321 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
2322 "copy input stream time base when stream copying", "mode" },
2323 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(shortest) },
2324 "finish encoding within shortest input" },
2325 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2326 "timestamp discontinuity delta threshold", "threshold" },
2327 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
2328 "timestamp error delta threshold", "threshold" },
2329 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2330 "exit on error", "error" },
2331 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_initial_nonkeyframes) },
2332 "copy initial non-keyframes" },
2333 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_prior_start) },
2334 "copy or discard frames before start time" },
2335 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, { .off = OFFSET(max_frames) },
2336 "set the number of frames to record", "number" },
2337 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(codec_tags) },
2338 "force codec tag/fourcc", "fourcc/tag" },
2339 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC,{ .off = OFFSET(qscale) },
2340 "use fixed quality scale (VBR)", "q" },
2341 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_qscale },
2342 "use fixed quality scale (VBR)", "q" },
2343 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_profile },
2344 "set profile", "profile" },
2345 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(filters) },
2346 "set stream filterchain", "filter_list" },
2347 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(reinit_filters) },
2348 "reinit filtergraph on input parameter changes", "" },
2349 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2350 "create a complex filtergraph", "graph_description" },
2351 { "stats", OPT_BOOL, { &print_stats },
2352 "print progress report during encoding", },
2353 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_attach },
2354 "add an attachment to the output file", "filename" },
2355 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |OPT_EXPERT,{ .off = OFFSET(dump_attachment) },
2356 "extract an attachment into a file", "filename" },
2357 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
2358 "print timestamp debugging info" },
2361 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_frames },
2362 "set the number of video frames to record", "number" },
2363 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_rates) },
2364 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2365 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC,{ .off = OFFSET(frame_sizes) },
2366 "set frame size (WxH or abbreviation)", "size" },
2367 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_aspect_ratios) },
2368 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2369 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_pix_fmts) },
2370 "set pixel format", "format" },
2371 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
2372 "set the number of bits per raw sample", "number" },
2373 { "croptop", OPT_VIDEO | HAS_ARG, { .func_arg = opt_frame_crop },
2374 "Removed, use the crop filter instead", "size" },
2375 { "cropbottom", OPT_VIDEO | HAS_ARG, { .func_arg = opt_frame_crop },
2376 "Removed, use the crop filter instead", "size" },
2377 { "cropleft", OPT_VIDEO | HAS_ARG, { .func_arg = opt_frame_crop },
2378 "Removed, use the crop filter instead", "size" },
2379 { "cropright", OPT_VIDEO | HAS_ARG, { .func_arg = opt_frame_crop },
2380 "Removed, use the crop filter instead", "size" },
2381 { "padtop", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2382 "Removed, use the pad filter instead", "size" },
2383 { "padbottom", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2384 "Removed, use the pad filter instead", "size" },
2385 { "padleft", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2386 "Removed, use the pad filter instead", "size" },
2387 { "padright", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2388 "Removed, use the pad filter instead", "size" },
2389 { "padcolor", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2390 "Removed, use the pad filter instead", "color" },
2391 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
2392 "deprecated use -g 1" },
2393 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(video_disable) },
2395 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2396 "discard threshold", "n" },
2397 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(rc_overrides) },
2398 "rate control override for specific intervals", "override" },
2399 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_codec },
2400 "force video codec ('copy' to copy stream)", "codec" },
2401 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
2403 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
2405 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_timecode },
2406 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
2407 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT, { .off = OFFSET(pass) },
2408 "select the pass number (1 to 3)", "n" },
2409 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(passlogfiles) },
2410 "select two pass log file name prefix", "prefix" },
2411 { "deinterlace", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_deinterlace },
2412 "this option is deprecated, use the yadif filter instead" },
2413 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
2414 "calculate PSNR of compressed frames" },
2415 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2416 "dump video coding statistics to file" },
2417 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2418 "dump video coding statistics to file", "file" },
2419 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_filters },
2420 "video filters", "filter list" },
2421 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(intra_matrices) },
2422 "specify intra matrix coeffs", "matrix" },
2423 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(inter_matrices) },
2424 "specify inter matrix coeffs", "matrix" },
2425 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC, { .off = OFFSET(top_field_first) },
2426 "top=1/bottom=0/auto=-1 field first", "" },
2427 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2428 "intra_dc_precision", "precision" },
2429 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new },
2430 "force video tag/fourcc", "fourcc/tag" },
2431 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2432 "show QP histogram" },
2433 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(force_fps) },
2434 "force the selected framerate, disable the best supported framerate selection" },
2435 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_streamid },
2436 "set the value of an outfile streamid", "streamIndex:value" },
2437 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_SPEC,
2438 { .off = OFFSET(forced_key_frames) },
2439 "force key frames at specified timestamps", "timestamps" },
2440 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_bitrate },
2441 "video bitrate (please use -b:v)", "bitrate" },
2444 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_frames },
2445 "set the number of audio frames to record", "number" },
2446 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_qscale },
2447 "set audio quality (codec-specific)", "quality", },
2448 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(audio_sample_rate) },
2449 "set audio sampling rate (in Hz)", "rate" },
2450 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(audio_channels) },
2451 "set number of audio channels", "channels" },
2452 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(audio_disable) },
2454 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_codec },
2455 "force audio codec ('copy' to copy stream)", "codec" },
2456 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new },
2457 "force audio tag/fourcc", "fourcc/tag" },
2458 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2459 "change audio volume (256=normal)" , "volume" },
2460 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_STRING, { .off = OFFSET(sample_fmts) },
2461 "set sample format", "format" },
2462 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_channel_layout },
2463 "set channel layout", "layout" },
2464 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_filters },
2465 "audio filters", "filter list" },
2467 /* subtitle options */
2468 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(subtitle_disable) },
2469 "disable subtitle" },
2470 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE, { .func_arg = opt_subtitle_codec },
2471 "force subtitle codec ('copy' to copy stream)", "codec" },
2472 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new }
2473 , "force subtitle tag/fourcc", "fourcc/tag" },
2474 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC, { .off = OFFSET(fix_sub_duration) },
2475 "fix subtitles duration" },
2478 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
2479 "deprecated, use -channel", "channel" },
2480 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
2481 "deprecated, use -standard", "standard" },
2482 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2485 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(mux_max_delay) },
2486 "set the maximum demux-decode delay", "seconds" },
2487 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(mux_preload) },
2488 "set the initial demux-decode delay", "seconds" },
2490 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT, { .off = OFFSET(bitstream_filters) },
2491 "A comma-separated list of bitstream filters", "bitstream_filters" },
2492 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_old2new },
2493 "deprecated", "audio bitstream_filters" },
2494 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_old2new },
2495 "deprecated", "video bitstream_filters" },
2497 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2498 "set the audio options to the indicated preset", "preset" },
2499 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2500 "set the video options to the indicated preset", "preset" },
2501 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2502 "set the subtitle options to the indicated preset", "preset" },
2503 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2504 "set options from indicated preset file", "filename" },
2505 /* data codec support */
2506 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_data_codec },
2507 "force data codec ('copy' to copy stream)", "codec" },
2508 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, { .off = OFFSET(data_disable) },
2511 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, { .func_arg = opt_default },
2512 "generic catch all option", "" },