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 /* read file contents into a string */
930 static uint8_t *read_file(const char *filename)
932 AVIOContext *pb = NULL;
933 AVIOContext *dyn_buf = NULL;
934 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
935 uint8_t buf[1024], *str;
938 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
942 ret = avio_open_dyn_buf(&dyn_buf);
947 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
948 avio_write(dyn_buf, buf, ret);
952 ret = avio_close_dyn_buf(dyn_buf, &str);
958 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
961 AVStream *st = ost->st;
962 char *filter = NULL, *filter_script = NULL;
964 MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
965 MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
967 if (filter_script && filter) {
968 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
969 "output stream #%d:%d.\n", nb_output_files, st->index);
974 return read_file(filter_script);
976 return av_strdup(filter);
978 return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
982 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
986 AVCodecContext *video_enc;
988 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
990 video_enc = st->codec;
992 if (!ost->stream_copy) {
993 const char *p = NULL;
994 char *frame_rate = NULL, *frame_size = NULL;
995 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
996 char *intra_matrix = NULL, *inter_matrix = NULL;
1000 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1001 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1002 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1006 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1007 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1008 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1012 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1013 if (frame_aspect_ratio)
1014 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
1016 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1017 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1018 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1021 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1023 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1025 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1026 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1029 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1031 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1033 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1034 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1037 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1040 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1041 for (i = 0; p; i++) {
1043 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1045 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1048 video_enc->rc_override =
1049 av_realloc(video_enc->rc_override,
1050 sizeof(RcOverride) * (i + 1));
1051 video_enc->rc_override[i].start_frame = start;
1052 video_enc->rc_override[i].end_frame = end;
1054 video_enc->rc_override[i].qscale = q;
1055 video_enc->rc_override[i].quality_factor = 1.0;
1058 video_enc->rc_override[i].qscale = 0;
1059 video_enc->rc_override[i].quality_factor = -q/100.0;
1064 video_enc->rc_override_count = i;
1065 video_enc->intra_dc_precision = intra_dc_precision - 8;
1068 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1071 video_enc->flags |= CODEC_FLAG_PASS1;
1073 video_enc->flags |= CODEC_FLAG_PASS2;
1077 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1078 if (ost->logfile_prefix &&
1079 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1082 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1083 if (ost->forced_keyframes)
1084 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1086 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1088 ost->top_field_first = -1;
1089 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1092 ost->avfilter = get_ost_filters(o, oc, ost);
1096 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1102 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1106 AVCodecContext *audio_enc;
1108 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1111 audio_enc = st->codec;
1112 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1114 if (!ost->stream_copy) {
1115 char *sample_fmt = NULL;
1117 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1119 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1121 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1122 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1126 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1128 ost->avfilter = get_ost_filters(o, oc, ost);
1136 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1140 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1141 if (!ost->stream_copy) {
1142 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1149 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1151 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1152 ost->stream_copy = 1;
1157 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1161 AVCodecContext *subtitle_enc;
1163 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1165 subtitle_enc = st->codec;
1167 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1172 /* arg format is "output-stream-index:streamid-value". */
1173 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1175 OptionsContext *o = optctx;
1180 av_strlcpy(idx_str, arg, sizeof(idx_str));
1181 p = strchr(idx_str, ':');
1183 av_log(NULL, AV_LOG_FATAL,
1184 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1189 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1190 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1191 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1195 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1197 AVFormatContext *is = ifile->ctx;
1198 AVFormatContext *os = ofile->ctx;
1202 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1204 return AVERROR(ENOMEM);
1207 for (i = 0; i < is->nb_chapters; i++) {
1208 AVChapter *in_ch = is->chapters[i], *out_ch;
1209 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
1210 AV_TIME_BASE_Q, in_ch->time_base);
1211 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1212 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1215 if (in_ch->end < ts_off)
1217 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1220 out_ch = av_mallocz(sizeof(AVChapter));
1222 return AVERROR(ENOMEM);
1224 out_ch->id = in_ch->id;
1225 out_ch->time_base = in_ch->time_base;
1226 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1227 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1230 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1232 os->chapters[os->nb_chapters++] = out_ch;
1237 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1238 AVFormatContext *oc)
1242 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1243 ofilter->out_tmp->pad_idx)) {
1244 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1245 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1247 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1252 ost->source_index = -1;
1253 ost->filter = ofilter;
1257 if (ost->stream_copy) {
1258 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1259 "which is fed from a complex filtergraph. Filtering and streamcopy "
1260 "cannot be used together.\n", ost->file_index, ost->index);
1264 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1265 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1268 avfilter_inout_free(&ofilter->out_tmp);
1271 static int configure_complex_filters(void)
1275 for (i = 0; i < nb_filtergraphs; i++)
1276 if (!filtergraphs[i]->graph &&
1277 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1282 static int open_output_file(OptionsContext *o, const char *filename)
1284 AVFormatContext *oc;
1286 AVOutputFormat *file_oformat;
1290 AVDictionary *unused_opts = NULL;
1291 AVDictionaryEntry *e = NULL;
1293 if (configure_complex_filters() < 0) {
1294 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1298 if (!strcmp(filename, "-"))
1301 oc = avformat_alloc_context();
1303 print_error(filename, AVERROR(ENOMEM));
1308 file_oformat = av_guess_format(o->format, NULL, NULL);
1309 if (!file_oformat) {
1310 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1314 file_oformat = av_guess_format(NULL, filename, NULL);
1315 if (!file_oformat) {
1316 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1322 oc->oformat = file_oformat;
1323 oc->interrupt_callback = int_cb;
1324 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1326 /* create streams for all unlabeled output pads */
1327 for (i = 0; i < nb_filtergraphs; i++) {
1328 FilterGraph *fg = filtergraphs[i];
1329 for (j = 0; j < fg->nb_outputs; j++) {
1330 OutputFilter *ofilter = fg->outputs[j];
1332 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1335 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1336 ofilter->out_tmp->pad_idx)) {
1337 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1338 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1339 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1341 init_output_filter(ofilter, o, oc);
1345 if (!o->nb_stream_maps) {
1346 /* pick the "best" stream of each type */
1347 #define NEW_STREAM(type, index)\
1349 ost = new_ ## type ## _stream(o, oc);\
1350 ost->source_index = index;\
1351 ost->sync_ist = input_streams[index];\
1352 input_streams[index]->discard = 0;\
1353 input_streams[index]->st->discard = AVDISCARD_NONE;\
1356 /* video: highest resolution */
1357 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1358 int area = 0, idx = -1;
1359 for (i = 0; i < nb_input_streams; i++) {
1360 ist = input_streams[i];
1361 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1362 ist->st->codec->width * ist->st->codec->height > area) {
1363 area = ist->st->codec->width * ist->st->codec->height;
1367 NEW_STREAM(video, idx);
1370 /* audio: most channels */
1371 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1372 int channels = 0, idx = -1;
1373 for (i = 0; i < nb_input_streams; i++) {
1374 ist = input_streams[i];
1375 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1376 ist->st->codec->channels > channels) {
1377 channels = ist->st->codec->channels;
1381 NEW_STREAM(audio, idx);
1384 /* subtitles: pick first */
1385 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1386 for (i = 0; i < nb_input_streams; i++)
1387 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1388 NEW_STREAM(subtitle, i);
1392 /* do something with data? */
1394 for (i = 0; i < o->nb_stream_maps; i++) {
1395 StreamMap *map = &o->stream_maps[i];
1400 if (map->linklabel) {
1402 OutputFilter *ofilter = NULL;
1405 for (j = 0; j < nb_filtergraphs; j++) {
1406 fg = filtergraphs[j];
1407 for (k = 0; k < fg->nb_outputs; k++) {
1408 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1409 if (out && !strcmp(out->name, map->linklabel)) {
1410 ofilter = fg->outputs[k];
1417 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1418 "in any defined filter graph.\n", map->linklabel);
1421 init_output_filter(ofilter, o, oc);
1423 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1424 switch (ist->st->codec->codec_type) {
1425 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1426 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1427 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1428 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1429 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1431 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1432 map->file_index, map->stream_index);
1436 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1437 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1438 map->sync_stream_index];
1440 ist->st->discard = AVDISCARD_NONE;
1445 /* handle attached files */
1446 for (i = 0; i < o->nb_attachments; i++) {
1448 uint8_t *attachment;
1452 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1453 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1457 if ((len = avio_size(pb)) <= 0) {
1458 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1462 if (!(attachment = av_malloc(len))) {
1463 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1467 avio_read(pb, attachment, len);
1469 ost = new_attachment_stream(o, oc);
1470 ost->stream_copy = 0;
1471 ost->source_index = -1;
1472 ost->attachment_filename = o->attachments[i];
1473 ost->st->codec->extradata = attachment;
1474 ost->st->codec->extradata_size = len;
1476 p = strrchr(o->attachments[i], '/');
1477 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1481 GROW_ARRAY(output_files, nb_output_files);
1482 of = av_mallocz(sizeof(*of));
1485 output_files[nb_output_files - 1] = of;
1488 of->ost_index = nb_output_streams - oc->nb_streams;
1489 of->recording_time = o->recording_time;
1490 if (o->recording_time != INT64_MAX)
1491 oc->duration = o->recording_time;
1492 of->start_time = o->start_time;
1493 of->limit_filesize = o->limit_filesize;
1494 of->shortest = o->shortest;
1495 av_dict_copy(&of->opts, o->g->format_opts, 0);
1498 /* check if all codec options have been used */
1499 unused_opts = strip_specifiers(o->g->codec_opts);
1500 for (i = of->ost_index; i < nb_output_streams; i++) {
1502 while ((e = av_dict_get(output_streams[i]->opts, "", e,
1503 AV_DICT_IGNORE_SUFFIX)))
1504 av_dict_set(&unused_opts, e->key, NULL, 0);
1508 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1509 const AVClass *class = avcodec_get_class();
1510 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1511 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1514 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1515 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1516 "output file #%d (%s) is not an encoding option.\n", e->key,
1517 option->help ? option->help : "", nb_output_files - 1,
1522 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1523 "output file #%d (%s) has not been used for any stream. The most "
1524 "likely reason is either wrong type (e.g. a video option with "
1525 "no video streams) or that it is a private option of some encoder "
1526 "which was not actually used for any stream.\n", e->key,
1527 option->help ? option->help : "", nb_output_files - 1, filename);
1529 av_dict_free(&unused_opts);
1531 /* check filename in case of an image number is expected */
1532 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1533 if (!av_filename_number_test(oc->filename)) {
1534 print_error(oc->filename, AVERROR(EINVAL));
1539 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1540 /* test if it already exists to avoid losing precious files */
1541 assert_file_overwrite(filename);
1544 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1545 &oc->interrupt_callback,
1547 print_error(filename, err);
1552 if (o->mux_preload) {
1554 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1555 av_dict_set(&of->opts, "preload", buf, 0);
1557 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1558 oc->flags |= AVFMT_FLAG_NONBLOCK;
1561 for (i = 0; i < o->nb_metadata_map; i++) {
1563 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1565 if (in_file_index >= nb_input_files) {
1566 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1569 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1570 in_file_index >= 0 ?
1571 input_files[in_file_index]->ctx : NULL, o);
1575 if (o->chapters_input_file >= nb_input_files) {
1576 if (o->chapters_input_file == INT_MAX) {
1577 /* copy chapters from the first input file that has them*/
1578 o->chapters_input_file = -1;
1579 for (i = 0; i < nb_input_files; i++)
1580 if (input_files[i]->ctx->nb_chapters) {
1581 o->chapters_input_file = i;
1585 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1586 o->chapters_input_file);
1590 if (o->chapters_input_file >= 0)
1591 copy_chapters(input_files[o->chapters_input_file], of,
1592 !o->metadata_chapters_manual);
1594 /* copy global metadata by default */
1595 if (!o->metadata_global_manual && nb_input_files)
1596 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1597 AV_DICT_DONT_OVERWRITE);
1598 if (!o->metadata_streams_manual)
1599 for (i = of->ost_index; i < nb_output_streams; i++) {
1601 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1603 ist = input_streams[output_streams[i]->source_index];
1604 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1607 /* process manually set metadata */
1608 for (i = 0; i < o->nb_metadata; i++) {
1611 const char *stream_spec;
1612 int index = 0, j, ret;
1614 val = strchr(o->metadata[i].u.str, '=');
1616 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1617 o->metadata[i].u.str);
1622 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1624 for (j = 0; j < oc->nb_streams; j++) {
1625 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1626 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1637 if (index < 0 || index >= oc->nb_chapters) {
1638 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1641 m = &oc->chapters[index]->metadata;
1644 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1647 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1654 static int opt_target(void *optctx, const char *opt, const char *arg)
1656 OptionsContext *o = optctx;
1657 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1658 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1660 if (!strncmp(arg, "pal-", 4)) {
1663 } else if (!strncmp(arg, "ntsc-", 5)) {
1666 } else if (!strncmp(arg, "film-", 5)) {
1670 /* Try to determine PAL/NTSC by peeking in the input files */
1671 if (nb_input_files) {
1673 for (j = 0; j < nb_input_files; j++) {
1674 for (i = 0; i < input_files[j]->nb_streams; i++) {
1675 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1676 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
1678 fr = c->time_base.den * 1000 / c->time_base.num;
1682 } else if ((fr == 29970) || (fr == 23976)) {
1687 if (norm != UNKNOWN)
1691 if (norm != UNKNOWN)
1692 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1695 if (norm == UNKNOWN) {
1696 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1697 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1698 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1702 if (!strcmp(arg, "vcd")) {
1703 opt_video_codec(o, "c:v", "mpeg1video");
1704 opt_audio_codec(o, "c:a", "mp2");
1705 parse_option(o, "f", "vcd", options);
1707 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1708 parse_option(o, "r", frame_rates[norm], options);
1709 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1711 opt_default(NULL, "b", "1150000");
1712 opt_default(NULL, "maxrate", "1150000");
1713 opt_default(NULL, "minrate", "1150000");
1714 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
1716 opt_default(NULL, "b:a", "224000");
1717 parse_option(o, "ar", "44100", options);
1718 parse_option(o, "ac", "2", options);
1720 opt_default(NULL, "packetsize", "2324");
1721 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
1723 /* We have to offset the PTS, so that it is consistent with the SCR.
1724 SCR starts at 36000, but the first two packs contain only padding
1725 and the first pack from the other stream, respectively, may also have
1726 been written before.
1727 So the real data starts at SCR 36000+3*1200. */
1728 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1729 } else if (!strcmp(arg, "svcd")) {
1731 opt_video_codec(o, "c:v", "mpeg2video");
1732 opt_audio_codec(o, "c:a", "mp2");
1733 parse_option(o, "f", "svcd", options);
1735 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1736 parse_option(o, "r", frame_rates[norm], options);
1737 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1739 opt_default(NULL, "b", "2040000");
1740 opt_default(NULL, "maxrate", "2516000");
1741 opt_default(NULL, "minrate", "0"); // 1145000;
1742 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1743 opt_default(NULL, "flags", "+scan_offset");
1746 opt_default(NULL, "b:a", "224000");
1747 parse_option(o, "ar", "44100", options);
1749 opt_default(NULL, "packetsize", "2324");
1751 } else if (!strcmp(arg, "dvd")) {
1753 opt_video_codec(o, "c:v", "mpeg2video");
1754 opt_audio_codec(o, "c:a", "ac3");
1755 parse_option(o, "f", "dvd", options);
1757 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1758 parse_option(o, "r", frame_rates[norm], options);
1759 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1761 opt_default(NULL, "b", "6000000");
1762 opt_default(NULL, "maxrate", "9000000");
1763 opt_default(NULL, "minrate", "0"); // 1500000;
1764 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1766 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1767 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
1769 opt_default(NULL, "b:a", "448000");
1770 parse_option(o, "ar", "48000", options);
1772 } else if (!strncmp(arg, "dv", 2)) {
1774 parse_option(o, "f", "dv", options);
1776 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1777 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1778 norm == PAL ? "yuv420p" : "yuv411p", options);
1779 parse_option(o, "r", frame_rates[norm], options);
1781 parse_option(o, "ar", "48000", options);
1782 parse_option(o, "ac", "2", options);
1785 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1786 return AVERROR(EINVAL);
1791 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1793 av_free (vstats_filename);
1794 vstats_filename = av_strdup (arg);
1798 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1801 time_t today2 = time(NULL);
1802 struct tm *today = localtime(&today2);
1804 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1806 return opt_vstats_file(NULL, opt, filename);
1809 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1811 OptionsContext *o = optctx;
1812 return parse_option(o, "frames:v", arg, options);
1815 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1817 OptionsContext *o = optctx;
1818 return parse_option(o, "frames:a", arg, options);
1821 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1823 OptionsContext *o = optctx;
1824 return parse_option(o, "frames:d", arg, options);
1827 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
1829 OptionsContext *o = optctx;
1830 return parse_option(o, "tag:v", arg, options);
1833 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
1835 OptionsContext *o = optctx;
1836 return parse_option(o, "tag:a", arg, options);
1839 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
1841 OptionsContext *o = optctx;
1842 return parse_option(o, "tag:s", arg, options);
1845 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
1847 OptionsContext *o = optctx;
1848 return parse_option(o, "filter:v", arg, options);
1851 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
1853 OptionsContext *o = optctx;
1854 return parse_option(o, "filter:a", arg, options);
1857 static int opt_vsync(void *optctx, const char *opt, const char *arg)
1859 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
1860 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
1861 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
1863 if (video_sync_method == VSYNC_AUTO)
1864 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
1868 #if FF_API_DEINTERLACE
1869 static int opt_deinterlace(void *optctx, const char *opt, const char *arg)
1871 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
1877 int opt_cpuflags(void *optctx, const char *opt, const char *arg)
1879 int flags = av_parse_cpu_flags(arg);
1884 av_set_cpu_flags_mask(flags);
1888 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
1890 OptionsContext *o = optctx;
1891 char layout_str[32];
1894 int ret, channels, ac_str_size;
1897 layout = av_get_channel_layout(arg);
1899 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
1900 return AVERROR(EINVAL);
1902 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
1903 ret = opt_default(NULL, opt, layout_str);
1907 /* set 'ac' option based on channel layout */
1908 channels = av_get_channel_layout_nb_channels(layout);
1909 snprintf(layout_str, sizeof(layout_str), "%d", channels);
1910 stream_str = strchr(opt, ':');
1911 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
1912 ac_str = av_mallocz(ac_str_size);
1914 return AVERROR(ENOMEM);
1915 av_strlcpy(ac_str, "ac", 3);
1917 av_strlcat(ac_str, stream_str, ac_str_size);
1918 ret = parse_option(o, ac_str, layout_str, options);
1924 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
1926 OptionsContext *o = optctx;
1927 return parse_option(o, "q:a", arg, options);
1930 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
1932 GROW_ARRAY(filtergraphs, nb_filtergraphs);
1933 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
1934 return AVERROR(ENOMEM);
1935 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
1936 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
1937 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
1938 return AVERROR(ENOMEM);
1942 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
1944 uint8_t *graph_desc = read_file(arg);
1946 return AVERROR(EINVAL);
1948 GROW_ARRAY(filtergraphs, nb_filtergraphs);
1949 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
1950 return AVERROR(ENOMEM);
1951 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
1952 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
1956 void show_help_default(const char *opt, const char *arg)
1958 /* per-file options have at least one of those set */
1959 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
1960 int show_advanced = 0, show_avoptions = 0;
1963 if (!strcmp(opt, "long"))
1965 else if (!strcmp(opt, "full"))
1966 show_advanced = show_avoptions = 1;
1968 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
1973 printf("Getting help:\n"
1974 " -h -- print basic options\n"
1975 " -h long -- print more options\n"
1976 " -h full -- print all options (including all format and codec specific options, very long)\n"
1977 " See man %s for detailed description of the options.\n"
1978 "\n", program_name);
1980 show_help_options(options, "Print help / information / capabilities:",
1983 show_help_options(options, "Global options (affect whole program "
1984 "instead of just one file:",
1985 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
1987 show_help_options(options, "Advanced global options:", OPT_EXPERT,
1988 per_file | OPT_EXIT, 0);
1990 show_help_options(options, "Per-file main options:", 0,
1991 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
1992 OPT_EXIT, per_file);
1994 show_help_options(options, "Advanced per-file options:",
1995 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
1997 show_help_options(options, "Video options:",
1998 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2000 show_help_options(options, "Advanced Video options:",
2001 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2003 show_help_options(options, "Audio options:",
2004 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2006 show_help_options(options, "Advanced Audio options:",
2007 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2008 show_help_options(options, "Subtitle options:",
2009 OPT_SUBTITLE, 0, 0);
2012 if (show_avoptions) {
2013 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2014 show_help_children(avcodec_get_class(), flags);
2015 show_help_children(avformat_get_class(), flags);
2016 show_help_children(sws_get_class(), flags);
2020 void show_usage(void)
2022 printf("Hyper fast Audio and Video encoder\n");
2023 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2032 static const OptionGroupDef groups[] = {
2033 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2034 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2037 static int open_files(OptionGroupList *l, const char *inout,
2038 int (*open_file)(OptionsContext*, const char*))
2042 for (i = 0; i < l->nb_groups; i++) {
2043 OptionGroup *g = &l->groups[i];
2049 ret = parse_optgroup(&o, g);
2051 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2052 "%s.\n", inout, g->arg);
2056 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2057 ret = open_file(&o, g->arg);
2060 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2064 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2070 int avconv_parse_options(int argc, char **argv)
2072 OptionParseContext octx;
2076 memset(&octx, 0, sizeof(octx));
2078 /* split the commandline into an internal representation */
2079 ret = split_commandline(&octx, argc, argv, options, groups,
2080 FF_ARRAY_ELEMS(groups));
2082 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2086 /* apply global options */
2087 ret = parse_optgroup(NULL, &octx.global_opts);
2089 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2093 /* open input files */
2094 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2096 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2100 /* open output files */
2101 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2103 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2108 uninit_parse_context(&octx);
2110 av_strerror(ret, error, sizeof(error));
2111 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2116 #define OFFSET(x) offsetof(OptionsContext, x)
2117 const OptionDef options[] = {
2119 #include "cmdutils_common_opts.h"
2120 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2121 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2122 "force format", "fmt" },
2123 { "y", OPT_BOOL, { &file_overwrite },
2124 "overwrite output files" },
2125 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2126 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2127 "codec name", "codec" },
2128 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2129 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2130 "codec name", "codec" },
2131 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2132 OPT_OUTPUT, { .off = OFFSET(presets) },
2133 "preset name", "preset" },
2134 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2135 OPT_OUTPUT, { .func_arg = opt_map },
2136 "set input stream mapping",
2137 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2138 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2139 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2140 "set metadata information of outfile from infile",
2141 "outfile[,metadata]:infile[,metadata]" },
2142 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2143 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2144 "set chapters mapping", "input_file_index" },
2145 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2146 "record or transcode \"duration\" seconds of audio/video",
2148 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2149 "set the limit file size in bytes", "limit_size" },
2150 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2151 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2152 "set the start time offset", "time_off" },
2153 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2154 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2155 "set the input ts offset", "time_off" },
2156 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2157 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2158 "set the input ts scale", "scale" },
2159 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2160 "add metadata", "string=string" },
2161 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2162 OPT_OUTPUT, { .func_arg = opt_data_frames },
2163 "set the number of data frames to record", "number" },
2164 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2165 "add timings for benchmarking" },
2166 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2167 "set max runtime in seconds", "limit" },
2168 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2169 "dump each input packet" },
2170 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2171 "when dumping packets, also dump the payload" },
2172 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2173 OPT_INPUT, { .off = OFFSET(rate_emu) },
2174 "read input at native frame rate", "" },
2175 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2176 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2177 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2178 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2179 "video sync method", "" },
2180 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2181 "audio sync method", "" },
2182 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2183 "audio drift threshold", "threshold" },
2184 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2185 "copy timestamps" },
2186 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2187 "copy input stream time base when stream copying" },
2188 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2189 OPT_OUTPUT, { .off = OFFSET(shortest) },
2190 "finish encoding within shortest input" },
2191 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2192 "timestamp discontinuity delta threshold", "threshold" },
2193 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2194 "exit on error", "error" },
2195 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2196 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2197 "copy initial non-keyframes" },
2198 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2199 "set the number of frames to record", "number" },
2200 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2201 OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(codec_tags) },
2202 "force codec tag/fourcc", "fourcc/tag" },
2203 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2204 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2205 "use fixed quality scale (VBR)", "q" },
2206 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2207 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2208 "use fixed quality scale (VBR)", "q" },
2209 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2210 "set stream filterchain", "filter_list" },
2211 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2212 "read stream filtergraph description from a file", "filename" },
2213 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2214 "create a complex filtergraph", "graph_description" },
2215 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2216 "read complex filtergraph description from a file", "filename" },
2217 { "stats", OPT_BOOL, { &print_stats },
2218 "print progress report during encoding", },
2219 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2220 OPT_OUTPUT, { .func_arg = opt_attach },
2221 "add an attachment to the output file", "filename" },
2222 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2223 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2224 "extract an attachment into a file", "filename" },
2225 { "cpuflags", HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags },
2226 "set CPU flags mask", "mask" },
2229 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2230 "set the number of video frames to record", "number" },
2231 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2232 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2233 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2234 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2235 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2236 "set frame size (WxH or abbreviation)", "size" },
2237 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2238 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2239 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2240 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2241 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2242 "set pixel format", "format" },
2243 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2245 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2246 "discard threshold", "n" },
2247 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2248 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2249 "rate control override for specific intervals", "override" },
2250 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2251 OPT_OUTPUT, { .func_arg = opt_video_codec },
2252 "force video codec ('copy' to copy stream)", "codec" },
2253 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2254 "select the pass number (1 or 2)", "n" },
2255 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2256 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2257 "select two pass log file name prefix", "prefix" },
2258 #if FF_API_DEINTERLACE
2259 { "deinterlace", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_deinterlace },
2260 "this option is deprecated, use the yadif filter instead" },
2262 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2263 "dump video coding statistics to file" },
2264 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2265 "dump video coding statistics to file", "file" },
2266 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2267 "video filters", "filter list" },
2268 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2269 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2270 "specify intra matrix coeffs", "matrix" },
2271 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2272 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2273 "specify inter matrix coeffs", "matrix" },
2274 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2275 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2276 "top=1/bottom=0/auto=-1 field first", "" },
2277 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2278 "intra_dc_precision", "precision" },
2279 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2280 OPT_OUTPUT, { .func_arg = opt_video_tag },
2281 "force video tag/fourcc", "fourcc/tag" },
2282 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2283 "show QP histogram" },
2284 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2285 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2286 "force the selected framerate, disable the best supported framerate selection" },
2287 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2288 OPT_OUTPUT, { .func_arg = opt_streamid },
2289 "set the value of an outfile streamid", "streamIndex:value" },
2290 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2291 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2292 "force key frames at specified timestamps", "timestamps" },
2295 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2296 "set the number of audio frames to record", "number" },
2297 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2298 "set audio quality (codec-specific)", "quality", },
2299 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2300 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2301 "set audio sampling rate (in Hz)", "rate" },
2302 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2303 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2304 "set number of audio channels", "channels" },
2305 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2307 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2308 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2309 "force audio codec ('copy' to copy stream)", "codec" },
2310 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2311 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2312 "force audio tag/fourcc", "fourcc/tag" },
2313 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2314 "change audio volume (256=normal)" , "volume" },
2315 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2316 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2317 "set sample format", "format" },
2318 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2319 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2320 "set channel layout", "layout" },
2321 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2322 "audio filters", "filter list" },
2324 /* subtitle options */
2325 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2326 "disable subtitle" },
2327 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2328 "force subtitle codec ('copy' to copy stream)", "codec" },
2329 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2330 , "force subtitle tag/fourcc", "fourcc/tag" },
2333 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2336 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2337 "set the maximum demux-decode delay", "seconds" },
2338 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2339 "set the initial demux-decode delay", "seconds" },
2341 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2342 "A comma-separated list of bitstream filters", "bitstream_filters" },
2344 /* data codec support */
2345 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2346 "force data codec ('copy' to copy stream)", "codec" },