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 DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
46 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
49 for (i = 0; i < o->nb_ ## name; i++) {\
50 char *spec = o->name[i].specifier;\
51 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
52 outvar = o->name[i].u.type;\
58 const HWAccel hwaccels[] = {
60 { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
63 { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
66 { "vda", vda_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
71 char *vstats_filename;
73 float audio_drift_threshold = 0.1;
74 float dts_delta_threshold = 10;
76 int audio_volume = 256;
77 int audio_sync_method = 0;
78 int video_sync_method = VSYNC_AUTO;
84 int exit_on_error = 0;
88 static int file_overwrite = 0;
89 static int file_skip = 0;
90 static int video_discard = 0;
91 static int intra_dc_precision = 8;
92 static int using_stdin = 0;
93 static int input_sync;
95 static void uninit_options(OptionsContext *o)
97 const OptionDef *po = options;
100 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
102 void *dst = (uint8_t*)o + po->u.off;
104 if (po->flags & OPT_SPEC) {
105 SpecifierOpt **so = dst;
106 int i, *count = (int*)(so + 1);
107 for (i = 0; i < *count; i++) {
108 av_freep(&(*so)[i].specifier);
109 if (po->flags & OPT_STRING)
110 av_freep(&(*so)[i].u.str);
114 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
119 for (i = 0; i < o->nb_stream_maps; i++)
120 av_freep(&o->stream_maps[i].linklabel);
121 av_freep(&o->stream_maps);
122 av_freep(&o->meta_data_maps);
123 av_freep(&o->streamid_map);
126 static void init_options(OptionsContext *o)
128 memset(o, 0, sizeof(*o));
130 o->mux_max_delay = 0.7;
131 o->start_time = AV_NOPTS_VALUE;
132 o->recording_time = INT64_MAX;
133 o->limit_filesize = UINT64_MAX;
134 o->chapters_input_file = INT_MAX;
135 o->accurate_seek = 1;
138 /* return a copy of the input with the stream specifiers removed from the keys */
139 static AVDictionary *strip_specifiers(AVDictionary *dict)
141 AVDictionaryEntry *e = NULL;
142 AVDictionary *ret = NULL;
144 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
145 char *p = strchr(e->key, ':');
149 av_dict_set(&ret, e->key, e->value, 0);
156 static double parse_frame_aspect_ratio(const char *arg)
163 p = strchr(arg, ':');
165 x = strtol(arg, &end, 10);
167 y = strtol(end + 1, &end, 10);
169 ar = (double)x / (double)y;
171 ar = strtod(arg, NULL);
174 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
180 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
184 printf("Supported hardware acceleration:\n");
185 for (i = 0; i < FF_ARRAY_ELEMS(hwaccels) - 1; i++) {
186 printf("%s\n", hwaccels[i].name);
192 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
194 OptionsContext *o = optctx;
195 return parse_option(o, "codec:a", arg, options);
198 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
200 OptionsContext *o = optctx;
201 return parse_option(o, "codec:v", arg, options);
204 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
206 OptionsContext *o = optctx;
207 return parse_option(o, "codec:s", arg, options);
210 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
212 OptionsContext *o = optctx;
213 return parse_option(o, "codec:d", arg, options);
216 static int opt_map(void *optctx, const char *opt, const char *arg)
218 OptionsContext *o = optctx;
220 int i, negative = 0, file_idx;
221 int sync_file_idx = -1, sync_stream_idx;
229 map = av_strdup(arg);
231 return AVERROR(ENOMEM);
233 /* parse sync stream first, just pick first matching stream */
234 if (sync = strchr(map, ',')) {
236 sync_file_idx = strtol(sync + 1, &sync, 0);
237 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
238 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
243 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
244 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
245 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
249 if (i == input_files[sync_file_idx]->nb_streams) {
250 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
251 "match any streams.\n", arg);
258 /* this mapping refers to lavfi output */
259 const char *c = map + 1;
260 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
261 m = &o->stream_maps[o->nb_stream_maps - 1];
262 m->linklabel = av_get_token(&c, "]");
264 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
268 file_idx = strtol(map, &p, 0);
269 if (file_idx >= nb_input_files || file_idx < 0) {
270 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
274 /* disable some already defined maps */
275 for (i = 0; i < o->nb_stream_maps; i++) {
276 m = &o->stream_maps[i];
277 if (file_idx == m->file_index &&
278 check_stream_specifier(input_files[m->file_index]->ctx,
279 input_files[m->file_index]->ctx->streams[m->stream_index],
280 *p == ':' ? p + 1 : p) > 0)
284 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
285 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
286 *p == ':' ? p + 1 : p) <= 0)
288 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
289 m = &o->stream_maps[o->nb_stream_maps - 1];
291 m->file_index = file_idx;
294 if (sync_file_idx >= 0) {
295 m->sync_file_index = sync_file_idx;
296 m->sync_stream_index = sync_stream_idx;
298 m->sync_file_index = file_idx;
299 m->sync_stream_index = i;
305 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
313 static int opt_attach(void *optctx, const char *opt, const char *arg)
315 OptionsContext *o = optctx;
316 GROW_ARRAY(o->attachments, o->nb_attachments);
317 o->attachments[o->nb_attachments - 1] = arg;
322 * Parse a metadata specifier passed as 'arg' parameter.
323 * @param arg metadata string to parse
324 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
325 * @param index for type c/p, chapter/program index is written here
326 * @param stream_spec for type s, the stream specifier is written here
328 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
336 if (*(++arg) && *arg != ':') {
337 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
340 *stream_spec = *arg == ':' ? arg + 1 : "";
345 *index = strtol(++arg, NULL, 0);
348 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
355 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
357 AVDictionary **meta_in = NULL;
358 AVDictionary **meta_out;
360 char type_in, type_out;
361 const char *istream_spec = NULL, *ostream_spec = NULL;
362 int idx_in = 0, idx_out = 0;
364 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
365 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
367 if (type_in == 'g' || type_out == 'g')
368 o->metadata_global_manual = 1;
369 if (type_in == 's' || type_out == 's')
370 o->metadata_streams_manual = 1;
371 if (type_in == 'c' || type_out == 'c')
372 o->metadata_chapters_manual = 1;
374 /* ic is NULL when just disabling automatic mappings */
378 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
379 if ((index) < 0 || (index) >= (nb_elems)) {\
380 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
385 #define SET_DICT(type, meta, context, index)\
388 meta = &context->metadata;\
391 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
392 meta = &context->chapters[index]->metadata;\
395 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
396 meta = &context->programs[index]->metadata;\
399 break; /* handled separately below */ \
400 default: av_assert0(0);\
403 SET_DICT(type_in, meta_in, ic, idx_in);
404 SET_DICT(type_out, meta_out, oc, idx_out);
406 /* for input streams choose first matching stream */
407 if (type_in == 's') {
408 for (i = 0; i < ic->nb_streams; i++) {
409 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
410 meta_in = &ic->streams[i]->metadata;
416 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
421 if (type_out == 's') {
422 for (i = 0; i < oc->nb_streams; i++) {
423 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
424 meta_out = &oc->streams[i]->metadata;
425 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
430 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
435 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
437 const AVCodecDescriptor *desc;
438 const char *codec_string = encoder ? "encoder" : "decoder";
442 avcodec_find_encoder_by_name(name) :
443 avcodec_find_decoder_by_name(name);
445 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
446 codec = encoder ? avcodec_find_encoder(desc->id) :
447 avcodec_find_decoder(desc->id);
449 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
450 codec_string, codec->name, desc->name);
454 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
457 if (codec->type != type) {
458 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
464 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
466 char *codec_name = NULL;
468 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
470 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
471 st->codec->codec_id = codec->id;
474 return avcodec_find_decoder(st->codec->codec_id);
477 /* Add all the streams from the given input file to the global
478 * list of input streams. */
479 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
483 for (i = 0; i < ic->nb_streams; i++) {
484 AVStream *st = ic->streams[i];
485 AVCodecContext *dec = st->codec;
486 InputStream *ist = av_mallocz(sizeof(*ist));
487 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
488 char *codec_tag = NULL;
494 GROW_ARRAY(input_streams, nb_input_streams);
495 input_streams[nb_input_streams - 1] = ist;
498 ist->file_index = nb_input_files;
500 st->discard = AVDISCARD_ALL;
502 ist->min_pts = INT64_MAX;
503 ist->max_pts = INT64_MIN;
506 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
509 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
511 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
513 uint32_t tag = strtol(codec_tag, &next, 0);
515 tag = AV_RL32(codec_tag);
516 st->codec->codec_tag = tag;
519 ist->dec = choose_decoder(o, ic, st);
520 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
522 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
524 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
528 ret = avcodec_copy_context(ist->dec_ctx, dec);
530 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
534 switch (dec->codec_type) {
535 case AVMEDIA_TYPE_VIDEO:
536 ist->resample_height = ist->dec_ctx->height;
537 ist->resample_width = ist->dec_ctx->width;
538 ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
540 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
541 if (framerate && av_parse_video_rate(&ist->framerate,
543 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
548 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
550 if (!strcmp(hwaccel, "none"))
551 ist->hwaccel_id = HWACCEL_NONE;
552 else if (!strcmp(hwaccel, "auto"))
553 ist->hwaccel_id = HWACCEL_AUTO;
556 for (i = 0; hwaccels[i].name; i++) {
557 if (!strcmp(hwaccels[i].name, hwaccel)) {
558 ist->hwaccel_id = hwaccels[i].id;
563 if (!ist->hwaccel_id) {
564 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
566 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
567 for (i = 0; hwaccels[i].name; i++)
568 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
569 av_log(NULL, AV_LOG_FATAL, "\n");
575 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
576 if (hwaccel_device) {
577 ist->hwaccel_device = av_strdup(hwaccel_device);
578 if (!ist->hwaccel_device)
581 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
584 case AVMEDIA_TYPE_AUDIO:
585 guess_input_channel_layout(ist);
587 ist->resample_sample_fmt = ist->dec_ctx->sample_fmt;
588 ist->resample_sample_rate = ist->dec_ctx->sample_rate;
589 ist->resample_channels = ist->dec_ctx->channels;
590 ist->resample_channel_layout = ist->dec_ctx->channel_layout;
593 case AVMEDIA_TYPE_DATA:
594 case AVMEDIA_TYPE_SUBTITLE:
595 case AVMEDIA_TYPE_ATTACHMENT:
596 case AVMEDIA_TYPE_UNKNOWN:
604 static void assert_file_overwrite(const char *filename)
606 if (file_overwrite && file_skip) {
607 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
611 if (!file_overwrite &&
612 (!strchr(filename, ':') || filename[1] == ':' ||
613 av_strstart(filename, "file:", NULL))) {
614 if (avio_check(filename, 0) == 0) {
615 if (!using_stdin && !file_skip) {
616 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
619 fprintf(stderr, "Not overwriting - exiting\n");
624 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
631 static void dump_attachment(AVStream *st, const char *filename)
634 AVIOContext *out = NULL;
635 AVDictionaryEntry *e;
637 if (!st->codec->extradata_size) {
638 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
639 nb_input_files - 1, st->index);
642 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
645 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
646 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
650 assert_file_overwrite(filename);
652 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
653 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
658 avio_write(out, st->codec->extradata, st->codec->extradata_size);
663 static int open_input_file(OptionsContext *o, const char *filename)
667 AVInputFormat *file_iformat = NULL;
672 AVDictionary *unused_opts = NULL;
673 AVDictionaryEntry *e = NULL;
674 int orig_nb_streams; // number of streams before avformat_find_stream_info
677 if (!(file_iformat = av_find_input_format(o->format))) {
678 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
683 if (!strcmp(filename, "-"))
686 using_stdin |= !strncmp(filename, "pipe:", 5) ||
687 !strcmp(filename, "/dev/stdin");
689 /* get default parameters from command line */
690 ic = avformat_alloc_context();
692 print_error(filename, AVERROR(ENOMEM));
695 if (o->nb_audio_sample_rate) {
696 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
697 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
699 if (o->nb_audio_channels) {
700 /* because we set audio_channels based on both the "ac" and
701 * "channel_layout" options, we need to check that the specified
702 * demuxer actually has the "channels" option before setting it */
703 if (file_iformat && file_iformat->priv_class &&
704 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
705 AV_OPT_SEARCH_FAKE_OBJ)) {
706 snprintf(buf, sizeof(buf), "%d",
707 o->audio_channels[o->nb_audio_channels - 1].u.i);
708 av_dict_set(&o->g->format_opts, "channels", buf, 0);
711 if (o->nb_frame_rates) {
712 /* set the format-level framerate option;
713 * this is important for video grabbers, e.g. x11 */
714 if (file_iformat && file_iformat->priv_class &&
715 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
716 AV_OPT_SEARCH_FAKE_OBJ)) {
717 av_dict_set(&o->g->format_opts, "framerate",
718 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
721 if (o->nb_frame_sizes) {
722 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
724 if (o->nb_frame_pix_fmts)
725 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
727 ic->flags |= AVFMT_FLAG_NONBLOCK;
728 ic->interrupt_callback = int_cb;
730 /* open the input file with generic libav function */
731 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
733 print_error(filename, err);
736 assert_avoptions(o->g->format_opts);
738 /* apply forced codec ids */
739 for (i = 0; i < ic->nb_streams; i++)
740 choose_decoder(o, ic, ic->streams[i]);
742 /* Set AVCodecContext options for avformat_find_stream_info */
743 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
744 orig_nb_streams = ic->nb_streams;
746 /* If not enough info to get the stream parameters, we decode the
747 first frames to get it. (used in mpeg case for example) */
748 ret = avformat_find_stream_info(ic, opts);
750 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
751 avformat_close_input(&ic);
755 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
756 /* add the stream start time */
757 if (ic->start_time != AV_NOPTS_VALUE)
758 timestamp += ic->start_time;
760 /* if seeking requested, we execute it */
761 if (o->start_time != AV_NOPTS_VALUE) {
762 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
764 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
765 filename, (double)timestamp / AV_TIME_BASE);
769 /* update the current parameters so that they match the one of the input stream */
770 add_input_streams(o, ic);
772 /* dump the file content */
773 av_dump_format(ic, nb_input_files, filename, 0);
775 GROW_ARRAY(input_files, nb_input_files);
776 f = av_mallocz(sizeof(*f));
779 input_files[nb_input_files - 1] = f;
782 f->ist_index = nb_input_streams - ic->nb_streams;
783 f->start_time = o->start_time;
784 f->recording_time = o->recording_time;
785 f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
786 f->nb_streams = ic->nb_streams;
787 f->rate_emu = o->rate_emu;
788 f->accurate_seek = o->accurate_seek;
791 f->time_base = (AVRational){ 1, 1 };
793 /* check if all codec options have been used */
794 unused_opts = strip_specifiers(o->g->codec_opts);
795 for (i = f->ist_index; i < nb_input_streams; i++) {
797 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
798 AV_DICT_IGNORE_SUFFIX)))
799 av_dict_set(&unused_opts, e->key, NULL, 0);
803 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
804 const AVClass *class = avcodec_get_class();
805 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
806 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
809 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
810 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
811 "input file #%d (%s) is not a decoding option.\n", e->key,
812 option->help ? option->help : "", nb_input_files - 1,
817 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
818 "input file #%d (%s) has not been used for any stream. The most "
819 "likely reason is either wrong type (e.g. a video option with "
820 "no video streams) or that it is a private option of some decoder "
821 "which was not actually used for any stream.\n", e->key,
822 option->help ? option->help : "", nb_input_files - 1, filename);
824 av_dict_free(&unused_opts);
826 for (i = 0; i < o->nb_dump_attachment; i++) {
829 for (j = 0; j < ic->nb_streams; j++) {
830 AVStream *st = ic->streams[j];
832 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
833 dump_attachment(st, o->dump_attachment[i].u.str);
837 for (i = 0; i < orig_nb_streams; i++)
838 av_dict_free(&opts[i]);
844 static uint8_t *get_line(AVIOContext *s)
850 if (avio_open_dyn_buf(&line) < 0) {
851 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
855 while ((c = avio_r8(s)) && c != '\n')
858 avio_close_dyn_buf(line, &buf);
863 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
867 const char *base[3] = { getenv("AVCONV_DATADIR"),
872 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
876 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
877 i != 1 ? "" : "/.avconv", codec_name, preset_name);
878 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
881 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
882 i != 1 ? "" : "/.avconv", preset_name);
883 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
889 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
891 char *codec_name = NULL;
893 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
895 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
896 NULL, ost->st->codec->codec_type);
897 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
898 } else if (!strcmp(codec_name, "copy"))
899 ost->stream_copy = 1;
901 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
902 ost->st->codec->codec_id = ost->enc->id;
906 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
909 AVStream *st = avformat_new_stream(oc, NULL);
910 int idx = oc->nb_streams - 1, ret = 0;
911 char *bsf = NULL, *next, *codec_tag = NULL;
912 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
916 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
920 if (oc->nb_streams - 1 < o->nb_streamid_map)
921 st->id = o->streamid_map[oc->nb_streams - 1];
923 GROW_ARRAY(output_streams, nb_output_streams);
924 if (!(ost = av_mallocz(sizeof(*ost))))
926 output_streams[nb_output_streams - 1] = ost;
928 ost->file_index = nb_output_files - 1;
931 st->codec->codec_type = type;
932 choose_encoder(o, oc, ost);
934 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
936 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
939 ost->enc_ctx->codec_type = type;
942 AVIOContext *s = NULL;
943 char *buf = NULL, *arg = NULL, *preset = NULL;
945 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
947 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
948 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
951 if (!buf[0] || buf[0] == '#') {
955 if (!(arg = strchr(buf, '='))) {
956 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
960 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
962 } while (!s->eof_reached);
966 av_log(NULL, AV_LOG_FATAL,
967 "Preset %s specified for stream %d:%d, but could not be opened.\n",
968 preset, ost->file_index, ost->index);
972 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
975 ost->max_frames = INT64_MAX;
976 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
978 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
980 if (next = strchr(bsf, ','))
982 if (!(bsfc = av_bitstream_filter_init(bsf))) {
983 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
987 bsfc_prev->next = bsfc;
989 ost->bitstream_filters = bsfc;
995 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
997 uint32_t tag = strtol(codec_tag, &next, 0);
999 tag = AV_RL32(codec_tag);
1000 ost->enc_ctx->codec_tag = tag;
1003 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1005 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1006 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1009 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1010 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1012 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1014 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1016 ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
1017 ost->last_mux_dts = AV_NOPTS_VALUE;
1022 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1025 const char *p = str;
1032 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1039 /* read file contents into a string */
1040 static uint8_t *read_file(const char *filename)
1042 AVIOContext *pb = NULL;
1043 AVIOContext *dyn_buf = NULL;
1044 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1045 uint8_t buf[1024], *str;
1048 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1052 ret = avio_open_dyn_buf(&dyn_buf);
1057 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1058 avio_write(dyn_buf, buf, ret);
1059 avio_w8(dyn_buf, 0);
1062 ret = avio_close_dyn_buf(dyn_buf, &str);
1068 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1071 AVStream *st = ost->st;
1072 char *filter = NULL, *filter_script = NULL;
1074 MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
1075 MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
1077 if (filter_script && filter) {
1078 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1079 "output stream #%d:%d.\n", nb_output_files, st->index);
1084 return read_file(filter_script);
1086 return av_strdup(filter);
1088 return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
1092 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
1096 AVCodecContext *video_enc;
1097 char *frame_aspect_ratio = NULL;
1099 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
1101 video_enc = ost->enc_ctx;
1103 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1104 if (frame_aspect_ratio)
1105 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
1107 if (!ost->stream_copy) {
1108 const char *p = NULL;
1109 char *frame_rate = NULL, *frame_size = NULL;
1110 char *frame_pix_fmt = NULL;
1111 char *intra_matrix = NULL, *inter_matrix = NULL;
1115 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1116 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1117 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1121 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1122 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1123 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1127 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1128 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1129 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1132 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1134 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1136 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1137 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1140 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1142 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1144 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1145 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1148 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1151 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1152 for (i = 0; p; i++) {
1154 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1156 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1159 video_enc->rc_override =
1160 av_realloc(video_enc->rc_override,
1161 sizeof(RcOverride) * (i + 1));
1162 if (!video_enc->rc_override) {
1163 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1166 video_enc->rc_override[i].start_frame = start;
1167 video_enc->rc_override[i].end_frame = end;
1169 video_enc->rc_override[i].qscale = q;
1170 video_enc->rc_override[i].quality_factor = 1.0;
1173 video_enc->rc_override[i].qscale = 0;
1174 video_enc->rc_override[i].quality_factor = -q/100.0;
1179 video_enc->rc_override_count = i;
1180 video_enc->intra_dc_precision = intra_dc_precision - 8;
1183 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1186 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1188 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1192 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1193 if (ost->logfile_prefix &&
1194 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1198 char logfilename[1024];
1201 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1202 ost->logfile_prefix ? ost->logfile_prefix :
1203 DEFAULT_PASS_LOGFILENAME_PREFIX,
1205 if (!strcmp(ost->enc->name, "libx264")) {
1206 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1208 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1209 f = fopen(logfilename, "wb");
1211 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
1212 logfilename, strerror(errno));
1217 char *logbuffer = read_file(logfilename);
1220 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1224 video_enc->stats_in = logbuffer;
1229 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1230 if (ost->forced_keyframes)
1231 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1233 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1235 ost->top_field_first = -1;
1236 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1239 ost->avfilter = get_ost_filters(o, oc, ost);
1243 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1249 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1253 AVCodecContext *audio_enc;
1255 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1258 audio_enc = ost->enc_ctx;
1259 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1261 if (!ost->stream_copy) {
1262 char *sample_fmt = NULL;
1264 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1266 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1268 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1269 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1273 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1275 ost->avfilter = get_ost_filters(o, oc, ost);
1283 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1287 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1288 if (!ost->stream_copy) {
1289 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1296 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1298 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1299 ost->stream_copy = 1;
1304 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1307 AVCodecContext *subtitle_enc;
1309 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1310 subtitle_enc = ost->enc_ctx;
1312 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1317 /* arg format is "output-stream-index:streamid-value". */
1318 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1320 OptionsContext *o = optctx;
1325 av_strlcpy(idx_str, arg, sizeof(idx_str));
1326 p = strchr(idx_str, ':');
1328 av_log(NULL, AV_LOG_FATAL,
1329 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1334 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1335 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1336 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1340 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1342 AVFormatContext *is = ifile->ctx;
1343 AVFormatContext *os = ofile->ctx;
1347 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1349 return AVERROR(ENOMEM);
1352 for (i = 0; i < is->nb_chapters; i++) {
1353 AVChapter *in_ch = is->chapters[i], *out_ch;
1354 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1355 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1356 AV_TIME_BASE_Q, in_ch->time_base);
1357 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1358 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1361 if (in_ch->end < ts_off)
1363 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1366 out_ch = av_mallocz(sizeof(AVChapter));
1368 return AVERROR(ENOMEM);
1370 out_ch->id = in_ch->id;
1371 out_ch->time_base = in_ch->time_base;
1372 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1373 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1376 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1378 os->chapters[os->nb_chapters++] = out_ch;
1383 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1384 AVFormatContext *oc)
1388 switch (ofilter->type) {
1389 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1390 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1392 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1397 ost->source_index = -1;
1398 ost->filter = ofilter;
1402 if (ost->stream_copy) {
1403 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1404 "which is fed from a complex filtergraph. Filtering and streamcopy "
1405 "cannot be used together.\n", ost->file_index, ost->index);
1409 avfilter_inout_free(&ofilter->out_tmp);
1412 static int init_complex_filters(void)
1416 for (i = 0; i < nb_filtergraphs; i++) {
1417 ret = init_complex_filtergraph(filtergraphs[i]);
1424 static int configure_complex_filters(void)
1428 for (i = 0; i < nb_filtergraphs; i++)
1429 if (!filtergraphs[i]->graph &&
1430 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1435 static int open_output_file(OptionsContext *o, const char *filename)
1437 AVFormatContext *oc;
1439 AVOutputFormat *file_oformat;
1443 AVDictionary *unused_opts = NULL;
1444 AVDictionaryEntry *e = NULL;
1446 GROW_ARRAY(output_files, nb_output_files);
1447 of = av_mallocz(sizeof(*of));
1450 output_files[nb_output_files - 1] = of;
1452 of->ost_index = nb_output_streams;
1453 of->recording_time = o->recording_time;
1454 of->start_time = o->start_time;
1455 of->limit_filesize = o->limit_filesize;
1456 of->shortest = o->shortest;
1457 av_dict_copy(&of->opts, o->g->format_opts, 0);
1459 if (!strcmp(filename, "-"))
1462 oc = avformat_alloc_context();
1464 print_error(filename, AVERROR(ENOMEM));
1468 if (o->recording_time != INT64_MAX)
1469 oc->duration = o->recording_time;
1472 file_oformat = av_guess_format(o->format, NULL, NULL);
1473 if (!file_oformat) {
1474 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1478 file_oformat = av_guess_format(NULL, filename, NULL);
1479 if (!file_oformat) {
1480 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1486 oc->oformat = file_oformat;
1487 oc->interrupt_callback = int_cb;
1488 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1490 /* create streams for all unlabeled output pads */
1491 for (i = 0; i < nb_filtergraphs; i++) {
1492 FilterGraph *fg = filtergraphs[i];
1493 for (j = 0; j < fg->nb_outputs; j++) {
1494 OutputFilter *ofilter = fg->outputs[j];
1496 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1499 switch (ofilter->type) {
1500 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1501 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1502 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1504 init_output_filter(ofilter, o, oc);
1508 if (!o->nb_stream_maps) {
1509 /* pick the "best" stream of each type */
1510 #define NEW_STREAM(type, index)\
1512 ost = new_ ## type ## _stream(o, oc);\
1513 ost->source_index = index;\
1514 ost->sync_ist = input_streams[index];\
1515 input_streams[index]->discard = 0;\
1516 input_streams[index]->st->discard = AVDISCARD_NONE;\
1519 /* video: highest resolution */
1520 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1521 int area = 0, idx = -1;
1522 for (i = 0; i < nb_input_streams; i++) {
1523 ist = input_streams[i];
1524 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1525 ist->st->codec->width * ist->st->codec->height > area) {
1526 area = ist->st->codec->width * ist->st->codec->height;
1530 NEW_STREAM(video, idx);
1533 /* audio: most channels */
1534 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1535 int channels = 0, idx = -1;
1536 for (i = 0; i < nb_input_streams; i++) {
1537 ist = input_streams[i];
1538 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1539 ist->st->codec->channels > channels) {
1540 channels = ist->st->codec->channels;
1544 NEW_STREAM(audio, idx);
1547 /* subtitles: pick first */
1548 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1549 for (i = 0; i < nb_input_streams; i++)
1550 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1551 NEW_STREAM(subtitle, i);
1555 /* do something with data? */
1557 for (i = 0; i < o->nb_stream_maps; i++) {
1558 StreamMap *map = &o->stream_maps[i];
1563 if (map->linklabel) {
1565 OutputFilter *ofilter = NULL;
1568 for (j = 0; j < nb_filtergraphs; j++) {
1569 fg = filtergraphs[j];
1570 for (k = 0; k < fg->nb_outputs; k++) {
1571 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1572 if (out && !strcmp(out->name, map->linklabel)) {
1573 ofilter = fg->outputs[k];
1580 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1581 "in any defined filter graph.\n", map->linklabel);
1584 init_output_filter(ofilter, o, oc);
1586 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1587 switch (ist->st->codec->codec_type) {
1588 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1589 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1590 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1591 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1592 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1594 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1595 map->file_index, map->stream_index);
1599 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1600 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1601 map->sync_stream_index];
1603 ist->st->discard = AVDISCARD_NONE;
1608 /* handle attached files */
1609 for (i = 0; i < o->nb_attachments; i++) {
1611 uint8_t *attachment;
1615 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1616 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1620 if ((len = avio_size(pb)) <= 0) {
1621 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1625 if (!(attachment = av_malloc(len))) {
1626 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1630 avio_read(pb, attachment, len);
1632 ost = new_attachment_stream(o, oc);
1633 ost->stream_copy = 0;
1634 ost->source_index = -1;
1635 ost->attachment_filename = o->attachments[i];
1636 ost->st->codec->extradata = attachment;
1637 ost->st->codec->extradata_size = len;
1639 p = strrchr(o->attachments[i], '/');
1640 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1644 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
1645 av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
1646 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
1650 /* check if all codec options have been used */
1651 unused_opts = strip_specifiers(o->g->codec_opts);
1652 for (i = of->ost_index; i < nb_output_streams; i++) {
1654 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
1655 AV_DICT_IGNORE_SUFFIX)))
1656 av_dict_set(&unused_opts, e->key, NULL, 0);
1660 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1661 const AVClass *class = avcodec_get_class();
1662 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1663 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1666 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1667 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1668 "output file #%d (%s) is not an encoding option.\n", e->key,
1669 option->help ? option->help : "", nb_output_files - 1,
1674 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1675 "output file #%d (%s) has not been used for any stream. The most "
1676 "likely reason is either wrong type (e.g. a video option with "
1677 "no video streams) or that it is a private option of some encoder "
1678 "which was not actually used for any stream.\n", e->key,
1679 option->help ? option->help : "", nb_output_files - 1, filename);
1681 av_dict_free(&unused_opts);
1683 /* set the encoding/decoding_needed flags */
1684 for (i = of->ost_index; i < nb_output_streams; i++) {
1685 OutputStream *ost = output_streams[i];
1687 ost->encoding_needed = !ost->stream_copy;
1688 if (ost->encoding_needed && ost->source_index >= 0) {
1689 InputStream *ist = input_streams[ost->source_index];
1690 ist->decoding_needed = 1;
1694 /* check filename in case of an image number is expected */
1695 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1696 if (!av_filename_number_test(oc->filename)) {
1697 print_error(oc->filename, AVERROR(EINVAL));
1702 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1703 /* test if it already exists to avoid losing precious files */
1704 assert_file_overwrite(filename);
1707 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1708 &oc->interrupt_callback,
1710 print_error(filename, err);
1715 if (o->mux_preload) {
1717 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1718 av_dict_set(&of->opts, "preload", buf, 0);
1720 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1721 oc->flags |= AVFMT_FLAG_NONBLOCK;
1724 for (i = 0; i < o->nb_metadata_map; i++) {
1726 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1728 if (in_file_index >= nb_input_files) {
1729 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1732 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1733 in_file_index >= 0 ?
1734 input_files[in_file_index]->ctx : NULL, o);
1738 if (o->chapters_input_file >= nb_input_files) {
1739 if (o->chapters_input_file == INT_MAX) {
1740 /* copy chapters from the first input file that has them*/
1741 o->chapters_input_file = -1;
1742 for (i = 0; i < nb_input_files; i++)
1743 if (input_files[i]->ctx->nb_chapters) {
1744 o->chapters_input_file = i;
1748 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1749 o->chapters_input_file);
1753 if (o->chapters_input_file >= 0)
1754 copy_chapters(input_files[o->chapters_input_file], of,
1755 !o->metadata_chapters_manual);
1757 /* copy global metadata by default */
1758 if (!o->metadata_global_manual && nb_input_files)
1759 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1760 AV_DICT_DONT_OVERWRITE);
1761 if (!o->metadata_streams_manual)
1762 for (i = of->ost_index; i < nb_output_streams; i++) {
1764 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1766 ist = input_streams[output_streams[i]->source_index];
1767 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1770 /* process manually set metadata */
1771 for (i = 0; i < o->nb_metadata; i++) {
1774 const char *stream_spec;
1775 int index = 0, j, ret;
1777 val = strchr(o->metadata[i].u.str, '=');
1779 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1780 o->metadata[i].u.str);
1785 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1787 for (j = 0; j < oc->nb_streams; j++) {
1788 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1789 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1800 if (index < 0 || index >= oc->nb_chapters) {
1801 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1804 m = &oc->chapters[index]->metadata;
1807 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1810 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1817 static int opt_target(void *optctx, const char *opt, const char *arg)
1819 OptionsContext *o = optctx;
1820 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1821 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1823 if (!strncmp(arg, "pal-", 4)) {
1826 } else if (!strncmp(arg, "ntsc-", 5)) {
1829 } else if (!strncmp(arg, "film-", 5)) {
1833 /* Try to determine PAL/NTSC by peeking in the input files */
1834 if (nb_input_files) {
1836 for (j = 0; j < nb_input_files; j++) {
1837 for (i = 0; i < input_files[j]->nb_streams; i++) {
1838 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1839 if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
1842 fr = c->time_base.den * 1000 / c->time_base.num;
1846 } else if ((fr == 29970) || (fr == 23976)) {
1851 if (norm != UNKNOWN)
1855 if (norm != UNKNOWN)
1856 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1859 if (norm == UNKNOWN) {
1860 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1861 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1862 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1866 if (!strcmp(arg, "vcd")) {
1867 opt_video_codec(o, "c:v", "mpeg1video");
1868 opt_audio_codec(o, "c:a", "mp2");
1869 parse_option(o, "f", "vcd", options);
1871 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1872 parse_option(o, "r", frame_rates[norm], options);
1873 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1875 opt_default(NULL, "b", "1150000");
1876 opt_default(NULL, "maxrate", "1150000");
1877 opt_default(NULL, "minrate", "1150000");
1878 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
1880 opt_default(NULL, "b:a", "224000");
1881 parse_option(o, "ar", "44100", options);
1882 parse_option(o, "ac", "2", options);
1884 opt_default(NULL, "packetsize", "2324");
1885 opt_default(NULL, "muxrate", "3528"); // 2352 * 75 / 50;
1887 /* We have to offset the PTS, so that it is consistent with the SCR.
1888 SCR starts at 36000, but the first two packs contain only padding
1889 and the first pack from the other stream, respectively, may also have
1890 been written before.
1891 So the real data starts at SCR 36000+3*1200. */
1892 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1893 } else if (!strcmp(arg, "svcd")) {
1895 opt_video_codec(o, "c:v", "mpeg2video");
1896 opt_audio_codec(o, "c:a", "mp2");
1897 parse_option(o, "f", "svcd", options);
1899 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1900 parse_option(o, "r", frame_rates[norm], options);
1901 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1903 opt_default(NULL, "b", "2040000");
1904 opt_default(NULL, "maxrate", "2516000");
1905 opt_default(NULL, "minrate", "0"); // 1145000;
1906 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1907 opt_default(NULL, "scan_offset", "1");
1910 opt_default(NULL, "b:a", "224000");
1911 parse_option(o, "ar", "44100", options);
1913 opt_default(NULL, "packetsize", "2324");
1915 } else if (!strcmp(arg, "dvd")) {
1917 opt_video_codec(o, "c:v", "mpeg2video");
1918 opt_audio_codec(o, "c:a", "ac3");
1919 parse_option(o, "f", "dvd", options);
1921 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1922 parse_option(o, "r", frame_rates[norm], options);
1923 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1925 opt_default(NULL, "b", "6000000");
1926 opt_default(NULL, "maxrate", "9000000");
1927 opt_default(NULL, "minrate", "0"); // 1500000;
1928 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1930 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1931 opt_default(NULL, "muxrate", "25200"); // from mplex project: data_rate = 1260000. mux_rate = data_rate / 50
1933 opt_default(NULL, "b:a", "448000");
1934 parse_option(o, "ar", "48000", options);
1936 } else if (!strncmp(arg, "dv", 2)) {
1938 parse_option(o, "f", "dv", options);
1940 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1941 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1942 norm == PAL ? "yuv420p" : "yuv411p", options);
1943 parse_option(o, "r", frame_rates[norm], options);
1945 parse_option(o, "ar", "48000", options);
1946 parse_option(o, "ac", "2", options);
1949 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1950 return AVERROR(EINVAL);
1953 av_dict_copy(&o->g->codec_opts, codec_opts, 0);
1954 av_dict_copy(&o->g->format_opts, format_opts, 0);
1959 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1961 av_free (vstats_filename);
1962 vstats_filename = av_strdup (arg);
1966 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1969 time_t today2 = time(NULL);
1970 struct tm *today = localtime(&today2);
1972 if (!today) { // maybe tomorrow
1973 av_log(NULL, AV_LOG_FATAL, "Unable to get current time.\n");
1977 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1979 return opt_vstats_file(NULL, opt, filename);
1982 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1984 OptionsContext *o = optctx;
1985 return parse_option(o, "frames:v", arg, options);
1988 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1990 OptionsContext *o = optctx;
1991 return parse_option(o, "frames:a", arg, options);
1994 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1996 OptionsContext *o = optctx;
1997 return parse_option(o, "frames:d", arg, options);
2000 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
2002 OptionsContext *o = optctx;
2003 return parse_option(o, "tag:v", arg, options);
2006 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
2008 OptionsContext *o = optctx;
2009 return parse_option(o, "tag:a", arg, options);
2012 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
2014 OptionsContext *o = optctx;
2015 return parse_option(o, "tag:s", arg, options);
2018 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2020 OptionsContext *o = optctx;
2021 return parse_option(o, "filter:v", arg, options);
2024 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2026 OptionsContext *o = optctx;
2027 return parse_option(o, "filter:a", arg, options);
2030 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2032 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2033 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2034 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2036 if (video_sync_method == VSYNC_AUTO)
2037 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2041 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2043 OptionsContext *o = optctx;
2044 char layout_str[32];
2047 int ret, channels, ac_str_size;
2050 layout = av_get_channel_layout(arg);
2052 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2053 return AVERROR(EINVAL);
2055 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2056 ret = opt_default(NULL, opt, layout_str);
2060 /* set 'ac' option based on channel layout */
2061 channels = av_get_channel_layout_nb_channels(layout);
2062 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2063 stream_str = strchr(opt, ':');
2064 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2065 ac_str = av_mallocz(ac_str_size);
2067 return AVERROR(ENOMEM);
2068 av_strlcpy(ac_str, "ac", 3);
2070 av_strlcat(ac_str, stream_str, ac_str_size);
2071 ret = parse_option(o, ac_str, layout_str, options);
2077 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2079 OptionsContext *o = optctx;
2080 return parse_option(o, "q:a", arg, options);
2083 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2085 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2086 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2087 return AVERROR(ENOMEM);
2088 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2089 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2090 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2091 return AVERROR(ENOMEM);
2095 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2097 uint8_t *graph_desc = read_file(arg);
2099 return AVERROR(EINVAL);
2101 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2102 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2103 return AVERROR(ENOMEM);
2104 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2105 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2109 void show_help_default(const char *opt, const char *arg)
2111 /* per-file options have at least one of those set */
2112 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2113 int show_advanced = 0, show_avoptions = 0;
2116 if (!strcmp(opt, "long"))
2118 else if (!strcmp(opt, "full"))
2119 show_advanced = show_avoptions = 1;
2121 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2126 printf("Getting help:\n"
2127 " -h -- print basic options\n"
2128 " -h long -- print more options\n"
2129 " -h full -- print all options (including all format and codec specific options, very long)\n"
2130 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
2131 " See man %s for detailed description of the options.\n"
2132 "\n", program_name);
2134 show_help_options(options, "Print help / information / capabilities:",
2137 show_help_options(options, "Global options (affect whole program "
2138 "instead of just one file:",
2139 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2141 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2142 per_file | OPT_EXIT, 0);
2144 show_help_options(options, "Per-file main options:", 0,
2145 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2146 OPT_EXIT, per_file);
2148 show_help_options(options, "Advanced per-file options:",
2149 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2151 show_help_options(options, "Video options:",
2152 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2154 show_help_options(options, "Advanced Video options:",
2155 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2157 show_help_options(options, "Audio options:",
2158 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2160 show_help_options(options, "Advanced Audio options:",
2161 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2162 show_help_options(options, "Subtitle options:",
2163 OPT_SUBTITLE, 0, 0);
2166 if (show_avoptions) {
2167 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2168 show_help_children(avcodec_get_class(), flags);
2169 show_help_children(avformat_get_class(), flags);
2170 show_help_children(sws_get_class(), flags);
2171 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM);
2175 void show_usage(void)
2177 printf("Hyper fast Audio and Video encoder\n");
2178 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2187 static const OptionGroupDef groups[] = {
2188 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2189 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2192 static int open_files(OptionGroupList *l, const char *inout,
2193 int (*open_file)(OptionsContext*, const char*))
2197 for (i = 0; i < l->nb_groups; i++) {
2198 OptionGroup *g = &l->groups[i];
2204 ret = parse_optgroup(&o, g);
2206 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2207 "%s.\n", inout, g->arg);
2211 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2212 ret = open_file(&o, g->arg);
2215 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2219 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2225 int avconv_parse_options(int argc, char **argv)
2227 OptionParseContext octx;
2231 memset(&octx, 0, sizeof(octx));
2233 /* split the commandline into an internal representation */
2234 ret = split_commandline(&octx, argc, argv, options, groups,
2235 FF_ARRAY_ELEMS(groups));
2237 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2241 /* apply global options */
2242 ret = parse_optgroup(NULL, &octx.global_opts);
2244 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2248 /* open input files */
2249 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2251 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2255 /* create the complex filtergraphs */
2256 ret = init_complex_filters();
2258 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
2262 /* open output files */
2263 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2265 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2269 /* configure the complex filtergraphs */
2270 ret = configure_complex_filters();
2272 av_log(NULL, AV_LOG_FATAL, "Error configuring complex filters.\n");
2277 uninit_parse_context(&octx);
2279 av_strerror(ret, error, sizeof(error));
2280 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2285 #define OFFSET(x) offsetof(OptionsContext, x)
2286 const OptionDef options[] = {
2288 #include "cmdutils_common_opts.h"
2289 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2290 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2291 "force format", "fmt" },
2292 { "y", OPT_BOOL, { &file_overwrite },
2293 "overwrite output files" },
2294 { "n", OPT_BOOL, { &file_skip },
2295 "never overwrite output files" },
2296 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2297 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2298 "codec name", "codec" },
2299 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2300 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2301 "codec name", "codec" },
2302 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2303 OPT_OUTPUT, { .off = OFFSET(presets) },
2304 "preset name", "preset" },
2305 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2306 OPT_OUTPUT, { .func_arg = opt_map },
2307 "set input stream mapping",
2308 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2309 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2310 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2311 "set metadata information of outfile from infile",
2312 "outfile[,metadata]:infile[,metadata]" },
2313 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2314 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2315 "set chapters mapping", "input_file_index" },
2316 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2317 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2318 "record or transcode \"duration\" seconds of audio/video",
2320 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2321 "set the limit file size in bytes", "limit_size" },
2322 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2323 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2324 "set the start time offset", "time_off" },
2325 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2326 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2327 "enable/disable accurate seeking with -ss" },
2328 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2329 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2330 "set the input ts offset", "time_off" },
2331 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2332 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2333 "set the input ts scale", "scale" },
2334 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2335 "add metadata", "string=string" },
2336 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2337 OPT_OUTPUT, { .func_arg = opt_data_frames },
2338 "set the number of data frames to record", "number" },
2339 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2340 "add timings for benchmarking" },
2341 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2342 "set max runtime in seconds", "limit" },
2343 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2344 "dump each input packet" },
2345 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2346 "when dumping packets, also dump the payload" },
2347 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2348 OPT_INPUT, { .off = OFFSET(rate_emu) },
2349 "read input at native frame rate", "" },
2350 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2351 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2352 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2353 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2354 "video sync method", "" },
2355 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2356 "audio sync method", "" },
2357 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2358 "audio drift threshold", "threshold" },
2359 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2360 "copy timestamps" },
2361 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2362 "copy input stream time base when stream copying" },
2363 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2364 OPT_OUTPUT, { .off = OFFSET(shortest) },
2365 "finish encoding within shortest input" },
2366 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2367 "timestamp discontinuity delta threshold", "threshold" },
2368 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2369 "exit on error", "error" },
2370 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2371 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2372 "copy initial non-keyframes" },
2373 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2374 "set the number of frames to record", "number" },
2375 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2376 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2377 "force codec tag/fourcc", "fourcc/tag" },
2378 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2379 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2380 "use fixed quality scale (VBR)", "q" },
2381 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2382 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2383 "use fixed quality scale (VBR)", "q" },
2384 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2385 "set stream filterchain", "filter_list" },
2386 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2387 "read stream filtergraph description from a file", "filename" },
2388 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2389 "create a complex filtergraph", "graph_description" },
2390 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2391 "read complex filtergraph description from a file", "filename" },
2392 { "stats", OPT_BOOL, { &print_stats },
2393 "print progress report during encoding", },
2394 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2395 OPT_OUTPUT, { .func_arg = opt_attach },
2396 "add an attachment to the output file", "filename" },
2397 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2398 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2399 "extract an attachment into a file", "filename" },
2400 { "loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
2401 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
2404 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2405 "set the number of video frames to record", "number" },
2406 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2407 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2408 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2409 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2410 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2411 "set frame size (WxH or abbreviation)", "size" },
2412 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2413 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2414 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2415 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2416 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2417 "set pixel format", "format" },
2418 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2420 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2421 "discard threshold", "n" },
2422 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2423 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2424 "rate control override for specific intervals", "override" },
2425 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2426 OPT_OUTPUT, { .func_arg = opt_video_codec },
2427 "force video codec ('copy' to copy stream)", "codec" },
2428 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2429 "select the pass number (1 or 2)", "n" },
2430 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2431 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2432 "select two pass log file name prefix", "prefix" },
2433 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2434 "dump video coding statistics to file" },
2435 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2436 "dump video coding statistics to file", "file" },
2437 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2438 "video filters", "filter list" },
2439 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2440 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2441 "specify intra matrix coeffs", "matrix" },
2442 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2443 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2444 "specify inter matrix coeffs", "matrix" },
2445 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2446 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2447 "top=1/bottom=0/auto=-1 field first", "" },
2448 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2449 "intra_dc_precision", "precision" },
2450 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2451 OPT_OUTPUT, { .func_arg = opt_video_tag },
2452 "force video tag/fourcc", "fourcc/tag" },
2453 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2454 "show QP histogram" },
2455 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2456 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2457 "force the selected framerate, disable the best supported framerate selection" },
2458 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2459 OPT_OUTPUT, { .func_arg = opt_streamid },
2460 "set the value of an outfile streamid", "streamIndex:value" },
2461 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2462 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2463 "force key frames at specified timestamps", "timestamps" },
2464 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2465 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
2466 "use HW accelerated decoding", "hwaccel name" },
2467 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2468 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
2469 "select a device for HW acceleration", "devicename" },
2470 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
2471 "show available HW acceleration methods" },
2472 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
2473 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
2474 "automatically insert correct rotate filters" },
2477 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2478 "set the number of audio frames to record", "number" },
2479 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2480 "set audio quality (codec-specific)", "quality", },
2481 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2482 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2483 "set audio sampling rate (in Hz)", "rate" },
2484 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2485 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2486 "set number of audio channels", "channels" },
2487 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2489 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2490 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2491 "force audio codec ('copy' to copy stream)", "codec" },
2492 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2493 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2494 "force audio tag/fourcc", "fourcc/tag" },
2495 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2496 "change audio volume (256=normal)" , "volume" },
2497 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2498 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2499 "set sample format", "format" },
2500 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2501 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2502 "set channel layout", "layout" },
2503 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2504 "audio filters", "filter list" },
2506 /* subtitle options */
2507 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2508 "disable subtitle" },
2509 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2510 "force subtitle codec ('copy' to copy stream)", "codec" },
2511 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2512 , "force subtitle tag/fourcc", "fourcc/tag" },
2515 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2518 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2519 "set the maximum demux-decode delay", "seconds" },
2520 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2521 "set the initial demux-decode delay", "seconds" },
2523 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2524 "A comma-separated list of bitstream filters", "bitstream_filters" },
2526 /* data codec support */
2527 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2528 "force data codec ('copy' to copy stream)", "codec" },