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 const HWAccel hwaccels[] = {
58 { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
63 char *vstats_filename;
65 float audio_drift_threshold = 0.1;
66 float dts_delta_threshold = 10;
68 int audio_volume = 256;
69 int audio_sync_method = 0;
70 int video_sync_method = VSYNC_AUTO;
76 int exit_on_error = 0;
80 static int file_overwrite = 0;
81 static int file_skip = 0;
82 static int video_discard = 0;
83 static int intra_dc_precision = 8;
84 static int using_stdin = 0;
85 static int input_sync;
87 static void uninit_options(OptionsContext *o)
89 const OptionDef *po = options;
92 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
94 void *dst = (uint8_t*)o + po->u.off;
96 if (po->flags & OPT_SPEC) {
97 SpecifierOpt **so = dst;
98 int i, *count = (int*)(so + 1);
99 for (i = 0; i < *count; i++) {
100 av_freep(&(*so)[i].specifier);
101 if (po->flags & OPT_STRING)
102 av_freep(&(*so)[i].u.str);
106 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
111 for (i = 0; i < o->nb_stream_maps; i++)
112 av_freep(&o->stream_maps[i].linklabel);
113 av_freep(&o->stream_maps);
114 av_freep(&o->meta_data_maps);
115 av_freep(&o->streamid_map);
118 static void init_options(OptionsContext *o)
120 memset(o, 0, sizeof(*o));
122 o->mux_max_delay = 0.7;
123 o->start_time = AV_NOPTS_VALUE;
124 o->recording_time = INT64_MAX;
125 o->limit_filesize = UINT64_MAX;
126 o->chapters_input_file = INT_MAX;
127 o->accurate_seek = 1;
130 /* return a copy of the input with the stream specifiers removed from the keys */
131 static AVDictionary *strip_specifiers(AVDictionary *dict)
133 AVDictionaryEntry *e = NULL;
134 AVDictionary *ret = NULL;
136 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
137 char *p = strchr(e->key, ':');
141 av_dict_set(&ret, e->key, e->value, 0);
148 static double parse_frame_aspect_ratio(const char *arg)
155 p = strchr(arg, ':');
157 x = strtol(arg, &end, 10);
159 y = strtol(end + 1, &end, 10);
161 ar = (double)x / (double)y;
163 ar = strtod(arg, NULL);
166 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
172 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
174 OptionsContext *o = optctx;
175 return parse_option(o, "codec:a", arg, options);
178 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
180 OptionsContext *o = optctx;
181 return parse_option(o, "codec:v", arg, options);
184 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
186 OptionsContext *o = optctx;
187 return parse_option(o, "codec:s", arg, options);
190 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
192 OptionsContext *o = optctx;
193 return parse_option(o, "codec:d", arg, options);
196 static int opt_map(void *optctx, const char *opt, const char *arg)
198 OptionsContext *o = optctx;
200 int i, negative = 0, file_idx;
201 int sync_file_idx = -1, sync_stream_idx;
209 map = av_strdup(arg);
211 /* parse sync stream first, just pick first matching stream */
212 if (sync = strchr(map, ',')) {
214 sync_file_idx = strtol(sync + 1, &sync, 0);
215 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
216 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
221 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
222 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
223 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
227 if (i == input_files[sync_file_idx]->nb_streams) {
228 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
229 "match any streams.\n", arg);
236 /* this mapping refers to lavfi output */
237 const char *c = map + 1;
238 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
239 m = &o->stream_maps[o->nb_stream_maps - 1];
240 m->linklabel = av_get_token(&c, "]");
242 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
246 file_idx = strtol(map, &p, 0);
247 if (file_idx >= nb_input_files || file_idx < 0) {
248 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
252 /* disable some already defined maps */
253 for (i = 0; i < o->nb_stream_maps; i++) {
254 m = &o->stream_maps[i];
255 if (file_idx == m->file_index &&
256 check_stream_specifier(input_files[m->file_index]->ctx,
257 input_files[m->file_index]->ctx->streams[m->stream_index],
258 *p == ':' ? p + 1 : p) > 0)
262 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
263 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
264 *p == ':' ? p + 1 : p) <= 0)
266 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
267 m = &o->stream_maps[o->nb_stream_maps - 1];
269 m->file_index = file_idx;
272 if (sync_file_idx >= 0) {
273 m->sync_file_index = sync_file_idx;
274 m->sync_stream_index = sync_stream_idx;
276 m->sync_file_index = file_idx;
277 m->sync_stream_index = i;
283 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
291 static int opt_attach(void *optctx, const char *opt, const char *arg)
293 OptionsContext *o = optctx;
294 GROW_ARRAY(o->attachments, o->nb_attachments);
295 o->attachments[o->nb_attachments - 1] = arg;
300 * Parse a metadata specifier passed as 'arg' parameter.
301 * @param arg metadata string to parse
302 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
303 * @param index for type c/p, chapter/program index is written here
304 * @param stream_spec for type s, the stream specifier is written here
306 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
314 if (*(++arg) && *arg != ':') {
315 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
318 *stream_spec = *arg == ':' ? arg + 1 : "";
323 *index = strtol(++arg, NULL, 0);
326 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
333 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
335 AVDictionary **meta_in = NULL;
336 AVDictionary **meta_out;
338 char type_in, type_out;
339 const char *istream_spec = NULL, *ostream_spec = NULL;
340 int idx_in = 0, idx_out = 0;
342 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
343 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
345 if (type_in == 'g' || type_out == 'g')
346 o->metadata_global_manual = 1;
347 if (type_in == 's' || type_out == 's')
348 o->metadata_streams_manual = 1;
349 if (type_in == 'c' || type_out == 'c')
350 o->metadata_chapters_manual = 1;
352 /* ic is NULL when just disabling automatic mappings */
356 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
357 if ((index) < 0 || (index) >= (nb_elems)) {\
358 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
363 #define SET_DICT(type, meta, context, index)\
366 meta = &context->metadata;\
369 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
370 meta = &context->chapters[index]->metadata;\
373 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
374 meta = &context->programs[index]->metadata;\
377 break; /* handled separately below */ \
378 default: av_assert0(0);\
381 SET_DICT(type_in, meta_in, ic, idx_in);
382 SET_DICT(type_out, meta_out, oc, idx_out);
384 /* for input streams choose first matching stream */
385 if (type_in == 's') {
386 for (i = 0; i < ic->nb_streams; i++) {
387 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
388 meta_in = &ic->streams[i]->metadata;
394 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
399 if (type_out == 's') {
400 for (i = 0; i < oc->nb_streams; i++) {
401 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
402 meta_out = &oc->streams[i]->metadata;
403 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
408 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
413 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
415 const AVCodecDescriptor *desc;
416 const char *codec_string = encoder ? "encoder" : "decoder";
420 avcodec_find_encoder_by_name(name) :
421 avcodec_find_decoder_by_name(name);
423 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
424 codec = encoder ? avcodec_find_encoder(desc->id) :
425 avcodec_find_decoder(desc->id);
427 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
428 codec_string, codec->name, desc->name);
432 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
435 if (codec->type != type) {
436 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
442 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
444 char *codec_name = NULL;
446 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
448 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
449 st->codec->codec_id = codec->id;
452 return avcodec_find_decoder(st->codec->codec_id);
455 /* Add all the streams from the given input file to the global
456 * list of input streams. */
457 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
461 for (i = 0; i < ic->nb_streams; i++) {
462 AVStream *st = ic->streams[i];
463 AVCodecContext *dec = st->codec;
464 InputStream *ist = av_mallocz(sizeof(*ist));
465 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
466 char *codec_tag = NULL;
472 GROW_ARRAY(input_streams, nb_input_streams);
473 input_streams[nb_input_streams - 1] = ist;
476 ist->file_index = nb_input_files;
478 st->discard = AVDISCARD_ALL;
481 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
483 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
485 uint32_t tag = strtol(codec_tag, &next, 0);
487 tag = AV_RL32(codec_tag);
488 st->codec->codec_tag = tag;
491 ist->dec = choose_decoder(o, ic, st);
492 ist->opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
494 switch (dec->codec_type) {
495 case AVMEDIA_TYPE_VIDEO:
496 ist->resample_height = dec->height;
497 ist->resample_width = dec->width;
498 ist->resample_pix_fmt = dec->pix_fmt;
500 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
501 if (framerate && av_parse_video_rate(&ist->framerate,
503 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
508 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
510 if (!strcmp(hwaccel, "none"))
511 ist->hwaccel_id = HWACCEL_NONE;
512 else if (!strcmp(hwaccel, "auto"))
513 ist->hwaccel_id = HWACCEL_AUTO;
516 for (i = 0; hwaccels[i].name; i++) {
517 if (!strcmp(hwaccels[i].name, hwaccel)) {
518 ist->hwaccel_id = hwaccels[i].id;
523 if (!ist->hwaccel_id) {
524 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
526 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
527 for (i = 0; hwaccels[i].name; i++)
528 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
529 av_log(NULL, AV_LOG_FATAL, "\n");
535 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
536 if (hwaccel_device) {
537 ist->hwaccel_device = av_strdup(hwaccel_device);
538 if (!ist->hwaccel_device)
541 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
544 case AVMEDIA_TYPE_AUDIO:
545 guess_input_channel_layout(ist);
547 ist->resample_sample_fmt = dec->sample_fmt;
548 ist->resample_sample_rate = dec->sample_rate;
549 ist->resample_channels = dec->channels;
550 ist->resample_channel_layout = dec->channel_layout;
553 case AVMEDIA_TYPE_DATA:
554 case AVMEDIA_TYPE_SUBTITLE:
555 case AVMEDIA_TYPE_ATTACHMENT:
556 case AVMEDIA_TYPE_UNKNOWN:
564 static void assert_file_overwrite(const char *filename)
566 if (file_overwrite && file_skip) {
567 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
571 if (!file_overwrite &&
572 (strchr(filename, ':') == NULL || filename[1] == ':' ||
573 av_strstart(filename, "file:", NULL))) {
574 if (avio_check(filename, 0) == 0) {
575 if (!using_stdin && !file_skip) {
576 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
579 fprintf(stderr, "Not overwriting - exiting\n");
584 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
591 static void dump_attachment(AVStream *st, const char *filename)
594 AVIOContext *out = NULL;
595 AVDictionaryEntry *e;
597 if (!st->codec->extradata_size) {
598 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
599 nb_input_files - 1, st->index);
602 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
605 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
606 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
610 assert_file_overwrite(filename);
612 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
613 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
618 avio_write(out, st->codec->extradata, st->codec->extradata_size);
623 static int open_input_file(OptionsContext *o, const char *filename)
627 AVInputFormat *file_iformat = NULL;
632 AVDictionary *unused_opts = NULL;
633 AVDictionaryEntry *e = NULL;
634 int orig_nb_streams; // number of streams before avformat_find_stream_info
637 if (!(file_iformat = av_find_input_format(o->format))) {
638 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
643 if (!strcmp(filename, "-"))
646 using_stdin |= !strncmp(filename, "pipe:", 5) ||
647 !strcmp(filename, "/dev/stdin");
649 /* get default parameters from command line */
650 ic = avformat_alloc_context();
652 print_error(filename, AVERROR(ENOMEM));
655 if (o->nb_audio_sample_rate) {
656 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
657 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
659 if (o->nb_audio_channels) {
660 /* because we set audio_channels based on both the "ac" and
661 * "channel_layout" options, we need to check that the specified
662 * demuxer actually has the "channels" option before setting it */
663 if (file_iformat && file_iformat->priv_class &&
664 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
665 AV_OPT_SEARCH_FAKE_OBJ)) {
666 snprintf(buf, sizeof(buf), "%d",
667 o->audio_channels[o->nb_audio_channels - 1].u.i);
668 av_dict_set(&o->g->format_opts, "channels", buf, 0);
671 if (o->nb_frame_rates) {
672 /* set the format-level framerate option;
673 * this is important for video grabbers, e.g. x11 */
674 if (file_iformat && file_iformat->priv_class &&
675 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
676 AV_OPT_SEARCH_FAKE_OBJ)) {
677 av_dict_set(&o->g->format_opts, "framerate",
678 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
681 if (o->nb_frame_sizes) {
682 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
684 if (o->nb_frame_pix_fmts)
685 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
687 ic->flags |= AVFMT_FLAG_NONBLOCK;
688 ic->interrupt_callback = int_cb;
690 /* open the input file with generic libav function */
691 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
693 print_error(filename, err);
696 assert_avoptions(o->g->format_opts);
698 /* apply forced codec ids */
699 for (i = 0; i < ic->nb_streams; i++)
700 choose_decoder(o, ic, ic->streams[i]);
702 /* Set AVCodecContext options for avformat_find_stream_info */
703 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
704 orig_nb_streams = ic->nb_streams;
706 /* If not enough info to get the stream parameters, we decode the
707 first frames to get it. (used in mpeg case for example) */
708 ret = avformat_find_stream_info(ic, opts);
710 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
711 avformat_close_input(&ic);
715 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
716 /* add the stream start time */
717 if (ic->start_time != AV_NOPTS_VALUE)
718 timestamp += ic->start_time;
720 /* if seeking requested, we execute it */
721 if (o->start_time != AV_NOPTS_VALUE) {
722 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
724 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
725 filename, (double)timestamp / AV_TIME_BASE);
729 /* update the current parameters so that they match the one of the input stream */
730 add_input_streams(o, ic);
732 /* dump the file content */
733 av_dump_format(ic, nb_input_files, filename, 0);
735 GROW_ARRAY(input_files, nb_input_files);
736 f = av_mallocz(sizeof(*f));
739 input_files[nb_input_files - 1] = f;
742 f->ist_index = nb_input_streams - ic->nb_streams;
743 f->start_time = o->start_time;
744 f->recording_time = o->recording_time;
745 f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
746 f->nb_streams = ic->nb_streams;
747 f->rate_emu = o->rate_emu;
748 f->accurate_seek = o->accurate_seek;
750 /* check if all codec options have been used */
751 unused_opts = strip_specifiers(o->g->codec_opts);
752 for (i = f->ist_index; i < nb_input_streams; i++) {
754 while ((e = av_dict_get(input_streams[i]->opts, "", e,
755 AV_DICT_IGNORE_SUFFIX)))
756 av_dict_set(&unused_opts, e->key, NULL, 0);
760 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
761 const AVClass *class = avcodec_get_class();
762 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
763 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
766 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
767 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
768 "input file #%d (%s) is not a decoding option.\n", e->key,
769 option->help ? option->help : "", nb_input_files - 1,
774 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
775 "input file #%d (%s) has not been used for any stream. The most "
776 "likely reason is either wrong type (e.g. a video option with "
777 "no video streams) or that it is a private option of some decoder "
778 "which was not actually used for any stream.\n", e->key,
779 option->help ? option->help : "", nb_input_files - 1, filename);
781 av_dict_free(&unused_opts);
783 for (i = 0; i < o->nb_dump_attachment; i++) {
786 for (j = 0; j < ic->nb_streams; j++) {
787 AVStream *st = ic->streams[j];
789 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
790 dump_attachment(st, o->dump_attachment[i].u.str);
794 for (i = 0; i < orig_nb_streams; i++)
795 av_dict_free(&opts[i]);
801 static uint8_t *get_line(AVIOContext *s)
807 if (avio_open_dyn_buf(&line) < 0) {
808 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
812 while ((c = avio_r8(s)) && c != '\n')
815 avio_close_dyn_buf(line, &buf);
820 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
824 const char *base[3] = { getenv("AVCONV_DATADIR"),
829 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
833 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
834 i != 1 ? "" : "/.avconv", codec_name, preset_name);
835 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
838 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
839 i != 1 ? "" : "/.avconv", preset_name);
840 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
846 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
848 char *codec_name = NULL;
850 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
852 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
853 NULL, ost->st->codec->codec_type);
854 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
855 } else if (!strcmp(codec_name, "copy"))
856 ost->stream_copy = 1;
858 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
859 ost->st->codec->codec_id = ost->enc->id;
863 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
866 AVStream *st = avformat_new_stream(oc, NULL);
867 int idx = oc->nb_streams - 1, ret = 0;
868 char *bsf = NULL, *next, *codec_tag = NULL;
869 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
873 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
877 if (oc->nb_streams - 1 < o->nb_streamid_map)
878 st->id = o->streamid_map[oc->nb_streams - 1];
880 GROW_ARRAY(output_streams, nb_output_streams);
881 if (!(ost = av_mallocz(sizeof(*ost))))
883 output_streams[nb_output_streams - 1] = ost;
885 ost->file_index = nb_output_files - 1;
888 st->codec->codec_type = type;
889 choose_encoder(o, oc, ost);
891 AVIOContext *s = NULL;
892 char *buf = NULL, *arg = NULL, *preset = NULL;
894 ost->opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
896 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
897 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
900 if (!buf[0] || buf[0] == '#') {
904 if (!(arg = strchr(buf, '='))) {
905 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
909 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
911 } while (!s->eof_reached);
915 av_log(NULL, AV_LOG_FATAL,
916 "Preset %s specified for stream %d:%d, but could not be opened.\n",
917 preset, ost->file_index, ost->index);
921 ost->opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
924 avcodec_get_context_defaults3(st->codec, ost->enc);
925 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
927 ost->max_frames = INT64_MAX;
928 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
930 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
932 if (next = strchr(bsf, ','))
934 if (!(bsfc = av_bitstream_filter_init(bsf))) {
935 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
939 bsfc_prev->next = bsfc;
941 ost->bitstream_filters = bsfc;
947 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
949 uint32_t tag = strtol(codec_tag, &next, 0);
951 tag = AV_RL32(codec_tag);
952 st->codec->codec_tag = tag;
955 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
957 st->codec->flags |= CODEC_FLAG_QSCALE;
958 st->codec->global_quality = FF_QP2LAMBDA * qscale;
961 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
962 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
964 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
966 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
968 ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
969 ost->last_mux_dts = AV_NOPTS_VALUE;
974 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
984 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
991 /* read file contents into a string */
992 static uint8_t *read_file(const char *filename)
994 AVIOContext *pb = NULL;
995 AVIOContext *dyn_buf = NULL;
996 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
997 uint8_t buf[1024], *str;
1000 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1004 ret = avio_open_dyn_buf(&dyn_buf);
1009 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1010 avio_write(dyn_buf, buf, ret);
1011 avio_w8(dyn_buf, 0);
1014 ret = avio_close_dyn_buf(dyn_buf, &str);
1020 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1023 AVStream *st = ost->st;
1024 char *filter = NULL, *filter_script = NULL;
1026 MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
1027 MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
1029 if (filter_script && filter) {
1030 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1031 "output stream #%d:%d.\n", nb_output_files, st->index);
1036 return read_file(filter_script);
1038 return av_strdup(filter);
1040 return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
1044 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
1048 AVCodecContext *video_enc;
1049 char *frame_aspect_ratio = NULL;
1051 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
1053 video_enc = st->codec;
1055 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1056 if (frame_aspect_ratio)
1057 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
1059 if (!ost->stream_copy) {
1060 const char *p = NULL;
1061 char *frame_rate = NULL, *frame_size = NULL;
1062 char *frame_pix_fmt = NULL;
1063 char *intra_matrix = NULL, *inter_matrix = NULL;
1067 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1068 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1069 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1073 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1074 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1075 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1079 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1080 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1081 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1084 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1086 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1088 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1089 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1092 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1094 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1096 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1097 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1100 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1103 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1104 for (i = 0; p; i++) {
1106 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1108 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1111 video_enc->rc_override =
1112 av_realloc(video_enc->rc_override,
1113 sizeof(RcOverride) * (i + 1));
1114 video_enc->rc_override[i].start_frame = start;
1115 video_enc->rc_override[i].end_frame = end;
1117 video_enc->rc_override[i].qscale = q;
1118 video_enc->rc_override[i].quality_factor = 1.0;
1121 video_enc->rc_override[i].qscale = 0;
1122 video_enc->rc_override[i].quality_factor = -q/100.0;
1127 video_enc->rc_override_count = i;
1128 video_enc->intra_dc_precision = intra_dc_precision - 8;
1131 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1134 video_enc->flags |= CODEC_FLAG_PASS1;
1136 video_enc->flags |= CODEC_FLAG_PASS2;
1140 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1141 if (ost->logfile_prefix &&
1142 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1145 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1146 if (ost->forced_keyframes)
1147 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1149 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1151 ost->top_field_first = -1;
1152 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1155 ost->avfilter = get_ost_filters(o, oc, ost);
1159 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1165 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1169 AVCodecContext *audio_enc;
1171 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1174 audio_enc = st->codec;
1175 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1177 if (!ost->stream_copy) {
1178 char *sample_fmt = NULL;
1180 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1182 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1184 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1185 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1189 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1191 ost->avfilter = get_ost_filters(o, oc, ost);
1199 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1203 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1204 if (!ost->stream_copy) {
1205 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1212 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1214 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1215 ost->stream_copy = 1;
1220 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1224 AVCodecContext *subtitle_enc;
1226 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1228 subtitle_enc = st->codec;
1230 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1235 /* arg format is "output-stream-index:streamid-value". */
1236 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1238 OptionsContext *o = optctx;
1243 av_strlcpy(idx_str, arg, sizeof(idx_str));
1244 p = strchr(idx_str, ':');
1246 av_log(NULL, AV_LOG_FATAL,
1247 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1252 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1253 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1254 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1258 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1260 AVFormatContext *is = ifile->ctx;
1261 AVFormatContext *os = ofile->ctx;
1265 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1267 return AVERROR(ENOMEM);
1270 for (i = 0; i < is->nb_chapters; i++) {
1271 AVChapter *in_ch = is->chapters[i], *out_ch;
1272 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1273 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1274 AV_TIME_BASE_Q, in_ch->time_base);
1275 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1276 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1279 if (in_ch->end < ts_off)
1281 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1284 out_ch = av_mallocz(sizeof(AVChapter));
1286 return AVERROR(ENOMEM);
1288 out_ch->id = in_ch->id;
1289 out_ch->time_base = in_ch->time_base;
1290 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1291 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1294 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1296 os->chapters[os->nb_chapters++] = out_ch;
1301 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1302 AVFormatContext *oc)
1306 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1307 ofilter->out_tmp->pad_idx)) {
1308 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1309 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1311 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1316 ost->source_index = -1;
1317 ost->filter = ofilter;
1321 if (ost->stream_copy) {
1322 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1323 "which is fed from a complex filtergraph. Filtering and streamcopy "
1324 "cannot be used together.\n", ost->file_index, ost->index);
1328 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1329 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1332 avfilter_inout_free(&ofilter->out_tmp);
1335 static int configure_complex_filters(void)
1339 for (i = 0; i < nb_filtergraphs; i++)
1340 if (!filtergraphs[i]->graph &&
1341 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1346 static int open_output_file(OptionsContext *o, const char *filename)
1348 AVFormatContext *oc;
1350 AVOutputFormat *file_oformat;
1354 AVDictionary *unused_opts = NULL;
1355 AVDictionaryEntry *e = NULL;
1357 if (configure_complex_filters() < 0) {
1358 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1362 GROW_ARRAY(output_files, nb_output_files);
1363 of = av_mallocz(sizeof(*of));
1366 output_files[nb_output_files - 1] = of;
1368 of->ost_index = nb_output_streams;
1369 of->recording_time = o->recording_time;
1370 of->start_time = o->start_time;
1371 of->limit_filesize = o->limit_filesize;
1372 of->shortest = o->shortest;
1373 av_dict_copy(&of->opts, o->g->format_opts, 0);
1375 if (!strcmp(filename, "-"))
1378 oc = avformat_alloc_context();
1380 print_error(filename, AVERROR(ENOMEM));
1384 if (o->recording_time != INT64_MAX)
1385 oc->duration = o->recording_time;
1388 file_oformat = av_guess_format(o->format, NULL, NULL);
1389 if (!file_oformat) {
1390 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1394 file_oformat = av_guess_format(NULL, filename, NULL);
1395 if (!file_oformat) {
1396 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1402 oc->oformat = file_oformat;
1403 oc->interrupt_callback = int_cb;
1404 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1406 /* create streams for all unlabeled output pads */
1407 for (i = 0; i < nb_filtergraphs; i++) {
1408 FilterGraph *fg = filtergraphs[i];
1409 for (j = 0; j < fg->nb_outputs; j++) {
1410 OutputFilter *ofilter = fg->outputs[j];
1412 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1415 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1416 ofilter->out_tmp->pad_idx)) {
1417 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1418 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1419 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1421 init_output_filter(ofilter, o, oc);
1425 if (!o->nb_stream_maps) {
1426 /* pick the "best" stream of each type */
1427 #define NEW_STREAM(type, index)\
1429 ost = new_ ## type ## _stream(o, oc);\
1430 ost->source_index = index;\
1431 ost->sync_ist = input_streams[index];\
1432 input_streams[index]->discard = 0;\
1433 input_streams[index]->st->discard = AVDISCARD_NONE;\
1436 /* video: highest resolution */
1437 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1438 int area = 0, idx = -1;
1439 for (i = 0; i < nb_input_streams; i++) {
1440 ist = input_streams[i];
1441 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1442 ist->st->codec->width * ist->st->codec->height > area) {
1443 area = ist->st->codec->width * ist->st->codec->height;
1447 NEW_STREAM(video, idx);
1450 /* audio: most channels */
1451 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1452 int channels = 0, idx = -1;
1453 for (i = 0; i < nb_input_streams; i++) {
1454 ist = input_streams[i];
1455 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1456 ist->st->codec->channels > channels) {
1457 channels = ist->st->codec->channels;
1461 NEW_STREAM(audio, idx);
1464 /* subtitles: pick first */
1465 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1466 for (i = 0; i < nb_input_streams; i++)
1467 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1468 NEW_STREAM(subtitle, i);
1472 /* do something with data? */
1474 for (i = 0; i < o->nb_stream_maps; i++) {
1475 StreamMap *map = &o->stream_maps[i];
1480 if (map->linklabel) {
1482 OutputFilter *ofilter = NULL;
1485 for (j = 0; j < nb_filtergraphs; j++) {
1486 fg = filtergraphs[j];
1487 for (k = 0; k < fg->nb_outputs; k++) {
1488 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1489 if (out && !strcmp(out->name, map->linklabel)) {
1490 ofilter = fg->outputs[k];
1497 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1498 "in any defined filter graph.\n", map->linklabel);
1501 init_output_filter(ofilter, o, oc);
1503 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1504 switch (ist->st->codec->codec_type) {
1505 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1506 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1507 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1508 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1509 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1511 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1512 map->file_index, map->stream_index);
1516 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1517 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1518 map->sync_stream_index];
1520 ist->st->discard = AVDISCARD_NONE;
1525 /* handle attached files */
1526 for (i = 0; i < o->nb_attachments; i++) {
1528 uint8_t *attachment;
1532 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1533 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1537 if ((len = avio_size(pb)) <= 0) {
1538 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1542 if (!(attachment = av_malloc(len))) {
1543 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1547 avio_read(pb, attachment, len);
1549 ost = new_attachment_stream(o, oc);
1550 ost->stream_copy = 0;
1551 ost->source_index = -1;
1552 ost->attachment_filename = o->attachments[i];
1553 ost->st->codec->extradata = attachment;
1554 ost->st->codec->extradata_size = len;
1556 p = strrchr(o->attachments[i], '/');
1557 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1561 /* check if all codec options have been used */
1562 unused_opts = strip_specifiers(o->g->codec_opts);
1563 for (i = of->ost_index; i < nb_output_streams; i++) {
1565 while ((e = av_dict_get(output_streams[i]->opts, "", e,
1566 AV_DICT_IGNORE_SUFFIX)))
1567 av_dict_set(&unused_opts, e->key, NULL, 0);
1571 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1572 const AVClass *class = avcodec_get_class();
1573 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1574 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1577 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1578 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1579 "output file #%d (%s) is not an encoding option.\n", e->key,
1580 option->help ? option->help : "", nb_output_files - 1,
1585 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1586 "output file #%d (%s) has not been used for any stream. The most "
1587 "likely reason is either wrong type (e.g. a video option with "
1588 "no video streams) or that it is a private option of some encoder "
1589 "which was not actually used for any stream.\n", e->key,
1590 option->help ? option->help : "", nb_output_files - 1, filename);
1592 av_dict_free(&unused_opts);
1594 /* check filename in case of an image number is expected */
1595 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1596 if (!av_filename_number_test(oc->filename)) {
1597 print_error(oc->filename, AVERROR(EINVAL));
1602 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1603 /* test if it already exists to avoid losing precious files */
1604 assert_file_overwrite(filename);
1607 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1608 &oc->interrupt_callback,
1610 print_error(filename, err);
1615 if (o->mux_preload) {
1617 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1618 av_dict_set(&of->opts, "preload", buf, 0);
1620 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1621 oc->flags |= AVFMT_FLAG_NONBLOCK;
1624 for (i = 0; i < o->nb_metadata_map; i++) {
1626 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1628 if (in_file_index >= nb_input_files) {
1629 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1632 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1633 in_file_index >= 0 ?
1634 input_files[in_file_index]->ctx : NULL, o);
1638 if (o->chapters_input_file >= nb_input_files) {
1639 if (o->chapters_input_file == INT_MAX) {
1640 /* copy chapters from the first input file that has them*/
1641 o->chapters_input_file = -1;
1642 for (i = 0; i < nb_input_files; i++)
1643 if (input_files[i]->ctx->nb_chapters) {
1644 o->chapters_input_file = i;
1648 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1649 o->chapters_input_file);
1653 if (o->chapters_input_file >= 0)
1654 copy_chapters(input_files[o->chapters_input_file], of,
1655 !o->metadata_chapters_manual);
1657 /* copy global metadata by default */
1658 if (!o->metadata_global_manual && nb_input_files)
1659 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1660 AV_DICT_DONT_OVERWRITE);
1661 if (!o->metadata_streams_manual)
1662 for (i = of->ost_index; i < nb_output_streams; i++) {
1664 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1666 ist = input_streams[output_streams[i]->source_index];
1667 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1670 /* process manually set metadata */
1671 for (i = 0; i < o->nb_metadata; i++) {
1674 const char *stream_spec;
1675 int index = 0, j, ret;
1677 val = strchr(o->metadata[i].u.str, '=');
1679 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1680 o->metadata[i].u.str);
1685 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1687 for (j = 0; j < oc->nb_streams; j++) {
1688 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1689 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1700 if (index < 0 || index >= oc->nb_chapters) {
1701 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1704 m = &oc->chapters[index]->metadata;
1707 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1710 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1717 static int opt_target(void *optctx, const char *opt, const char *arg)
1719 OptionsContext *o = optctx;
1720 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1721 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1723 if (!strncmp(arg, "pal-", 4)) {
1726 } else if (!strncmp(arg, "ntsc-", 5)) {
1729 } else if (!strncmp(arg, "film-", 5)) {
1733 /* Try to determine PAL/NTSC by peeking in the input files */
1734 if (nb_input_files) {
1736 for (j = 0; j < nb_input_files; j++) {
1737 for (i = 0; i < input_files[j]->nb_streams; i++) {
1738 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1739 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
1741 fr = c->time_base.den * 1000 / c->time_base.num;
1745 } else if ((fr == 29970) || (fr == 23976)) {
1750 if (norm != UNKNOWN)
1754 if (norm != UNKNOWN)
1755 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1758 if (norm == UNKNOWN) {
1759 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1760 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1761 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1765 if (!strcmp(arg, "vcd")) {
1766 opt_video_codec(o, "c:v", "mpeg1video");
1767 opt_audio_codec(o, "c:a", "mp2");
1768 parse_option(o, "f", "vcd", options);
1770 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1771 parse_option(o, "r", frame_rates[norm], options);
1772 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1774 opt_default(NULL, "b", "1150000");
1775 opt_default(NULL, "maxrate", "1150000");
1776 opt_default(NULL, "minrate", "1150000");
1777 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
1779 opt_default(NULL, "b:a", "224000");
1780 parse_option(o, "ar", "44100", options);
1781 parse_option(o, "ac", "2", options);
1783 opt_default(NULL, "packetsize", "2324");
1784 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
1786 /* We have to offset the PTS, so that it is consistent with the SCR.
1787 SCR starts at 36000, but the first two packs contain only padding
1788 and the first pack from the other stream, respectively, may also have
1789 been written before.
1790 So the real data starts at SCR 36000+3*1200. */
1791 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1792 } else if (!strcmp(arg, "svcd")) {
1794 opt_video_codec(o, "c:v", "mpeg2video");
1795 opt_audio_codec(o, "c:a", "mp2");
1796 parse_option(o, "f", "svcd", options);
1798 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1799 parse_option(o, "r", frame_rates[norm], options);
1800 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1802 opt_default(NULL, "b", "2040000");
1803 opt_default(NULL, "maxrate", "2516000");
1804 opt_default(NULL, "minrate", "0"); // 1145000;
1805 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1806 opt_default(NULL, "flags", "+scan_offset");
1809 opt_default(NULL, "b:a", "224000");
1810 parse_option(o, "ar", "44100", options);
1812 opt_default(NULL, "packetsize", "2324");
1814 } else if (!strcmp(arg, "dvd")) {
1816 opt_video_codec(o, "c:v", "mpeg2video");
1817 opt_audio_codec(o, "c:a", "ac3");
1818 parse_option(o, "f", "dvd", options);
1820 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1821 parse_option(o, "r", frame_rates[norm], options);
1822 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1824 opt_default(NULL, "b", "6000000");
1825 opt_default(NULL, "maxrate", "9000000");
1826 opt_default(NULL, "minrate", "0"); // 1500000;
1827 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1829 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1830 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
1832 opt_default(NULL, "b:a", "448000");
1833 parse_option(o, "ar", "48000", options);
1835 } else if (!strncmp(arg, "dv", 2)) {
1837 parse_option(o, "f", "dv", options);
1839 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1840 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1841 norm == PAL ? "yuv420p" : "yuv411p", options);
1842 parse_option(o, "r", frame_rates[norm], options);
1844 parse_option(o, "ar", "48000", options);
1845 parse_option(o, "ac", "2", options);
1848 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1849 return AVERROR(EINVAL);
1854 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1856 av_free (vstats_filename);
1857 vstats_filename = av_strdup (arg);
1861 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1864 time_t today2 = time(NULL);
1865 struct tm *today = localtime(&today2);
1867 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1869 return opt_vstats_file(NULL, opt, filename);
1872 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1874 OptionsContext *o = optctx;
1875 return parse_option(o, "frames:v", arg, options);
1878 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1880 OptionsContext *o = optctx;
1881 return parse_option(o, "frames:a", arg, options);
1884 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1886 OptionsContext *o = optctx;
1887 return parse_option(o, "frames:d", arg, options);
1890 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
1892 OptionsContext *o = optctx;
1893 return parse_option(o, "tag:v", arg, options);
1896 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
1898 OptionsContext *o = optctx;
1899 return parse_option(o, "tag:a", arg, options);
1902 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
1904 OptionsContext *o = optctx;
1905 return parse_option(o, "tag:s", arg, options);
1908 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
1910 OptionsContext *o = optctx;
1911 return parse_option(o, "filter:v", arg, options);
1914 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
1916 OptionsContext *o = optctx;
1917 return parse_option(o, "filter:a", arg, options);
1920 static int opt_vsync(void *optctx, const char *opt, const char *arg)
1922 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
1923 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
1924 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
1926 if (video_sync_method == VSYNC_AUTO)
1927 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
1931 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
1933 OptionsContext *o = optctx;
1934 char layout_str[32];
1937 int ret, channels, ac_str_size;
1940 layout = av_get_channel_layout(arg);
1942 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
1943 return AVERROR(EINVAL);
1945 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
1946 ret = opt_default(NULL, opt, layout_str);
1950 /* set 'ac' option based on channel layout */
1951 channels = av_get_channel_layout_nb_channels(layout);
1952 snprintf(layout_str, sizeof(layout_str), "%d", channels);
1953 stream_str = strchr(opt, ':');
1954 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
1955 ac_str = av_mallocz(ac_str_size);
1957 return AVERROR(ENOMEM);
1958 av_strlcpy(ac_str, "ac", 3);
1960 av_strlcat(ac_str, stream_str, ac_str_size);
1961 ret = parse_option(o, ac_str, layout_str, options);
1967 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
1969 OptionsContext *o = optctx;
1970 return parse_option(o, "q:a", arg, options);
1973 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
1975 GROW_ARRAY(filtergraphs, nb_filtergraphs);
1976 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
1977 return AVERROR(ENOMEM);
1978 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
1979 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
1980 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
1981 return AVERROR(ENOMEM);
1985 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
1987 uint8_t *graph_desc = read_file(arg);
1989 return AVERROR(EINVAL);
1991 GROW_ARRAY(filtergraphs, nb_filtergraphs);
1992 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
1993 return AVERROR(ENOMEM);
1994 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
1995 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
1999 void show_help_default(const char *opt, const char *arg)
2001 /* per-file options have at least one of those set */
2002 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2003 int show_advanced = 0, show_avoptions = 0;
2006 if (!strcmp(opt, "long"))
2008 else if (!strcmp(opt, "full"))
2009 show_advanced = show_avoptions = 1;
2011 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2016 printf("Getting help:\n"
2017 " -h -- print basic options\n"
2018 " -h long -- print more options\n"
2019 " -h full -- print all options (including all format and codec specific options, very long)\n"
2020 " See man %s for detailed description of the options.\n"
2021 "\n", program_name);
2023 show_help_options(options, "Print help / information / capabilities:",
2026 show_help_options(options, "Global options (affect whole program "
2027 "instead of just one file:",
2028 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2030 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2031 per_file | OPT_EXIT, 0);
2033 show_help_options(options, "Per-file main options:", 0,
2034 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2035 OPT_EXIT, per_file);
2037 show_help_options(options, "Advanced per-file options:",
2038 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2040 show_help_options(options, "Video options:",
2041 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2043 show_help_options(options, "Advanced Video options:",
2044 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2046 show_help_options(options, "Audio options:",
2047 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2049 show_help_options(options, "Advanced Audio options:",
2050 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2051 show_help_options(options, "Subtitle options:",
2052 OPT_SUBTITLE, 0, 0);
2055 if (show_avoptions) {
2056 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2057 show_help_children(avcodec_get_class(), flags);
2058 show_help_children(avformat_get_class(), flags);
2059 show_help_children(sws_get_class(), flags);
2060 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM);
2064 void show_usage(void)
2066 printf("Hyper fast Audio and Video encoder\n");
2067 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2076 static const OptionGroupDef groups[] = {
2077 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2078 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2081 static int open_files(OptionGroupList *l, const char *inout,
2082 int (*open_file)(OptionsContext*, const char*))
2086 for (i = 0; i < l->nb_groups; i++) {
2087 OptionGroup *g = &l->groups[i];
2093 ret = parse_optgroup(&o, g);
2095 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2096 "%s.\n", inout, g->arg);
2100 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2101 ret = open_file(&o, g->arg);
2104 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2108 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2114 int avconv_parse_options(int argc, char **argv)
2116 OptionParseContext octx;
2120 memset(&octx, 0, sizeof(octx));
2122 /* split the commandline into an internal representation */
2123 ret = split_commandline(&octx, argc, argv, options, groups,
2124 FF_ARRAY_ELEMS(groups));
2126 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2130 /* apply global options */
2131 ret = parse_optgroup(NULL, &octx.global_opts);
2133 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2137 /* open input files */
2138 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2140 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2144 /* open output files */
2145 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2147 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2152 uninit_parse_context(&octx);
2154 av_strerror(ret, error, sizeof(error));
2155 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2160 #define OFFSET(x) offsetof(OptionsContext, x)
2161 const OptionDef options[] = {
2163 #include "cmdutils_common_opts.h"
2164 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2165 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2166 "force format", "fmt" },
2167 { "y", OPT_BOOL, { &file_overwrite },
2168 "overwrite output files" },
2169 { "n", OPT_BOOL, { &file_skip },
2170 "never overwrite output files" },
2171 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2172 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2173 "codec name", "codec" },
2174 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2175 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2176 "codec name", "codec" },
2177 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2178 OPT_OUTPUT, { .off = OFFSET(presets) },
2179 "preset name", "preset" },
2180 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2181 OPT_OUTPUT, { .func_arg = opt_map },
2182 "set input stream mapping",
2183 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2184 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2185 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2186 "set metadata information of outfile from infile",
2187 "outfile[,metadata]:infile[,metadata]" },
2188 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2189 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2190 "set chapters mapping", "input_file_index" },
2191 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2192 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2193 "record or transcode \"duration\" seconds of audio/video",
2195 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2196 "set the limit file size in bytes", "limit_size" },
2197 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2198 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2199 "set the start time offset", "time_off" },
2200 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2201 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2202 "enable/disable accurate seeking with -ss" },
2203 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2204 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2205 "set the input ts offset", "time_off" },
2206 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2207 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2208 "set the input ts scale", "scale" },
2209 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2210 "add metadata", "string=string" },
2211 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2212 OPT_OUTPUT, { .func_arg = opt_data_frames },
2213 "set the number of data frames to record", "number" },
2214 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2215 "add timings for benchmarking" },
2216 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2217 "set max runtime in seconds", "limit" },
2218 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2219 "dump each input packet" },
2220 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2221 "when dumping packets, also dump the payload" },
2222 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2223 OPT_INPUT, { .off = OFFSET(rate_emu) },
2224 "read input at native frame rate", "" },
2225 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2226 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2227 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2228 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2229 "video sync method", "" },
2230 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2231 "audio sync method", "" },
2232 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2233 "audio drift threshold", "threshold" },
2234 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2235 "copy timestamps" },
2236 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2237 "copy input stream time base when stream copying" },
2238 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2239 OPT_OUTPUT, { .off = OFFSET(shortest) },
2240 "finish encoding within shortest input" },
2241 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2242 "timestamp discontinuity delta threshold", "threshold" },
2243 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2244 "exit on error", "error" },
2245 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2246 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2247 "copy initial non-keyframes" },
2248 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2249 "set the number of frames to record", "number" },
2250 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2251 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2252 "force codec tag/fourcc", "fourcc/tag" },
2253 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2254 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2255 "use fixed quality scale (VBR)", "q" },
2256 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2257 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2258 "use fixed quality scale (VBR)", "q" },
2259 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2260 "set stream filterchain", "filter_list" },
2261 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2262 "read stream filtergraph description from a file", "filename" },
2263 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2264 "create a complex filtergraph", "graph_description" },
2265 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2266 "read complex filtergraph description from a file", "filename" },
2267 { "stats", OPT_BOOL, { &print_stats },
2268 "print progress report during encoding", },
2269 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2270 OPT_OUTPUT, { .func_arg = opt_attach },
2271 "add an attachment to the output file", "filename" },
2272 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2273 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2274 "extract an attachment into a file", "filename" },
2277 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2278 "set the number of video frames to record", "number" },
2279 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2280 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2281 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2282 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2283 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2284 "set frame size (WxH or abbreviation)", "size" },
2285 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2286 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2287 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2288 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2289 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2290 "set pixel format", "format" },
2291 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2293 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2294 "discard threshold", "n" },
2295 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2296 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2297 "rate control override for specific intervals", "override" },
2298 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2299 OPT_OUTPUT, { .func_arg = opt_video_codec },
2300 "force video codec ('copy' to copy stream)", "codec" },
2301 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2302 "select the pass number (1 or 2)", "n" },
2303 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2304 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2305 "select two pass log file name prefix", "prefix" },
2306 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2307 "dump video coding statistics to file" },
2308 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2309 "dump video coding statistics to file", "file" },
2310 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2311 "video filters", "filter list" },
2312 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2313 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2314 "specify intra matrix coeffs", "matrix" },
2315 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2316 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2317 "specify inter matrix coeffs", "matrix" },
2318 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2319 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2320 "top=1/bottom=0/auto=-1 field first", "" },
2321 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2322 "intra_dc_precision", "precision" },
2323 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2324 OPT_OUTPUT, { .func_arg = opt_video_tag },
2325 "force video tag/fourcc", "fourcc/tag" },
2326 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2327 "show QP histogram" },
2328 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2329 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2330 "force the selected framerate, disable the best supported framerate selection" },
2331 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2332 OPT_OUTPUT, { .func_arg = opt_streamid },
2333 "set the value of an outfile streamid", "streamIndex:value" },
2334 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2335 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2336 "force key frames at specified timestamps", "timestamps" },
2337 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2338 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
2339 "use HW accelerated decoding", "hwaccel name" },
2340 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2341 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
2342 "select a device for HW acceleration" "devicename" },
2345 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2346 "set the number of audio frames to record", "number" },
2347 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2348 "set audio quality (codec-specific)", "quality", },
2349 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2350 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2351 "set audio sampling rate (in Hz)", "rate" },
2352 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2353 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2354 "set number of audio channels", "channels" },
2355 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2357 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2358 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2359 "force audio codec ('copy' to copy stream)", "codec" },
2360 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2361 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2362 "force audio tag/fourcc", "fourcc/tag" },
2363 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2364 "change audio volume (256=normal)" , "volume" },
2365 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2366 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2367 "set sample format", "format" },
2368 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2369 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2370 "set channel layout", "layout" },
2371 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2372 "audio filters", "filter list" },
2374 /* subtitle options */
2375 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2376 "disable subtitle" },
2377 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2378 "force subtitle codec ('copy' to copy stream)", "codec" },
2379 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2380 , "force subtitle tag/fourcc", "fourcc/tag" },
2383 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2386 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2387 "set the maximum demux-decode delay", "seconds" },
2388 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2389 "set the initial demux-decode delay", "seconds" },
2391 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2392 "A comma-separated list of bitstream filters", "bitstream_filters" },
2394 /* data codec support */
2395 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2396 "force data codec ('copy' to copy stream)", "codec" },