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"
32 #include "libavutil/avassert.h"
33 #include "libavutil/avstring.h"
34 #include "libavutil/avutil.h"
35 #include "libavutil/channel_layout.h"
36 #include "libavutil/intreadwrite.h"
37 #include "libavutil/fifo.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/opt.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/pixdesc.h"
42 #include "libavutil/pixfmt.h"
44 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
47 for (i = 0; i < o->nb_ ## name; i++) {\
48 char *spec = o->name[i].specifier;\
49 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
50 outvar = o->name[i].u.type;\
56 char *vstats_filename;
58 float audio_drift_threshold = 0.1;
59 float dts_delta_threshold = 10;
61 int audio_volume = 256;
62 int audio_sync_method = 0;
63 int video_sync_method = VSYNC_AUTO;
69 int exit_on_error = 0;
73 static int file_overwrite = 0;
74 static int file_skip = 0;
75 static int video_discard = 0;
76 static int intra_dc_precision = 8;
77 static int using_stdin = 0;
78 static int input_sync;
80 static void uninit_options(OptionsContext *o)
82 const OptionDef *po = options;
85 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
87 void *dst = (uint8_t*)o + po->u.off;
89 if (po->flags & OPT_SPEC) {
90 SpecifierOpt **so = dst;
91 int i, *count = (int*)(so + 1);
92 for (i = 0; i < *count; i++) {
93 av_freep(&(*so)[i].specifier);
94 if (po->flags & OPT_STRING)
95 av_freep(&(*so)[i].u.str);
99 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
104 for (i = 0; i < o->nb_stream_maps; i++)
105 av_freep(&o->stream_maps[i].linklabel);
106 av_freep(&o->stream_maps);
107 av_freep(&o->meta_data_maps);
108 av_freep(&o->streamid_map);
111 static void init_options(OptionsContext *o)
113 memset(o, 0, sizeof(*o));
115 o->mux_max_delay = 0.7;
116 o->start_time = AV_NOPTS_VALUE;
117 o->recording_time = INT64_MAX;
118 o->limit_filesize = UINT64_MAX;
119 o->chapters_input_file = INT_MAX;
120 o->accurate_seek = 1;
123 /* return a copy of the input with the stream specifiers removed from the keys */
124 static AVDictionary *strip_specifiers(AVDictionary *dict)
126 AVDictionaryEntry *e = NULL;
127 AVDictionary *ret = NULL;
129 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
130 char *p = strchr(e->key, ':');
134 av_dict_set(&ret, e->key, e->value, 0);
141 static double parse_frame_aspect_ratio(const char *arg)
148 p = strchr(arg, ':');
150 x = strtol(arg, &end, 10);
152 y = strtol(end + 1, &end, 10);
154 ar = (double)x / (double)y;
156 ar = strtod(arg, NULL);
159 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
165 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
167 OptionsContext *o = optctx;
168 return parse_option(o, "codec:a", arg, options);
171 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
173 OptionsContext *o = optctx;
174 return parse_option(o, "codec:v", arg, options);
177 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
179 OptionsContext *o = optctx;
180 return parse_option(o, "codec:s", arg, options);
183 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
185 OptionsContext *o = optctx;
186 return parse_option(o, "codec:d", arg, options);
189 static int opt_map(void *optctx, const char *opt, const char *arg)
191 OptionsContext *o = optctx;
193 int i, negative = 0, file_idx;
194 int sync_file_idx = -1, sync_stream_idx;
202 map = av_strdup(arg);
204 /* parse sync stream first, just pick first matching stream */
205 if (sync = strchr(map, ',')) {
207 sync_file_idx = strtol(sync + 1, &sync, 0);
208 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
209 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
214 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
215 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
216 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
220 if (i == input_files[sync_file_idx]->nb_streams) {
221 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
222 "match any streams.\n", arg);
229 /* this mapping refers to lavfi output */
230 const char *c = map + 1;
231 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
232 m = &o->stream_maps[o->nb_stream_maps - 1];
233 m->linklabel = av_get_token(&c, "]");
235 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
239 file_idx = strtol(map, &p, 0);
240 if (file_idx >= nb_input_files || file_idx < 0) {
241 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
245 /* disable some already defined maps */
246 for (i = 0; i < o->nb_stream_maps; i++) {
247 m = &o->stream_maps[i];
248 if (file_idx == m->file_index &&
249 check_stream_specifier(input_files[m->file_index]->ctx,
250 input_files[m->file_index]->ctx->streams[m->stream_index],
251 *p == ':' ? p + 1 : p) > 0)
255 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
256 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
257 *p == ':' ? p + 1 : p) <= 0)
259 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
260 m = &o->stream_maps[o->nb_stream_maps - 1];
262 m->file_index = file_idx;
265 if (sync_file_idx >= 0) {
266 m->sync_file_index = sync_file_idx;
267 m->sync_stream_index = sync_stream_idx;
269 m->sync_file_index = file_idx;
270 m->sync_stream_index = i;
276 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
284 static int opt_attach(void *optctx, const char *opt, const char *arg)
286 OptionsContext *o = optctx;
287 GROW_ARRAY(o->attachments, o->nb_attachments);
288 o->attachments[o->nb_attachments - 1] = arg;
293 * Parse a metadata specifier passed as 'arg' parameter.
294 * @param arg metadata string to parse
295 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
296 * @param index for type c/p, chapter/program index is written here
297 * @param stream_spec for type s, the stream specifier is written here
299 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
307 if (*(++arg) && *arg != ':') {
308 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
311 *stream_spec = *arg == ':' ? arg + 1 : "";
316 *index = strtol(++arg, NULL, 0);
319 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
326 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
328 AVDictionary **meta_in = NULL;
329 AVDictionary **meta_out;
331 char type_in, type_out;
332 const char *istream_spec = NULL, *ostream_spec = NULL;
333 int idx_in = 0, idx_out = 0;
335 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
336 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
338 if (type_in == 'g' || type_out == 'g')
339 o->metadata_global_manual = 1;
340 if (type_in == 's' || type_out == 's')
341 o->metadata_streams_manual = 1;
342 if (type_in == 'c' || type_out == 'c')
343 o->metadata_chapters_manual = 1;
345 /* ic is NULL when just disabling automatic mappings */
349 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
350 if ((index) < 0 || (index) >= (nb_elems)) {\
351 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
356 #define SET_DICT(type, meta, context, index)\
359 meta = &context->metadata;\
362 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
363 meta = &context->chapters[index]->metadata;\
366 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
367 meta = &context->programs[index]->metadata;\
370 break; /* handled separately below */ \
371 default: av_assert0(0);\
374 SET_DICT(type_in, meta_in, ic, idx_in);
375 SET_DICT(type_out, meta_out, oc, idx_out);
377 /* for input streams choose first matching stream */
378 if (type_in == 's') {
379 for (i = 0; i < ic->nb_streams; i++) {
380 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
381 meta_in = &ic->streams[i]->metadata;
387 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
392 if (type_out == 's') {
393 for (i = 0; i < oc->nb_streams; i++) {
394 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
395 meta_out = &oc->streams[i]->metadata;
396 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
401 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
406 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
408 const AVCodecDescriptor *desc;
409 const char *codec_string = encoder ? "encoder" : "decoder";
413 avcodec_find_encoder_by_name(name) :
414 avcodec_find_decoder_by_name(name);
416 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
417 codec = encoder ? avcodec_find_encoder(desc->id) :
418 avcodec_find_decoder(desc->id);
420 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
421 codec_string, codec->name, desc->name);
425 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
428 if (codec->type != type) {
429 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
435 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
437 char *codec_name = NULL;
439 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
441 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
442 st->codec->codec_id = codec->id;
445 return avcodec_find_decoder(st->codec->codec_id);
448 /* Add all the streams from the given input file to the global
449 * list of input streams. */
450 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
454 for (i = 0; i < ic->nb_streams; i++) {
455 AVStream *st = ic->streams[i];
456 AVCodecContext *dec = st->codec;
457 InputStream *ist = av_mallocz(sizeof(*ist));
458 char *framerate = NULL;
463 GROW_ARRAY(input_streams, nb_input_streams);
464 input_streams[nb_input_streams - 1] = ist;
467 ist->file_index = nb_input_files;
469 st->discard = AVDISCARD_ALL;
472 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
474 ist->dec = choose_decoder(o, ic, st);
475 ist->opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
477 switch (dec->codec_type) {
478 case AVMEDIA_TYPE_VIDEO:
479 ist->resample_height = dec->height;
480 ist->resample_width = dec->width;
481 ist->resample_pix_fmt = dec->pix_fmt;
483 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
484 if (framerate && av_parse_video_rate(&ist->framerate,
486 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
492 case AVMEDIA_TYPE_AUDIO:
493 guess_input_channel_layout(ist);
495 ist->resample_sample_fmt = dec->sample_fmt;
496 ist->resample_sample_rate = dec->sample_rate;
497 ist->resample_channels = dec->channels;
498 ist->resample_channel_layout = dec->channel_layout;
501 case AVMEDIA_TYPE_DATA:
502 case AVMEDIA_TYPE_SUBTITLE:
503 case AVMEDIA_TYPE_ATTACHMENT:
504 case AVMEDIA_TYPE_UNKNOWN:
512 static void assert_file_overwrite(const char *filename)
514 if (file_overwrite && file_skip) {
515 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
519 if (!file_overwrite &&
520 (strchr(filename, ':') == NULL || filename[1] == ':' ||
521 av_strstart(filename, "file:", NULL))) {
522 if (avio_check(filename, 0) == 0) {
523 if (!using_stdin && !file_skip) {
524 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
527 fprintf(stderr, "Not overwriting - exiting\n");
532 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
539 static void dump_attachment(AVStream *st, const char *filename)
542 AVIOContext *out = NULL;
543 AVDictionaryEntry *e;
545 if (!st->codec->extradata_size) {
546 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
547 nb_input_files - 1, st->index);
550 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
553 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
554 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
558 assert_file_overwrite(filename);
560 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
561 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
566 avio_write(out, st->codec->extradata, st->codec->extradata_size);
571 static int open_input_file(OptionsContext *o, const char *filename)
575 AVInputFormat *file_iformat = NULL;
580 AVDictionary *unused_opts = NULL;
581 AVDictionaryEntry *e = NULL;
582 int orig_nb_streams; // number of streams before avformat_find_stream_info
585 if (!(file_iformat = av_find_input_format(o->format))) {
586 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
591 if (!strcmp(filename, "-"))
594 using_stdin |= !strncmp(filename, "pipe:", 5) ||
595 !strcmp(filename, "/dev/stdin");
597 /* get default parameters from command line */
598 ic = avformat_alloc_context();
600 print_error(filename, AVERROR(ENOMEM));
603 if (o->nb_audio_sample_rate) {
604 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
605 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
607 if (o->nb_audio_channels) {
608 /* because we set audio_channels based on both the "ac" and
609 * "channel_layout" options, we need to check that the specified
610 * demuxer actually has the "channels" option before setting it */
611 if (file_iformat && file_iformat->priv_class &&
612 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
613 AV_OPT_SEARCH_FAKE_OBJ)) {
614 snprintf(buf, sizeof(buf), "%d",
615 o->audio_channels[o->nb_audio_channels - 1].u.i);
616 av_dict_set(&o->g->format_opts, "channels", buf, 0);
619 if (o->nb_frame_rates) {
620 /* set the format-level framerate option;
621 * this is important for video grabbers, e.g. x11 */
622 if (file_iformat && file_iformat->priv_class &&
623 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
624 AV_OPT_SEARCH_FAKE_OBJ)) {
625 av_dict_set(&o->g->format_opts, "framerate",
626 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
629 if (o->nb_frame_sizes) {
630 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
632 if (o->nb_frame_pix_fmts)
633 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
635 ic->flags |= AVFMT_FLAG_NONBLOCK;
636 ic->interrupt_callback = int_cb;
638 /* open the input file with generic libav function */
639 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
641 print_error(filename, err);
644 assert_avoptions(o->g->format_opts);
646 /* apply forced codec ids */
647 for (i = 0; i < ic->nb_streams; i++)
648 choose_decoder(o, ic, ic->streams[i]);
650 /* Set AVCodecContext options for avformat_find_stream_info */
651 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
652 orig_nb_streams = ic->nb_streams;
654 /* If not enough info to get the stream parameters, we decode the
655 first frames to get it. (used in mpeg case for example) */
656 ret = avformat_find_stream_info(ic, opts);
658 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
659 avformat_close_input(&ic);
663 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
664 /* add the stream start time */
665 if (ic->start_time != AV_NOPTS_VALUE)
666 timestamp += ic->start_time;
668 /* if seeking requested, we execute it */
669 if (o->start_time != AV_NOPTS_VALUE) {
670 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
672 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
673 filename, (double)timestamp / AV_TIME_BASE);
677 /* update the current parameters so that they match the one of the input stream */
678 add_input_streams(o, ic);
680 /* dump the file content */
681 av_dump_format(ic, nb_input_files, filename, 0);
683 GROW_ARRAY(input_files, nb_input_files);
684 f = av_mallocz(sizeof(*f));
687 input_files[nb_input_files - 1] = f;
690 f->ist_index = nb_input_streams - ic->nb_streams;
691 f->start_time = o->start_time;
692 f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
693 f->nb_streams = ic->nb_streams;
694 f->rate_emu = o->rate_emu;
695 f->accurate_seek = o->accurate_seek;
697 /* check if all codec options have been used */
698 unused_opts = strip_specifiers(o->g->codec_opts);
699 for (i = f->ist_index; i < nb_input_streams; i++) {
701 while ((e = av_dict_get(input_streams[i]->opts, "", e,
702 AV_DICT_IGNORE_SUFFIX)))
703 av_dict_set(&unused_opts, e->key, NULL, 0);
707 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
708 const AVClass *class = avcodec_get_class();
709 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
710 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
713 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
714 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
715 "input file #%d (%s) is not a decoding option.\n", e->key,
716 option->help ? option->help : "", nb_input_files - 1,
721 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
722 "input file #%d (%s) has not been used for any stream. The most "
723 "likely reason is either wrong type (e.g. a video option with "
724 "no video streams) or that it is a private option of some decoder "
725 "which was not actually used for any stream.\n", e->key,
726 option->help ? option->help : "", nb_input_files - 1, filename);
728 av_dict_free(&unused_opts);
730 for (i = 0; i < o->nb_dump_attachment; i++) {
733 for (j = 0; j < ic->nb_streams; j++) {
734 AVStream *st = ic->streams[j];
736 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
737 dump_attachment(st, o->dump_attachment[i].u.str);
741 for (i = 0; i < orig_nb_streams; i++)
742 av_dict_free(&opts[i]);
748 static uint8_t *get_line(AVIOContext *s)
754 if (avio_open_dyn_buf(&line) < 0) {
755 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
759 while ((c = avio_r8(s)) && c != '\n')
762 avio_close_dyn_buf(line, &buf);
767 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
771 const char *base[3] = { getenv("AVCONV_DATADIR"),
776 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
780 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
781 i != 1 ? "" : "/.avconv", codec_name, preset_name);
782 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
785 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
786 i != 1 ? "" : "/.avconv", preset_name);
787 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
793 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
795 char *codec_name = NULL;
797 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
799 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
800 NULL, ost->st->codec->codec_type);
801 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
802 } else if (!strcmp(codec_name, "copy"))
803 ost->stream_copy = 1;
805 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
806 ost->st->codec->codec_id = ost->enc->id;
810 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
813 AVStream *st = avformat_new_stream(oc, NULL);
814 int idx = oc->nb_streams - 1, ret = 0;
815 char *bsf = NULL, *next, *codec_tag = NULL;
816 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
820 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
824 if (oc->nb_streams - 1 < o->nb_streamid_map)
825 st->id = o->streamid_map[oc->nb_streams - 1];
827 GROW_ARRAY(output_streams, nb_output_streams);
828 if (!(ost = av_mallocz(sizeof(*ost))))
830 output_streams[nb_output_streams - 1] = ost;
832 ost->file_index = nb_output_files - 1;
835 st->codec->codec_type = type;
836 choose_encoder(o, oc, ost);
838 AVIOContext *s = NULL;
839 char *buf = NULL, *arg = NULL, *preset = NULL;
841 ost->opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
843 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
844 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
847 if (!buf[0] || buf[0] == '#') {
851 if (!(arg = strchr(buf, '='))) {
852 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
856 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
858 } while (!s->eof_reached);
862 av_log(NULL, AV_LOG_FATAL,
863 "Preset %s specified for stream %d:%d, but could not be opened.\n",
864 preset, ost->file_index, ost->index);
868 ost->opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
871 avcodec_get_context_defaults3(st->codec, ost->enc);
872 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
874 ost->max_frames = INT64_MAX;
875 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
877 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
879 if (next = strchr(bsf, ','))
881 if (!(bsfc = av_bitstream_filter_init(bsf))) {
882 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
886 bsfc_prev->next = bsfc;
888 ost->bitstream_filters = bsfc;
894 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
896 uint32_t tag = strtol(codec_tag, &next, 0);
898 tag = AV_RL32(codec_tag);
899 st->codec->codec_tag = tag;
902 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
904 st->codec->flags |= CODEC_FLAG_QSCALE;
905 st->codec->global_quality = FF_QP2LAMBDA * qscale;
908 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
909 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
911 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
913 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
915 ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
916 ost->last_mux_dts = AV_NOPTS_VALUE;
921 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
931 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
938 /* read file contents into a string */
939 static uint8_t *read_file(const char *filename)
941 AVIOContext *pb = NULL;
942 AVIOContext *dyn_buf = NULL;
943 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
944 uint8_t buf[1024], *str;
947 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
951 ret = avio_open_dyn_buf(&dyn_buf);
956 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
957 avio_write(dyn_buf, buf, ret);
961 ret = avio_close_dyn_buf(dyn_buf, &str);
967 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
970 AVStream *st = ost->st;
971 char *filter = NULL, *filter_script = NULL;
973 MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
974 MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
976 if (filter_script && filter) {
977 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
978 "output stream #%d:%d.\n", nb_output_files, st->index);
983 return read_file(filter_script);
985 return av_strdup(filter);
987 return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
991 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
995 AVCodecContext *video_enc;
996 char *frame_aspect_ratio = NULL;
998 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
1000 video_enc = st->codec;
1002 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1003 if (frame_aspect_ratio)
1004 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
1006 if (!ost->stream_copy) {
1007 const char *p = NULL;
1008 char *frame_rate = NULL, *frame_size = NULL;
1009 char *frame_pix_fmt = NULL;
1010 char *intra_matrix = NULL, *inter_matrix = NULL;
1014 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1015 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1016 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1020 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1021 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1022 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1026 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1027 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1028 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1031 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1033 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1035 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1036 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1039 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1041 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1043 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1044 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1047 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1050 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1051 for (i = 0; p; i++) {
1053 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1055 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1058 video_enc->rc_override =
1059 av_realloc(video_enc->rc_override,
1060 sizeof(RcOverride) * (i + 1));
1061 video_enc->rc_override[i].start_frame = start;
1062 video_enc->rc_override[i].end_frame = end;
1064 video_enc->rc_override[i].qscale = q;
1065 video_enc->rc_override[i].quality_factor = 1.0;
1068 video_enc->rc_override[i].qscale = 0;
1069 video_enc->rc_override[i].quality_factor = -q/100.0;
1074 video_enc->rc_override_count = i;
1075 video_enc->intra_dc_precision = intra_dc_precision - 8;
1078 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1081 video_enc->flags |= CODEC_FLAG_PASS1;
1083 video_enc->flags |= CODEC_FLAG_PASS2;
1087 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1088 if (ost->logfile_prefix &&
1089 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1092 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1093 if (ost->forced_keyframes)
1094 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1096 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1098 ost->top_field_first = -1;
1099 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1102 ost->avfilter = get_ost_filters(o, oc, ost);
1106 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1112 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1116 AVCodecContext *audio_enc;
1118 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1121 audio_enc = st->codec;
1122 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1124 if (!ost->stream_copy) {
1125 char *sample_fmt = NULL;
1127 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1129 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1131 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1132 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1136 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1138 ost->avfilter = get_ost_filters(o, oc, ost);
1146 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1150 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1151 if (!ost->stream_copy) {
1152 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1159 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1161 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1162 ost->stream_copy = 1;
1167 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1171 AVCodecContext *subtitle_enc;
1173 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1175 subtitle_enc = st->codec;
1177 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1182 /* arg format is "output-stream-index:streamid-value". */
1183 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1185 OptionsContext *o = optctx;
1190 av_strlcpy(idx_str, arg, sizeof(idx_str));
1191 p = strchr(idx_str, ':');
1193 av_log(NULL, AV_LOG_FATAL,
1194 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1199 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1200 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1201 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1205 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1207 AVFormatContext *is = ifile->ctx;
1208 AVFormatContext *os = ofile->ctx;
1212 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1214 return AVERROR(ENOMEM);
1217 for (i = 0; i < is->nb_chapters; i++) {
1218 AVChapter *in_ch = is->chapters[i], *out_ch;
1219 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1220 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1221 AV_TIME_BASE_Q, in_ch->time_base);
1222 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1223 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1226 if (in_ch->end < ts_off)
1228 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1231 out_ch = av_mallocz(sizeof(AVChapter));
1233 return AVERROR(ENOMEM);
1235 out_ch->id = in_ch->id;
1236 out_ch->time_base = in_ch->time_base;
1237 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1238 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1241 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1243 os->chapters[os->nb_chapters++] = out_ch;
1248 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1249 AVFormatContext *oc)
1253 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1254 ofilter->out_tmp->pad_idx)) {
1255 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1256 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1258 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1263 ost->source_index = -1;
1264 ost->filter = ofilter;
1268 if (ost->stream_copy) {
1269 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1270 "which is fed from a complex filtergraph. Filtering and streamcopy "
1271 "cannot be used together.\n", ost->file_index, ost->index);
1275 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1276 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1279 avfilter_inout_free(&ofilter->out_tmp);
1282 static int configure_complex_filters(void)
1286 for (i = 0; i < nb_filtergraphs; i++)
1287 if (!filtergraphs[i]->graph &&
1288 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1293 static int open_output_file(OptionsContext *o, const char *filename)
1295 AVFormatContext *oc;
1297 AVOutputFormat *file_oformat;
1301 AVDictionary *unused_opts = NULL;
1302 AVDictionaryEntry *e = NULL;
1304 if (configure_complex_filters() < 0) {
1305 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1309 GROW_ARRAY(output_files, nb_output_files);
1310 of = av_mallocz(sizeof(*of));
1313 output_files[nb_output_files - 1] = of;
1315 of->ost_index = nb_output_streams;
1316 of->recording_time = o->recording_time;
1317 of->start_time = o->start_time;
1318 of->limit_filesize = o->limit_filesize;
1319 of->shortest = o->shortest;
1320 av_dict_copy(&of->opts, o->g->format_opts, 0);
1322 if (!strcmp(filename, "-"))
1325 oc = avformat_alloc_context();
1327 print_error(filename, AVERROR(ENOMEM));
1331 if (o->recording_time != INT64_MAX)
1332 oc->duration = o->recording_time;
1335 file_oformat = av_guess_format(o->format, NULL, NULL);
1336 if (!file_oformat) {
1337 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1341 file_oformat = av_guess_format(NULL, filename, NULL);
1342 if (!file_oformat) {
1343 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1349 oc->oformat = file_oformat;
1350 oc->interrupt_callback = int_cb;
1351 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1353 /* create streams for all unlabeled output pads */
1354 for (i = 0; i < nb_filtergraphs; i++) {
1355 FilterGraph *fg = filtergraphs[i];
1356 for (j = 0; j < fg->nb_outputs; j++) {
1357 OutputFilter *ofilter = fg->outputs[j];
1359 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1362 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1363 ofilter->out_tmp->pad_idx)) {
1364 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1365 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1366 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1368 init_output_filter(ofilter, o, oc);
1372 if (!o->nb_stream_maps) {
1373 /* pick the "best" stream of each type */
1374 #define NEW_STREAM(type, index)\
1376 ost = new_ ## type ## _stream(o, oc);\
1377 ost->source_index = index;\
1378 ost->sync_ist = input_streams[index];\
1379 input_streams[index]->discard = 0;\
1380 input_streams[index]->st->discard = AVDISCARD_NONE;\
1383 /* video: highest resolution */
1384 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1385 int area = 0, idx = -1;
1386 for (i = 0; i < nb_input_streams; i++) {
1387 ist = input_streams[i];
1388 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1389 ist->st->codec->width * ist->st->codec->height > area) {
1390 area = ist->st->codec->width * ist->st->codec->height;
1394 NEW_STREAM(video, idx);
1397 /* audio: most channels */
1398 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1399 int channels = 0, idx = -1;
1400 for (i = 0; i < nb_input_streams; i++) {
1401 ist = input_streams[i];
1402 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1403 ist->st->codec->channels > channels) {
1404 channels = ist->st->codec->channels;
1408 NEW_STREAM(audio, idx);
1411 /* subtitles: pick first */
1412 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1413 for (i = 0; i < nb_input_streams; i++)
1414 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1415 NEW_STREAM(subtitle, i);
1419 /* do something with data? */
1421 for (i = 0; i < o->nb_stream_maps; i++) {
1422 StreamMap *map = &o->stream_maps[i];
1427 if (map->linklabel) {
1429 OutputFilter *ofilter = NULL;
1432 for (j = 0; j < nb_filtergraphs; j++) {
1433 fg = filtergraphs[j];
1434 for (k = 0; k < fg->nb_outputs; k++) {
1435 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1436 if (out && !strcmp(out->name, map->linklabel)) {
1437 ofilter = fg->outputs[k];
1444 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1445 "in any defined filter graph.\n", map->linklabel);
1448 init_output_filter(ofilter, o, oc);
1450 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1451 switch (ist->st->codec->codec_type) {
1452 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1453 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1454 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1455 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1456 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1458 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1459 map->file_index, map->stream_index);
1463 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1464 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1465 map->sync_stream_index];
1467 ist->st->discard = AVDISCARD_NONE;
1472 /* handle attached files */
1473 for (i = 0; i < o->nb_attachments; i++) {
1475 uint8_t *attachment;
1479 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1480 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1484 if ((len = avio_size(pb)) <= 0) {
1485 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1489 if (!(attachment = av_malloc(len))) {
1490 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1494 avio_read(pb, attachment, len);
1496 ost = new_attachment_stream(o, oc);
1497 ost->stream_copy = 0;
1498 ost->source_index = -1;
1499 ost->attachment_filename = o->attachments[i];
1500 ost->st->codec->extradata = attachment;
1501 ost->st->codec->extradata_size = len;
1503 p = strrchr(o->attachments[i], '/');
1504 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1508 /* check if all codec options have been used */
1509 unused_opts = strip_specifiers(o->g->codec_opts);
1510 for (i = of->ost_index; i < nb_output_streams; i++) {
1512 while ((e = av_dict_get(output_streams[i]->opts, "", e,
1513 AV_DICT_IGNORE_SUFFIX)))
1514 av_dict_set(&unused_opts, e->key, NULL, 0);
1518 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1519 const AVClass *class = avcodec_get_class();
1520 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1521 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1524 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1525 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1526 "output file #%d (%s) is not an encoding option.\n", e->key,
1527 option->help ? option->help : "", nb_output_files - 1,
1532 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1533 "output file #%d (%s) has not been used for any stream. The most "
1534 "likely reason is either wrong type (e.g. a video option with "
1535 "no video streams) or that it is a private option of some encoder "
1536 "which was not actually used for any stream.\n", e->key,
1537 option->help ? option->help : "", nb_output_files - 1, filename);
1539 av_dict_free(&unused_opts);
1541 /* check filename in case of an image number is expected */
1542 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1543 if (!av_filename_number_test(oc->filename)) {
1544 print_error(oc->filename, AVERROR(EINVAL));
1549 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1550 /* test if it already exists to avoid losing precious files */
1551 assert_file_overwrite(filename);
1554 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1555 &oc->interrupt_callback,
1557 print_error(filename, err);
1562 if (o->mux_preload) {
1564 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1565 av_dict_set(&of->opts, "preload", buf, 0);
1567 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1568 oc->flags |= AVFMT_FLAG_NONBLOCK;
1571 for (i = 0; i < o->nb_metadata_map; i++) {
1573 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1575 if (in_file_index >= nb_input_files) {
1576 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1579 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1580 in_file_index >= 0 ?
1581 input_files[in_file_index]->ctx : NULL, o);
1585 if (o->chapters_input_file >= nb_input_files) {
1586 if (o->chapters_input_file == INT_MAX) {
1587 /* copy chapters from the first input file that has them*/
1588 o->chapters_input_file = -1;
1589 for (i = 0; i < nb_input_files; i++)
1590 if (input_files[i]->ctx->nb_chapters) {
1591 o->chapters_input_file = i;
1595 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1596 o->chapters_input_file);
1600 if (o->chapters_input_file >= 0)
1601 copy_chapters(input_files[o->chapters_input_file], of,
1602 !o->metadata_chapters_manual);
1604 /* copy global metadata by default */
1605 if (!o->metadata_global_manual && nb_input_files)
1606 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1607 AV_DICT_DONT_OVERWRITE);
1608 if (!o->metadata_streams_manual)
1609 for (i = of->ost_index; i < nb_output_streams; i++) {
1611 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1613 ist = input_streams[output_streams[i]->source_index];
1614 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1617 /* process manually set metadata */
1618 for (i = 0; i < o->nb_metadata; i++) {
1621 const char *stream_spec;
1622 int index = 0, j, ret;
1624 val = strchr(o->metadata[i].u.str, '=');
1626 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1627 o->metadata[i].u.str);
1632 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1634 for (j = 0; j < oc->nb_streams; j++) {
1635 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1636 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1647 if (index < 0 || index >= oc->nb_chapters) {
1648 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1651 m = &oc->chapters[index]->metadata;
1654 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1657 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1664 static int opt_target(void *optctx, const char *opt, const char *arg)
1666 OptionsContext *o = optctx;
1667 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1668 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1670 if (!strncmp(arg, "pal-", 4)) {
1673 } else if (!strncmp(arg, "ntsc-", 5)) {
1676 } else if (!strncmp(arg, "film-", 5)) {
1680 /* Try to determine PAL/NTSC by peeking in the input files */
1681 if (nb_input_files) {
1683 for (j = 0; j < nb_input_files; j++) {
1684 for (i = 0; i < input_files[j]->nb_streams; i++) {
1685 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1686 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
1688 fr = c->time_base.den * 1000 / c->time_base.num;
1692 } else if ((fr == 29970) || (fr == 23976)) {
1697 if (norm != UNKNOWN)
1701 if (norm != UNKNOWN)
1702 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1705 if (norm == UNKNOWN) {
1706 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1707 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1708 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1712 if (!strcmp(arg, "vcd")) {
1713 opt_video_codec(o, "c:v", "mpeg1video");
1714 opt_audio_codec(o, "c:a", "mp2");
1715 parse_option(o, "f", "vcd", options);
1717 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1718 parse_option(o, "r", frame_rates[norm], options);
1719 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1721 opt_default(NULL, "b", "1150000");
1722 opt_default(NULL, "maxrate", "1150000");
1723 opt_default(NULL, "minrate", "1150000");
1724 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
1726 opt_default(NULL, "b:a", "224000");
1727 parse_option(o, "ar", "44100", options);
1728 parse_option(o, "ac", "2", options);
1730 opt_default(NULL, "packetsize", "2324");
1731 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
1733 /* We have to offset the PTS, so that it is consistent with the SCR.
1734 SCR starts at 36000, but the first two packs contain only padding
1735 and the first pack from the other stream, respectively, may also have
1736 been written before.
1737 So the real data starts at SCR 36000+3*1200. */
1738 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1739 } else if (!strcmp(arg, "svcd")) {
1741 opt_video_codec(o, "c:v", "mpeg2video");
1742 opt_audio_codec(o, "c:a", "mp2");
1743 parse_option(o, "f", "svcd", options);
1745 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1746 parse_option(o, "r", frame_rates[norm], options);
1747 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1749 opt_default(NULL, "b", "2040000");
1750 opt_default(NULL, "maxrate", "2516000");
1751 opt_default(NULL, "minrate", "0"); // 1145000;
1752 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1753 opt_default(NULL, "flags", "+scan_offset");
1756 opt_default(NULL, "b:a", "224000");
1757 parse_option(o, "ar", "44100", options);
1759 opt_default(NULL, "packetsize", "2324");
1761 } else if (!strcmp(arg, "dvd")) {
1763 opt_video_codec(o, "c:v", "mpeg2video");
1764 opt_audio_codec(o, "c:a", "ac3");
1765 parse_option(o, "f", "dvd", options);
1767 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1768 parse_option(o, "r", frame_rates[norm], options);
1769 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1771 opt_default(NULL, "b", "6000000");
1772 opt_default(NULL, "maxrate", "9000000");
1773 opt_default(NULL, "minrate", "0"); // 1500000;
1774 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1776 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1777 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
1779 opt_default(NULL, "b:a", "448000");
1780 parse_option(o, "ar", "48000", options);
1782 } else if (!strncmp(arg, "dv", 2)) {
1784 parse_option(o, "f", "dv", options);
1786 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1787 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1788 norm == PAL ? "yuv420p" : "yuv411p", options);
1789 parse_option(o, "r", frame_rates[norm], options);
1791 parse_option(o, "ar", "48000", options);
1792 parse_option(o, "ac", "2", options);
1795 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1796 return AVERROR(EINVAL);
1801 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1803 av_free (vstats_filename);
1804 vstats_filename = av_strdup (arg);
1808 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1811 time_t today2 = time(NULL);
1812 struct tm *today = localtime(&today2);
1814 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1816 return opt_vstats_file(NULL, opt, filename);
1819 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1821 OptionsContext *o = optctx;
1822 return parse_option(o, "frames:v", arg, options);
1825 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1827 OptionsContext *o = optctx;
1828 return parse_option(o, "frames:a", arg, options);
1831 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1833 OptionsContext *o = optctx;
1834 return parse_option(o, "frames:d", arg, options);
1837 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
1839 OptionsContext *o = optctx;
1840 return parse_option(o, "tag:v", arg, options);
1843 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
1845 OptionsContext *o = optctx;
1846 return parse_option(o, "tag:a", arg, options);
1849 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
1851 OptionsContext *o = optctx;
1852 return parse_option(o, "tag:s", arg, options);
1855 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
1857 OptionsContext *o = optctx;
1858 return parse_option(o, "filter:v", arg, options);
1861 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
1863 OptionsContext *o = optctx;
1864 return parse_option(o, "filter:a", arg, options);
1867 static int opt_vsync(void *optctx, const char *opt, const char *arg)
1869 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
1870 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
1871 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
1873 if (video_sync_method == VSYNC_AUTO)
1874 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
1878 int opt_cpuflags(void *optctx, const char *opt, const char *arg)
1880 int flags = av_parse_cpu_flags(arg);
1885 av_set_cpu_flags_mask(flags);
1889 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
1891 OptionsContext *o = optctx;
1892 char layout_str[32];
1895 int ret, channels, ac_str_size;
1898 layout = av_get_channel_layout(arg);
1900 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
1901 return AVERROR(EINVAL);
1903 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
1904 ret = opt_default(NULL, opt, layout_str);
1908 /* set 'ac' option based on channel layout */
1909 channels = av_get_channel_layout_nb_channels(layout);
1910 snprintf(layout_str, sizeof(layout_str), "%d", channels);
1911 stream_str = strchr(opt, ':');
1912 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
1913 ac_str = av_mallocz(ac_str_size);
1915 return AVERROR(ENOMEM);
1916 av_strlcpy(ac_str, "ac", 3);
1918 av_strlcat(ac_str, stream_str, ac_str_size);
1919 ret = parse_option(o, ac_str, layout_str, options);
1925 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
1927 OptionsContext *o = optctx;
1928 return parse_option(o, "q:a", arg, options);
1931 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
1933 GROW_ARRAY(filtergraphs, nb_filtergraphs);
1934 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
1935 return AVERROR(ENOMEM);
1936 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
1937 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
1938 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
1939 return AVERROR(ENOMEM);
1943 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
1945 uint8_t *graph_desc = read_file(arg);
1947 return AVERROR(EINVAL);
1949 GROW_ARRAY(filtergraphs, nb_filtergraphs);
1950 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
1951 return AVERROR(ENOMEM);
1952 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
1953 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
1957 void show_help_default(const char *opt, const char *arg)
1959 /* per-file options have at least one of those set */
1960 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
1961 int show_advanced = 0, show_avoptions = 0;
1964 if (!strcmp(opt, "long"))
1966 else if (!strcmp(opt, "full"))
1967 show_advanced = show_avoptions = 1;
1969 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
1974 printf("Getting help:\n"
1975 " -h -- print basic options\n"
1976 " -h long -- print more options\n"
1977 " -h full -- print all options (including all format and codec specific options, very long)\n"
1978 " See man %s for detailed description of the options.\n"
1979 "\n", program_name);
1981 show_help_options(options, "Print help / information / capabilities:",
1984 show_help_options(options, "Global options (affect whole program "
1985 "instead of just one file:",
1986 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
1988 show_help_options(options, "Advanced global options:", OPT_EXPERT,
1989 per_file | OPT_EXIT, 0);
1991 show_help_options(options, "Per-file main options:", 0,
1992 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
1993 OPT_EXIT, per_file);
1995 show_help_options(options, "Advanced per-file options:",
1996 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
1998 show_help_options(options, "Video options:",
1999 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2001 show_help_options(options, "Advanced Video options:",
2002 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2004 show_help_options(options, "Audio options:",
2005 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2007 show_help_options(options, "Advanced Audio options:",
2008 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2009 show_help_options(options, "Subtitle options:",
2010 OPT_SUBTITLE, 0, 0);
2013 if (show_avoptions) {
2014 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2015 show_help_children(avcodec_get_class(), flags);
2016 show_help_children(avformat_get_class(), flags);
2017 show_help_children(sws_get_class(), flags);
2018 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM);
2022 void show_usage(void)
2024 printf("Hyper fast Audio and Video encoder\n");
2025 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2034 static const OptionGroupDef groups[] = {
2035 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2036 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2039 static int open_files(OptionGroupList *l, const char *inout,
2040 int (*open_file)(OptionsContext*, const char*))
2044 for (i = 0; i < l->nb_groups; i++) {
2045 OptionGroup *g = &l->groups[i];
2051 ret = parse_optgroup(&o, g);
2053 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2054 "%s.\n", inout, g->arg);
2058 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2059 ret = open_file(&o, g->arg);
2062 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2066 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2072 int avconv_parse_options(int argc, char **argv)
2074 OptionParseContext octx;
2078 memset(&octx, 0, sizeof(octx));
2080 /* split the commandline into an internal representation */
2081 ret = split_commandline(&octx, argc, argv, options, groups,
2082 FF_ARRAY_ELEMS(groups));
2084 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2088 /* apply global options */
2089 ret = parse_optgroup(NULL, &octx.global_opts);
2091 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2095 /* open input files */
2096 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2098 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2102 /* open output files */
2103 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2105 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2110 uninit_parse_context(&octx);
2112 av_strerror(ret, error, sizeof(error));
2113 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2118 #define OFFSET(x) offsetof(OptionsContext, x)
2119 const OptionDef options[] = {
2121 #include "cmdutils_common_opts.h"
2122 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2123 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2124 "force format", "fmt" },
2125 { "y", OPT_BOOL, { &file_overwrite },
2126 "overwrite output files" },
2127 { "n", OPT_BOOL, { &file_skip },
2128 "never overwrite output files" },
2129 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2130 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2131 "codec name", "codec" },
2132 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2133 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2134 "codec name", "codec" },
2135 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2136 OPT_OUTPUT, { .off = OFFSET(presets) },
2137 "preset name", "preset" },
2138 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2139 OPT_OUTPUT, { .func_arg = opt_map },
2140 "set input stream mapping",
2141 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2142 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2143 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2144 "set metadata information of outfile from infile",
2145 "outfile[,metadata]:infile[,metadata]" },
2146 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2147 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2148 "set chapters mapping", "input_file_index" },
2149 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2150 "record or transcode \"duration\" seconds of audio/video",
2152 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2153 "set the limit file size in bytes", "limit_size" },
2154 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2155 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2156 "set the start time offset", "time_off" },
2157 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2158 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2159 "enable/disable accurate seeking with -ss" },
2160 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2161 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2162 "set the input ts offset", "time_off" },
2163 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2164 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2165 "set the input ts scale", "scale" },
2166 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2167 "add metadata", "string=string" },
2168 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2169 OPT_OUTPUT, { .func_arg = opt_data_frames },
2170 "set the number of data frames to record", "number" },
2171 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2172 "add timings for benchmarking" },
2173 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2174 "set max runtime in seconds", "limit" },
2175 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2176 "dump each input packet" },
2177 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2178 "when dumping packets, also dump the payload" },
2179 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2180 OPT_INPUT, { .off = OFFSET(rate_emu) },
2181 "read input at native frame rate", "" },
2182 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2183 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2184 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2185 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2186 "video sync method", "" },
2187 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2188 "audio sync method", "" },
2189 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2190 "audio drift threshold", "threshold" },
2191 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2192 "copy timestamps" },
2193 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2194 "copy input stream time base when stream copying" },
2195 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2196 OPT_OUTPUT, { .off = OFFSET(shortest) },
2197 "finish encoding within shortest input" },
2198 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2199 "timestamp discontinuity delta threshold", "threshold" },
2200 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2201 "exit on error", "error" },
2202 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2203 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2204 "copy initial non-keyframes" },
2205 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2206 "set the number of frames to record", "number" },
2207 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2208 OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(codec_tags) },
2209 "force codec tag/fourcc", "fourcc/tag" },
2210 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2211 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2212 "use fixed quality scale (VBR)", "q" },
2213 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2214 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2215 "use fixed quality scale (VBR)", "q" },
2216 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2217 "set stream filterchain", "filter_list" },
2218 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2219 "read stream filtergraph description from a file", "filename" },
2220 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2221 "create a complex filtergraph", "graph_description" },
2222 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2223 "read complex filtergraph description from a file", "filename" },
2224 { "stats", OPT_BOOL, { &print_stats },
2225 "print progress report during encoding", },
2226 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2227 OPT_OUTPUT, { .func_arg = opt_attach },
2228 "add an attachment to the output file", "filename" },
2229 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2230 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2231 "extract an attachment into a file", "filename" },
2232 { "cpuflags", HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags },
2233 "set CPU flags mask", "mask" },
2236 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2237 "set the number of video frames to record", "number" },
2238 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2239 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2240 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2241 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2242 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2243 "set frame size (WxH or abbreviation)", "size" },
2244 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2245 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2246 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2247 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2248 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2249 "set pixel format", "format" },
2250 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2252 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2253 "discard threshold", "n" },
2254 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2255 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2256 "rate control override for specific intervals", "override" },
2257 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2258 OPT_OUTPUT, { .func_arg = opt_video_codec },
2259 "force video codec ('copy' to copy stream)", "codec" },
2260 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2261 "select the pass number (1 or 2)", "n" },
2262 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2263 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2264 "select two pass log file name prefix", "prefix" },
2265 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2266 "dump video coding statistics to file" },
2267 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2268 "dump video coding statistics to file", "file" },
2269 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2270 "video filters", "filter list" },
2271 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2272 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2273 "specify intra matrix coeffs", "matrix" },
2274 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2275 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2276 "specify inter matrix coeffs", "matrix" },
2277 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2278 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2279 "top=1/bottom=0/auto=-1 field first", "" },
2280 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2281 "intra_dc_precision", "precision" },
2282 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2283 OPT_OUTPUT, { .func_arg = opt_video_tag },
2284 "force video tag/fourcc", "fourcc/tag" },
2285 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2286 "show QP histogram" },
2287 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2288 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2289 "force the selected framerate, disable the best supported framerate selection" },
2290 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2291 OPT_OUTPUT, { .func_arg = opt_streamid },
2292 "set the value of an outfile streamid", "streamIndex:value" },
2293 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2294 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2295 "force key frames at specified timestamps", "timestamps" },
2298 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2299 "set the number of audio frames to record", "number" },
2300 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2301 "set audio quality (codec-specific)", "quality", },
2302 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2303 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2304 "set audio sampling rate (in Hz)", "rate" },
2305 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2306 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2307 "set number of audio channels", "channels" },
2308 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2310 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2311 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2312 "force audio codec ('copy' to copy stream)", "codec" },
2313 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2314 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2315 "force audio tag/fourcc", "fourcc/tag" },
2316 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2317 "change audio volume (256=normal)" , "volume" },
2318 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2319 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2320 "set sample format", "format" },
2321 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2322 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2323 "set channel layout", "layout" },
2324 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2325 "audio filters", "filter list" },
2327 /* subtitle options */
2328 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2329 "disable subtitle" },
2330 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2331 "force subtitle codec ('copy' to copy stream)", "codec" },
2332 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2333 , "force subtitle tag/fourcc", "fourcc/tag" },
2336 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2339 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2340 "set the maximum demux-decode delay", "seconds" },
2341 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2342 "set the initial demux-decode delay", "seconds" },
2344 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2345 "A comma-separated list of bitstream filters", "bitstream_filters" },
2347 /* data codec support */
2348 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2349 "force data codec ('copy' to copy stream)", "codec" },