2 * ffmpeg option parsing
4 * This file is part of FFmpeg.
6 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
59 for (i = 0; i < o->nb_ ## name; i++) {\
60 char *spec = o->name[i].specifier;\
61 if (!strcmp(spec, mediatype))\
62 outvar = o->name[i].u.type;\
66 const HWAccel hwaccels[] = {
68 { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
71 { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
74 { "vda", vda_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
79 char *vstats_filename;
81 float audio_drift_threshold = 0.1;
82 float dts_delta_threshold = 10;
83 float dts_error_threshold = 3600*30;
85 int audio_volume = 256;
86 int audio_sync_method = 0;
87 int video_sync_method = VSYNC_AUTO;
88 int do_deinterlace = 0;
90 int do_benchmark_all = 0;
94 int start_at_zero = 0;
97 int exit_on_error = 0;
100 int stdin_interaction = 1;
101 int frame_bits_per_raw_sample = 0;
102 float max_error_rate = 2.0/3;
105 static int intra_only = 0;
106 static int file_overwrite = 0;
107 static int no_file_overwrite = 0;
108 static int do_psnr = 0;
109 static int input_sync;
110 static int override_ffserver = 0;
112 static void uninit_options(OptionsContext *o)
114 const OptionDef *po = options;
117 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
119 void *dst = (uint8_t*)o + po->u.off;
121 if (po->flags & OPT_SPEC) {
122 SpecifierOpt **so = dst;
123 int i, *count = (int*)(so + 1);
124 for (i = 0; i < *count; i++) {
125 av_freep(&(*so)[i].specifier);
126 if (po->flags & OPT_STRING)
127 av_freep(&(*so)[i].u.str);
131 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
136 for (i = 0; i < o->nb_stream_maps; i++)
137 av_freep(&o->stream_maps[i].linklabel);
138 av_freep(&o->stream_maps);
139 av_freep(&o->audio_channel_maps);
140 av_freep(&o->streamid_map);
141 av_freep(&o->attachments);
144 static void init_options(OptionsContext *o)
146 memset(o, 0, sizeof(*o));
148 o->stop_time = INT64_MAX;
149 o->mux_max_delay = 0.7;
150 o->start_time = AV_NOPTS_VALUE;
151 o->recording_time = INT64_MAX;
152 o->limit_filesize = UINT64_MAX;
153 o->chapters_input_file = INT_MAX;
154 o->accurate_seek = 1;
157 /* return a copy of the input with the stream specifiers removed from the keys */
158 static AVDictionary *strip_specifiers(AVDictionary *dict)
160 AVDictionaryEntry *e = NULL;
161 AVDictionary *ret = NULL;
163 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
164 char *p = strchr(e->key, ':');
168 av_dict_set(&ret, e->key, e->value, 0);
175 static int opt_sameq(void *optctx, const char *opt, const char *arg)
177 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
178 "If you are looking for an option to preserve the quality (which is not "
179 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
181 return AVERROR(EINVAL);
184 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
186 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
187 return opt_default(optctx, "channel", arg);
190 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
192 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
193 return opt_default(optctx, "standard", arg);
196 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
198 OptionsContext *o = optctx;
199 return parse_option(o, "codec:a", arg, options);
202 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
204 OptionsContext *o = optctx;
205 return parse_option(o, "codec:v", arg, options);
208 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
210 OptionsContext *o = optctx;
211 return parse_option(o, "codec:s", arg, options);
214 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
216 OptionsContext *o = optctx;
217 return parse_option(o, "codec:d", arg, options);
220 static int opt_map(void *optctx, const char *opt, const char *arg)
222 OptionsContext *o = optctx;
224 int i, negative = 0, file_idx;
225 int sync_file_idx = -1, sync_stream_idx = 0;
233 map = av_strdup(arg);
235 /* parse sync stream first, just pick first matching stream */
236 if (sync = strchr(map, ',')) {
238 sync_file_idx = strtol(sync + 1, &sync, 0);
239 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
240 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
245 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
246 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
247 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
251 if (i == input_files[sync_file_idx]->nb_streams) {
252 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
253 "match any streams.\n", arg);
260 /* this mapping refers to lavfi output */
261 const char *c = map + 1;
262 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
263 m = &o->stream_maps[o->nb_stream_maps - 1];
264 m->linklabel = av_get_token(&c, "]");
266 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
270 file_idx = strtol(map, &p, 0);
271 if (file_idx >= nb_input_files || file_idx < 0) {
272 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
276 /* disable some already defined maps */
277 for (i = 0; i < o->nb_stream_maps; i++) {
278 m = &o->stream_maps[i];
279 if (file_idx == m->file_index &&
280 check_stream_specifier(input_files[m->file_index]->ctx,
281 input_files[m->file_index]->ctx->streams[m->stream_index],
282 *p == ':' ? p + 1 : p) > 0)
286 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
287 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
288 *p == ':' ? p + 1 : p) <= 0)
290 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
291 m = &o->stream_maps[o->nb_stream_maps - 1];
293 m->file_index = file_idx;
296 if (sync_file_idx >= 0) {
297 m->sync_file_index = sync_file_idx;
298 m->sync_stream_index = sync_stream_idx;
300 m->sync_file_index = file_idx;
301 m->sync_stream_index = i;
307 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
315 static int opt_attach(void *optctx, const char *opt, const char *arg)
317 OptionsContext *o = optctx;
318 GROW_ARRAY(o->attachments, o->nb_attachments);
319 o->attachments[o->nb_attachments - 1] = arg;
323 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
325 OptionsContext *o = optctx;
330 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
331 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
333 /* muted channel syntax */
334 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
335 if ((n == 1 || n == 3) && m->channel_idx == -1) {
336 m->file_idx = m->stream_idx = -1;
338 m->ofile_idx = m->ostream_idx = -1;
343 n = sscanf(arg, "%d.%d.%d:%d.%d",
344 &m->file_idx, &m->stream_idx, &m->channel_idx,
345 &m->ofile_idx, &m->ostream_idx);
347 if (n != 3 && n != 5) {
348 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
349 "[file.stream.channel|-1][:syncfile:syncstream]\n");
353 if (n != 5) // only file.stream.channel specified
354 m->ofile_idx = m->ostream_idx = -1;
357 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
358 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
362 if (m->stream_idx < 0 ||
363 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
364 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
365 m->file_idx, m->stream_idx);
368 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
369 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
370 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
371 m->file_idx, m->stream_idx);
374 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
375 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
376 m->file_idx, m->stream_idx, m->channel_idx);
383 * Parse a metadata specifier passed as 'arg' parameter.
384 * @param arg metadata string to parse
385 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
386 * @param index for type c/p, chapter/program index is written here
387 * @param stream_spec for type s, the stream specifier is written here
389 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
397 if (*(++arg) && *arg != ':') {
398 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
401 *stream_spec = *arg == ':' ? arg + 1 : "";
406 *index = strtol(++arg, NULL, 0);
409 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
416 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
418 AVDictionary **meta_in = NULL;
419 AVDictionary **meta_out = NULL;
421 char type_in, type_out;
422 const char *istream_spec = NULL, *ostream_spec = NULL;
423 int idx_in = 0, idx_out = 0;
425 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
426 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
429 if (type_out == 'g' || !*outspec)
430 o->metadata_global_manual = 1;
431 if (type_out == 's' || !*outspec)
432 o->metadata_streams_manual = 1;
433 if (type_out == 'c' || !*outspec)
434 o->metadata_chapters_manual = 1;
438 if (type_in == 'g' || type_out == 'g')
439 o->metadata_global_manual = 1;
440 if (type_in == 's' || type_out == 's')
441 o->metadata_streams_manual = 1;
442 if (type_in == 'c' || type_out == 'c')
443 o->metadata_chapters_manual = 1;
445 /* ic is NULL when just disabling automatic mappings */
449 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
450 if ((index) < 0 || (index) >= (nb_elems)) {\
451 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
456 #define SET_DICT(type, meta, context, index)\
459 meta = &context->metadata;\
462 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
463 meta = &context->chapters[index]->metadata;\
466 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
467 meta = &context->programs[index]->metadata;\
470 break; /* handled separately below */ \
471 default: av_assert0(0);\
474 SET_DICT(type_in, meta_in, ic, idx_in);
475 SET_DICT(type_out, meta_out, oc, idx_out);
477 /* for input streams choose first matching stream */
478 if (type_in == 's') {
479 for (i = 0; i < ic->nb_streams; i++) {
480 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
481 meta_in = &ic->streams[i]->metadata;
487 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
492 if (type_out == 's') {
493 for (i = 0; i < oc->nb_streams; i++) {
494 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
495 meta_out = &oc->streams[i]->metadata;
496 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
501 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
506 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
508 OptionsContext *o = optctx;
510 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
511 struct tm time = *gmtime((time_t*)&recording_timestamp);
512 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
513 parse_option(o, "metadata", buf, options);
515 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
516 "tag instead.\n", opt);
520 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
522 const AVCodecDescriptor *desc;
523 const char *codec_string = encoder ? "encoder" : "decoder";
527 avcodec_find_encoder_by_name(name) :
528 avcodec_find_decoder_by_name(name);
530 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
531 codec = encoder ? avcodec_find_encoder(desc->id) :
532 avcodec_find_decoder(desc->id);
534 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
535 codec_string, codec->name, desc->name);
539 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
542 if (codec->type != type) {
543 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
549 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
551 char *codec_name = NULL;
553 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
555 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
556 st->codec->codec_id = codec->id;
559 return avcodec_find_decoder(st->codec->codec_id);
562 /* Add all the streams from the given input file to the global
563 * list of input streams. */
564 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
568 for (i = 0; i < ic->nb_streams; i++) {
569 AVStream *st = ic->streams[i];
570 AVCodecContext *dec = st->codec;
571 InputStream *ist = av_mallocz(sizeof(*ist));
572 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
573 char *codec_tag = NULL;
575 char *discard_str = NULL;
576 const AVOption *discard_opt = av_opt_find(dec, "skip_frame", NULL, 0, 0);
581 GROW_ARRAY(input_streams, nb_input_streams);
582 input_streams[nb_input_streams - 1] = ist;
585 ist->file_index = nb_input_files;
587 st->discard = AVDISCARD_ALL;
590 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
592 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
594 uint32_t tag = strtol(codec_tag, &next, 0);
596 tag = AV_RL32(codec_tag);
597 st->codec->codec_tag = tag;
600 ist->dec = choose_decoder(o, ic, st);
601 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
603 ist->reinit_filters = -1;
604 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
606 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
607 ist->user_set_discard = AVDISCARD_NONE;
608 if (discard_str && av_opt_eval_int(dec, discard_opt, discard_str, &ist->user_set_discard) < 0) {
609 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
614 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
616 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
618 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
622 ret = avcodec_copy_context(ist->dec_ctx, dec);
624 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
628 switch (dec->codec_type) {
629 case AVMEDIA_TYPE_VIDEO:
631 ist->dec = avcodec_find_decoder(dec->codec_id);
632 if (av_codec_get_lowres(dec)) {
633 dec->flags |= CODEC_FLAG_EMU_EDGE;
636 ist->resample_height = ist->dec_ctx->height;
637 ist->resample_width = ist->dec_ctx->width;
638 ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
640 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
641 if (framerate && av_parse_video_rate(&ist->framerate,
643 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
648 ist->top_field_first = -1;
649 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
651 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
653 if (!strcmp(hwaccel, "none"))
654 ist->hwaccel_id = HWACCEL_NONE;
655 else if (!strcmp(hwaccel, "auto"))
656 ist->hwaccel_id = HWACCEL_AUTO;
659 for (i = 0; hwaccels[i].name; i++) {
660 if (!strcmp(hwaccels[i].name, hwaccel)) {
661 ist->hwaccel_id = hwaccels[i].id;
666 if (!ist->hwaccel_id) {
667 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
669 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
670 for (i = 0; hwaccels[i].name; i++)
671 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
672 av_log(NULL, AV_LOG_FATAL, "\n");
678 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
679 if (hwaccel_device) {
680 ist->hwaccel_device = av_strdup(hwaccel_device);
681 if (!ist->hwaccel_device)
684 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
687 case AVMEDIA_TYPE_AUDIO:
688 ist->guess_layout_max = INT_MAX;
689 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
690 guess_input_channel_layout(ist);
692 ist->resample_sample_fmt = ist->dec_ctx->sample_fmt;
693 ist->resample_sample_rate = ist->dec_ctx->sample_rate;
694 ist->resample_channels = ist->dec_ctx->channels;
695 ist->resample_channel_layout = ist->dec_ctx->channel_layout;
698 case AVMEDIA_TYPE_DATA:
699 case AVMEDIA_TYPE_SUBTITLE: {
700 char *canvas_size = NULL;
702 ist->dec = avcodec_find_decoder(dec->codec_id);
703 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
704 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
706 av_parse_video_size(&dec->width, &dec->height, canvas_size) < 0) {
707 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
712 case AVMEDIA_TYPE_ATTACHMENT:
713 case AVMEDIA_TYPE_UNKNOWN:
721 static void assert_file_overwrite(const char *filename)
723 if (file_overwrite && no_file_overwrite) {
724 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
728 if (!file_overwrite) {
729 const char *proto_name = avio_find_protocol_name(filename);
730 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
731 if (stdin_interaction && !no_file_overwrite) {
732 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
735 signal(SIGINT, SIG_DFL);
737 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
743 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
750 static void dump_attachment(AVStream *st, const char *filename)
753 AVIOContext *out = NULL;
754 AVDictionaryEntry *e;
756 if (!st->codec->extradata_size) {
757 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
758 nb_input_files - 1, st->index);
761 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
764 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
765 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
769 assert_file_overwrite(filename);
771 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
772 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
777 avio_write(out, st->codec->extradata, st->codec->extradata_size);
782 static int open_input_file(OptionsContext *o, const char *filename)
786 AVInputFormat *file_iformat = NULL;
790 AVDictionary *unused_opts = NULL;
791 AVDictionaryEntry *e = NULL;
792 int orig_nb_streams; // number of streams before avformat_find_stream_info
793 char * video_codec_name = NULL;
794 char * audio_codec_name = NULL;
795 char *subtitle_codec_name = NULL;
798 if (!(file_iformat = av_find_input_format(o->format))) {
799 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
804 if (!strcmp(filename, "-"))
807 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
808 strcmp(filename, "/dev/stdin");
810 /* get default parameters from command line */
811 ic = avformat_alloc_context();
813 print_error(filename, AVERROR(ENOMEM));
816 if (o->nb_audio_sample_rate) {
817 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
819 if (o->nb_audio_channels) {
820 /* because we set audio_channels based on both the "ac" and
821 * "channel_layout" options, we need to check that the specified
822 * demuxer actually has the "channels" option before setting it */
823 if (file_iformat && file_iformat->priv_class &&
824 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
825 AV_OPT_SEARCH_FAKE_OBJ)) {
826 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
829 if (o->nb_frame_rates) {
830 /* set the format-level framerate option;
831 * this is important for video grabbers, e.g. x11 */
832 if (file_iformat && file_iformat->priv_class &&
833 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
834 AV_OPT_SEARCH_FAKE_OBJ)) {
835 av_dict_set(&o->g->format_opts, "framerate",
836 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
839 if (o->nb_frame_sizes) {
840 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
842 if (o->nb_frame_pix_fmts)
843 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
845 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
846 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
847 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
849 ic->video_codec_id = video_codec_name ?
850 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
851 ic->audio_codec_id = audio_codec_name ?
852 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
853 ic->subtitle_codec_id= subtitle_codec_name ?
854 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
856 if (video_codec_name)
857 av_format_set_video_codec (ic, find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0));
858 if (audio_codec_name)
859 av_format_set_audio_codec (ic, find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0));
860 if (subtitle_codec_name)
861 av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
863 ic->flags |= AVFMT_FLAG_NONBLOCK;
864 ic->interrupt_callback = int_cb;
866 /* open the input file with generic avformat function */
867 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
869 print_error(filename, err);
872 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
873 assert_avoptions(o->g->format_opts);
875 /* apply forced codec ids */
876 for (i = 0; i < ic->nb_streams; i++)
877 choose_decoder(o, ic, ic->streams[i]);
879 /* Set AVCodecContext options for avformat_find_stream_info */
880 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
881 orig_nb_streams = ic->nb_streams;
883 /* If not enough info to get the stream parameters, we decode the
884 first frames to get it. (used in mpeg case for example) */
885 ret = avformat_find_stream_info(ic, opts);
887 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
888 if (ic->nb_streams == 0) {
889 avformat_close_input(&ic);
894 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
895 /* add the stream start time */
896 if (ic->start_time != AV_NOPTS_VALUE)
897 timestamp += ic->start_time;
899 /* if seeking requested, we execute it */
900 if (o->start_time != AV_NOPTS_VALUE) {
901 ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, timestamp, 0);
903 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
904 filename, (double)timestamp / AV_TIME_BASE);
908 /* update the current parameters so that they match the one of the input stream */
909 add_input_streams(o, ic);
911 /* dump the file content */
912 av_dump_format(ic, nb_input_files, filename, 0);
914 GROW_ARRAY(input_files, nb_input_files);
915 f = av_mallocz(sizeof(*f));
918 input_files[nb_input_files - 1] = f;
921 f->ist_index = nb_input_streams - ic->nb_streams;
922 f->start_time = o->start_time;
923 f->recording_time = o->recording_time;
924 f->input_ts_offset = o->input_ts_offset;
925 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
926 f->nb_streams = ic->nb_streams;
927 f->rate_emu = o->rate_emu;
928 f->accurate_seek = o->accurate_seek;
930 /* check if all codec options have been used */
931 unused_opts = strip_specifiers(o->g->codec_opts);
932 for (i = f->ist_index; i < nb_input_streams; i++) {
934 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
935 AV_DICT_IGNORE_SUFFIX)))
936 av_dict_set(&unused_opts, e->key, NULL, 0);
940 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
941 const AVClass *class = avcodec_get_class();
942 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
943 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
944 const AVClass *fclass = avformat_get_class();
945 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
946 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
947 if (!option || foption)
951 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
952 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
953 "input file #%d (%s) is not a decoding option.\n", e->key,
954 option->help ? option->help : "", nb_input_files - 1,
959 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
960 "input file #%d (%s) has not been used for any stream. The most "
961 "likely reason is either wrong type (e.g. a video option with "
962 "no video streams) or that it is a private option of some decoder "
963 "which was not actually used for any stream.\n", e->key,
964 option->help ? option->help : "", nb_input_files - 1, filename);
966 av_dict_free(&unused_opts);
968 for (i = 0; i < o->nb_dump_attachment; i++) {
971 for (j = 0; j < ic->nb_streams; j++) {
972 AVStream *st = ic->streams[j];
974 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
975 dump_attachment(st, o->dump_attachment[i].u.str);
979 for (i = 0; i < orig_nb_streams; i++)
980 av_dict_free(&opts[i]);
986 static uint8_t *get_line(AVIOContext *s)
992 if (avio_open_dyn_buf(&line) < 0) {
993 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
997 while ((c = avio_r8(s)) && c != '\n')
1000 avio_close_dyn_buf(line, &buf);
1005 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1008 char filename[1000];
1009 const char *base[3] = { getenv("AVCONV_DATADIR"),
1014 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1018 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1019 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1020 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1023 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1024 i != 1 ? "" : "/.avconv", preset_name);
1025 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1031 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1033 char *codec_name = NULL;
1035 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1037 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
1038 NULL, ost->st->codec->codec_type);
1039 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1040 } else if (!strcmp(codec_name, "copy"))
1041 ost->stream_copy = 1;
1043 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
1044 ost->st->codec->codec_id = ost->enc->id;
1048 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1051 AVStream *st = avformat_new_stream(oc, NULL);
1052 int idx = oc->nb_streams - 1, ret = 0;
1053 char *bsf = NULL, *next, *codec_tag = NULL;
1054 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
1059 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1063 if (oc->nb_streams - 1 < o->nb_streamid_map)
1064 st->id = o->streamid_map[oc->nb_streams - 1];
1066 GROW_ARRAY(output_streams, nb_output_streams);
1067 if (!(ost = av_mallocz(sizeof(*ost))))
1069 output_streams[nb_output_streams - 1] = ost;
1071 ost->file_index = nb_output_files - 1;
1074 st->codec->codec_type = type;
1075 choose_encoder(o, oc, ost);
1077 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1078 if (!ost->enc_ctx) {
1079 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1082 ost->enc_ctx->codec_type = type;
1085 AVIOContext *s = NULL;
1086 char *buf = NULL, *arg = NULL, *preset = NULL;
1088 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1090 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1091 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1094 if (!buf[0] || buf[0] == '#') {
1098 if (!(arg = strchr(buf, '='))) {
1099 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1103 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1105 } while (!s->eof_reached);
1109 av_log(NULL, AV_LOG_FATAL,
1110 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1111 preset, ost->file_index, ost->index);
1115 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1118 ost->max_frames = INT64_MAX;
1119 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1120 for (i = 0; i<o->nb_max_frames; i++) {
1121 char *p = o->max_frames[i].specifier;
1122 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1123 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1128 ost->copy_prior_start = -1;
1129 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1131 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
1133 if (next = strchr(bsf, ','))
1135 if (!(bsfc = av_bitstream_filter_init(bsf))) {
1136 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
1140 bsfc_prev->next = bsfc;
1142 ost->bitstream_filters = bsfc;
1148 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1150 uint32_t tag = strtol(codec_tag, &next, 0);
1152 tag = AV_RL32(codec_tag);
1153 ost->enc_ctx->codec_tag = tag;
1156 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1158 ost->enc_ctx->flags |= CODEC_FLAG_QSCALE;
1159 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1162 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1163 ost->enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
1165 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1167 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1168 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1169 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1171 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1173 ost->source_index = source_index;
1174 if (source_index >= 0) {
1175 ost->sync_ist = input_streams[source_index];
1176 input_streams[source_index]->discard = 0;
1177 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1179 ost->last_mux_dts = AV_NOPTS_VALUE;
1184 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1187 const char *p = str;
1194 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1201 /* read file contents into a string */
1202 static uint8_t *read_file(const char *filename)
1204 AVIOContext *pb = NULL;
1205 AVIOContext *dyn_buf = NULL;
1206 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1207 uint8_t buf[1024], *str;
1210 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1214 ret = avio_open_dyn_buf(&dyn_buf);
1219 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1220 avio_write(dyn_buf, buf, ret);
1221 avio_w8(dyn_buf, 0);
1224 ret = avio_close_dyn_buf(dyn_buf, &str);
1230 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1233 AVStream *st = ost->st;
1235 if (ost->filters_script && ost->filters) {
1236 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1237 "output stream #%d:%d.\n", nb_output_files, st->index);
1241 if (ost->filters_script)
1242 return read_file(ost->filters_script);
1243 else if (ost->filters)
1244 return av_strdup(ost->filters);
1246 return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
1250 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1251 const OutputStream *ost, enum AVMediaType type)
1253 if (ost->filters_script || ost->filters) {
1254 av_log(NULL, AV_LOG_ERROR,
1255 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1256 "Filtering and streamcopy cannot be used together.\n",
1257 ost->filters ? "Filtergraph" : "Filtergraph script",
1258 ost->filters ? ost->filters : ost->filters_script,
1259 av_get_media_type_string(type), ost->file_index, ost->index);
1264 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1268 AVCodecContext *video_enc;
1269 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1271 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1273 video_enc = ost->enc_ctx;
1275 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1276 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1277 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1280 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1281 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1283 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1284 if (frame_aspect_ratio) {
1286 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1287 q.num <= 0 || q.den <= 0) {
1288 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1291 ost->frame_aspect_ratio = q;
1294 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1295 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1297 if (!ost->stream_copy) {
1298 const char *p = NULL;
1299 char *frame_size = NULL;
1300 char *frame_pix_fmt = NULL;
1301 char *intra_matrix = NULL, *inter_matrix = NULL;
1302 char *chroma_intra_matrix = NULL;
1306 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1307 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1308 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1312 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1313 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1314 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1315 ost->keep_pix_fmt = 1;
1316 if (!*++frame_pix_fmt)
1317 frame_pix_fmt = NULL;
1319 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1320 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1323 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1326 video_enc->gop_size = 0;
1327 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1329 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1330 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1333 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1335 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1336 if (chroma_intra_matrix) {
1337 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1339 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1342 av_codec_set_chroma_intra_matrix(video_enc, p);
1343 parse_matrix_coeffs(p, chroma_intra_matrix);
1345 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1347 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1348 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1351 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1354 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1355 for (i = 0; p; i++) {
1357 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1359 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1362 /* FIXME realloc failure */
1363 video_enc->rc_override =
1364 av_realloc(video_enc->rc_override,
1365 sizeof(RcOverride) * (i + 1));
1366 video_enc->rc_override[i].start_frame = start;
1367 video_enc->rc_override[i].end_frame = end;
1369 video_enc->rc_override[i].qscale = q;
1370 video_enc->rc_override[i].quality_factor = 1.0;
1373 video_enc->rc_override[i].qscale = 0;
1374 video_enc->rc_override[i].quality_factor = -q/100.0;
1379 video_enc->rc_override_count = i;
1382 video_enc->flags|= CODEC_FLAG_PSNR;
1385 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1388 video_enc->flags |= CODEC_FLAG_PASS1;
1389 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1392 video_enc->flags |= CODEC_FLAG_PASS2;
1393 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1397 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1398 if (ost->logfile_prefix &&
1399 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1402 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1403 if (ost->forced_keyframes)
1404 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1406 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1408 ost->top_field_first = -1;
1409 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1412 ost->avfilter = get_ost_filters(o, oc, ost);
1416 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1419 if (ost->stream_copy)
1420 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1425 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1430 AVCodecContext *audio_enc;
1432 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1435 audio_enc = ost->enc_ctx;
1436 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1438 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1439 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1441 if (!ost->stream_copy) {
1442 char *sample_fmt = NULL;
1444 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1446 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1448 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1449 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1453 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1455 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1456 ost->apad = av_strdup(ost->apad);
1458 ost->avfilter = get_ost_filters(o, oc, ost);
1462 /* check for channel mapping for this audio stream */
1463 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1464 AudioChannelMap *map = &o->audio_channel_maps[n];
1465 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1466 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1469 if (map->channel_idx == -1) {
1471 } else if (ost->source_index < 0) {
1472 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1473 ost->file_index, ost->st->index);
1476 ist = input_streams[ost->source_index];
1479 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1480 if (av_reallocp_array(&ost->audio_channels_map,
1481 ost->audio_channels_mapped + 1,
1482 sizeof(*ost->audio_channels_map)
1486 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1492 if (ost->stream_copy)
1493 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1498 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1502 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1503 if (!ost->stream_copy) {
1504 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1511 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1513 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1514 ost->stream_copy = 1;
1519 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1523 AVCodecContext *subtitle_enc;
1525 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1527 subtitle_enc = ost->enc_ctx;
1529 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1531 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1533 if (!ost->stream_copy) {
1534 char *frame_size = NULL;
1536 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1537 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1538 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1546 /* arg format is "output-stream-index:streamid-value". */
1547 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1549 OptionsContext *o = optctx;
1554 av_strlcpy(idx_str, arg, sizeof(idx_str));
1555 p = strchr(idx_str, ':');
1557 av_log(NULL, AV_LOG_FATAL,
1558 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1563 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1564 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1565 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1569 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1571 AVFormatContext *is = ifile->ctx;
1572 AVFormatContext *os = ofile->ctx;
1576 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1578 return AVERROR(ENOMEM);
1581 for (i = 0; i < is->nb_chapters; i++) {
1582 AVChapter *in_ch = is->chapters[i], *out_ch;
1583 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1584 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1585 AV_TIME_BASE_Q, in_ch->time_base);
1586 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1587 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1590 if (in_ch->end < ts_off)
1592 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1595 out_ch = av_mallocz(sizeof(AVChapter));
1597 return AVERROR(ENOMEM);
1599 out_ch->id = in_ch->id;
1600 out_ch->time_base = in_ch->time_base;
1601 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1602 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1605 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1607 os->chapters[os->nb_chapters++] = out_ch;
1612 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1615 AVFormatContext *ic = avformat_alloc_context();
1617 ic->interrupt_callback = int_cb;
1618 err = avformat_open_input(&ic, filename, NULL, NULL);
1621 /* copy stream format */
1622 for(i=0;i<ic->nb_streams;i++) {
1626 AVCodecContext *avctx;
1628 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
1630 av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
1631 return AVERROR(EINVAL);
1633 ost = new_output_stream(o, s, codec->type, -1);
1638 // FIXME: a more elegant solution is needed
1639 memcpy(st, ic->streams[i], sizeof(AVStream));
1641 st->info = av_malloc(sizeof(*st->info));
1642 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
1644 avcodec_copy_context(st->codec, ic->streams[i]->codec);
1646 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
1647 choose_sample_fmt(st, codec);
1648 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
1649 choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt);
1650 avcodec_copy_context(ost->enc_ctx, st->codec);
1653 avformat_close_input(&ic);
1657 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1658 AVFormatContext *oc)
1662 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1663 ofilter->out_tmp->pad_idx)) {
1664 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
1665 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1667 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1672 ost->source_index = -1;
1673 ost->filter = ofilter;
1677 if (ost->stream_copy) {
1678 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1679 "which is fed from a complex filtergraph. Filtering and streamcopy "
1680 "cannot be used together.\n", ost->file_index, ost->index);
1684 if (ost->avfilter && (ost->filters || ost->filters_script)) {
1685 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
1686 av_log(NULL, AV_LOG_ERROR,
1687 "%s '%s' was specified through the %s option "
1688 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
1689 "%s and -filter_complex cannot be used together for the same stream.\n",
1690 ost->filters ? "Filtergraph" : "Filtergraph script",
1691 ost->filters ? ost->filters : ost->filters_script,
1692 opt, ost->file_index, ost->index, opt);
1696 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1697 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1700 avfilter_inout_free(&ofilter->out_tmp);
1703 static int configure_complex_filters(void)
1707 for (i = 0; i < nb_filtergraphs; i++)
1708 if (!filtergraphs[i]->graph &&
1709 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1714 static int open_output_file(OptionsContext *o, const char *filename)
1716 AVFormatContext *oc;
1718 AVOutputFormat *file_oformat;
1722 AVDictionary *unused_opts = NULL;
1723 AVDictionaryEntry *e = NULL;
1725 if (configure_complex_filters() < 0) {
1726 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1730 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
1731 o->stop_time = INT64_MAX;
1732 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1735 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1736 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
1737 if (o->stop_time <= start_time) {
1738 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1741 o->recording_time = o->stop_time - start_time;
1745 GROW_ARRAY(output_files, nb_output_files);
1746 of = av_mallocz(sizeof(*of));
1749 output_files[nb_output_files - 1] = of;
1751 of->ost_index = nb_output_streams;
1752 of->recording_time = o->recording_time;
1753 of->start_time = o->start_time;
1754 of->limit_filesize = o->limit_filesize;
1755 of->shortest = o->shortest;
1756 av_dict_copy(&of->opts, o->g->format_opts, 0);
1758 if (!strcmp(filename, "-"))
1761 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
1763 print_error(filename, err);
1768 if (o->recording_time != INT64_MAX)
1769 oc->duration = o->recording_time;
1771 file_oformat= oc->oformat;
1772 oc->interrupt_callback = int_cb;
1774 /* create streams for all unlabeled output pads */
1775 for (i = 0; i < nb_filtergraphs; i++) {
1776 FilterGraph *fg = filtergraphs[i];
1777 for (j = 0; j < fg->nb_outputs; j++) {
1778 OutputFilter *ofilter = fg->outputs[j];
1780 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1783 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1784 ofilter->out_tmp->pad_idx)) {
1785 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1786 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1787 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1789 init_output_filter(ofilter, o, oc);
1793 /* ffserver seeking with date=... needs a date reference */
1794 if (!strcmp(file_oformat->name, "ffm") &&
1795 av_strstart(filename, "http:", NULL)) {
1796 int err = parse_option(o, "metadata", "creation_time=now", options);
1798 print_error(filename, err);
1803 if (!strcmp(file_oformat->name, "ffm") && !override_ffserver &&
1804 av_strstart(filename, "http:", NULL)) {
1806 /* special case for files sent to ffserver: we get the stream
1807 parameters from ffserver */
1808 int err = read_ffserver_streams(o, oc, filename);
1810 print_error(filename, err);
1813 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
1814 ost = output_streams[j];
1815 for (i = 0; i < nb_input_streams; i++) {
1816 ist = input_streams[i];
1817 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
1819 ost->source_index= i;
1820 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
1821 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
1823 ist->st->discard = ist->user_set_discard;
1828 av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codec->codec_type));
1832 } else if (!o->nb_stream_maps) {
1833 char *subtitle_codec_name = NULL;
1834 /* pick the "best" stream of each type */
1836 /* video: highest resolution */
1837 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
1838 int area = 0, idx = -1;
1839 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
1840 for (i = 0; i < nb_input_streams; i++) {
1842 ist = input_streams[i];
1843 new_area = ist->st->codec->width * ist->st->codec->height;
1844 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1846 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1848 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1855 new_video_stream(o, oc, idx);
1858 /* audio: most channels */
1859 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
1860 int channels = 0, idx = -1;
1861 for (i = 0; i < nb_input_streams; i++) {
1862 ist = input_streams[i];
1863 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1864 ist->st->codec->channels > channels) {
1865 channels = ist->st->codec->channels;
1870 new_audio_stream(o, oc, idx);
1873 /* subtitles: pick first */
1874 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
1875 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
1876 for (i = 0; i < nb_input_streams; i++)
1877 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1878 AVCodecDescriptor const *input_descriptor =
1879 avcodec_descriptor_get(input_streams[i]->st->codec->codec_id);
1880 AVCodecDescriptor const *output_descriptor = NULL;
1881 AVCodec const *output_codec =
1882 avcodec_find_encoder(oc->oformat->subtitle_codec);
1883 int input_props = 0, output_props = 0;
1885 output_descriptor = avcodec_descriptor_get(output_codec->id);
1886 if (input_descriptor)
1887 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1888 if (output_descriptor)
1889 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1890 if (subtitle_codec_name ||
1891 input_props & output_props ||
1892 // Map dvb teletext which has neither property to any output subtitle encoder
1893 input_descriptor && output_descriptor &&
1894 (!input_descriptor->props ||
1895 !output_descriptor->props)) {
1896 new_subtitle_stream(o, oc, i);
1901 /* do something with data? */
1903 for (i = 0; i < o->nb_stream_maps; i++) {
1904 StreamMap *map = &o->stream_maps[i];
1909 if (map->linklabel) {
1911 OutputFilter *ofilter = NULL;
1914 for (j = 0; j < nb_filtergraphs; j++) {
1915 fg = filtergraphs[j];
1916 for (k = 0; k < fg->nb_outputs; k++) {
1917 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1918 if (out && !strcmp(out->name, map->linklabel)) {
1919 ofilter = fg->outputs[k];
1926 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1927 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
1930 init_output_filter(ofilter, o, oc);
1932 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
1934 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1935 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
1937 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1939 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1941 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
1944 switch (ist->st->codec->codec_type) {
1945 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
1946 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
1947 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
1948 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
1949 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
1951 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1952 map->file_index, map->stream_index);
1959 /* handle attached files */
1960 for (i = 0; i < o->nb_attachments; i++) {
1962 uint8_t *attachment;
1966 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1967 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1971 if ((len = avio_size(pb)) <= 0) {
1972 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1976 if (!(attachment = av_malloc(len))) {
1977 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1981 avio_read(pb, attachment, len);
1983 ost = new_attachment_stream(o, oc, -1);
1984 ost->stream_copy = 0;
1985 ost->attachment_filename = o->attachments[i];
1987 ost->enc_ctx->extradata = attachment;
1988 ost->enc_ctx->extradata_size = len;
1990 p = strrchr(o->attachments[i], '/');
1991 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1995 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
1996 AVDictionaryEntry *e;
1997 ost = output_streams[i];
1999 if ((ost->stream_copy || ost->attachment_filename)
2000 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2001 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2002 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2006 /* check if all codec options have been used */
2007 unused_opts = strip_specifiers(o->g->codec_opts);
2008 for (i = of->ost_index; i < nb_output_streams; i++) {
2010 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2011 AV_DICT_IGNORE_SUFFIX)))
2012 av_dict_set(&unused_opts, e->key, NULL, 0);
2016 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2017 const AVClass *class = avcodec_get_class();
2018 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2019 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2020 const AVClass *fclass = avformat_get_class();
2021 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2022 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2023 if (!option || foption)
2027 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2028 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2029 "output file #%d (%s) is not an encoding option.\n", e->key,
2030 option->help ? option->help : "", nb_output_files - 1,
2035 // gop_timecode is injected by generic code but not always used
2036 if (!strcmp(e->key, "gop_timecode"))
2039 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2040 "output file #%d (%s) has not been used for any stream. The most "
2041 "likely reason is either wrong type (e.g. a video option with "
2042 "no video streams) or that it is a private option of some encoder "
2043 "which was not actually used for any stream.\n", e->key,
2044 option->help ? option->help : "", nb_output_files - 1, filename);
2046 av_dict_free(&unused_opts);
2048 /* check filename in case of an image number is expected */
2049 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2050 if (!av_filename_number_test(oc->filename)) {
2051 print_error(oc->filename, AVERROR(EINVAL));
2056 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2057 /* test if it already exists to avoid losing precious files */
2058 assert_file_overwrite(filename);
2061 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2062 &oc->interrupt_callback,
2064 print_error(filename, err);
2067 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2068 assert_file_overwrite(filename);
2070 if (o->mux_preload) {
2071 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2073 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2076 for (i = 0; i < o->nb_metadata_map; i++) {
2078 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2080 if (in_file_index >= nb_input_files) {
2081 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2084 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2085 in_file_index >= 0 ?
2086 input_files[in_file_index]->ctx : NULL, o);
2090 if (o->chapters_input_file >= nb_input_files) {
2091 if (o->chapters_input_file == INT_MAX) {
2092 /* copy chapters from the first input file that has them*/
2093 o->chapters_input_file = -1;
2094 for (i = 0; i < nb_input_files; i++)
2095 if (input_files[i]->ctx->nb_chapters) {
2096 o->chapters_input_file = i;
2100 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2101 o->chapters_input_file);
2105 if (o->chapters_input_file >= 0)
2106 copy_chapters(input_files[o->chapters_input_file], of,
2107 !o->metadata_chapters_manual);
2109 /* copy global metadata by default */
2110 if (!o->metadata_global_manual && nb_input_files){
2111 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2112 AV_DICT_DONT_OVERWRITE);
2113 if(o->recording_time != INT64_MAX)
2114 av_dict_set(&oc->metadata, "duration", NULL, 0);
2115 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2117 if (!o->metadata_streams_manual)
2118 for (i = of->ost_index; i < nb_output_streams; i++) {
2120 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2122 ist = input_streams[output_streams[i]->source_index];
2123 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2124 if (!output_streams[i]->stream_copy)
2125 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2128 /* process manually set metadata */
2129 for (i = 0; i < o->nb_metadata; i++) {
2132 const char *stream_spec;
2133 int index = 0, j, ret = 0;
2135 val = strchr(o->metadata[i].u.str, '=');
2137 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2138 o->metadata[i].u.str);
2143 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2145 for (j = 0; j < oc->nb_streams; j++) {
2146 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2147 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2158 if (index < 0 || index >= oc->nb_chapters) {
2159 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2162 m = &oc->chapters[index]->metadata;
2165 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2168 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2175 static int opt_target(void *optctx, const char *opt, const char *arg)
2177 OptionsContext *o = optctx;
2178 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2179 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2181 if (!strncmp(arg, "pal-", 4)) {
2184 } else if (!strncmp(arg, "ntsc-", 5)) {
2187 } else if (!strncmp(arg, "film-", 5)) {
2191 /* Try to determine PAL/NTSC by peeking in the input files */
2192 if (nb_input_files) {
2194 for (j = 0; j < nb_input_files; j++) {
2195 for (i = 0; i < input_files[j]->nb_streams; i++) {
2196 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
2197 if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
2200 fr = c->time_base.den * 1000 / c->time_base.num;
2204 } else if ((fr == 29970) || (fr == 23976)) {
2209 if (norm != UNKNOWN)
2213 if (norm != UNKNOWN)
2214 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2217 if (norm == UNKNOWN) {
2218 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2219 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2220 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2224 if (!strcmp(arg, "vcd")) {
2225 opt_video_codec(o, "c:v", "mpeg1video");
2226 opt_audio_codec(o, "c:a", "mp2");
2227 parse_option(o, "f", "vcd", options);
2229 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2230 parse_option(o, "r", frame_rates[norm], options);
2231 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2233 opt_default(NULL, "b:v", "1150000");
2234 opt_default(NULL, "maxrate", "1150000");
2235 opt_default(NULL, "minrate", "1150000");
2236 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
2238 opt_default(NULL, "b:a", "224000");
2239 parse_option(o, "ar", "44100", options);
2240 parse_option(o, "ac", "2", options);
2242 opt_default(NULL, "packetsize", "2324");
2243 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2245 /* We have to offset the PTS, so that it is consistent with the SCR.
2246 SCR starts at 36000, but the first two packs contain only padding
2247 and the first pack from the other stream, respectively, may also have
2248 been written before.
2249 So the real data starts at SCR 36000+3*1200. */
2250 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2251 } else if (!strcmp(arg, "svcd")) {
2253 opt_video_codec(o, "c:v", "mpeg2video");
2254 opt_audio_codec(o, "c:a", "mp2");
2255 parse_option(o, "f", "svcd", options);
2257 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2258 parse_option(o, "r", frame_rates[norm], options);
2259 parse_option(o, "pix_fmt", "yuv420p", options);
2260 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2262 opt_default(NULL, "b:v", "2040000");
2263 opt_default(NULL, "maxrate", "2516000");
2264 opt_default(NULL, "minrate", "0"); // 1145000;
2265 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2266 opt_default(NULL, "scan_offset", "1");
2268 opt_default(NULL, "b:a", "224000");
2269 parse_option(o, "ar", "44100", options);
2271 opt_default(NULL, "packetsize", "2324");
2273 } else if (!strcmp(arg, "dvd")) {
2275 opt_video_codec(o, "c:v", "mpeg2video");
2276 opt_audio_codec(o, "c:a", "ac3");
2277 parse_option(o, "f", "dvd", options);
2279 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2280 parse_option(o, "r", frame_rates[norm], options);
2281 parse_option(o, "pix_fmt", "yuv420p", options);
2282 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2284 opt_default(NULL, "b:v", "6000000");
2285 opt_default(NULL, "maxrate", "9000000");
2286 opt_default(NULL, "minrate", "0"); // 1500000;
2287 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2289 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2290 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2292 opt_default(NULL, "b:a", "448000");
2293 parse_option(o, "ar", "48000", options);
2295 } else if (!strncmp(arg, "dv", 2)) {
2297 parse_option(o, "f", "dv", options);
2299 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2300 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2301 norm == PAL ? "yuv420p" : "yuv411p", options);
2302 parse_option(o, "r", frame_rates[norm], options);
2304 parse_option(o, "ar", "48000", options);
2305 parse_option(o, "ac", "2", options);
2308 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2309 return AVERROR(EINVAL);
2312 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2313 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2318 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2320 av_free (vstats_filename);
2321 vstats_filename = av_strdup (arg);
2325 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2328 time_t today2 = time(NULL);
2329 struct tm *today = localtime(&today2);
2331 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2333 return opt_vstats_file(NULL, opt, filename);
2336 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2338 OptionsContext *o = optctx;
2339 return parse_option(o, "frames:v", arg, options);
2342 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2344 OptionsContext *o = optctx;
2345 return parse_option(o, "frames:a", arg, options);
2348 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2350 OptionsContext *o = optctx;
2351 return parse_option(o, "frames:d", arg, options);
2354 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2357 AVDictionary *cbak = codec_opts;
2358 AVDictionary *fbak = format_opts;
2362 ret = opt_default(NULL, opt, arg);
2364 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2365 av_dict_copy(&o->g->format_opts, format_opts, 0);
2366 av_dict_free(&codec_opts);
2367 av_dict_free(&format_opts);
2374 static int opt_preset(void *optctx, const char *opt, const char *arg)
2376 OptionsContext *o = optctx;
2378 char filename[1000], line[1000], tmp_line[1000];
2379 const char *codec_name = NULL;
2383 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2385 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2386 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2387 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2389 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2393 while (fgets(line, sizeof(line), f)) {
2394 char *key = tmp_line, *value, *endptr;
2396 if (strcspn(line, "#\n\r") == 0)
2398 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2399 if (!av_strtok(key, "=", &value) ||
2400 !av_strtok(value, "\r\n", &endptr)) {
2401 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2404 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2406 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2407 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2408 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2409 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2410 else if (opt_default_new(o, key, value) < 0) {
2411 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2412 filename, line, key, value);
2422 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2424 OptionsContext *o = optctx;
2425 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2426 int ret = parse_option(o, s, arg, options);
2431 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2433 OptionsContext *o = optctx;
2435 if(!strcmp(opt, "ab")){
2436 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
2438 } else if(!strcmp(opt, "b")){
2439 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2440 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2443 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2447 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2449 OptionsContext *o = optctx;
2452 if(!strcmp(opt, "qscale")){
2453 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2454 return parse_option(o, "q:v", arg, options);
2456 s = av_asprintf("q%s", opt + 6);
2457 ret = parse_option(o, s, arg, options);
2462 static int opt_profile(void *optctx, const char *opt, const char *arg)
2464 OptionsContext *o = optctx;
2465 if(!strcmp(opt, "profile")){
2466 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2467 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2470 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2474 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2476 OptionsContext *o = optctx;
2477 return parse_option(o, "filter:v", arg, options);
2480 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2482 OptionsContext *o = optctx;
2483 return parse_option(o, "filter:a", arg, options);
2486 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2488 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2489 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2490 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2491 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
2493 if (video_sync_method == VSYNC_AUTO)
2494 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2498 static int opt_timecode(void *optctx, const char *opt, const char *arg)
2500 OptionsContext *o = optctx;
2501 char *tcr = av_asprintf("timecode=%s", arg);
2502 int ret = parse_option(o, "metadata:g", tcr, options);
2504 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
2509 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2511 OptionsContext *o = optctx;
2512 char layout_str[32];
2515 int ret, channels, ac_str_size;
2518 layout = av_get_channel_layout(arg);
2520 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2521 return AVERROR(EINVAL);
2523 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2524 ret = opt_default_new(o, opt, layout_str);
2528 /* set 'ac' option based on channel layout */
2529 channels = av_get_channel_layout_nb_channels(layout);
2530 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2531 stream_str = strchr(opt, ':');
2532 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2533 ac_str = av_mallocz(ac_str_size);
2535 return AVERROR(ENOMEM);
2536 av_strlcpy(ac_str, "ac", 3);
2538 av_strlcat(ac_str, stream_str, ac_str_size);
2539 ret = parse_option(o, ac_str, layout_str, options);
2545 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2547 OptionsContext *o = optctx;
2548 return parse_option(o, "q:a", arg, options);
2551 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2553 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2554 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2555 return AVERROR(ENOMEM);
2556 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2557 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2558 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2559 return AVERROR(ENOMEM);
2563 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2565 uint8_t *graph_desc = read_file(arg);
2567 return AVERROR(EINVAL);
2569 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2570 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2571 return AVERROR(ENOMEM);
2572 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2573 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2577 void show_help_default(const char *opt, const char *arg)
2579 /* per-file options have at least one of those set */
2580 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2581 int show_advanced = 0, show_avoptions = 0;
2584 if (!strcmp(opt, "long"))
2586 else if (!strcmp(opt, "full"))
2587 show_advanced = show_avoptions = 1;
2589 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2594 printf("Getting help:\n"
2595 " -h -- print basic options\n"
2596 " -h long -- print more options\n"
2597 " -h full -- print all options (including all format and codec specific options, very long)\n"
2598 " See man %s for detailed description of the options.\n"
2599 "\n", program_name);
2601 show_help_options(options, "Print help / information / capabilities:",
2604 show_help_options(options, "Global options (affect whole program "
2605 "instead of just one file:",
2606 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2608 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2609 per_file | OPT_EXIT, 0);
2611 show_help_options(options, "Per-file main options:", 0,
2612 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2613 OPT_EXIT, per_file);
2615 show_help_options(options, "Advanced per-file options:",
2616 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2618 show_help_options(options, "Video options:",
2619 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2621 show_help_options(options, "Advanced Video options:",
2622 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2624 show_help_options(options, "Audio options:",
2625 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2627 show_help_options(options, "Advanced Audio options:",
2628 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2629 show_help_options(options, "Subtitle options:",
2630 OPT_SUBTITLE, 0, 0);
2633 if (show_avoptions) {
2634 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2635 show_help_children(avcodec_get_class(), flags);
2636 show_help_children(avformat_get_class(), flags);
2638 show_help_children(sws_get_class(), flags);
2640 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2641 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
2645 void show_usage(void)
2647 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
2648 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2649 av_log(NULL, AV_LOG_INFO, "\n");
2657 static const OptionGroupDef groups[] = {
2658 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2659 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2662 static int open_files(OptionGroupList *l, const char *inout,
2663 int (*open_file)(OptionsContext*, const char*))
2667 for (i = 0; i < l->nb_groups; i++) {
2668 OptionGroup *g = &l->groups[i];
2674 ret = parse_optgroup(&o, g);
2676 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2677 "%s.\n", inout, g->arg);
2681 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2682 ret = open_file(&o, g->arg);
2685 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2689 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2695 int ffmpeg_parse_options(int argc, char **argv)
2697 OptionParseContext octx;
2701 memset(&octx, 0, sizeof(octx));
2703 /* split the commandline into an internal representation */
2704 ret = split_commandline(&octx, argc, argv, options, groups,
2705 FF_ARRAY_ELEMS(groups));
2707 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2711 /* apply global options */
2712 ret = parse_optgroup(NULL, &octx.global_opts);
2714 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2718 /* open input files */
2719 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2721 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2725 /* open output files */
2726 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2728 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2733 uninit_parse_context(&octx);
2735 av_strerror(ret, error, sizeof(error));
2736 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2741 static int opt_progress(void *optctx, const char *opt, const char *arg)
2743 AVIOContext *avio = NULL;
2746 if (!strcmp(arg, "-"))
2748 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
2750 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
2751 arg, av_err2str(ret));
2754 progress_avio = avio;
2758 #define OFFSET(x) offsetof(OptionsContext, x)
2759 const OptionDef options[] = {
2761 #include "cmdutils_common_opts.h"
2762 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2763 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2764 "force format", "fmt" },
2765 { "y", OPT_BOOL, { &file_overwrite },
2766 "overwrite output files" },
2767 { "n", OPT_BOOL, { &no_file_overwrite },
2768 "never overwrite output files" },
2769 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2770 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2771 "codec name", "codec" },
2772 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2773 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2774 "codec name", "codec" },
2775 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2776 OPT_OUTPUT, { .off = OFFSET(presets) },
2777 "preset name", "preset" },
2778 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2779 OPT_OUTPUT, { .func_arg = opt_map },
2780 "set input stream mapping",
2781 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2782 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
2783 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
2784 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2785 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2786 "set metadata information of outfile from infile",
2787 "outfile[,metadata]:infile[,metadata]" },
2788 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2789 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2790 "set chapters mapping", "input_file_index" },
2791 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2792 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2793 "record or transcode \"duration\" seconds of audio/video",
2795 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },
2796 "record or transcode stop time", "time_stop" },
2797 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2798 "set the limit file size in bytes", "limit_size" },
2799 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2800 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2801 "set the start time offset", "time_off" },
2802 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2803 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2804 "enable/disable accurate seeking with -ss" },
2805 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2806 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2807 "set the input ts offset", "time_off" },
2808 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2809 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2810 "set the input ts scale", "scale" },
2811 { "timestamp", HAS_ARG | OPT_PERFILE, { .func_arg = opt_recording_timestamp },
2812 "set the recording timestamp ('now' to set the current time)", "time" },
2813 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2814 "add metadata", "string=string" },
2815 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2816 OPT_OUTPUT, { .func_arg = opt_data_frames },
2817 "set the number of data frames to record", "number" },
2818 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2819 "add timings for benchmarking" },
2820 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
2821 "add timings for each task" },
2822 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
2823 "write program-readable progress information", "url" },
2824 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
2825 "enable or disable interaction on standard input" },
2826 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2827 "set max runtime in seconds", "limit" },
2828 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2829 "dump each input packet" },
2830 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2831 "when dumping packets, also dump the payload" },
2832 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2833 OPT_INPUT, { .off = OFFSET(rate_emu) },
2834 "read input at native frame rate", "" },
2835 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2836 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2837 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2838 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2839 "video sync method", "" },
2840 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2841 "audio sync method", "" },
2842 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2843 "audio drift threshold", "threshold" },
2844 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2845 "copy timestamps" },
2846 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
2847 "shift input timestamps to start at 0 when using copyts" },
2848 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
2849 "copy input stream time base when stream copying", "mode" },
2850 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2851 OPT_OUTPUT, { .off = OFFSET(shortest) },
2852 "finish encoding within shortest input" },
2853 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
2854 OPT_OUTPUT, { .off = OFFSET(apad) },
2856 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2857 "timestamp discontinuity delta threshold", "threshold" },
2858 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
2859 "timestamp error delta threshold", "threshold" },
2860 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2861 "exit on error", "error" },
2862 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2863 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2864 "copy initial non-keyframes" },
2865 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
2866 "copy or discard frames before start time" },
2867 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2868 "set the number of frames to record", "number" },
2869 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2870 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2871 "force codec tag/fourcc", "fourcc/tag" },
2872 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2873 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2874 "use fixed quality scale (VBR)", "q" },
2875 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2876 OPT_OUTPUT, { .func_arg = opt_qscale },
2877 "use fixed quality scale (VBR)", "q" },
2878 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
2879 "set profile", "profile" },
2880 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2881 "set stream filtergraph", "filter_graph" },
2882 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2883 "read stream filtergraph description from a file", "filename" },
2884 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
2885 "reinit filtergraph on input parameter changes", "" },
2886 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2887 "create a complex filtergraph", "graph_description" },
2888 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2889 "create a complex filtergraph", "graph_description" },
2890 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2891 "read complex filtergraph description from a file", "filename" },
2892 { "stats", OPT_BOOL, { &print_stats },
2893 "print progress report during encoding", },
2894 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2895 OPT_OUTPUT, { .func_arg = opt_attach },
2896 "add an attachment to the output file", "filename" },
2897 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2898 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2899 "extract an attachment into a file", "filename" },
2900 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
2901 "print timestamp debugging info" },
2902 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
2903 "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
2904 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
2905 OPT_INPUT, { .off = OFFSET(discard) },
2909 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2910 "set the number of video frames to record", "number" },
2911 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2912 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2913 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2914 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
2915 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2916 "set frame size (WxH or abbreviation)", "size" },
2917 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2918 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2919 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2920 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2921 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2922 "set pixel format", "format" },
2923 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
2924 "set the number of bits per raw sample", "number" },
2925 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
2926 "deprecated use -g 1" },
2927 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
2929 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2930 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2931 "rate control override for specific intervals", "override" },
2932 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2933 OPT_OUTPUT, { .func_arg = opt_video_codec },
2934 "force video codec ('copy' to copy stream)", "codec" },
2935 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
2937 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
2939 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
2940 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
2941 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2942 "select the pass number (1 to 3)", "n" },
2943 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2944 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2945 "select two pass log file name prefix", "prefix" },
2946 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
2947 "this option is deprecated, use the yadif filter instead" },
2948 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
2949 "calculate PSNR of compressed frames" },
2950 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2951 "dump video coding statistics to file" },
2952 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2953 "dump video coding statistics to file", "file" },
2954 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2955 "set video filters", "filter_graph" },
2956 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2957 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2958 "specify intra matrix coeffs", "matrix" },
2959 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2960 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2961 "specify inter matrix coeffs", "matrix" },
2962 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2963 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
2964 "specify intra matrix coeffs", "matrix" },
2965 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2966 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2967 "top=1/bottom=0/auto=-1 field first", "" },
2968 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2969 OPT_OUTPUT, { .func_arg = opt_old2new },
2970 "force video tag/fourcc", "fourcc/tag" },
2971 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2972 "show QP histogram" },
2973 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2974 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2975 "force the selected framerate, disable the best supported framerate selection" },
2976 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2977 OPT_OUTPUT, { .func_arg = opt_streamid },
2978 "set the value of an outfile streamid", "streamIndex:value" },
2979 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2980 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2981 "force key frames at specified timestamps", "timestamps" },
2982 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
2983 "audio bitrate (please use -b:a)", "bitrate" },
2984 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
2985 "video bitrate (please use -b:v)", "bitrate" },
2986 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2987 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
2988 "use HW accelerated decoding", "hwaccel name" },
2989 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2990 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
2991 "select a device for HW acceleration" "devicename" },
2993 { "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
2997 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2998 "set the number of audio frames to record", "number" },
2999 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3000 "set audio quality (codec-specific)", "quality", },
3001 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3002 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3003 "set audio sampling rate (in Hz)", "rate" },
3004 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3005 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3006 "set number of audio channels", "channels" },
3007 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3009 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3010 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3011 "force audio codec ('copy' to copy stream)", "codec" },
3012 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3013 OPT_OUTPUT, { .func_arg = opt_old2new },
3014 "force audio tag/fourcc", "fourcc/tag" },
3015 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3016 "change audio volume (256=normal)" , "volume" },
3017 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3018 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3019 "set sample format", "format" },
3020 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3021 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3022 "set channel layout", "layout" },
3023 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3024 "set audio filters", "filter_graph" },
3025 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3026 "set the maximum number of channels to try to guess the channel layout" },
3028 /* subtitle options */
3029 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3030 "disable subtitle" },
3031 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3032 "force subtitle codec ('copy' to copy stream)", "codec" },
3033 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3034 , "force subtitle tag/fourcc", "fourcc/tag" },
3035 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3036 "fix subtitles duration" },
3037 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3038 "set canvas size (WxH or abbreviation)", "size" },
3041 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3042 "deprecated, use -channel", "channel" },
3043 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3044 "deprecated, use -standard", "standard" },
3045 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3048 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3049 "set the maximum demux-decode delay", "seconds" },
3050 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3051 "set the initial demux-decode delay", "seconds" },
3052 { "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
3053 "override the options from ffserver", "" },
3055 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3056 "A comma-separated list of bitstream filters", "bitstream_filters" },
3057 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3058 "deprecated", "audio bitstream_filters" },
3059 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3060 "deprecated", "video bitstream_filters" },
3062 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3063 "set the audio options to the indicated preset", "preset" },
3064 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3065 "set the video options to the indicated preset", "preset" },
3066 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3067 "set the subtitle options to the indicated preset", "preset" },
3068 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3069 "set options from indicated preset file", "filename" },
3070 /* data codec support */
3071 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3072 "force data codec ('copy' to copy stream)", "codec" },
3073 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },