2 * avconv option parsing
4 * This file is part of Libav.
6 * Libav 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 * Libav 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 Libav; 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 char *vstats_filename;
59 float audio_drift_threshold = 0.1;
60 float dts_delta_threshold = 10;
62 int audio_volume = 256;
63 int audio_sync_method = 0;
64 int video_sync_method = VSYNC_AUTO;
65 int do_deinterlace = 0;
71 int exit_on_error = 0;
75 static int file_overwrite = 0;
76 static int video_discard = 0;
77 static int intra_dc_precision = 8;
78 static int using_stdin = 0;
79 static int input_sync;
81 static void uninit_options(OptionsContext *o)
83 const OptionDef *po = options;
86 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
88 void *dst = (uint8_t*)o + po->u.off;
90 if (po->flags & OPT_SPEC) {
91 SpecifierOpt **so = dst;
92 int i, *count = (int*)(so + 1);
93 for (i = 0; i < *count; i++) {
94 av_freep(&(*so)[i].specifier);
95 if (po->flags & OPT_STRING)
96 av_freep(&(*so)[i].u.str);
100 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
105 for (i = 0; i < o->nb_stream_maps; i++)
106 av_freep(&o->stream_maps[i].linklabel);
107 av_freep(&o->stream_maps);
108 av_freep(&o->meta_data_maps);
109 av_freep(&o->streamid_map);
112 static void init_options(OptionsContext *o)
114 memset(o, 0, sizeof(*o));
116 o->mux_max_delay = 0.7;
117 o->recording_time = INT64_MAX;
118 o->limit_filesize = UINT64_MAX;
119 o->chapters_input_file = INT_MAX;
122 /* return a copy of the input with the stream specifiers removed from the keys */
123 static AVDictionary *strip_specifiers(AVDictionary *dict)
125 AVDictionaryEntry *e = NULL;
126 AVDictionary *ret = NULL;
128 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
129 char *p = strchr(e->key, ':');
133 av_dict_set(&ret, e->key, e->value, 0);
140 static double parse_frame_aspect_ratio(const char *arg)
147 p = strchr(arg, ':');
149 x = strtol(arg, &end, 10);
151 y = strtol(end + 1, &end, 10);
153 ar = (double)x / (double)y;
155 ar = strtod(arg, NULL);
158 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
164 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
166 OptionsContext *o = optctx;
167 return parse_option(o, "codec:a", arg, options);
170 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
172 OptionsContext *o = optctx;
173 return parse_option(o, "codec:v", arg, options);
176 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
178 OptionsContext *o = optctx;
179 return parse_option(o, "codec:s", arg, options);
182 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
184 OptionsContext *o = optctx;
185 return parse_option(o, "codec:d", arg, options);
188 static int opt_map(void *optctx, const char *opt, const char *arg)
190 OptionsContext *o = optctx;
192 int i, negative = 0, file_idx;
193 int sync_file_idx = -1, sync_stream_idx;
201 map = av_strdup(arg);
203 /* parse sync stream first, just pick first matching stream */
204 if (sync = strchr(map, ',')) {
206 sync_file_idx = strtol(sync + 1, &sync, 0);
207 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
208 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
213 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
214 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
215 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
219 if (i == input_files[sync_file_idx]->nb_streams) {
220 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
221 "match any streams.\n", arg);
228 /* this mapping refers to lavfi output */
229 const char *c = map + 1;
230 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
231 m = &o->stream_maps[o->nb_stream_maps - 1];
232 m->linklabel = av_get_token(&c, "]");
234 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
238 file_idx = strtol(map, &p, 0);
239 if (file_idx >= nb_input_files || file_idx < 0) {
240 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
244 /* disable some already defined maps */
245 for (i = 0; i < o->nb_stream_maps; i++) {
246 m = &o->stream_maps[i];
247 if (file_idx == m->file_index &&
248 check_stream_specifier(input_files[m->file_index]->ctx,
249 input_files[m->file_index]->ctx->streams[m->stream_index],
250 *p == ':' ? p + 1 : p) > 0)
254 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
255 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
256 *p == ':' ? p + 1 : p) <= 0)
258 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
259 m = &o->stream_maps[o->nb_stream_maps - 1];
261 m->file_index = file_idx;
264 if (sync_file_idx >= 0) {
265 m->sync_file_index = sync_file_idx;
266 m->sync_stream_index = sync_stream_idx;
268 m->sync_file_index = file_idx;
269 m->sync_stream_index = i;
275 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
283 static int opt_attach(void *optctx, const char *opt, const char *arg)
285 OptionsContext *o = optctx;
286 GROW_ARRAY(o->attachments, o->nb_attachments);
287 o->attachments[o->nb_attachments - 1] = arg;
292 * Parse a metadata specifier passed as 'arg' parameter.
293 * @param arg metadata string to parse
294 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
295 * @param index for type c/p, chapter/program index is written here
296 * @param stream_spec for type s, the stream specifier is written here
298 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
306 if (*(++arg) && *arg != ':') {
307 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
310 *stream_spec = *arg == ':' ? arg + 1 : "";
315 *index = strtol(++arg, NULL, 0);
318 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
325 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
327 AVDictionary **meta_in = NULL;
328 AVDictionary **meta_out;
330 char type_in, type_out;
331 const char *istream_spec = NULL, *ostream_spec = NULL;
332 int idx_in = 0, idx_out = 0;
334 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
335 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
337 if (type_in == 'g' || type_out == 'g')
338 o->metadata_global_manual = 1;
339 if (type_in == 's' || type_out == 's')
340 o->metadata_streams_manual = 1;
341 if (type_in == 'c' || type_out == 'c')
342 o->metadata_chapters_manual = 1;
344 /* ic is NULL when just disabling automatic mappings */
348 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
349 if ((index) < 0 || (index) >= (nb_elems)) {\
350 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
355 #define SET_DICT(type, meta, context, index)\
358 meta = &context->metadata;\
361 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
362 meta = &context->chapters[index]->metadata;\
365 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
366 meta = &context->programs[index]->metadata;\
369 break; /* handled separately below */ \
370 default: av_assert0(0);\
373 SET_DICT(type_in, meta_in, ic, idx_in);
374 SET_DICT(type_out, meta_out, oc, idx_out);
376 /* for input streams choose first matching stream */
377 if (type_in == 's') {
378 for (i = 0; i < ic->nb_streams; i++) {
379 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
380 meta_in = &ic->streams[i]->metadata;
386 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
391 if (type_out == 's') {
392 for (i = 0; i < oc->nb_streams; i++) {
393 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
394 meta_out = &oc->streams[i]->metadata;
395 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
400 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
405 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
407 const AVCodecDescriptor *desc;
408 const char *codec_string = encoder ? "encoder" : "decoder";
412 avcodec_find_encoder_by_name(name) :
413 avcodec_find_decoder_by_name(name);
415 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
416 codec = encoder ? avcodec_find_encoder(desc->id) :
417 avcodec_find_decoder(desc->id);
419 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
420 codec_string, codec->name, desc->name);
424 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
427 if (codec->type != type) {
428 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
434 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
436 char *codec_name = NULL;
438 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
440 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
441 st->codec->codec_id = codec->id;
444 return avcodec_find_decoder(st->codec->codec_id);
447 /* Add all the streams from the given input file to the global
448 * list of input streams. */
449 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
453 for (i = 0; i < ic->nb_streams; i++) {
454 AVStream *st = ic->streams[i];
455 AVCodecContext *dec = st->codec;
456 InputStream *ist = av_mallocz(sizeof(*ist));
457 char *framerate = NULL;
462 GROW_ARRAY(input_streams, nb_input_streams);
463 input_streams[nb_input_streams - 1] = ist;
466 ist->file_index = nb_input_files;
468 st->discard = AVDISCARD_ALL;
471 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
473 ist->dec = choose_decoder(o, ic, st);
474 ist->opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
476 switch (dec->codec_type) {
477 case AVMEDIA_TYPE_VIDEO:
478 ist->resample_height = dec->height;
479 ist->resample_width = dec->width;
480 ist->resample_pix_fmt = dec->pix_fmt;
482 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
483 if (framerate && av_parse_video_rate(&ist->framerate,
485 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
491 case AVMEDIA_TYPE_AUDIO:
492 guess_input_channel_layout(ist);
494 ist->resample_sample_fmt = dec->sample_fmt;
495 ist->resample_sample_rate = dec->sample_rate;
496 ist->resample_channels = dec->channels;
497 ist->resample_channel_layout = dec->channel_layout;
500 case AVMEDIA_TYPE_DATA:
501 case AVMEDIA_TYPE_SUBTITLE:
502 case AVMEDIA_TYPE_ATTACHMENT:
503 case AVMEDIA_TYPE_UNKNOWN:
511 static void assert_file_overwrite(const char *filename)
513 if (!file_overwrite &&
514 (strchr(filename, ':') == NULL || filename[1] == ':' ||
515 av_strstart(filename, "file:", NULL))) {
516 if (avio_check(filename, 0) == 0) {
518 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
521 fprintf(stderr, "Not overwriting - exiting\n");
526 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
533 static void dump_attachment(AVStream *st, const char *filename)
536 AVIOContext *out = NULL;
537 AVDictionaryEntry *e;
539 if (!st->codec->extradata_size) {
540 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
541 nb_input_files - 1, st->index);
544 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
547 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
548 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
552 assert_file_overwrite(filename);
554 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
555 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
560 avio_write(out, st->codec->extradata, st->codec->extradata_size);
565 static int open_input_file(OptionsContext *o, const char *filename)
569 AVInputFormat *file_iformat = NULL;
574 AVDictionary *unused_opts = NULL;
575 AVDictionaryEntry *e = NULL;
576 int orig_nb_streams; // number of streams before avformat_find_stream_info
579 if (!(file_iformat = av_find_input_format(o->format))) {
580 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
585 if (!strcmp(filename, "-"))
588 using_stdin |= !strncmp(filename, "pipe:", 5) ||
589 !strcmp(filename, "/dev/stdin");
591 /* get default parameters from command line */
592 ic = avformat_alloc_context();
594 print_error(filename, AVERROR(ENOMEM));
597 if (o->nb_audio_sample_rate) {
598 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
599 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
601 if (o->nb_audio_channels) {
602 /* because we set audio_channels based on both the "ac" and
603 * "channel_layout" options, we need to check that the specified
604 * demuxer actually has the "channels" option before setting it */
605 if (file_iformat && file_iformat->priv_class &&
606 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
607 AV_OPT_SEARCH_FAKE_OBJ)) {
608 snprintf(buf, sizeof(buf), "%d",
609 o->audio_channels[o->nb_audio_channels - 1].u.i);
610 av_dict_set(&o->g->format_opts, "channels", buf, 0);
613 if (o->nb_frame_rates) {
614 /* set the format-level framerate option;
615 * this is important for video grabbers, e.g. x11 */
616 if (file_iformat && file_iformat->priv_class &&
617 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
618 AV_OPT_SEARCH_FAKE_OBJ)) {
619 av_dict_set(&o->g->format_opts, "framerate",
620 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
623 if (o->nb_frame_sizes) {
624 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
626 if (o->nb_frame_pix_fmts)
627 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
629 ic->flags |= AVFMT_FLAG_NONBLOCK;
630 ic->interrupt_callback = int_cb;
632 /* open the input file with generic libav function */
633 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
635 print_error(filename, err);
638 assert_avoptions(o->g->format_opts);
640 /* apply forced codec ids */
641 for (i = 0; i < ic->nb_streams; i++)
642 choose_decoder(o, ic, ic->streams[i]);
644 /* Set AVCodecContext options for avformat_find_stream_info */
645 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
646 orig_nb_streams = ic->nb_streams;
648 /* If not enough info to get the stream parameters, we decode the
649 first frames to get it. (used in mpeg case for example) */
650 ret = avformat_find_stream_info(ic, opts);
652 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
653 avformat_close_input(&ic);
657 timestamp = o->start_time;
658 /* add the stream start time */
659 if (ic->start_time != AV_NOPTS_VALUE)
660 timestamp += ic->start_time;
662 /* if seeking requested, we execute it */
663 if (o->start_time != 0) {
664 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
666 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
667 filename, (double)timestamp / AV_TIME_BASE);
671 /* update the current parameters so that they match the one of the input stream */
672 add_input_streams(o, ic);
674 /* dump the file content */
675 av_dump_format(ic, nb_input_files, filename, 0);
677 GROW_ARRAY(input_files, nb_input_files);
678 f = av_mallocz(sizeof(*f));
681 input_files[nb_input_files - 1] = f;
684 f->ist_index = nb_input_streams - ic->nb_streams;
685 f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
686 f->nb_streams = ic->nb_streams;
687 f->rate_emu = o->rate_emu;
689 /* check if all codec options have been used */
690 unused_opts = strip_specifiers(o->g->codec_opts);
691 for (i = f->ist_index; i < nb_input_streams; i++) {
693 while ((e = av_dict_get(input_streams[i]->opts, "", e,
694 AV_DICT_IGNORE_SUFFIX)))
695 av_dict_set(&unused_opts, e->key, NULL, 0);
699 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
700 const AVClass *class = avcodec_get_class();
701 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
702 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
705 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
706 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
707 "input file #%d (%s) is not a decoding option.\n", e->key,
708 option->help ? option->help : "", nb_input_files - 1,
713 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
714 "input file #%d (%s) has not been used for any stream. The most "
715 "likely reason is either wrong type (e.g. a video option with "
716 "no video streams) or that it is a private option of some decoder "
717 "which was not actually used for any stream.\n", e->key,
718 option->help ? option->help : "", nb_input_files - 1, filename);
720 av_dict_free(&unused_opts);
722 for (i = 0; i < o->nb_dump_attachment; i++) {
725 for (j = 0; j < ic->nb_streams; j++) {
726 AVStream *st = ic->streams[j];
728 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
729 dump_attachment(st, o->dump_attachment[i].u.str);
733 for (i = 0; i < orig_nb_streams; i++)
734 av_dict_free(&opts[i]);
740 static uint8_t *get_line(AVIOContext *s)
746 if (avio_open_dyn_buf(&line) < 0) {
747 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
751 while ((c = avio_r8(s)) && c != '\n')
754 avio_close_dyn_buf(line, &buf);
759 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
763 const char *base[3] = { getenv("AVCONV_DATADIR"),
768 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
772 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
773 i != 1 ? "" : "/.avconv", codec_name, preset_name);
774 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
777 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
778 i != 1 ? "" : "/.avconv", preset_name);
779 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
785 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
787 char *codec_name = NULL;
789 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
791 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
792 NULL, ost->st->codec->codec_type);
793 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
794 } else if (!strcmp(codec_name, "copy"))
795 ost->stream_copy = 1;
797 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
798 ost->st->codec->codec_id = ost->enc->id;
802 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
805 AVStream *st = avformat_new_stream(oc, NULL);
806 int idx = oc->nb_streams - 1, ret = 0;
807 char *bsf = NULL, *next, *codec_tag = NULL;
808 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
812 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
816 if (oc->nb_streams - 1 < o->nb_streamid_map)
817 st->id = o->streamid_map[oc->nb_streams - 1];
819 GROW_ARRAY(output_streams, nb_output_streams);
820 if (!(ost = av_mallocz(sizeof(*ost))))
822 output_streams[nb_output_streams - 1] = ost;
824 ost->file_index = nb_output_files;
827 st->codec->codec_type = type;
828 choose_encoder(o, oc, ost);
830 AVIOContext *s = NULL;
831 char *buf = NULL, *arg = NULL, *preset = NULL;
833 ost->opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
835 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
836 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
839 if (!buf[0] || buf[0] == '#') {
843 if (!(arg = strchr(buf, '='))) {
844 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
848 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
850 } while (!s->eof_reached);
854 av_log(NULL, AV_LOG_FATAL,
855 "Preset %s specified for stream %d:%d, but could not be opened.\n",
856 preset, ost->file_index, ost->index);
860 ost->opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
863 avcodec_get_context_defaults3(st->codec, ost->enc);
864 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
866 ost->max_frames = INT64_MAX;
867 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
869 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
871 if (next = strchr(bsf, ','))
873 if (!(bsfc = av_bitstream_filter_init(bsf))) {
874 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
878 bsfc_prev->next = bsfc;
880 ost->bitstream_filters = bsfc;
886 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
888 uint32_t tag = strtol(codec_tag, &next, 0);
890 tag = AV_RL32(codec_tag);
891 st->codec->codec_tag = tag;
894 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
896 st->codec->flags |= CODEC_FLAG_QSCALE;
897 st->codec->global_quality = FF_QP2LAMBDA * qscale;
900 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
901 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
903 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
905 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
907 ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
912 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
922 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
929 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
933 AVCodecContext *video_enc;
935 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
937 video_enc = st->codec;
939 if (!ost->stream_copy) {
940 const char *p = NULL;
941 char *frame_rate = NULL, *frame_size = NULL;
942 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
943 char *intra_matrix = NULL, *inter_matrix = NULL;
944 const char *filters = "null";
948 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
949 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
950 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
954 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
955 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
956 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
960 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
961 if (frame_aspect_ratio)
962 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
964 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
965 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
966 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
969 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
971 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
973 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
974 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
977 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
979 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
981 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
982 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
985 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
988 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
989 for (i = 0; p; i++) {
991 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
993 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
996 video_enc->rc_override =
997 av_realloc(video_enc->rc_override,
998 sizeof(RcOverride) * (i + 1));
999 video_enc->rc_override[i].start_frame = start;
1000 video_enc->rc_override[i].end_frame = end;
1002 video_enc->rc_override[i].qscale = q;
1003 video_enc->rc_override[i].quality_factor = 1.0;
1006 video_enc->rc_override[i].qscale = 0;
1007 video_enc->rc_override[i].quality_factor = -q/100.0;
1012 video_enc->rc_override_count = i;
1013 video_enc->intra_dc_precision = intra_dc_precision - 8;
1016 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1019 video_enc->flags |= CODEC_FLAG_PASS1;
1021 video_enc->flags |= CODEC_FLAG_PASS2;
1025 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1026 if (ost->logfile_prefix &&
1027 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1030 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1031 if (ost->forced_keyframes)
1032 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1034 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1036 ost->top_field_first = -1;
1037 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1039 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
1040 ost->avfilter = av_strdup(filters);
1042 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1048 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1052 AVCodecContext *audio_enc;
1054 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1057 audio_enc = st->codec;
1058 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1060 if (!ost->stream_copy) {
1061 char *sample_fmt = NULL;
1062 const char *filters = "anull";
1064 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1066 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1068 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1069 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1073 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1075 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
1076 ost->avfilter = av_strdup(filters);
1082 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1086 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1087 if (!ost->stream_copy) {
1088 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1095 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1097 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1098 ost->stream_copy = 1;
1102 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1106 AVCodecContext *subtitle_enc;
1108 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1110 subtitle_enc = st->codec;
1112 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1117 /* arg format is "output-stream-index:streamid-value". */
1118 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1120 OptionsContext *o = optctx;
1125 av_strlcpy(idx_str, arg, sizeof(idx_str));
1126 p = strchr(idx_str, ':');
1128 av_log(NULL, AV_LOG_FATAL,
1129 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1134 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1135 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1136 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1140 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1142 AVFormatContext *is = ifile->ctx;
1143 AVFormatContext *os = ofile->ctx;
1147 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1149 return AVERROR(ENOMEM);
1152 for (i = 0; i < is->nb_chapters; i++) {
1153 AVChapter *in_ch = is->chapters[i], *out_ch;
1154 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
1155 AV_TIME_BASE_Q, in_ch->time_base);
1156 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1157 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1160 if (in_ch->end < ts_off)
1162 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1165 out_ch = av_mallocz(sizeof(AVChapter));
1167 return AVERROR(ENOMEM);
1169 out_ch->id = in_ch->id;
1170 out_ch->time_base = in_ch->time_base;
1171 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1172 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1175 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1177 os->chapters[os->nb_chapters++] = out_ch;
1182 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1183 AVFormatContext *oc)
1187 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1188 ofilter->out_tmp->pad_idx)) {
1189 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1190 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1192 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1197 ost->source_index = -1;
1198 ost->filter = ofilter;
1202 if (ost->stream_copy) {
1203 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1204 "which is fed from a complex filtergraph. Filtering and streamcopy "
1205 "cannot be used together.\n", ost->file_index, ost->index);
1209 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1210 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1213 avfilter_inout_free(&ofilter->out_tmp);
1216 static int configure_complex_filters(void)
1220 for (i = 0; i < nb_filtergraphs; i++)
1221 if (!filtergraphs[i]->graph &&
1222 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1227 static int open_output_file(OptionsContext *o, const char *filename)
1229 AVFormatContext *oc;
1231 AVOutputFormat *file_oformat;
1235 AVDictionary *unused_opts = NULL;
1236 AVDictionaryEntry *e = NULL;
1238 if (configure_complex_filters() < 0) {
1239 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1243 if (!strcmp(filename, "-"))
1246 oc = avformat_alloc_context();
1248 print_error(filename, AVERROR(ENOMEM));
1253 file_oformat = av_guess_format(o->format, NULL, NULL);
1254 if (!file_oformat) {
1255 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1259 file_oformat = av_guess_format(NULL, filename, NULL);
1260 if (!file_oformat) {
1261 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1267 oc->oformat = file_oformat;
1268 oc->interrupt_callback = int_cb;
1269 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1271 /* create streams for all unlabeled output pads */
1272 for (i = 0; i < nb_filtergraphs; i++) {
1273 FilterGraph *fg = filtergraphs[i];
1274 for (j = 0; j < fg->nb_outputs; j++) {
1275 OutputFilter *ofilter = fg->outputs[j];
1277 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1280 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1281 ofilter->out_tmp->pad_idx)) {
1282 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1283 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1284 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1286 init_output_filter(ofilter, o, oc);
1290 if (!o->nb_stream_maps) {
1291 /* pick the "best" stream of each type */
1292 #define NEW_STREAM(type, index)\
1294 ost = new_ ## type ## _stream(o, oc);\
1295 ost->source_index = index;\
1296 ost->sync_ist = input_streams[index];\
1297 input_streams[index]->discard = 0;\
1298 input_streams[index]->st->discard = AVDISCARD_NONE;\
1301 /* video: highest resolution */
1302 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1303 int area = 0, idx = -1;
1304 for (i = 0; i < nb_input_streams; i++) {
1305 ist = input_streams[i];
1306 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1307 ist->st->codec->width * ist->st->codec->height > area) {
1308 area = ist->st->codec->width * ist->st->codec->height;
1312 NEW_STREAM(video, idx);
1315 /* audio: most channels */
1316 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1317 int channels = 0, idx = -1;
1318 for (i = 0; i < nb_input_streams; i++) {
1319 ist = input_streams[i];
1320 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1321 ist->st->codec->channels > channels) {
1322 channels = ist->st->codec->channels;
1326 NEW_STREAM(audio, idx);
1329 /* subtitles: pick first */
1330 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1331 for (i = 0; i < nb_input_streams; i++)
1332 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1333 NEW_STREAM(subtitle, i);
1337 /* do something with data? */
1339 for (i = 0; i < o->nb_stream_maps; i++) {
1340 StreamMap *map = &o->stream_maps[i];
1345 if (map->linklabel) {
1347 OutputFilter *ofilter = NULL;
1350 for (j = 0; j < nb_filtergraphs; j++) {
1351 fg = filtergraphs[j];
1352 for (k = 0; k < fg->nb_outputs; k++) {
1353 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1354 if (out && !strcmp(out->name, map->linklabel)) {
1355 ofilter = fg->outputs[k];
1362 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1363 "in any defined filter graph.\n", map->linklabel);
1366 init_output_filter(ofilter, o, oc);
1368 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1369 switch (ist->st->codec->codec_type) {
1370 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1371 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1372 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1373 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1374 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1376 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1377 map->file_index, map->stream_index);
1381 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1382 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1383 map->sync_stream_index];
1385 ist->st->discard = AVDISCARD_NONE;
1390 /* handle attached files */
1391 for (i = 0; i < o->nb_attachments; i++) {
1393 uint8_t *attachment;
1397 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1398 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1402 if ((len = avio_size(pb)) <= 0) {
1403 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1407 if (!(attachment = av_malloc(len))) {
1408 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1412 avio_read(pb, attachment, len);
1414 ost = new_attachment_stream(o, oc);
1415 ost->stream_copy = 0;
1416 ost->source_index = -1;
1417 ost->attachment_filename = o->attachments[i];
1418 ost->st->codec->extradata = attachment;
1419 ost->st->codec->extradata_size = len;
1421 p = strrchr(o->attachments[i], '/');
1422 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1426 GROW_ARRAY(output_files, nb_output_files);
1427 of = av_mallocz(sizeof(*of));
1430 output_files[nb_output_files - 1] = of;
1433 of->ost_index = nb_output_streams - oc->nb_streams;
1434 of->recording_time = o->recording_time;
1435 if (o->recording_time != INT64_MAX)
1436 oc->duration = o->recording_time;
1437 of->start_time = o->start_time;
1438 of->limit_filesize = o->limit_filesize;
1439 of->shortest = o->shortest;
1440 av_dict_copy(&of->opts, o->g->format_opts, 0);
1443 /* check if all codec options have been used */
1444 unused_opts = strip_specifiers(o->g->codec_opts);
1445 for (i = of->ost_index; i < nb_output_streams; i++) {
1447 while ((e = av_dict_get(output_streams[i]->opts, "", e,
1448 AV_DICT_IGNORE_SUFFIX)))
1449 av_dict_set(&unused_opts, e->key, NULL, 0);
1453 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1454 const AVClass *class = avcodec_get_class();
1455 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1456 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1459 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1460 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1461 "output file #%d (%s) is not an encoding option.\n", e->key,
1462 option->help ? option->help : "", nb_output_files - 1,
1467 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1468 "output file #%d (%s) has not been used for any stream. The most "
1469 "likely reason is either wrong type (e.g. a video option with "
1470 "no video streams) or that it is a private option of some encoder "
1471 "which was not actually used for any stream.\n", e->key,
1472 option->help ? option->help : "", nb_output_files - 1, filename);
1474 av_dict_free(&unused_opts);
1476 /* check filename in case of an image number is expected */
1477 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1478 if (!av_filename_number_test(oc->filename)) {
1479 print_error(oc->filename, AVERROR(EINVAL));
1484 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1485 /* test if it already exists to avoid losing precious files */
1486 assert_file_overwrite(filename);
1489 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1490 &oc->interrupt_callback,
1492 print_error(filename, err);
1497 if (o->mux_preload) {
1499 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1500 av_dict_set(&of->opts, "preload", buf, 0);
1502 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1503 oc->flags |= AVFMT_FLAG_NONBLOCK;
1506 for (i = 0; i < o->nb_metadata_map; i++) {
1508 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1510 if (in_file_index >= nb_input_files) {
1511 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1514 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1515 in_file_index >= 0 ?
1516 input_files[in_file_index]->ctx : NULL, o);
1520 if (o->chapters_input_file >= nb_input_files) {
1521 if (o->chapters_input_file == INT_MAX) {
1522 /* copy chapters from the first input file that has them*/
1523 o->chapters_input_file = -1;
1524 for (i = 0; i < nb_input_files; i++)
1525 if (input_files[i]->ctx->nb_chapters) {
1526 o->chapters_input_file = i;
1530 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1531 o->chapters_input_file);
1535 if (o->chapters_input_file >= 0)
1536 copy_chapters(input_files[o->chapters_input_file], of,
1537 !o->metadata_chapters_manual);
1539 /* copy global metadata by default */
1540 if (!o->metadata_global_manual && nb_input_files)
1541 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1542 AV_DICT_DONT_OVERWRITE);
1543 if (!o->metadata_streams_manual)
1544 for (i = of->ost_index; i < nb_output_streams; i++) {
1546 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1548 ist = input_streams[output_streams[i]->source_index];
1549 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1552 /* process manually set metadata */
1553 for (i = 0; i < o->nb_metadata; i++) {
1556 const char *stream_spec;
1557 int index = 0, j, ret;
1559 val = strchr(o->metadata[i].u.str, '=');
1561 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1562 o->metadata[i].u.str);
1567 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1569 for (j = 0; j < oc->nb_streams; j++) {
1570 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1571 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1582 if (index < 0 || index >= oc->nb_chapters) {
1583 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1586 m = &oc->chapters[index]->metadata;
1589 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1592 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1599 static int opt_target(void *optctx, const char *opt, const char *arg)
1601 OptionsContext *o = optctx;
1602 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1603 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1605 if (!strncmp(arg, "pal-", 4)) {
1608 } else if (!strncmp(arg, "ntsc-", 5)) {
1611 } else if (!strncmp(arg, "film-", 5)) {
1615 /* Try to determine PAL/NTSC by peeking in the input files */
1616 if (nb_input_files) {
1618 for (j = 0; j < nb_input_files; j++) {
1619 for (i = 0; i < input_files[j]->nb_streams; i++) {
1620 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1621 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
1623 fr = c->time_base.den * 1000 / c->time_base.num;
1627 } else if ((fr == 29970) || (fr == 23976)) {
1632 if (norm != UNKNOWN)
1636 if (norm != UNKNOWN)
1637 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1640 if (norm == UNKNOWN) {
1641 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1642 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1643 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1647 if (!strcmp(arg, "vcd")) {
1648 opt_video_codec(o, "c:v", "mpeg1video");
1649 opt_audio_codec(o, "c:a", "mp2");
1650 parse_option(o, "f", "vcd", options);
1652 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1653 parse_option(o, "r", frame_rates[norm], options);
1654 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1656 opt_default(NULL, "b", "1150000");
1657 opt_default(NULL, "maxrate", "1150000");
1658 opt_default(NULL, "minrate", "1150000");
1659 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
1661 opt_default(NULL, "b:a", "224000");
1662 parse_option(o, "ar", "44100", options);
1663 parse_option(o, "ac", "2", options);
1665 opt_default(NULL, "packetsize", "2324");
1666 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
1668 /* We have to offset the PTS, so that it is consistent with the SCR.
1669 SCR starts at 36000, but the first two packs contain only padding
1670 and the first pack from the other stream, respectively, may also have
1671 been written before.
1672 So the real data starts at SCR 36000+3*1200. */
1673 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1674 } else if (!strcmp(arg, "svcd")) {
1676 opt_video_codec(o, "c:v", "mpeg2video");
1677 opt_audio_codec(o, "c:a", "mp2");
1678 parse_option(o, "f", "svcd", options);
1680 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1681 parse_option(o, "r", frame_rates[norm], options);
1682 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1684 opt_default(NULL, "b", "2040000");
1685 opt_default(NULL, "maxrate", "2516000");
1686 opt_default(NULL, "minrate", "0"); // 1145000;
1687 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1688 opt_default(NULL, "flags", "+scan_offset");
1691 opt_default(NULL, "b:a", "224000");
1692 parse_option(o, "ar", "44100", options);
1694 opt_default(NULL, "packetsize", "2324");
1696 } else if (!strcmp(arg, "dvd")) {
1698 opt_video_codec(o, "c:v", "mpeg2video");
1699 opt_audio_codec(o, "c:a", "ac3");
1700 parse_option(o, "f", "dvd", options);
1702 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1703 parse_option(o, "r", frame_rates[norm], options);
1704 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1706 opt_default(NULL, "b", "6000000");
1707 opt_default(NULL, "maxrate", "9000000");
1708 opt_default(NULL, "minrate", "0"); // 1500000;
1709 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1711 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1712 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
1714 opt_default(NULL, "b:a", "448000");
1715 parse_option(o, "ar", "48000", options);
1717 } else if (!strncmp(arg, "dv", 2)) {
1719 parse_option(o, "f", "dv", options);
1721 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1722 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1723 norm == PAL ? "yuv420p" : "yuv411p", options);
1724 parse_option(o, "r", frame_rates[norm], options);
1726 parse_option(o, "ar", "48000", options);
1727 parse_option(o, "ac", "2", options);
1730 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1731 return AVERROR(EINVAL);
1736 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1738 av_free (vstats_filename);
1739 vstats_filename = av_strdup (arg);
1743 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1746 time_t today2 = time(NULL);
1747 struct tm *today = localtime(&today2);
1749 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1751 return opt_vstats_file(NULL, opt, filename);
1754 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1756 OptionsContext *o = optctx;
1757 return parse_option(o, "frames:v", arg, options);
1760 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1762 OptionsContext *o = optctx;
1763 return parse_option(o, "frames:a", arg, options);
1766 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1768 OptionsContext *o = optctx;
1769 return parse_option(o, "frames:d", arg, options);
1772 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
1774 OptionsContext *o = optctx;
1775 return parse_option(o, "tag:v", arg, options);
1778 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
1780 OptionsContext *o = optctx;
1781 return parse_option(o, "tag:a", arg, options);
1784 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
1786 OptionsContext *o = optctx;
1787 return parse_option(o, "tag:s", arg, options);
1790 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
1792 OptionsContext *o = optctx;
1793 return parse_option(o, "filter:v", arg, options);
1796 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
1798 OptionsContext *o = optctx;
1799 return parse_option(o, "filter:a", arg, options);
1802 static int opt_vsync(void *optctx, const char *opt, const char *arg)
1804 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
1805 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
1806 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
1808 if (video_sync_method == VSYNC_AUTO)
1809 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
1813 #if FF_API_DEINTERLACE
1814 static int opt_deinterlace(void *optctx, const char *opt, const char *arg)
1816 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
1822 int opt_cpuflags(void *optctx, const char *opt, const char *arg)
1824 int flags = av_parse_cpu_flags(arg);
1829 av_set_cpu_flags_mask(flags);
1833 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
1835 OptionsContext *o = optctx;
1836 char layout_str[32];
1839 int ret, channels, ac_str_size;
1842 layout = av_get_channel_layout(arg);
1844 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
1845 return AVERROR(EINVAL);
1847 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
1848 ret = opt_default(NULL, opt, layout_str);
1852 /* set 'ac' option based on channel layout */
1853 channels = av_get_channel_layout_nb_channels(layout);
1854 snprintf(layout_str, sizeof(layout_str), "%d", channels);
1855 stream_str = strchr(opt, ':');
1856 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
1857 ac_str = av_mallocz(ac_str_size);
1859 return AVERROR(ENOMEM);
1860 av_strlcpy(ac_str, "ac", 3);
1862 av_strlcat(ac_str, stream_str, ac_str_size);
1863 ret = parse_option(o, ac_str, layout_str, options);
1869 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
1871 OptionsContext *o = optctx;
1872 return parse_option(o, "q:a", arg, options);
1875 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
1877 GROW_ARRAY(filtergraphs, nb_filtergraphs);
1878 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
1879 return AVERROR(ENOMEM);
1880 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
1881 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
1885 void show_help_default(const char *opt, const char *arg)
1887 /* per-file options have at least one of those set */
1888 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
1889 int show_advanced = 0, show_avoptions = 0;
1892 if (!strcmp(opt, "long"))
1894 else if (!strcmp(opt, "full"))
1895 show_advanced = show_avoptions = 1;
1897 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
1902 printf("Getting help:\n"
1903 " -h -- print basic options\n"
1904 " -h long -- print more options\n"
1905 " -h full -- print all options (including all format and codec specific options, very long)\n"
1906 " See man %s for detailed description of the options.\n"
1907 "\n", program_name);
1909 show_help_options(options, "Print help / information / capabilities:",
1912 show_help_options(options, "Global options (affect whole program "
1913 "instead of just one file:",
1914 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
1916 show_help_options(options, "Advanced global options:", OPT_EXPERT,
1917 per_file | OPT_EXIT, 0);
1919 show_help_options(options, "Per-file main options:", 0,
1920 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
1921 OPT_EXIT, per_file);
1923 show_help_options(options, "Advanced per-file options:",
1924 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
1926 show_help_options(options, "Video options:",
1927 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
1929 show_help_options(options, "Advanced Video options:",
1930 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
1932 show_help_options(options, "Audio options:",
1933 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
1935 show_help_options(options, "Advanced Audio options:",
1936 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
1937 show_help_options(options, "Subtitle options:",
1938 OPT_SUBTITLE, 0, 0);
1941 if (show_avoptions) {
1942 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
1943 show_help_children(avcodec_get_class(), flags);
1944 show_help_children(avformat_get_class(), flags);
1945 show_help_children(sws_get_class(), flags);
1949 void show_usage(void)
1951 printf("Hyper fast Audio and Video encoder\n");
1952 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
1961 static const OptionGroupDef groups[] = {
1962 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
1963 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
1966 static int open_files(OptionGroupList *l, const char *inout,
1967 int (*open_file)(OptionsContext*, const char*))
1971 for (i = 0; i < l->nb_groups; i++) {
1972 OptionGroup *g = &l->groups[i];
1978 ret = parse_optgroup(&o, g);
1980 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
1981 "%s.\n", inout, g->arg);
1985 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
1986 ret = open_file(&o, g->arg);
1989 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
1993 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
1999 int avconv_parse_options(int argc, char **argv)
2001 OptionParseContext octx;
2005 memset(&octx, 0, sizeof(octx));
2007 /* split the commandline into an internal representation */
2008 ret = split_commandline(&octx, argc, argv, options, groups,
2009 FF_ARRAY_ELEMS(groups));
2011 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2015 /* apply global options */
2016 ret = parse_optgroup(NULL, &octx.global_opts);
2018 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2022 /* open input files */
2023 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2025 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2029 /* open output files */
2030 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2032 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2037 uninit_parse_context(&octx);
2039 av_strerror(ret, error, sizeof(error));
2040 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2045 #define OFFSET(x) offsetof(OptionsContext, x)
2046 const OptionDef options[] = {
2048 #include "cmdutils_common_opts.h"
2049 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2050 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2051 "force format", "fmt" },
2052 { "y", OPT_BOOL, { &file_overwrite },
2053 "overwrite output files" },
2054 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2055 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2056 "codec name", "codec" },
2057 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2058 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2059 "codec name", "codec" },
2060 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2061 OPT_OUTPUT, { .off = OFFSET(presets) },
2062 "preset name", "preset" },
2063 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2064 OPT_OUTPUT, { .func_arg = opt_map },
2065 "set input stream mapping",
2066 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2067 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2068 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2069 "set metadata information of outfile from infile",
2070 "outfile[,metadata]:infile[,metadata]" },
2071 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2072 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2073 "set chapters mapping", "input_file_index" },
2074 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2075 "record or transcode \"duration\" seconds of audio/video",
2077 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2078 "set the limit file size in bytes", "limit_size" },
2079 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2080 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2081 "set the start time offset", "time_off" },
2082 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2083 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2084 "set the input ts offset", "time_off" },
2085 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2086 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2087 "set the input ts scale", "scale" },
2088 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2089 "add metadata", "string=string" },
2090 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2091 OPT_OUTPUT, { .func_arg = opt_data_frames },
2092 "set the number of data frames to record", "number" },
2093 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2094 "add timings for benchmarking" },
2095 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2096 "set max runtime in seconds", "limit" },
2097 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2098 "dump each input packet" },
2099 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2100 "when dumping packets, also dump the payload" },
2101 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2102 OPT_INPUT, { .off = OFFSET(rate_emu) },
2103 "read input at native frame rate", "" },
2104 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2105 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2106 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2107 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2108 "video sync method", "" },
2109 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2110 "audio sync method", "" },
2111 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2112 "audio drift threshold", "threshold" },
2113 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2114 "copy timestamps" },
2115 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2116 "copy input stream time base when stream copying" },
2117 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2118 OPT_OUTPUT, { .off = OFFSET(shortest) },
2119 "finish encoding within shortest input" },
2120 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2121 "timestamp discontinuity delta threshold", "threshold" },
2122 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2123 "exit on error", "error" },
2124 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2125 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2126 "copy initial non-keyframes" },
2127 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2128 "set the number of frames to record", "number" },
2129 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2130 OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(codec_tags) },
2131 "force codec tag/fourcc", "fourcc/tag" },
2132 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2133 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2134 "use fixed quality scale (VBR)", "q" },
2135 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2136 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2137 "use fixed quality scale (VBR)", "q" },
2138 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2139 "set stream filterchain", "filter_list" },
2140 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2141 "create a complex filtergraph", "graph_description" },
2142 { "stats", OPT_BOOL, { &print_stats },
2143 "print progress report during encoding", },
2144 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2145 OPT_OUTPUT, { .func_arg = opt_attach },
2146 "add an attachment to the output file", "filename" },
2147 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2148 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2149 "extract an attachment into a file", "filename" },
2150 { "cpuflags", HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags },
2151 "set CPU flags mask", "mask" },
2154 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2155 "set the number of video frames to record", "number" },
2156 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2157 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2158 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2159 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2160 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2161 "set frame size (WxH or abbreviation)", "size" },
2162 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2163 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2164 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2165 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2166 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2167 "set pixel format", "format" },
2168 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2170 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2171 "discard threshold", "n" },
2172 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2173 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2174 "rate control override for specific intervals", "override" },
2175 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2176 OPT_OUTPUT, { .func_arg = opt_video_codec },
2177 "force video codec ('copy' to copy stream)", "codec" },
2178 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2179 "select the pass number (1 or 2)", "n" },
2180 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2181 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2182 "select two pass log file name prefix", "prefix" },
2183 #if FF_API_DEINTERLACE
2184 { "deinterlace", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_deinterlace },
2185 "this option is deprecated, use the yadif filter instead" },
2187 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2188 "dump video coding statistics to file" },
2189 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2190 "dump video coding statistics to file", "file" },
2191 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2192 "video filters", "filter list" },
2193 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2194 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2195 "specify intra matrix coeffs", "matrix" },
2196 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2197 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2198 "specify inter matrix coeffs", "matrix" },
2199 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2200 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2201 "top=1/bottom=0/auto=-1 field first", "" },
2202 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2203 "intra_dc_precision", "precision" },
2204 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2205 OPT_OUTPUT, { .func_arg = opt_video_tag },
2206 "force video tag/fourcc", "fourcc/tag" },
2207 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2208 "show QP histogram" },
2209 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2210 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2211 "force the selected framerate, disable the best supported framerate selection" },
2212 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2213 OPT_OUTPUT, { .func_arg = opt_streamid },
2214 "set the value of an outfile streamid", "streamIndex:value" },
2215 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2216 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2217 "force key frames at specified timestamps", "timestamps" },
2220 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2221 "set the number of audio frames to record", "number" },
2222 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2223 "set audio quality (codec-specific)", "quality", },
2224 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2225 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2226 "set audio sampling rate (in Hz)", "rate" },
2227 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2228 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2229 "set number of audio channels", "channels" },
2230 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2232 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2233 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2234 "force audio codec ('copy' to copy stream)", "codec" },
2235 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2236 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2237 "force audio tag/fourcc", "fourcc/tag" },
2238 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2239 "change audio volume (256=normal)" , "volume" },
2240 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2241 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2242 "set sample format", "format" },
2243 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2244 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2245 "set channel layout", "layout" },
2246 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2247 "audio filters", "filter list" },
2249 /* subtitle options */
2250 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2251 "disable subtitle" },
2252 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2253 "force subtitle codec ('copy' to copy stream)", "codec" },
2254 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2255 , "force subtitle tag/fourcc", "fourcc/tag" },
2258 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2261 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2262 "set the maximum demux-decode delay", "seconds" },
2263 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2264 "set the initial demux-decode delay", "seconds" },
2266 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2267 "A comma-separated list of bitstream filters", "bitstream_filters" },
2269 /* data codec support */
2270 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2271 "force data codec ('copy' to copy stream)", "codec" },