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"
43 #include "libavutil/time_internal.h"
45 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
48 for (i = 0; i < o->nb_ ## name; i++) {\
49 char *spec = o->name[i].specifier;\
50 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
51 outvar = o->name[i].u.type;\
57 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
60 for (i = 0; i < o->nb_ ## name; i++) {\
61 char *spec = o->name[i].specifier;\
62 if (!strcmp(spec, mediatype))\
63 outvar = o->name[i].u.type;\
67 const HWAccel hwaccels[] = {
69 { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
72 { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
75 { "vda", vda_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
80 char *vstats_filename;
83 float audio_drift_threshold = 0.1;
84 float dts_delta_threshold = 10;
85 float dts_error_threshold = 3600*30;
87 int audio_volume = 256;
88 int audio_sync_method = 0;
89 int video_sync_method = VSYNC_AUTO;
90 float frame_drop_threshold = 0;
91 int do_deinterlace = 0;
93 int do_benchmark_all = 0;
97 int start_at_zero = 0;
100 int exit_on_error = 0;
101 int print_stats = -1;
103 int stdin_interaction = 1;
104 int frame_bits_per_raw_sample = 0;
105 float max_error_rate = 2.0/3;
108 static int intra_only = 0;
109 static int file_overwrite = 0;
110 static int no_file_overwrite = 0;
111 static int do_psnr = 0;
112 static int input_sync;
113 static int override_ffserver = 0;
114 static int input_stream_potentially_available = 0;
115 static int ignore_unknown_streams = 0;
116 static int copy_unknown_streams = 0;
118 static void uninit_options(OptionsContext *o)
120 const OptionDef *po = options;
123 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
125 void *dst = (uint8_t*)o + po->u.off;
127 if (po->flags & OPT_SPEC) {
128 SpecifierOpt **so = dst;
129 int i, *count = (int*)(so + 1);
130 for (i = 0; i < *count; i++) {
131 av_freep(&(*so)[i].specifier);
132 if (po->flags & OPT_STRING)
133 av_freep(&(*so)[i].u.str);
137 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
142 for (i = 0; i < o->nb_stream_maps; i++)
143 av_freep(&o->stream_maps[i].linklabel);
144 av_freep(&o->stream_maps);
145 av_freep(&o->audio_channel_maps);
146 av_freep(&o->streamid_map);
147 av_freep(&o->attachments);
150 static void init_options(OptionsContext *o)
152 memset(o, 0, sizeof(*o));
154 o->stop_time = INT64_MAX;
155 o->mux_max_delay = 0.7;
156 o->start_time = AV_NOPTS_VALUE;
157 o->recording_time = INT64_MAX;
158 o->limit_filesize = UINT64_MAX;
159 o->chapters_input_file = INT_MAX;
160 o->accurate_seek = 1;
163 /* return a copy of the input with the stream specifiers removed from the keys */
164 static AVDictionary *strip_specifiers(AVDictionary *dict)
166 AVDictionaryEntry *e = NULL;
167 AVDictionary *ret = NULL;
169 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
170 char *p = strchr(e->key, ':');
174 av_dict_set(&ret, e->key, e->value, 0);
181 static int opt_sameq(void *optctx, const char *opt, const char *arg)
183 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
184 "If you are looking for an option to preserve the quality (which is not "
185 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
187 return AVERROR(EINVAL);
190 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
192 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
193 return opt_default(optctx, "channel", arg);
196 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
198 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
199 return opt_default(optctx, "standard", arg);
202 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
204 OptionsContext *o = optctx;
205 return parse_option(o, "codec:a", arg, options);
208 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
210 OptionsContext *o = optctx;
211 return parse_option(o, "codec:v", arg, options);
214 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
216 OptionsContext *o = optctx;
217 return parse_option(o, "codec:s", arg, options);
220 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
222 OptionsContext *o = optctx;
223 return parse_option(o, "codec:d", arg, options);
226 static int opt_map(void *optctx, const char *opt, const char *arg)
228 OptionsContext *o = optctx;
230 int i, negative = 0, file_idx;
231 int sync_file_idx = -1, sync_stream_idx = 0;
239 map = av_strdup(arg);
241 return AVERROR(ENOMEM);
243 /* parse sync stream first, just pick first matching stream */
244 if (sync = strchr(map, ',')) {
246 sync_file_idx = strtol(sync + 1, &sync, 0);
247 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
248 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
253 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
254 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
255 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
259 if (i == input_files[sync_file_idx]->nb_streams) {
260 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
261 "match any streams.\n", arg);
268 /* this mapping refers to lavfi output */
269 const char *c = map + 1;
270 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
271 m = &o->stream_maps[o->nb_stream_maps - 1];
272 m->linklabel = av_get_token(&c, "]");
274 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
278 file_idx = strtol(map, &p, 0);
279 if (file_idx >= nb_input_files || file_idx < 0) {
280 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
284 /* disable some already defined maps */
285 for (i = 0; i < o->nb_stream_maps; i++) {
286 m = &o->stream_maps[i];
287 if (file_idx == m->file_index &&
288 check_stream_specifier(input_files[m->file_index]->ctx,
289 input_files[m->file_index]->ctx->streams[m->stream_index],
290 *p == ':' ? p + 1 : p) > 0)
294 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
295 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
296 *p == ':' ? p + 1 : p) <= 0)
298 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
299 m = &o->stream_maps[o->nb_stream_maps - 1];
301 m->file_index = file_idx;
304 if (sync_file_idx >= 0) {
305 m->sync_file_index = sync_file_idx;
306 m->sync_stream_index = sync_stream_idx;
308 m->sync_file_index = file_idx;
309 m->sync_stream_index = i;
315 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
323 static int opt_attach(void *optctx, const char *opt, const char *arg)
325 OptionsContext *o = optctx;
326 GROW_ARRAY(o->attachments, o->nb_attachments);
327 o->attachments[o->nb_attachments - 1] = arg;
331 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
333 OptionsContext *o = optctx;
338 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
339 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
341 /* muted channel syntax */
342 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
343 if ((n == 1 || n == 3) && m->channel_idx == -1) {
344 m->file_idx = m->stream_idx = -1;
346 m->ofile_idx = m->ostream_idx = -1;
351 n = sscanf(arg, "%d.%d.%d:%d.%d",
352 &m->file_idx, &m->stream_idx, &m->channel_idx,
353 &m->ofile_idx, &m->ostream_idx);
355 if (n != 3 && n != 5) {
356 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
357 "[file.stream.channel|-1][:syncfile:syncstream]\n");
361 if (n != 5) // only file.stream.channel specified
362 m->ofile_idx = m->ostream_idx = -1;
365 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
366 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
370 if (m->stream_idx < 0 ||
371 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
372 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
373 m->file_idx, m->stream_idx);
376 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
377 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
378 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
379 m->file_idx, m->stream_idx);
382 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
383 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
384 m->file_idx, m->stream_idx, m->channel_idx);
390 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
392 av_free(sdp_filename);
393 sdp_filename = av_strdup(arg);
398 * Parse a metadata specifier passed as 'arg' parameter.
399 * @param arg metadata string to parse
400 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
401 * @param index for type c/p, chapter/program index is written here
402 * @param stream_spec for type s, the stream specifier is written here
404 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
412 if (*(++arg) && *arg != ':') {
413 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
416 *stream_spec = *arg == ':' ? arg + 1 : "";
421 *index = strtol(++arg, NULL, 0);
424 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
431 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
433 AVDictionary **meta_in = NULL;
434 AVDictionary **meta_out = NULL;
436 char type_in, type_out;
437 const char *istream_spec = NULL, *ostream_spec = NULL;
438 int idx_in = 0, idx_out = 0;
440 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
441 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
444 if (type_out == 'g' || !*outspec)
445 o->metadata_global_manual = 1;
446 if (type_out == 's' || !*outspec)
447 o->metadata_streams_manual = 1;
448 if (type_out == 'c' || !*outspec)
449 o->metadata_chapters_manual = 1;
453 if (type_in == 'g' || type_out == 'g')
454 o->metadata_global_manual = 1;
455 if (type_in == 's' || type_out == 's')
456 o->metadata_streams_manual = 1;
457 if (type_in == 'c' || type_out == 'c')
458 o->metadata_chapters_manual = 1;
460 /* ic is NULL when just disabling automatic mappings */
464 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
465 if ((index) < 0 || (index) >= (nb_elems)) {\
466 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
471 #define SET_DICT(type, meta, context, index)\
474 meta = &context->metadata;\
477 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
478 meta = &context->chapters[index]->metadata;\
481 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
482 meta = &context->programs[index]->metadata;\
485 break; /* handled separately below */ \
486 default: av_assert0(0);\
489 SET_DICT(type_in, meta_in, ic, idx_in);
490 SET_DICT(type_out, meta_out, oc, idx_out);
492 /* for input streams choose first matching stream */
493 if (type_in == 's') {
494 for (i = 0; i < ic->nb_streams; i++) {
495 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
496 meta_in = &ic->streams[i]->metadata;
502 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
507 if (type_out == 's') {
508 for (i = 0; i < oc->nb_streams; i++) {
509 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
510 meta_out = &oc->streams[i]->metadata;
511 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
516 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
521 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
523 OptionsContext *o = optctx;
525 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
526 struct tm time = *gmtime((time_t*)&recording_timestamp);
527 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
529 parse_option(o, "metadata", buf, options);
531 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
532 "tag instead.\n", opt);
536 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
538 const AVCodecDescriptor *desc;
539 const char *codec_string = encoder ? "encoder" : "decoder";
543 avcodec_find_encoder_by_name(name) :
544 avcodec_find_decoder_by_name(name);
546 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
547 codec = encoder ? avcodec_find_encoder(desc->id) :
548 avcodec_find_decoder(desc->id);
550 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
551 codec_string, codec->name, desc->name);
555 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
558 if (codec->type != type) {
559 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
565 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
567 char *codec_name = NULL;
569 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
571 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
572 st->codec->codec_id = codec->id;
575 return avcodec_find_decoder(st->codec->codec_id);
578 /* Add all the streams from the given input file to the global
579 * list of input streams. */
580 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
584 for (i = 0; i < ic->nb_streams; i++) {
585 AVStream *st = ic->streams[i];
586 AVCodecContext *dec = st->codec;
587 InputStream *ist = av_mallocz(sizeof(*ist));
588 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
589 char *codec_tag = NULL;
591 char *discard_str = NULL;
592 const AVOption *discard_opt = av_opt_find(dec, "skip_frame", NULL, 0, 0);
597 GROW_ARRAY(input_streams, nb_input_streams);
598 input_streams[nb_input_streams - 1] = ist;
601 ist->file_index = nb_input_files;
603 st->discard = AVDISCARD_ALL;
606 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
609 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
611 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
613 uint32_t tag = strtol(codec_tag, &next, 0);
615 tag = AV_RL32(codec_tag);
616 st->codec->codec_tag = tag;
619 ist->dec = choose_decoder(o, ic, st);
620 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
622 ist->reinit_filters = -1;
623 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
625 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
626 ist->user_set_discard = AVDISCARD_NONE;
627 if (discard_str && av_opt_eval_int(dec, discard_opt, discard_str, &ist->user_set_discard) < 0) {
628 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
633 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
635 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
637 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
641 ret = avcodec_copy_context(ist->dec_ctx, dec);
643 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
647 switch (dec->codec_type) {
648 case AVMEDIA_TYPE_VIDEO:
650 ist->dec = avcodec_find_decoder(dec->codec_id);
651 if (av_codec_get_lowres(dec)) {
652 dec->flags |= CODEC_FLAG_EMU_EDGE;
655 ist->resample_height = ist->dec_ctx->height;
656 ist->resample_width = ist->dec_ctx->width;
657 ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
659 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
660 if (framerate && av_parse_video_rate(&ist->framerate,
662 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
667 ist->top_field_first = -1;
668 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
670 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
672 if (!strcmp(hwaccel, "none"))
673 ist->hwaccel_id = HWACCEL_NONE;
674 else if (!strcmp(hwaccel, "auto"))
675 ist->hwaccel_id = HWACCEL_AUTO;
678 for (i = 0; hwaccels[i].name; i++) {
679 if (!strcmp(hwaccels[i].name, hwaccel)) {
680 ist->hwaccel_id = hwaccels[i].id;
685 if (!ist->hwaccel_id) {
686 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
688 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
689 for (i = 0; hwaccels[i].name; i++)
690 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
691 av_log(NULL, AV_LOG_FATAL, "\n");
697 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
698 if (hwaccel_device) {
699 ist->hwaccel_device = av_strdup(hwaccel_device);
700 if (!ist->hwaccel_device)
703 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
706 case AVMEDIA_TYPE_AUDIO:
707 ist->guess_layout_max = INT_MAX;
708 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
709 guess_input_channel_layout(ist);
711 ist->resample_sample_fmt = ist->dec_ctx->sample_fmt;
712 ist->resample_sample_rate = ist->dec_ctx->sample_rate;
713 ist->resample_channels = ist->dec_ctx->channels;
714 ist->resample_channel_layout = ist->dec_ctx->channel_layout;
717 case AVMEDIA_TYPE_DATA:
718 case AVMEDIA_TYPE_SUBTITLE: {
719 char *canvas_size = NULL;
721 ist->dec = avcodec_find_decoder(dec->codec_id);
722 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
723 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
725 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
726 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
731 case AVMEDIA_TYPE_ATTACHMENT:
732 case AVMEDIA_TYPE_UNKNOWN:
740 static void assert_file_overwrite(const char *filename)
742 if (file_overwrite && no_file_overwrite) {
743 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
747 if (!file_overwrite) {
748 const char *proto_name = avio_find_protocol_name(filename);
749 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
750 if (stdin_interaction && !no_file_overwrite) {
751 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
754 signal(SIGINT, SIG_DFL);
756 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
762 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
769 static void dump_attachment(AVStream *st, const char *filename)
772 AVIOContext *out = NULL;
773 AVDictionaryEntry *e;
775 if (!st->codec->extradata_size) {
776 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
777 nb_input_files - 1, st->index);
780 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
783 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
784 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
788 assert_file_overwrite(filename);
790 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
791 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
796 avio_write(out, st->codec->extradata, st->codec->extradata_size);
801 static int open_input_file(OptionsContext *o, const char *filename)
805 AVInputFormat *file_iformat = NULL;
809 AVDictionary *unused_opts = NULL;
810 AVDictionaryEntry *e = NULL;
811 int orig_nb_streams; // number of streams before avformat_find_stream_info
812 char * video_codec_name = NULL;
813 char * audio_codec_name = NULL;
814 char *subtitle_codec_name = NULL;
815 char * data_codec_name = NULL;
816 int scan_all_pmts_set = 0;
819 if (!(file_iformat = av_find_input_format(o->format))) {
820 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
825 if (!strcmp(filename, "-"))
828 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
829 strcmp(filename, "/dev/stdin");
831 /* get default parameters from command line */
832 ic = avformat_alloc_context();
834 print_error(filename, AVERROR(ENOMEM));
837 if (o->nb_audio_sample_rate) {
838 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
840 if (o->nb_audio_channels) {
841 /* because we set audio_channels based on both the "ac" and
842 * "channel_layout" options, we need to check that the specified
843 * demuxer actually has the "channels" option before setting it */
844 if (file_iformat && file_iformat->priv_class &&
845 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
846 AV_OPT_SEARCH_FAKE_OBJ)) {
847 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
850 if (o->nb_frame_rates) {
851 /* set the format-level framerate option;
852 * this is important for video grabbers, e.g. x11 */
853 if (file_iformat && file_iformat->priv_class &&
854 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
855 AV_OPT_SEARCH_FAKE_OBJ)) {
856 av_dict_set(&o->g->format_opts, "framerate",
857 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
860 if (o->nb_frame_sizes) {
861 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
863 if (o->nb_frame_pix_fmts)
864 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
866 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
867 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
868 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
869 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
871 ic->video_codec_id = video_codec_name ?
872 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
873 ic->audio_codec_id = audio_codec_name ?
874 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
875 ic->subtitle_codec_id= subtitle_codec_name ?
876 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
877 ic->data_codec_id = data_codec_name ?
878 find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0)->id : AV_CODEC_ID_NONE;
880 if (video_codec_name)
881 av_format_set_video_codec (ic, find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0));
882 if (audio_codec_name)
883 av_format_set_audio_codec (ic, find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0));
884 if (subtitle_codec_name)
885 av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
887 av_format_set_data_codec(ic, find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0));
889 ic->flags |= AVFMT_FLAG_NONBLOCK;
890 ic->interrupt_callback = int_cb;
892 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
893 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
894 scan_all_pmts_set = 1;
896 /* open the input file with generic avformat function */
897 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
899 print_error(filename, err);
902 if (scan_all_pmts_set)
903 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
904 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
905 assert_avoptions(o->g->format_opts);
907 /* apply forced codec ids */
908 for (i = 0; i < ic->nb_streams; i++)
909 choose_decoder(o, ic, ic->streams[i]);
911 /* Set AVCodecContext options for avformat_find_stream_info */
912 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
913 orig_nb_streams = ic->nb_streams;
915 /* If not enough info to get the stream parameters, we decode the
916 first frames to get it. (used in mpeg case for example) */
917 ret = avformat_find_stream_info(ic, opts);
919 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
920 if (ic->nb_streams == 0) {
921 avformat_close_input(&ic);
926 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
927 /* add the stream start time */
928 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
929 timestamp += ic->start_time;
931 /* if seeking requested, we execute it */
932 if (o->start_time != AV_NOPTS_VALUE) {
933 int64_t seek_timestamp = timestamp;
935 if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
936 int dts_heuristic = 0;
937 for (i=0; i<ic->nb_streams; i++) {
938 AVCodecContext *avctx = ic->streams[i]->codec;
939 if (avctx->has_b_frames)
943 seek_timestamp -= 3*AV_TIME_BASE / 23;
946 ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
948 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
949 filename, (double)timestamp / AV_TIME_BASE);
953 /* update the current parameters so that they match the one of the input stream */
954 add_input_streams(o, ic);
956 /* dump the file content */
957 av_dump_format(ic, nb_input_files, filename, 0);
959 GROW_ARRAY(input_files, nb_input_files);
960 f = av_mallocz(sizeof(*f));
963 input_files[nb_input_files - 1] = f;
966 f->ist_index = nb_input_streams - ic->nb_streams;
967 f->start_time = o->start_time;
968 f->recording_time = o->recording_time;
969 f->input_ts_offset = o->input_ts_offset;
970 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
971 f->nb_streams = ic->nb_streams;
972 f->rate_emu = o->rate_emu;
973 f->accurate_seek = o->accurate_seek;
975 f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
978 /* check if all codec options have been used */
979 unused_opts = strip_specifiers(o->g->codec_opts);
980 for (i = f->ist_index; i < nb_input_streams; i++) {
982 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
983 AV_DICT_IGNORE_SUFFIX)))
984 av_dict_set(&unused_opts, e->key, NULL, 0);
988 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
989 const AVClass *class = avcodec_get_class();
990 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
991 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
992 const AVClass *fclass = avformat_get_class();
993 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
994 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
995 if (!option || foption)
999 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1000 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1001 "input file #%d (%s) is not a decoding option.\n", e->key,
1002 option->help ? option->help : "", nb_input_files - 1,
1007 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1008 "input file #%d (%s) has not been used for any stream. The most "
1009 "likely reason is either wrong type (e.g. a video option with "
1010 "no video streams) or that it is a private option of some decoder "
1011 "which was not actually used for any stream.\n", e->key,
1012 option->help ? option->help : "", nb_input_files - 1, filename);
1014 av_dict_free(&unused_opts);
1016 for (i = 0; i < o->nb_dump_attachment; i++) {
1019 for (j = 0; j < ic->nb_streams; j++) {
1020 AVStream *st = ic->streams[j];
1022 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1023 dump_attachment(st, o->dump_attachment[i].u.str);
1027 for (i = 0; i < orig_nb_streams; i++)
1028 av_dict_free(&opts[i]);
1031 input_stream_potentially_available = 1;
1036 static uint8_t *get_line(AVIOContext *s)
1042 if (avio_open_dyn_buf(&line) < 0) {
1043 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1047 while ((c = avio_r8(s)) && c != '\n')
1050 avio_close_dyn_buf(line, &buf);
1055 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1058 char filename[1000];
1059 const char *base[3] = { getenv("AVCONV_DATADIR"),
1064 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1068 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1069 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1070 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1073 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1074 i != 1 ? "" : "/.avconv", preset_name);
1075 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1081 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1083 char *codec_name = NULL;
1085 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1087 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
1088 NULL, ost->st->codec->codec_type);
1089 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1090 } else if (!strcmp(codec_name, "copy"))
1091 ost->stream_copy = 1;
1093 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
1094 ost->st->codec->codec_id = ost->enc->id;
1098 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1101 AVStream *st = avformat_new_stream(oc, NULL);
1102 int idx = oc->nb_streams - 1, ret = 0;
1103 char *bsf = NULL, *next, *codec_tag = NULL;
1104 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
1109 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1113 if (oc->nb_streams - 1 < o->nb_streamid_map)
1114 st->id = o->streamid_map[oc->nb_streams - 1];
1116 GROW_ARRAY(output_streams, nb_output_streams);
1117 if (!(ost = av_mallocz(sizeof(*ost))))
1119 output_streams[nb_output_streams - 1] = ost;
1121 ost->file_index = nb_output_files - 1;
1124 st->codec->codec_type = type;
1125 choose_encoder(o, oc, ost);
1127 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1128 if (!ost->enc_ctx) {
1129 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1132 ost->enc_ctx->codec_type = type;
1135 AVIOContext *s = NULL;
1136 char *buf = NULL, *arg = NULL, *preset = NULL;
1138 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1140 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1141 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1144 if (!buf[0] || buf[0] == '#') {
1148 if (!(arg = strchr(buf, '='))) {
1149 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1153 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1155 } while (!s->eof_reached);
1159 av_log(NULL, AV_LOG_FATAL,
1160 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1161 preset, ost->file_index, ost->index);
1165 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1168 ost->max_frames = INT64_MAX;
1169 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1170 for (i = 0; i<o->nb_max_frames; i++) {
1171 char *p = o->max_frames[i].specifier;
1172 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1173 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1178 ost->copy_prior_start = -1;
1179 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1181 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
1184 if (next = strchr(bsf, ','))
1186 if (arg = strchr(bsf, '='))
1188 if (!(bsfc = av_bitstream_filter_init(bsf))) {
1189 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
1193 bsfc_prev->next = bsfc;
1195 ost->bitstream_filters = bsfc;
1196 av_dict_set(&ost->bsf_args, bsfc->filter->name, arg, 0);
1202 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1204 uint32_t tag = strtol(codec_tag, &next, 0);
1206 tag = AV_RL32(codec_tag);
1207 ost->st->codec->codec_tag =
1208 ost->enc_ctx->codec_tag = tag;
1211 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1213 ost->enc_ctx->flags |= CODEC_FLAG_QSCALE;
1214 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1217 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1218 ost->disposition = av_strdup(ost->disposition);
1220 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1221 ost->enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
1223 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1225 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1226 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1227 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1229 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1231 ost->source_index = source_index;
1232 if (source_index >= 0) {
1233 ost->sync_ist = input_streams[source_index];
1234 input_streams[source_index]->discard = 0;
1235 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1237 ost->last_mux_dts = AV_NOPTS_VALUE;
1242 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1245 const char *p = str;
1252 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1259 /* read file contents into a string */
1260 static uint8_t *read_file(const char *filename)
1262 AVIOContext *pb = NULL;
1263 AVIOContext *dyn_buf = NULL;
1264 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1265 uint8_t buf[1024], *str;
1268 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1272 ret = avio_open_dyn_buf(&dyn_buf);
1277 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1278 avio_write(dyn_buf, buf, ret);
1279 avio_w8(dyn_buf, 0);
1282 ret = avio_close_dyn_buf(dyn_buf, &str);
1288 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1291 AVStream *st = ost->st;
1293 if (ost->filters_script && ost->filters) {
1294 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1295 "output stream #%d:%d.\n", nb_output_files, st->index);
1299 if (ost->filters_script)
1300 return read_file(ost->filters_script);
1301 else if (ost->filters)
1302 return av_strdup(ost->filters);
1304 return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
1308 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1309 const OutputStream *ost, enum AVMediaType type)
1311 if (ost->filters_script || ost->filters) {
1312 av_log(NULL, AV_LOG_ERROR,
1313 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1314 "Filtering and streamcopy cannot be used together.\n",
1315 ost->filters ? "Filtergraph" : "Filtergraph script",
1316 ost->filters ? ost->filters : ost->filters_script,
1317 av_get_media_type_string(type), ost->file_index, ost->index);
1322 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1326 AVCodecContext *video_enc;
1327 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1329 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1331 video_enc = ost->enc_ctx;
1333 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1334 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1335 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1338 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1339 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1341 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1342 if (frame_aspect_ratio) {
1344 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1345 q.num <= 0 || q.den <= 0) {
1346 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1349 ost->frame_aspect_ratio = q;
1352 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1353 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1355 if (!ost->stream_copy) {
1356 const char *p = NULL;
1357 char *frame_size = NULL;
1358 char *frame_pix_fmt = NULL;
1359 char *intra_matrix = NULL, *inter_matrix = NULL;
1360 char *chroma_intra_matrix = NULL;
1364 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1365 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1366 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1370 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1371 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1372 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1373 ost->keep_pix_fmt = 1;
1374 if (!*++frame_pix_fmt)
1375 frame_pix_fmt = NULL;
1377 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1378 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1381 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1384 video_enc->gop_size = 0;
1385 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1387 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1388 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1391 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1393 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1394 if (chroma_intra_matrix) {
1395 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1397 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1400 av_codec_set_chroma_intra_matrix(video_enc, p);
1401 parse_matrix_coeffs(p, chroma_intra_matrix);
1403 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1405 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1406 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1409 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1412 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1413 for (i = 0; p; i++) {
1415 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1417 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1420 video_enc->rc_override =
1421 av_realloc_array(video_enc->rc_override,
1422 i + 1, sizeof(RcOverride));
1423 if (!video_enc->rc_override) {
1424 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1427 video_enc->rc_override[i].start_frame = start;
1428 video_enc->rc_override[i].end_frame = end;
1430 video_enc->rc_override[i].qscale = q;
1431 video_enc->rc_override[i].quality_factor = 1.0;
1434 video_enc->rc_override[i].qscale = 0;
1435 video_enc->rc_override[i].quality_factor = -q/100.0;
1440 video_enc->rc_override_count = i;
1443 video_enc->flags|= CODEC_FLAG_PSNR;
1446 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1449 video_enc->flags |= CODEC_FLAG_PASS1;
1450 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1453 video_enc->flags |= CODEC_FLAG_PASS2;
1454 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1458 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1459 if (ost->logfile_prefix &&
1460 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1463 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1464 if (ost->forced_keyframes)
1465 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1467 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1469 ost->top_field_first = -1;
1470 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1473 ost->avfilter = get_ost_filters(o, oc, ost);
1477 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1480 if (ost->stream_copy)
1481 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1486 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1491 AVCodecContext *audio_enc;
1493 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1496 audio_enc = ost->enc_ctx;
1497 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1499 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1500 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1502 if (!ost->stream_copy) {
1503 char *sample_fmt = NULL;
1505 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1507 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1509 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1510 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1514 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1516 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1517 ost->apad = av_strdup(ost->apad);
1519 ost->avfilter = get_ost_filters(o, oc, ost);
1523 /* check for channel mapping for this audio stream */
1524 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1525 AudioChannelMap *map = &o->audio_channel_maps[n];
1526 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1527 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1530 if (map->channel_idx == -1) {
1532 } else if (ost->source_index < 0) {
1533 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1534 ost->file_index, ost->st->index);
1537 ist = input_streams[ost->source_index];
1540 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1541 if (av_reallocp_array(&ost->audio_channels_map,
1542 ost->audio_channels_mapped + 1,
1543 sizeof(*ost->audio_channels_map)
1547 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1553 if (ost->stream_copy)
1554 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1559 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1563 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1564 if (!ost->stream_copy) {
1565 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1572 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1576 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1577 if (!ost->stream_copy) {
1578 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1585 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1587 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1588 ost->stream_copy = 1;
1593 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1597 AVCodecContext *subtitle_enc;
1599 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1601 subtitle_enc = ost->enc_ctx;
1603 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1605 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1607 if (!ost->stream_copy) {
1608 char *frame_size = NULL;
1610 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1611 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1612 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1620 /* arg format is "output-stream-index:streamid-value". */
1621 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1623 OptionsContext *o = optctx;
1628 av_strlcpy(idx_str, arg, sizeof(idx_str));
1629 p = strchr(idx_str, ':');
1631 av_log(NULL, AV_LOG_FATAL,
1632 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1637 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1638 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1639 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1643 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1645 AVFormatContext *is = ifile->ctx;
1646 AVFormatContext *os = ofile->ctx;
1650 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1652 return AVERROR(ENOMEM);
1655 for (i = 0; i < is->nb_chapters; i++) {
1656 AVChapter *in_ch = is->chapters[i], *out_ch;
1657 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1658 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1659 AV_TIME_BASE_Q, in_ch->time_base);
1660 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1661 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1664 if (in_ch->end < ts_off)
1666 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1669 out_ch = av_mallocz(sizeof(AVChapter));
1671 return AVERROR(ENOMEM);
1673 out_ch->id = in_ch->id;
1674 out_ch->time_base = in_ch->time_base;
1675 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1676 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1679 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1681 os->chapters[os->nb_chapters++] = out_ch;
1686 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1689 AVFormatContext *ic = avformat_alloc_context();
1691 ic->interrupt_callback = int_cb;
1692 err = avformat_open_input(&ic, filename, NULL, NULL);
1695 /* copy stream format */
1696 for(i=0;i<ic->nb_streams;i++) {
1700 const char *enc_config;
1702 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
1704 av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
1705 return AVERROR(EINVAL);
1707 if (codec->type == AVMEDIA_TYPE_AUDIO)
1708 opt_audio_codec(o, "c:a", codec->name);
1709 else if (codec->type == AVMEDIA_TYPE_VIDEO)
1710 opt_video_codec(o, "c:v", codec->name);
1711 ost = new_output_stream(o, s, codec->type, -1);
1714 avcodec_get_context_defaults3(st->codec, codec);
1715 enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
1717 AVDictionary *opts = NULL;
1718 av_dict_parse_string(&opts, enc_config, "=", ",", 0);
1719 av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
1720 av_dict_free(&opts);
1723 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
1724 choose_sample_fmt(st, codec);
1725 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
1726 choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt);
1727 avcodec_copy_context(ost->enc_ctx, st->codec);
1729 av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
1732 avformat_close_input(&ic);
1736 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1737 AVFormatContext *oc)
1741 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1742 ofilter->out_tmp->pad_idx)) {
1743 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
1744 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1746 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1751 ost->source_index = -1;
1752 ost->filter = ofilter;
1756 if (ost->stream_copy) {
1757 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1758 "which is fed from a complex filtergraph. Filtering and streamcopy "
1759 "cannot be used together.\n", ost->file_index, ost->index);
1763 if (ost->avfilter && (ost->filters || ost->filters_script)) {
1764 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
1765 av_log(NULL, AV_LOG_ERROR,
1766 "%s '%s' was specified through the %s option "
1767 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
1768 "%s and -filter_complex cannot be used together for the same stream.\n",
1769 ost->filters ? "Filtergraph" : "Filtergraph script",
1770 ost->filters ? ost->filters : ost->filters_script,
1771 opt, ost->file_index, ost->index, opt);
1775 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1776 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1779 avfilter_inout_free(&ofilter->out_tmp);
1782 static int configure_complex_filters(void)
1786 for (i = 0; i < nb_filtergraphs; i++)
1787 if (!filtergraphs[i]->graph &&
1788 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1793 static int open_output_file(OptionsContext *o, const char *filename)
1795 AVFormatContext *oc;
1797 AVOutputFormat *file_oformat;
1801 AVDictionary *unused_opts = NULL;
1802 AVDictionaryEntry *e = NULL;
1804 if (configure_complex_filters() < 0) {
1805 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1809 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
1810 o->stop_time = INT64_MAX;
1811 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1814 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1815 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
1816 if (o->stop_time <= start_time) {
1817 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1820 o->recording_time = o->stop_time - start_time;
1824 GROW_ARRAY(output_files, nb_output_files);
1825 of = av_mallocz(sizeof(*of));
1828 output_files[nb_output_files - 1] = of;
1830 of->ost_index = nb_output_streams;
1831 of->recording_time = o->recording_time;
1832 of->start_time = o->start_time;
1833 of->limit_filesize = o->limit_filesize;
1834 of->shortest = o->shortest;
1835 av_dict_copy(&of->opts, o->g->format_opts, 0);
1837 if (!strcmp(filename, "-"))
1840 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
1842 print_error(filename, err);
1847 if (o->recording_time != INT64_MAX)
1848 oc->duration = o->recording_time;
1850 file_oformat= oc->oformat;
1851 oc->interrupt_callback = int_cb;
1853 /* create streams for all unlabeled output pads */
1854 for (i = 0; i < nb_filtergraphs; i++) {
1855 FilterGraph *fg = filtergraphs[i];
1856 for (j = 0; j < fg->nb_outputs; j++) {
1857 OutputFilter *ofilter = fg->outputs[j];
1859 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1862 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1863 ofilter->out_tmp->pad_idx)) {
1864 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1865 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1866 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1868 init_output_filter(ofilter, o, oc);
1872 /* ffserver seeking with date=... needs a date reference */
1873 if (!strcmp(file_oformat->name, "ffm") &&
1874 av_strstart(filename, "http:", NULL)) {
1875 int err = parse_option(o, "metadata", "creation_time=now", options);
1877 print_error(filename, err);
1882 if (!strcmp(file_oformat->name, "ffm") && !override_ffserver &&
1883 av_strstart(filename, "http:", NULL)) {
1885 /* special case for files sent to ffserver: we get the stream
1886 parameters from ffserver */
1887 int err = read_ffserver_streams(o, oc, filename);
1889 print_error(filename, err);
1892 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
1893 ost = output_streams[j];
1894 for (i = 0; i < nb_input_streams; i++) {
1895 ist = input_streams[i];
1896 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
1898 ost->source_index= i;
1899 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
1900 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
1902 ist->st->discard = ist->user_set_discard;
1907 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));
1911 } else if (!o->nb_stream_maps) {
1912 char *subtitle_codec_name = NULL;
1913 /* pick the "best" stream of each type */
1915 /* video: highest resolution */
1916 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
1917 int area = 0, idx = -1;
1918 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
1919 for (i = 0; i < nb_input_streams; i++) {
1921 ist = input_streams[i];
1922 new_area = ist->st->codec->width * ist->st->codec->height;
1923 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1925 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1927 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1934 new_video_stream(o, oc, idx);
1937 /* audio: most channels */
1938 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
1939 int channels = 0, idx = -1;
1940 for (i = 0; i < nb_input_streams; i++) {
1941 ist = input_streams[i];
1942 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1943 ist->st->codec->channels > channels) {
1944 channels = ist->st->codec->channels;
1949 new_audio_stream(o, oc, idx);
1952 /* subtitles: pick first */
1953 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
1954 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
1955 for (i = 0; i < nb_input_streams; i++)
1956 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1957 AVCodecDescriptor const *input_descriptor =
1958 avcodec_descriptor_get(input_streams[i]->st->codec->codec_id);
1959 AVCodecDescriptor const *output_descriptor = NULL;
1960 AVCodec const *output_codec =
1961 avcodec_find_encoder(oc->oformat->subtitle_codec);
1962 int input_props = 0, output_props = 0;
1964 output_descriptor = avcodec_descriptor_get(output_codec->id);
1965 if (input_descriptor)
1966 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1967 if (output_descriptor)
1968 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1969 if (subtitle_codec_name ||
1970 input_props & output_props ||
1971 // Map dvb teletext which has neither property to any output subtitle encoder
1972 input_descriptor && output_descriptor &&
1973 (!input_descriptor->props ||
1974 !output_descriptor->props)) {
1975 new_subtitle_stream(o, oc, i);
1980 /* Data only if codec id match */
1981 if (!o->data_disable ) {
1982 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
1983 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
1984 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_DATA
1985 && input_streams[i]->st->codec->codec_id == codec_id )
1986 new_data_stream(o, oc, i);
1990 for (i = 0; i < o->nb_stream_maps; i++) {
1991 StreamMap *map = &o->stream_maps[i];
1996 if (map->linklabel) {
1998 OutputFilter *ofilter = NULL;
2001 for (j = 0; j < nb_filtergraphs; j++) {
2002 fg = filtergraphs[j];
2003 for (k = 0; k < fg->nb_outputs; k++) {
2004 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2005 if (out && !strcmp(out->name, map->linklabel)) {
2006 ofilter = fg->outputs[k];
2013 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2014 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2017 init_output_filter(ofilter, o, oc);
2019 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2021 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2022 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
2024 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2026 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2028 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
2032 switch (ist->st->codec->codec_type) {
2033 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2034 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2035 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2036 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2037 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2038 case AVMEDIA_TYPE_UNKNOWN:
2039 if (copy_unknown_streams) {
2040 ost = new_unknown_stream (o, oc, src_idx);
2044 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2045 "Cannot map stream #%d:%d - unsupported type.\n",
2046 map->file_index, map->stream_index);
2047 if (!ignore_unknown_streams) {
2048 av_log(NULL, AV_LOG_FATAL,
2049 "If you want unsupported types ignored instead "
2050 "of failing, please use the -ignore_unknown option\n"
2051 "If you want them copied, please use -copy_unknown\n");
2056 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2057 + map->sync_stream_index];
2062 /* handle attached files */
2063 for (i = 0; i < o->nb_attachments; i++) {
2065 uint8_t *attachment;
2069 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2070 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2074 if ((len = avio_size(pb)) <= 0) {
2075 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2079 if (!(attachment = av_malloc(len))) {
2080 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
2084 avio_read(pb, attachment, len);
2086 ost = new_attachment_stream(o, oc, -1);
2087 ost->stream_copy = 0;
2088 ost->attachment_filename = o->attachments[i];
2090 ost->st->codec->extradata = attachment;
2091 ost->st->codec->extradata_size = len;
2093 p = strrchr(o->attachments[i], '/');
2094 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2098 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2099 AVDictionaryEntry *e;
2100 ost = output_streams[i];
2102 if ((ost->stream_copy || ost->attachment_filename)
2103 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2104 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2105 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2109 /* check if all codec options have been used */
2110 unused_opts = strip_specifiers(o->g->codec_opts);
2111 for (i = of->ost_index; i < nb_output_streams; i++) {
2113 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2114 AV_DICT_IGNORE_SUFFIX)))
2115 av_dict_set(&unused_opts, e->key, NULL, 0);
2119 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2120 const AVClass *class = avcodec_get_class();
2121 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2122 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2123 const AVClass *fclass = avformat_get_class();
2124 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2125 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2126 if (!option || foption)
2130 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2131 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2132 "output file #%d (%s) is not an encoding option.\n", e->key,
2133 option->help ? option->help : "", nb_output_files - 1,
2138 // gop_timecode is injected by generic code but not always used
2139 if (!strcmp(e->key, "gop_timecode"))
2142 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2143 "output file #%d (%s) has not been used for any stream. The most "
2144 "likely reason is either wrong type (e.g. a video option with "
2145 "no video streams) or that it is a private option of some encoder "
2146 "which was not actually used for any stream.\n", e->key,
2147 option->help ? option->help : "", nb_output_files - 1, filename);
2149 av_dict_free(&unused_opts);
2151 /* check filename in case of an image number is expected */
2152 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2153 if (!av_filename_number_test(oc->filename)) {
2154 print_error(oc->filename, AVERROR(EINVAL));
2159 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2160 av_log(NULL, AV_LOG_ERROR,
2161 "No input streams but output needs an input stream\n");
2165 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2166 /* test if it already exists to avoid losing precious files */
2167 assert_file_overwrite(filename);
2170 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2171 &oc->interrupt_callback,
2173 print_error(filename, err);
2176 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2177 assert_file_overwrite(filename);
2179 if (o->mux_preload) {
2180 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2182 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2185 for (i = 0; i < o->nb_metadata_map; i++) {
2187 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2189 if (in_file_index >= nb_input_files) {
2190 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2193 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2194 in_file_index >= 0 ?
2195 input_files[in_file_index]->ctx : NULL, o);
2199 if (o->chapters_input_file >= nb_input_files) {
2200 if (o->chapters_input_file == INT_MAX) {
2201 /* copy chapters from the first input file that has them*/
2202 o->chapters_input_file = -1;
2203 for (i = 0; i < nb_input_files; i++)
2204 if (input_files[i]->ctx->nb_chapters) {
2205 o->chapters_input_file = i;
2209 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2210 o->chapters_input_file);
2214 if (o->chapters_input_file >= 0)
2215 copy_chapters(input_files[o->chapters_input_file], of,
2216 !o->metadata_chapters_manual);
2218 /* copy global metadata by default */
2219 if (!o->metadata_global_manual && nb_input_files){
2220 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2221 AV_DICT_DONT_OVERWRITE);
2222 if(o->recording_time != INT64_MAX)
2223 av_dict_set(&oc->metadata, "duration", NULL, 0);
2224 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2226 if (!o->metadata_streams_manual)
2227 for (i = of->ost_index; i < nb_output_streams; i++) {
2229 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2231 ist = input_streams[output_streams[i]->source_index];
2232 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2233 if (!output_streams[i]->stream_copy) {
2234 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2235 if (ist->autorotate)
2236 av_dict_set(&output_streams[i]->st->metadata, "rotate", NULL, 0);
2240 /* process manually set metadata */
2241 for (i = 0; i < o->nb_metadata; i++) {
2244 const char *stream_spec;
2245 int index = 0, j, ret = 0;
2248 val = strchr(o->metadata[i].u.str, '=');
2250 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2251 o->metadata[i].u.str);
2256 if (!strcmp(o->metadata[i].u.str, "creation_time") &&
2257 !strcmp(val, "now")) {
2258 time_t now = time(0);
2259 struct tm *ptm, tmbuf;
2260 ptm = localtime_r(&now, &tmbuf);
2262 if (strftime(now_time, sizeof(now_time), "%Y-%m-%d %H:%M:%S", ptm))
2267 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2269 for (j = 0; j < oc->nb_streams; j++) {
2270 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2271 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2272 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2273 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2274 ost->rotate_overridden = 1;
2286 if (index < 0 || index >= oc->nb_chapters) {
2287 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2290 m = &oc->chapters[index]->metadata;
2293 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2296 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2303 static int opt_target(void *optctx, const char *opt, const char *arg)
2305 OptionsContext *o = optctx;
2306 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2307 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2309 if (!strncmp(arg, "pal-", 4)) {
2312 } else if (!strncmp(arg, "ntsc-", 5)) {
2315 } else if (!strncmp(arg, "film-", 5)) {
2319 /* Try to determine PAL/NTSC by peeking in the input files */
2320 if (nb_input_files) {
2322 for (j = 0; j < nb_input_files; j++) {
2323 for (i = 0; i < input_files[j]->nb_streams; i++) {
2324 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
2325 if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
2328 fr = c->time_base.den * 1000 / c->time_base.num;
2332 } else if ((fr == 29970) || (fr == 23976)) {
2337 if (norm != UNKNOWN)
2341 if (norm != UNKNOWN)
2342 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2345 if (norm == UNKNOWN) {
2346 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2347 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2348 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2352 if (!strcmp(arg, "vcd")) {
2353 opt_video_codec(o, "c:v", "mpeg1video");
2354 opt_audio_codec(o, "c:a", "mp2");
2355 parse_option(o, "f", "vcd", options);
2357 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2358 parse_option(o, "r", frame_rates[norm], options);
2359 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2361 opt_default(NULL, "b:v", "1150000");
2362 opt_default(NULL, "maxrate:v", "1150000");
2363 opt_default(NULL, "minrate:v", "1150000");
2364 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2366 opt_default(NULL, "b:a", "224000");
2367 parse_option(o, "ar", "44100", options);
2368 parse_option(o, "ac", "2", options);
2370 opt_default(NULL, "packetsize", "2324");
2371 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2373 /* We have to offset the PTS, so that it is consistent with the SCR.
2374 SCR starts at 36000, but the first two packs contain only padding
2375 and the first pack from the other stream, respectively, may also have
2376 been written before.
2377 So the real data starts at SCR 36000+3*1200. */
2378 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2379 } else if (!strcmp(arg, "svcd")) {
2381 opt_video_codec(o, "c:v", "mpeg2video");
2382 opt_audio_codec(o, "c:a", "mp2");
2383 parse_option(o, "f", "svcd", options);
2385 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2386 parse_option(o, "r", frame_rates[norm], options);
2387 parse_option(o, "pix_fmt", "yuv420p", options);
2388 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2390 opt_default(NULL, "b:v", "2040000");
2391 opt_default(NULL, "maxrate:v", "2516000");
2392 opt_default(NULL, "minrate:v", "0"); // 1145000;
2393 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2394 opt_default(NULL, "scan_offset", "1");
2396 opt_default(NULL, "b:a", "224000");
2397 parse_option(o, "ar", "44100", options);
2399 opt_default(NULL, "packetsize", "2324");
2401 } else if (!strcmp(arg, "dvd")) {
2403 opt_video_codec(o, "c:v", "mpeg2video");
2404 opt_audio_codec(o, "c:a", "ac3");
2405 parse_option(o, "f", "dvd", options);
2407 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2408 parse_option(o, "r", frame_rates[norm], options);
2409 parse_option(o, "pix_fmt", "yuv420p", options);
2410 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2412 opt_default(NULL, "b:v", "6000000");
2413 opt_default(NULL, "maxrate:v", "9000000");
2414 opt_default(NULL, "minrate:v", "0"); // 1500000;
2415 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2417 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2418 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2420 opt_default(NULL, "b:a", "448000");
2421 parse_option(o, "ar", "48000", options);
2423 } else if (!strncmp(arg, "dv", 2)) {
2425 parse_option(o, "f", "dv", options);
2427 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2428 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2429 norm == PAL ? "yuv420p" : "yuv411p", options);
2430 parse_option(o, "r", frame_rates[norm], options);
2432 parse_option(o, "ar", "48000", options);
2433 parse_option(o, "ac", "2", options);
2436 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2437 return AVERROR(EINVAL);
2440 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2441 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2446 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2448 av_free (vstats_filename);
2449 vstats_filename = av_strdup (arg);
2453 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2456 time_t today2 = time(NULL);
2457 struct tm *today = localtime(&today2);
2459 if (!today) { // maybe tomorrow
2460 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2464 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2466 return opt_vstats_file(NULL, opt, filename);
2469 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2471 OptionsContext *o = optctx;
2472 return parse_option(o, "frames:v", arg, options);
2475 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2477 OptionsContext *o = optctx;
2478 return parse_option(o, "frames:a", arg, options);
2481 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2483 OptionsContext *o = optctx;
2484 return parse_option(o, "frames:d", arg, options);
2487 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2490 AVDictionary *cbak = codec_opts;
2491 AVDictionary *fbak = format_opts;
2495 ret = opt_default(NULL, opt, arg);
2497 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2498 av_dict_copy(&o->g->format_opts, format_opts, 0);
2499 av_dict_free(&codec_opts);
2500 av_dict_free(&format_opts);
2507 static int opt_preset(void *optctx, const char *opt, const char *arg)
2509 OptionsContext *o = optctx;
2511 char filename[1000], line[1000], tmp_line[1000];
2512 const char *codec_name = NULL;
2516 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2518 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2519 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2520 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2522 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2526 while (fgets(line, sizeof(line), f)) {
2527 char *key = tmp_line, *value, *endptr;
2529 if (strcspn(line, "#\n\r") == 0)
2531 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2532 if (!av_strtok(key, "=", &value) ||
2533 !av_strtok(value, "\r\n", &endptr)) {
2534 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2537 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2539 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2540 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2541 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2542 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2543 else if (opt_default_new(o, key, value) < 0) {
2544 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2545 filename, line, key, value);
2555 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2557 OptionsContext *o = optctx;
2558 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2559 int ret = parse_option(o, s, arg, options);
2564 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2566 OptionsContext *o = optctx;
2568 if(!strcmp(opt, "ab")){
2569 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
2571 } else if(!strcmp(opt, "b")){
2572 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2573 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2576 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2580 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2582 OptionsContext *o = optctx;
2585 if(!strcmp(opt, "qscale")){
2586 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2587 return parse_option(o, "q:v", arg, options);
2589 s = av_asprintf("q%s", opt + 6);
2590 ret = parse_option(o, s, arg, options);
2595 static int opt_profile(void *optctx, const char *opt, const char *arg)
2597 OptionsContext *o = optctx;
2598 if(!strcmp(opt, "profile")){
2599 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2600 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2603 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2607 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2609 OptionsContext *o = optctx;
2610 return parse_option(o, "filter:v", arg, options);
2613 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2615 OptionsContext *o = optctx;
2616 return parse_option(o, "filter:a", arg, options);
2619 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2621 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2622 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2623 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2624 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
2626 if (video_sync_method == VSYNC_AUTO)
2627 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2631 static int opt_timecode(void *optctx, const char *opt, const char *arg)
2633 OptionsContext *o = optctx;
2634 char *tcr = av_asprintf("timecode=%s", arg);
2635 int ret = parse_option(o, "metadata:g", tcr, options);
2637 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
2642 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2644 OptionsContext *o = optctx;
2645 char layout_str[32];
2648 int ret, channels, ac_str_size;
2651 layout = av_get_channel_layout(arg);
2653 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2654 return AVERROR(EINVAL);
2656 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2657 ret = opt_default_new(o, opt, layout_str);
2661 /* set 'ac' option based on channel layout */
2662 channels = av_get_channel_layout_nb_channels(layout);
2663 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2664 stream_str = strchr(opt, ':');
2665 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2666 ac_str = av_mallocz(ac_str_size);
2668 return AVERROR(ENOMEM);
2669 av_strlcpy(ac_str, "ac", 3);
2671 av_strlcat(ac_str, stream_str, ac_str_size);
2672 ret = parse_option(o, ac_str, layout_str, options);
2678 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2680 OptionsContext *o = optctx;
2681 return parse_option(o, "q:a", arg, options);
2684 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2686 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2687 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2688 return AVERROR(ENOMEM);
2689 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2690 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2691 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2692 return AVERROR(ENOMEM);
2694 input_stream_potentially_available = 1;
2699 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2701 uint8_t *graph_desc = read_file(arg);
2703 return AVERROR(EINVAL);
2705 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2706 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2707 return AVERROR(ENOMEM);
2708 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2709 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2711 input_stream_potentially_available = 1;
2716 void show_help_default(const char *opt, const char *arg)
2718 /* per-file options have at least one of those set */
2719 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2720 int show_advanced = 0, show_avoptions = 0;
2723 if (!strcmp(opt, "long"))
2725 else if (!strcmp(opt, "full"))
2726 show_advanced = show_avoptions = 1;
2728 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2733 printf("Getting help:\n"
2734 " -h -- print basic options\n"
2735 " -h long -- print more options\n"
2736 " -h full -- print all options (including all format and codec specific options, very long)\n"
2737 " See man %s for detailed description of the options.\n"
2738 "\n", program_name);
2740 show_help_options(options, "Print help / information / capabilities:",
2743 show_help_options(options, "Global options (affect whole program "
2744 "instead of just one file:",
2745 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2747 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2748 per_file | OPT_EXIT, 0);
2750 show_help_options(options, "Per-file main options:", 0,
2751 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2752 OPT_EXIT, per_file);
2754 show_help_options(options, "Advanced per-file options:",
2755 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2757 show_help_options(options, "Video options:",
2758 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2760 show_help_options(options, "Advanced Video options:",
2761 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2763 show_help_options(options, "Audio options:",
2764 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2766 show_help_options(options, "Advanced Audio options:",
2767 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2768 show_help_options(options, "Subtitle options:",
2769 OPT_SUBTITLE, 0, 0);
2772 if (show_avoptions) {
2773 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2774 show_help_children(avcodec_get_class(), flags);
2775 show_help_children(avformat_get_class(), flags);
2777 show_help_children(sws_get_class(), flags);
2779 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2780 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
2784 void show_usage(void)
2786 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
2787 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2788 av_log(NULL, AV_LOG_INFO, "\n");
2796 static const OptionGroupDef groups[] = {
2797 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2798 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2801 static int open_files(OptionGroupList *l, const char *inout,
2802 int (*open_file)(OptionsContext*, const char*))
2806 for (i = 0; i < l->nb_groups; i++) {
2807 OptionGroup *g = &l->groups[i];
2813 ret = parse_optgroup(&o, g);
2815 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2816 "%s.\n", inout, g->arg);
2820 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2821 ret = open_file(&o, g->arg);
2824 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2828 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2834 int ffmpeg_parse_options(int argc, char **argv)
2836 OptionParseContext octx;
2840 memset(&octx, 0, sizeof(octx));
2842 /* split the commandline into an internal representation */
2843 ret = split_commandline(&octx, argc, argv, options, groups,
2844 FF_ARRAY_ELEMS(groups));
2846 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2850 /* apply global options */
2851 ret = parse_optgroup(NULL, &octx.global_opts);
2853 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2857 /* open input files */
2858 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2860 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2864 /* open output files */
2865 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2867 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2872 uninit_parse_context(&octx);
2874 av_strerror(ret, error, sizeof(error));
2875 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2880 static int opt_progress(void *optctx, const char *opt, const char *arg)
2882 AVIOContext *avio = NULL;
2885 if (!strcmp(arg, "-"))
2887 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
2889 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
2890 arg, av_err2str(ret));
2893 progress_avio = avio;
2897 #define OFFSET(x) offsetof(OptionsContext, x)
2898 const OptionDef options[] = {
2900 #include "cmdutils_common_opts.h"
2901 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2902 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2903 "force format", "fmt" },
2904 { "y", OPT_BOOL, { &file_overwrite },
2905 "overwrite output files" },
2906 { "n", OPT_BOOL, { &no_file_overwrite },
2907 "never overwrite output files" },
2908 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
2909 "Ignore unknown stream types" },
2910 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
2911 "Copy unknown stream types" },
2912 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2913 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2914 "codec name", "codec" },
2915 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2916 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2917 "codec name", "codec" },
2918 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2919 OPT_OUTPUT, { .off = OFFSET(presets) },
2920 "preset name", "preset" },
2921 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2922 OPT_OUTPUT, { .func_arg = opt_map },
2923 "set input stream mapping",
2924 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2925 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
2926 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
2927 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2928 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2929 "set metadata information of outfile from infile",
2930 "outfile[,metadata]:infile[,metadata]" },
2931 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2932 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2933 "set chapters mapping", "input_file_index" },
2934 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2935 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2936 "record or transcode \"duration\" seconds of audio/video",
2938 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },
2939 "record or transcode stop time", "time_stop" },
2940 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2941 "set the limit file size in bytes", "limit_size" },
2942 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2943 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2944 "set the start time offset", "time_off" },
2945 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
2946 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
2947 "enable/disable seeking by timestamp with -ss" },
2948 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2949 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2950 "enable/disable accurate seeking with -ss" },
2951 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2952 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2953 "set the input ts offset", "time_off" },
2954 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2955 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2956 "set the input ts scale", "scale" },
2957 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
2958 "set the recording timestamp ('now' to set the current time)", "time" },
2959 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2960 "add metadata", "string=string" },
2961 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2962 OPT_OUTPUT, { .func_arg = opt_data_frames },
2963 "set the number of data frames to output", "number" },
2964 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2965 "add timings for benchmarking" },
2966 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
2967 "add timings for each task" },
2968 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
2969 "write program-readable progress information", "url" },
2970 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
2971 "enable or disable interaction on standard input" },
2972 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2973 "set max runtime in seconds", "limit" },
2974 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2975 "dump each input packet" },
2976 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2977 "when dumping packets, also dump the payload" },
2978 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2979 OPT_INPUT, { .off = OFFSET(rate_emu) },
2980 "read input at native frame rate", "" },
2981 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2982 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2983 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2984 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2985 "video sync method", "" },
2986 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
2987 "frame drop threshold", "" },
2988 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2989 "audio sync method", "" },
2990 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2991 "audio drift threshold", "threshold" },
2992 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2993 "copy timestamps" },
2994 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
2995 "shift input timestamps to start at 0 when using copyts" },
2996 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
2997 "copy input stream time base when stream copying", "mode" },
2998 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2999 OPT_OUTPUT, { .off = OFFSET(shortest) },
3000 "finish encoding within shortest input" },
3001 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3002 OPT_OUTPUT, { .off = OFFSET(apad) },
3004 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3005 "timestamp discontinuity delta threshold", "threshold" },
3006 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3007 "timestamp error delta threshold", "threshold" },
3008 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3009 "exit on error", "error" },
3010 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3011 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3012 "copy initial non-keyframes" },
3013 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3014 "copy or discard frames before start time" },
3015 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3016 "set the number of frames to output", "number" },
3017 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3018 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3019 "force codec tag/fourcc", "fourcc/tag" },
3020 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3021 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3022 "use fixed quality scale (VBR)", "q" },
3023 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3024 OPT_OUTPUT, { .func_arg = opt_qscale },
3025 "use fixed quality scale (VBR)", "q" },
3026 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3027 "set profile", "profile" },
3028 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3029 "set stream filtergraph", "filter_graph" },
3030 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3031 "read stream filtergraph description from a file", "filename" },
3032 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3033 "reinit filtergraph on input parameter changes", "" },
3034 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3035 "create a complex filtergraph", "graph_description" },
3036 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3037 "create a complex filtergraph", "graph_description" },
3038 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3039 "read complex filtergraph description from a file", "filename" },
3040 { "stats", OPT_BOOL, { &print_stats },
3041 "print progress report during encoding", },
3042 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3043 OPT_OUTPUT, { .func_arg = opt_attach },
3044 "add an attachment to the output file", "filename" },
3045 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3046 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3047 "extract an attachment into a file", "filename" },
3048 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3049 "print timestamp debugging info" },
3050 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3051 "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
3052 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3053 OPT_INPUT, { .off = OFFSET(discard) },
3055 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3056 OPT_OUTPUT, { .off = OFFSET(disposition) },
3057 "disposition", "" },
3058 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3059 { .off = OFFSET(thread_queue_size) },
3060 "set the maximum number of queued packets from the demuxer" },
3063 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3064 "set the number of video frames to output", "number" },
3065 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3066 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3067 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3068 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3069 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3070 "set frame size (WxH or abbreviation)", "size" },
3071 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3072 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3073 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3074 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3075 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3076 "set pixel format", "format" },
3077 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3078 "set the number of bits per raw sample", "number" },
3079 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3080 "deprecated use -g 1" },
3081 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3083 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3084 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3085 "rate control override for specific intervals", "override" },
3086 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3087 OPT_OUTPUT, { .func_arg = opt_video_codec },
3088 "force video codec ('copy' to copy stream)", "codec" },
3089 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3091 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3093 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3094 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3095 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3096 "select the pass number (1 to 3)", "n" },
3097 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3098 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3099 "select two pass log file name prefix", "prefix" },
3100 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3101 "this option is deprecated, use the yadif filter instead" },
3102 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3103 "calculate PSNR of compressed frames" },
3104 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
3105 "dump video coding statistics to file" },
3106 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
3107 "dump video coding statistics to file", "file" },
3108 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3109 "set video filters", "filter_graph" },
3110 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3111 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3112 "specify intra matrix coeffs", "matrix" },
3113 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3114 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3115 "specify inter matrix coeffs", "matrix" },
3116 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3117 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3118 "specify intra matrix coeffs", "matrix" },
3119 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3120 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3121 "top=1/bottom=0/auto=-1 field first", "" },
3122 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3123 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3124 "force video tag/fourcc", "fourcc/tag" },
3125 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3126 "show QP histogram" },
3127 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3128 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3129 "force the selected framerate, disable the best supported framerate selection" },
3130 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3131 OPT_OUTPUT, { .func_arg = opt_streamid },
3132 "set the value of an outfile streamid", "streamIndex:value" },
3133 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3134 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3135 "force key frames at specified timestamps", "timestamps" },
3136 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3137 "audio bitrate (please use -b:a)", "bitrate" },
3138 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3139 "video bitrate (please use -b:v)", "bitrate" },
3140 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3141 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3142 "use HW accelerated decoding", "hwaccel name" },
3143 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3144 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3145 "select a device for HW acceleration" "devicename" },
3147 { "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
3149 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3150 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3151 "automatically insert correct rotate filters" },
3154 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3155 "set the number of audio frames to output", "number" },
3156 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3157 "set audio quality (codec-specific)", "quality", },
3158 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3159 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3160 "set audio sampling rate (in Hz)", "rate" },
3161 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3162 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3163 "set number of audio channels", "channels" },
3164 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3166 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3167 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3168 "force audio codec ('copy' to copy stream)", "codec" },
3169 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3170 OPT_OUTPUT, { .func_arg = opt_old2new },
3171 "force audio tag/fourcc", "fourcc/tag" },
3172 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3173 "change audio volume (256=normal)" , "volume" },
3174 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3175 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3176 "set sample format", "format" },
3177 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3178 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3179 "set channel layout", "layout" },
3180 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3181 "set audio filters", "filter_graph" },
3182 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3183 "set the maximum number of channels to try to guess the channel layout" },
3185 /* subtitle options */
3186 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3187 "disable subtitle" },
3188 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3189 "force subtitle codec ('copy' to copy stream)", "codec" },
3190 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3191 , "force subtitle tag/fourcc", "fourcc/tag" },
3192 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3193 "fix subtitles duration" },
3194 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3195 "set canvas size (WxH or abbreviation)", "size" },
3198 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3199 "deprecated, use -channel", "channel" },
3200 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3201 "deprecated, use -standard", "standard" },
3202 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3205 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3206 "set the maximum demux-decode delay", "seconds" },
3207 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3208 "set the initial demux-decode delay", "seconds" },
3209 { "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
3210 "override the options from ffserver", "" },
3211 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { opt_sdp_file },
3212 "specify a file in which to print sdp information", "file" },
3214 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3215 "A comma-separated list of bitstream filters", "bitstream_filters" },
3216 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3217 "deprecated", "audio bitstream_filters" },
3218 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3219 "deprecated", "video bitstream_filters" },
3221 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3222 "set the audio options to the indicated preset", "preset" },
3223 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3224 "set the video options to the indicated preset", "preset" },
3225 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3226 "set the subtitle options to the indicated preset", "preset" },
3227 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3228 "set options from indicated preset file", "filename" },
3229 /* data codec support */
3230 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3231 "force data codec ('copy' to copy stream)", "codec" },
3232 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },