2 * ffmpeg option parsing
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavformat/avformat.h"
28 #include "libavcodec/avcodec.h"
30 #include "libavfilter/avfilter.h"
32 #include "libavutil/avassert.h"
33 #include "libavutil/avstring.h"
34 #include "libavutil/avutil.h"
35 #include "libavutil/channel_layout.h"
36 #include "libavutil/intreadwrite.h"
37 #include "libavutil/fifo.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/opt.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/pixdesc.h"
42 #include "libavutil/pixfmt.h"
44 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
47 for (i = 0; i < o->nb_ ## name; i++) {\
48 char *spec = o->name[i].specifier;\
49 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
50 outvar = o->name[i].u.type;\
56 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
59 for (i = 0; i < o->nb_ ## name; i++) {\
60 char *spec = o->name[i].specifier;\
61 if (!strcmp(spec, mediatype))\
62 outvar = o->name[i].u.type;\
66 const HWAccel hwaccels[] = {
68 { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
71 { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
74 { "vda", vda_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
79 char *vstats_filename;
82 float audio_drift_threshold = 0.1;
83 float dts_delta_threshold = 10;
84 float dts_error_threshold = 3600*30;
86 int audio_volume = 256;
87 int audio_sync_method = 0;
88 int video_sync_method = VSYNC_AUTO;
89 float frame_drop_threshold = 0;
90 int do_deinterlace = 0;
92 int do_benchmark_all = 0;
96 int start_at_zero = 0;
99 int exit_on_error = 0;
100 int print_stats = -1;
102 int stdin_interaction = 1;
103 int frame_bits_per_raw_sample = 0;
104 float max_error_rate = 2.0/3;
107 static int intra_only = 0;
108 static int file_overwrite = 0;
109 static int no_file_overwrite = 0;
110 static int do_psnr = 0;
111 static int input_sync;
112 static int override_ffserver = 0;
113 static int input_stream_potentially_available = 0;
115 static void uninit_options(OptionsContext *o)
117 const OptionDef *po = options;
120 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
122 void *dst = (uint8_t*)o + po->u.off;
124 if (po->flags & OPT_SPEC) {
125 SpecifierOpt **so = dst;
126 int i, *count = (int*)(so + 1);
127 for (i = 0; i < *count; i++) {
128 av_freep(&(*so)[i].specifier);
129 if (po->flags & OPT_STRING)
130 av_freep(&(*so)[i].u.str);
134 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
139 for (i = 0; i < o->nb_stream_maps; i++)
140 av_freep(&o->stream_maps[i].linklabel);
141 av_freep(&o->stream_maps);
142 av_freep(&o->audio_channel_maps);
143 av_freep(&o->streamid_map);
144 av_freep(&o->attachments);
147 static void init_options(OptionsContext *o)
149 memset(o, 0, sizeof(*o));
151 o->stop_time = INT64_MAX;
152 o->mux_max_delay = 0.7;
153 o->start_time = AV_NOPTS_VALUE;
154 o->recording_time = INT64_MAX;
155 o->limit_filesize = UINT64_MAX;
156 o->chapters_input_file = INT_MAX;
157 o->accurate_seek = 1;
160 /* return a copy of the input with the stream specifiers removed from the keys */
161 static AVDictionary *strip_specifiers(AVDictionary *dict)
163 AVDictionaryEntry *e = NULL;
164 AVDictionary *ret = NULL;
166 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
167 char *p = strchr(e->key, ':');
171 av_dict_set(&ret, e->key, e->value, 0);
178 static int opt_sameq(void *optctx, const char *opt, const char *arg)
180 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
181 "If you are looking for an option to preserve the quality (which is not "
182 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
184 return AVERROR(EINVAL);
187 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
189 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
190 return opt_default(optctx, "channel", arg);
193 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
195 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
196 return opt_default(optctx, "standard", arg);
199 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
201 OptionsContext *o = optctx;
202 return parse_option(o, "codec:a", arg, options);
205 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
207 OptionsContext *o = optctx;
208 return parse_option(o, "codec:v", arg, options);
211 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
213 OptionsContext *o = optctx;
214 return parse_option(o, "codec:s", arg, options);
217 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
219 OptionsContext *o = optctx;
220 return parse_option(o, "codec:d", arg, options);
223 static int opt_map(void *optctx, const char *opt, const char *arg)
225 OptionsContext *o = optctx;
227 int i, negative = 0, file_idx;
228 int sync_file_idx = -1, sync_stream_idx = 0;
236 map = av_strdup(arg);
238 return AVERROR(ENOMEM);
240 /* parse sync stream first, just pick first matching stream */
241 if (sync = strchr(map, ',')) {
243 sync_file_idx = strtol(sync + 1, &sync, 0);
244 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
245 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
250 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
251 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
252 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
256 if (i == input_files[sync_file_idx]->nb_streams) {
257 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
258 "match any streams.\n", arg);
265 /* this mapping refers to lavfi output */
266 const char *c = map + 1;
267 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
268 m = &o->stream_maps[o->nb_stream_maps - 1];
269 m->linklabel = av_get_token(&c, "]");
271 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
275 file_idx = strtol(map, &p, 0);
276 if (file_idx >= nb_input_files || file_idx < 0) {
277 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
281 /* disable some already defined maps */
282 for (i = 0; i < o->nb_stream_maps; i++) {
283 m = &o->stream_maps[i];
284 if (file_idx == m->file_index &&
285 check_stream_specifier(input_files[m->file_index]->ctx,
286 input_files[m->file_index]->ctx->streams[m->stream_index],
287 *p == ':' ? p + 1 : p) > 0)
291 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
292 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
293 *p == ':' ? p + 1 : p) <= 0)
295 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
296 m = &o->stream_maps[o->nb_stream_maps - 1];
298 m->file_index = file_idx;
301 if (sync_file_idx >= 0) {
302 m->sync_file_index = sync_file_idx;
303 m->sync_stream_index = sync_stream_idx;
305 m->sync_file_index = file_idx;
306 m->sync_stream_index = i;
312 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
320 static int opt_attach(void *optctx, const char *opt, const char *arg)
322 OptionsContext *o = optctx;
323 GROW_ARRAY(o->attachments, o->nb_attachments);
324 o->attachments[o->nb_attachments - 1] = arg;
328 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
330 OptionsContext *o = optctx;
335 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
336 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
338 /* muted channel syntax */
339 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
340 if ((n == 1 || n == 3) && m->channel_idx == -1) {
341 m->file_idx = m->stream_idx = -1;
343 m->ofile_idx = m->ostream_idx = -1;
348 n = sscanf(arg, "%d.%d.%d:%d.%d",
349 &m->file_idx, &m->stream_idx, &m->channel_idx,
350 &m->ofile_idx, &m->ostream_idx);
352 if (n != 3 && n != 5) {
353 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
354 "[file.stream.channel|-1][:syncfile:syncstream]\n");
358 if (n != 5) // only file.stream.channel specified
359 m->ofile_idx = m->ostream_idx = -1;
362 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
363 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
367 if (m->stream_idx < 0 ||
368 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
369 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
370 m->file_idx, m->stream_idx);
373 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
374 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
375 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
376 m->file_idx, m->stream_idx);
379 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
380 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
381 m->file_idx, m->stream_idx, m->channel_idx);
387 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
389 av_free(sdp_filename);
390 sdp_filename = av_strdup(arg);
395 * Parse a metadata specifier passed as 'arg' parameter.
396 * @param arg metadata string to parse
397 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
398 * @param index for type c/p, chapter/program index is written here
399 * @param stream_spec for type s, the stream specifier is written here
401 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
409 if (*(++arg) && *arg != ':') {
410 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
413 *stream_spec = *arg == ':' ? arg + 1 : "";
418 *index = strtol(++arg, NULL, 0);
421 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
428 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
430 AVDictionary **meta_in = NULL;
431 AVDictionary **meta_out = NULL;
433 char type_in, type_out;
434 const char *istream_spec = NULL, *ostream_spec = NULL;
435 int idx_in = 0, idx_out = 0;
437 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
438 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
441 if (type_out == 'g' || !*outspec)
442 o->metadata_global_manual = 1;
443 if (type_out == 's' || !*outspec)
444 o->metadata_streams_manual = 1;
445 if (type_out == 'c' || !*outspec)
446 o->metadata_chapters_manual = 1;
450 if (type_in == 'g' || type_out == 'g')
451 o->metadata_global_manual = 1;
452 if (type_in == 's' || type_out == 's')
453 o->metadata_streams_manual = 1;
454 if (type_in == 'c' || type_out == 'c')
455 o->metadata_chapters_manual = 1;
457 /* ic is NULL when just disabling automatic mappings */
461 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
462 if ((index) < 0 || (index) >= (nb_elems)) {\
463 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
468 #define SET_DICT(type, meta, context, index)\
471 meta = &context->metadata;\
474 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
475 meta = &context->chapters[index]->metadata;\
478 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
479 meta = &context->programs[index]->metadata;\
482 break; /* handled separately below */ \
483 default: av_assert0(0);\
486 SET_DICT(type_in, meta_in, ic, idx_in);
487 SET_DICT(type_out, meta_out, oc, idx_out);
489 /* for input streams choose first matching stream */
490 if (type_in == 's') {
491 for (i = 0; i < ic->nb_streams; i++) {
492 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
493 meta_in = &ic->streams[i]->metadata;
499 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
504 if (type_out == 's') {
505 for (i = 0; i < oc->nb_streams; i++) {
506 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
507 meta_out = &oc->streams[i]->metadata;
508 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
513 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
518 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
520 OptionsContext *o = optctx;
522 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
523 struct tm time = *gmtime((time_t*)&recording_timestamp);
524 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
526 parse_option(o, "metadata", buf, options);
528 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
529 "tag instead.\n", opt);
533 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
535 const AVCodecDescriptor *desc;
536 const char *codec_string = encoder ? "encoder" : "decoder";
540 avcodec_find_encoder_by_name(name) :
541 avcodec_find_decoder_by_name(name);
543 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
544 codec = encoder ? avcodec_find_encoder(desc->id) :
545 avcodec_find_decoder(desc->id);
547 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
548 codec_string, codec->name, desc->name);
552 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
555 if (codec->type != type) {
556 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
562 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
564 char *codec_name = NULL;
566 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
568 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
569 st->codec->codec_id = codec->id;
572 return avcodec_find_decoder(st->codec->codec_id);
575 /* Add all the streams from the given input file to the global
576 * list of input streams. */
577 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
581 for (i = 0; i < ic->nb_streams; i++) {
582 AVStream *st = ic->streams[i];
583 AVCodecContext *dec = st->codec;
584 InputStream *ist = av_mallocz(sizeof(*ist));
585 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
586 char *codec_tag = NULL;
588 char *discard_str = NULL;
589 const AVOption *discard_opt = av_opt_find(dec, "skip_frame", NULL, 0, 0);
594 GROW_ARRAY(input_streams, nb_input_streams);
595 input_streams[nb_input_streams - 1] = ist;
598 ist->file_index = nb_input_files;
600 st->discard = AVDISCARD_ALL;
603 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
606 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
608 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
610 uint32_t tag = strtol(codec_tag, &next, 0);
612 tag = AV_RL32(codec_tag);
613 st->codec->codec_tag = tag;
616 ist->dec = choose_decoder(o, ic, st);
617 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
619 ist->reinit_filters = -1;
620 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
622 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
623 ist->user_set_discard = AVDISCARD_NONE;
624 if (discard_str && av_opt_eval_int(dec, discard_opt, discard_str, &ist->user_set_discard) < 0) {
625 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
630 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
632 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
634 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
638 ret = avcodec_copy_context(ist->dec_ctx, dec);
640 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
644 switch (dec->codec_type) {
645 case AVMEDIA_TYPE_VIDEO:
647 ist->dec = avcodec_find_decoder(dec->codec_id);
648 if (av_codec_get_lowres(dec)) {
649 dec->flags |= CODEC_FLAG_EMU_EDGE;
652 ist->resample_height = ist->dec_ctx->height;
653 ist->resample_width = ist->dec_ctx->width;
654 ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
656 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
657 if (framerate && av_parse_video_rate(&ist->framerate,
659 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
664 ist->top_field_first = -1;
665 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
667 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
669 if (!strcmp(hwaccel, "none"))
670 ist->hwaccel_id = HWACCEL_NONE;
671 else if (!strcmp(hwaccel, "auto"))
672 ist->hwaccel_id = HWACCEL_AUTO;
675 for (i = 0; hwaccels[i].name; i++) {
676 if (!strcmp(hwaccels[i].name, hwaccel)) {
677 ist->hwaccel_id = hwaccels[i].id;
682 if (!ist->hwaccel_id) {
683 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
685 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
686 for (i = 0; hwaccels[i].name; i++)
687 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
688 av_log(NULL, AV_LOG_FATAL, "\n");
694 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
695 if (hwaccel_device) {
696 ist->hwaccel_device = av_strdup(hwaccel_device);
697 if (!ist->hwaccel_device)
700 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
703 case AVMEDIA_TYPE_AUDIO:
704 ist->guess_layout_max = INT_MAX;
705 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
706 guess_input_channel_layout(ist);
708 ist->resample_sample_fmt = ist->dec_ctx->sample_fmt;
709 ist->resample_sample_rate = ist->dec_ctx->sample_rate;
710 ist->resample_channels = ist->dec_ctx->channels;
711 ist->resample_channel_layout = ist->dec_ctx->channel_layout;
714 case AVMEDIA_TYPE_DATA:
715 case AVMEDIA_TYPE_SUBTITLE: {
716 char *canvas_size = NULL;
718 ist->dec = avcodec_find_decoder(dec->codec_id);
719 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
720 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
722 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
723 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
728 case AVMEDIA_TYPE_ATTACHMENT:
729 case AVMEDIA_TYPE_UNKNOWN:
737 static void assert_file_overwrite(const char *filename)
739 if (file_overwrite && no_file_overwrite) {
740 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
744 if (!file_overwrite) {
745 const char *proto_name = avio_find_protocol_name(filename);
746 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
747 if (stdin_interaction && !no_file_overwrite) {
748 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
751 signal(SIGINT, SIG_DFL);
753 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
759 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
766 static void dump_attachment(AVStream *st, const char *filename)
769 AVIOContext *out = NULL;
770 AVDictionaryEntry *e;
772 if (!st->codec->extradata_size) {
773 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
774 nb_input_files - 1, st->index);
777 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
780 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
781 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
785 assert_file_overwrite(filename);
787 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
788 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
793 avio_write(out, st->codec->extradata, st->codec->extradata_size);
798 static int open_input_file(OptionsContext *o, const char *filename)
802 AVInputFormat *file_iformat = NULL;
806 AVDictionary *unused_opts = NULL;
807 AVDictionaryEntry *e = NULL;
808 int orig_nb_streams; // number of streams before avformat_find_stream_info
809 char * video_codec_name = NULL;
810 char * audio_codec_name = NULL;
811 char *subtitle_codec_name = NULL;
812 char * data_codec_name = NULL;
813 int scan_all_pmts_set = 0;
816 if (!(file_iformat = av_find_input_format(o->format))) {
817 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
822 if (!strcmp(filename, "-"))
825 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
826 strcmp(filename, "/dev/stdin");
828 /* get default parameters from command line */
829 ic = avformat_alloc_context();
831 print_error(filename, AVERROR(ENOMEM));
834 if (o->nb_audio_sample_rate) {
835 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
837 if (o->nb_audio_channels) {
838 /* because we set audio_channels based on both the "ac" and
839 * "channel_layout" options, we need to check that the specified
840 * demuxer actually has the "channels" option before setting it */
841 if (file_iformat && file_iformat->priv_class &&
842 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
843 AV_OPT_SEARCH_FAKE_OBJ)) {
844 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
847 if (o->nb_frame_rates) {
848 /* set the format-level framerate option;
849 * this is important for video grabbers, e.g. x11 */
850 if (file_iformat && file_iformat->priv_class &&
851 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
852 AV_OPT_SEARCH_FAKE_OBJ)) {
853 av_dict_set(&o->g->format_opts, "framerate",
854 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
857 if (o->nb_frame_sizes) {
858 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
860 if (o->nb_frame_pix_fmts)
861 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
863 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
864 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
865 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
866 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
868 ic->video_codec_id = video_codec_name ?
869 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
870 ic->audio_codec_id = audio_codec_name ?
871 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
872 ic->subtitle_codec_id= subtitle_codec_name ?
873 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
874 ic->data_codec_id = data_codec_name ?
875 find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0)->id : AV_CODEC_ID_NONE;
877 if (video_codec_name)
878 av_format_set_video_codec (ic, find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0));
879 if (audio_codec_name)
880 av_format_set_audio_codec (ic, find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0));
881 if (subtitle_codec_name)
882 av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
884 av_format_set_data_codec(ic, find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0));
886 ic->flags |= AVFMT_FLAG_NONBLOCK;
887 ic->interrupt_callback = int_cb;
889 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
890 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
891 scan_all_pmts_set = 1;
893 /* open the input file with generic avformat function */
894 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
896 print_error(filename, err);
899 if (scan_all_pmts_set)
900 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
901 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
902 assert_avoptions(o->g->format_opts);
904 /* apply forced codec ids */
905 for (i = 0; i < ic->nb_streams; i++)
906 choose_decoder(o, ic, ic->streams[i]);
908 /* Set AVCodecContext options for avformat_find_stream_info */
909 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
910 orig_nb_streams = ic->nb_streams;
912 /* If not enough info to get the stream parameters, we decode the
913 first frames to get it. (used in mpeg case for example) */
914 ret = avformat_find_stream_info(ic, opts);
916 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
917 if (ic->nb_streams == 0) {
918 avformat_close_input(&ic);
923 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
924 /* add the stream start time */
925 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
926 timestamp += ic->start_time;
928 /* if seeking requested, we execute it */
929 if (o->start_time != AV_NOPTS_VALUE) {
930 ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, timestamp, 0);
932 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
933 filename, (double)timestamp / AV_TIME_BASE);
937 /* update the current parameters so that they match the one of the input stream */
938 add_input_streams(o, ic);
940 /* dump the file content */
941 av_dump_format(ic, nb_input_files, filename, 0);
943 GROW_ARRAY(input_files, nb_input_files);
944 f = av_mallocz(sizeof(*f));
947 input_files[nb_input_files - 1] = f;
950 f->ist_index = nb_input_streams - ic->nb_streams;
951 f->start_time = o->start_time;
952 f->recording_time = o->recording_time;
953 f->input_ts_offset = o->input_ts_offset;
954 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
955 f->nb_streams = ic->nb_streams;
956 f->rate_emu = o->rate_emu;
957 f->accurate_seek = o->accurate_seek;
959 f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
962 /* check if all codec options have been used */
963 unused_opts = strip_specifiers(o->g->codec_opts);
964 for (i = f->ist_index; i < nb_input_streams; i++) {
966 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
967 AV_DICT_IGNORE_SUFFIX)))
968 av_dict_set(&unused_opts, e->key, NULL, 0);
972 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
973 const AVClass *class = avcodec_get_class();
974 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
975 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
976 const AVClass *fclass = avformat_get_class();
977 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
978 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
979 if (!option || foption)
983 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
984 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
985 "input file #%d (%s) is not a decoding option.\n", e->key,
986 option->help ? option->help : "", nb_input_files - 1,
991 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
992 "input file #%d (%s) has not been used for any stream. The most "
993 "likely reason is either wrong type (e.g. a video option with "
994 "no video streams) or that it is a private option of some decoder "
995 "which was not actually used for any stream.\n", e->key,
996 option->help ? option->help : "", nb_input_files - 1, filename);
998 av_dict_free(&unused_opts);
1000 for (i = 0; i < o->nb_dump_attachment; i++) {
1003 for (j = 0; j < ic->nb_streams; j++) {
1004 AVStream *st = ic->streams[j];
1006 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1007 dump_attachment(st, o->dump_attachment[i].u.str);
1011 for (i = 0; i < orig_nb_streams; i++)
1012 av_dict_free(&opts[i]);
1015 input_stream_potentially_available = 1;
1020 static uint8_t *get_line(AVIOContext *s)
1026 if (avio_open_dyn_buf(&line) < 0) {
1027 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1031 while ((c = avio_r8(s)) && c != '\n')
1034 avio_close_dyn_buf(line, &buf);
1039 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1042 char filename[1000];
1043 const char *base[3] = { getenv("AVCONV_DATADIR"),
1048 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1052 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1053 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1054 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1057 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1058 i != 1 ? "" : "/.avconv", preset_name);
1059 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1065 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1067 char *codec_name = NULL;
1069 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1071 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
1072 NULL, ost->st->codec->codec_type);
1073 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1074 } else if (!strcmp(codec_name, "copy"))
1075 ost->stream_copy = 1;
1077 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
1078 ost->st->codec->codec_id = ost->enc->id;
1082 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1085 AVStream *st = avformat_new_stream(oc, NULL);
1086 int idx = oc->nb_streams - 1, ret = 0;
1087 char *bsf = NULL, *next, *codec_tag = NULL;
1088 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
1093 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1097 if (oc->nb_streams - 1 < o->nb_streamid_map)
1098 st->id = o->streamid_map[oc->nb_streams - 1];
1100 GROW_ARRAY(output_streams, nb_output_streams);
1101 if (!(ost = av_mallocz(sizeof(*ost))))
1103 output_streams[nb_output_streams - 1] = ost;
1105 ost->file_index = nb_output_files - 1;
1108 st->codec->codec_type = type;
1109 choose_encoder(o, oc, ost);
1111 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1112 if (!ost->enc_ctx) {
1113 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1116 ost->enc_ctx->codec_type = type;
1119 AVIOContext *s = NULL;
1120 char *buf = NULL, *arg = NULL, *preset = NULL;
1122 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1124 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1125 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1128 if (!buf[0] || buf[0] == '#') {
1132 if (!(arg = strchr(buf, '='))) {
1133 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1137 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1139 } while (!s->eof_reached);
1143 av_log(NULL, AV_LOG_FATAL,
1144 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1145 preset, ost->file_index, ost->index);
1149 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1152 ost->max_frames = INT64_MAX;
1153 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1154 for (i = 0; i<o->nb_max_frames; i++) {
1155 char *p = o->max_frames[i].specifier;
1156 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1157 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1162 ost->copy_prior_start = -1;
1163 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1165 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
1168 if (next = strchr(bsf, ','))
1170 if (arg = strchr(bsf, '='))
1172 if (!(bsfc = av_bitstream_filter_init(bsf))) {
1173 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
1177 bsfc_prev->next = bsfc;
1179 ost->bitstream_filters = bsfc;
1180 av_dict_set(&ost->bsf_args, bsfc->filter->name, arg, 0);
1186 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1188 uint32_t tag = strtol(codec_tag, &next, 0);
1190 tag = AV_RL32(codec_tag);
1191 ost->enc_ctx->codec_tag = tag;
1194 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1196 ost->enc_ctx->flags |= CODEC_FLAG_QSCALE;
1197 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1200 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1201 ost->disposition = av_strdup(ost->disposition);
1203 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1204 ost->enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
1206 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1208 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1209 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1210 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1212 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1214 ost->source_index = source_index;
1215 if (source_index >= 0) {
1216 ost->sync_ist = input_streams[source_index];
1217 input_streams[source_index]->discard = 0;
1218 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1220 ost->last_mux_dts = AV_NOPTS_VALUE;
1225 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1228 const char *p = str;
1235 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1242 /* read file contents into a string */
1243 static uint8_t *read_file(const char *filename)
1245 AVIOContext *pb = NULL;
1246 AVIOContext *dyn_buf = NULL;
1247 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1248 uint8_t buf[1024], *str;
1251 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1255 ret = avio_open_dyn_buf(&dyn_buf);
1260 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1261 avio_write(dyn_buf, buf, ret);
1262 avio_w8(dyn_buf, 0);
1265 ret = avio_close_dyn_buf(dyn_buf, &str);
1271 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1274 AVStream *st = ost->st;
1276 if (ost->filters_script && ost->filters) {
1277 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1278 "output stream #%d:%d.\n", nb_output_files, st->index);
1282 if (ost->filters_script)
1283 return read_file(ost->filters_script);
1284 else if (ost->filters)
1285 return av_strdup(ost->filters);
1287 return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
1291 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1292 const OutputStream *ost, enum AVMediaType type)
1294 if (ost->filters_script || ost->filters) {
1295 av_log(NULL, AV_LOG_ERROR,
1296 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1297 "Filtering and streamcopy cannot be used together.\n",
1298 ost->filters ? "Filtergraph" : "Filtergraph script",
1299 ost->filters ? ost->filters : ost->filters_script,
1300 av_get_media_type_string(type), ost->file_index, ost->index);
1305 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1309 AVCodecContext *video_enc;
1310 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1312 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1314 video_enc = ost->enc_ctx;
1316 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1317 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1318 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1321 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1322 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1324 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1325 if (frame_aspect_ratio) {
1327 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1328 q.num <= 0 || q.den <= 0) {
1329 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1332 ost->frame_aspect_ratio = q;
1335 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1336 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1338 if (!ost->stream_copy) {
1339 const char *p = NULL;
1340 char *frame_size = NULL;
1341 char *frame_pix_fmt = NULL;
1342 char *intra_matrix = NULL, *inter_matrix = NULL;
1343 char *chroma_intra_matrix = NULL;
1347 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1348 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1349 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1353 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1354 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1355 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1356 ost->keep_pix_fmt = 1;
1357 if (!*++frame_pix_fmt)
1358 frame_pix_fmt = NULL;
1360 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1361 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1364 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1367 video_enc->gop_size = 0;
1368 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1370 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1371 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1374 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1376 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1377 if (chroma_intra_matrix) {
1378 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1380 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1383 av_codec_set_chroma_intra_matrix(video_enc, p);
1384 parse_matrix_coeffs(p, chroma_intra_matrix);
1386 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1388 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1389 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1392 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1395 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1396 for (i = 0; p; i++) {
1398 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1400 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1403 video_enc->rc_override =
1404 av_realloc_array(video_enc->rc_override,
1405 i + 1, sizeof(RcOverride));
1406 if (!video_enc->rc_override) {
1407 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1410 video_enc->rc_override[i].start_frame = start;
1411 video_enc->rc_override[i].end_frame = end;
1413 video_enc->rc_override[i].qscale = q;
1414 video_enc->rc_override[i].quality_factor = 1.0;
1417 video_enc->rc_override[i].qscale = 0;
1418 video_enc->rc_override[i].quality_factor = -q/100.0;
1423 video_enc->rc_override_count = i;
1426 video_enc->flags|= CODEC_FLAG_PSNR;
1429 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1432 video_enc->flags |= CODEC_FLAG_PASS1;
1433 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1436 video_enc->flags |= CODEC_FLAG_PASS2;
1437 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1441 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1442 if (ost->logfile_prefix &&
1443 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1446 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1447 if (ost->forced_keyframes)
1448 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1450 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1452 ost->top_field_first = -1;
1453 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1456 ost->avfilter = get_ost_filters(o, oc, ost);
1460 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1463 if (ost->stream_copy)
1464 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1469 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1474 AVCodecContext *audio_enc;
1476 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1479 audio_enc = ost->enc_ctx;
1480 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1482 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1483 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1485 if (!ost->stream_copy) {
1486 char *sample_fmt = NULL;
1488 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1490 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1492 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1493 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1497 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1499 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1500 ost->apad = av_strdup(ost->apad);
1502 ost->avfilter = get_ost_filters(o, oc, ost);
1506 /* check for channel mapping for this audio stream */
1507 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1508 AudioChannelMap *map = &o->audio_channel_maps[n];
1509 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1510 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1513 if (map->channel_idx == -1) {
1515 } else if (ost->source_index < 0) {
1516 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1517 ost->file_index, ost->st->index);
1520 ist = input_streams[ost->source_index];
1523 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1524 if (av_reallocp_array(&ost->audio_channels_map,
1525 ost->audio_channels_mapped + 1,
1526 sizeof(*ost->audio_channels_map)
1530 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1536 if (ost->stream_copy)
1537 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1542 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1546 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1547 if (!ost->stream_copy) {
1548 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1555 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1557 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1558 ost->stream_copy = 1;
1563 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1567 AVCodecContext *subtitle_enc;
1569 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1571 subtitle_enc = ost->enc_ctx;
1573 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1575 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1577 if (!ost->stream_copy) {
1578 char *frame_size = NULL;
1580 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1581 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1582 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1590 /* arg format is "output-stream-index:streamid-value". */
1591 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1593 OptionsContext *o = optctx;
1598 av_strlcpy(idx_str, arg, sizeof(idx_str));
1599 p = strchr(idx_str, ':');
1601 av_log(NULL, AV_LOG_FATAL,
1602 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1607 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1608 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1609 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1613 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1615 AVFormatContext *is = ifile->ctx;
1616 AVFormatContext *os = ofile->ctx;
1620 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1622 return AVERROR(ENOMEM);
1625 for (i = 0; i < is->nb_chapters; i++) {
1626 AVChapter *in_ch = is->chapters[i], *out_ch;
1627 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1628 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1629 AV_TIME_BASE_Q, in_ch->time_base);
1630 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1631 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1634 if (in_ch->end < ts_off)
1636 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1639 out_ch = av_mallocz(sizeof(AVChapter));
1641 return AVERROR(ENOMEM);
1643 out_ch->id = in_ch->id;
1644 out_ch->time_base = in_ch->time_base;
1645 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1646 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1649 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1651 os->chapters[os->nb_chapters++] = out_ch;
1656 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1659 AVFormatContext *ic = avformat_alloc_context();
1661 ic->interrupt_callback = int_cb;
1662 err = avformat_open_input(&ic, filename, NULL, NULL);
1665 /* copy stream format */
1666 for(i=0;i<ic->nb_streams;i++) {
1670 const char *enc_config;
1672 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
1674 av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
1675 return AVERROR(EINVAL);
1677 if (codec->type == AVMEDIA_TYPE_AUDIO)
1678 opt_audio_codec(o, "c:a", codec->name);
1679 else if (codec->type == AVMEDIA_TYPE_VIDEO)
1680 opt_video_codec(o, "c:v", codec->name);
1681 ost = new_output_stream(o, s, codec->type, -1);
1684 avcodec_get_context_defaults3(st->codec, codec);
1685 enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
1687 AVDictionary *opts = NULL;
1688 av_dict_parse_string(&opts, enc_config, "=", ",", 0);
1689 av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
1690 av_dict_free(&opts);
1693 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
1694 choose_sample_fmt(st, codec);
1695 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
1696 choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt);
1697 avcodec_copy_context(ost->enc_ctx, st->codec);
1699 av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
1702 avformat_close_input(&ic);
1706 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1707 AVFormatContext *oc)
1711 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1712 ofilter->out_tmp->pad_idx)) {
1713 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
1714 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1716 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1721 ost->source_index = -1;
1722 ost->filter = ofilter;
1726 if (ost->stream_copy) {
1727 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1728 "which is fed from a complex filtergraph. Filtering and streamcopy "
1729 "cannot be used together.\n", ost->file_index, ost->index);
1733 if (ost->avfilter && (ost->filters || ost->filters_script)) {
1734 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
1735 av_log(NULL, AV_LOG_ERROR,
1736 "%s '%s' was specified through the %s option "
1737 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
1738 "%s and -filter_complex cannot be used together for the same stream.\n",
1739 ost->filters ? "Filtergraph" : "Filtergraph script",
1740 ost->filters ? ost->filters : ost->filters_script,
1741 opt, ost->file_index, ost->index, opt);
1745 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1746 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1749 avfilter_inout_free(&ofilter->out_tmp);
1752 static int configure_complex_filters(void)
1756 for (i = 0; i < nb_filtergraphs; i++)
1757 if (!filtergraphs[i]->graph &&
1758 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1763 static int open_output_file(OptionsContext *o, const char *filename)
1765 AVFormatContext *oc;
1767 AVOutputFormat *file_oformat;
1771 AVDictionary *unused_opts = NULL;
1772 AVDictionaryEntry *e = NULL;
1774 if (configure_complex_filters() < 0) {
1775 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1779 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
1780 o->stop_time = INT64_MAX;
1781 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1784 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1785 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
1786 if (o->stop_time <= start_time) {
1787 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1790 o->recording_time = o->stop_time - start_time;
1794 GROW_ARRAY(output_files, nb_output_files);
1795 of = av_mallocz(sizeof(*of));
1798 output_files[nb_output_files - 1] = of;
1800 of->ost_index = nb_output_streams;
1801 of->recording_time = o->recording_time;
1802 of->start_time = o->start_time;
1803 of->limit_filesize = o->limit_filesize;
1804 of->shortest = o->shortest;
1805 av_dict_copy(&of->opts, o->g->format_opts, 0);
1807 if (!strcmp(filename, "-"))
1810 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
1812 print_error(filename, err);
1817 if (o->recording_time != INT64_MAX)
1818 oc->duration = o->recording_time;
1820 file_oformat= oc->oformat;
1821 oc->interrupt_callback = int_cb;
1823 /* create streams for all unlabeled output pads */
1824 for (i = 0; i < nb_filtergraphs; i++) {
1825 FilterGraph *fg = filtergraphs[i];
1826 for (j = 0; j < fg->nb_outputs; j++) {
1827 OutputFilter *ofilter = fg->outputs[j];
1829 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1832 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1833 ofilter->out_tmp->pad_idx)) {
1834 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1835 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1836 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1838 init_output_filter(ofilter, o, oc);
1842 /* ffserver seeking with date=... needs a date reference */
1843 if (!strcmp(file_oformat->name, "ffm") &&
1844 av_strstart(filename, "http:", NULL)) {
1845 int err = parse_option(o, "metadata", "creation_time=now", options);
1847 print_error(filename, err);
1852 if (!strcmp(file_oformat->name, "ffm") && !override_ffserver &&
1853 av_strstart(filename, "http:", NULL)) {
1855 /* special case for files sent to ffserver: we get the stream
1856 parameters from ffserver */
1857 int err = read_ffserver_streams(o, oc, filename);
1859 print_error(filename, err);
1862 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
1863 ost = output_streams[j];
1864 for (i = 0; i < nb_input_streams; i++) {
1865 ist = input_streams[i];
1866 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
1868 ost->source_index= i;
1869 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
1870 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
1872 ist->st->discard = ist->user_set_discard;
1877 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));
1881 } else if (!o->nb_stream_maps) {
1882 char *subtitle_codec_name = NULL;
1883 /* pick the "best" stream of each type */
1885 /* video: highest resolution */
1886 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
1887 int area = 0, idx = -1;
1888 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
1889 for (i = 0; i < nb_input_streams; i++) {
1891 ist = input_streams[i];
1892 new_area = ist->st->codec->width * ist->st->codec->height;
1893 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1895 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1897 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1904 new_video_stream(o, oc, idx);
1907 /* audio: most channels */
1908 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
1909 int channels = 0, idx = -1;
1910 for (i = 0; i < nb_input_streams; i++) {
1911 ist = input_streams[i];
1912 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1913 ist->st->codec->channels > channels) {
1914 channels = ist->st->codec->channels;
1919 new_audio_stream(o, oc, idx);
1922 /* subtitles: pick first */
1923 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
1924 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
1925 for (i = 0; i < nb_input_streams; i++)
1926 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1927 AVCodecDescriptor const *input_descriptor =
1928 avcodec_descriptor_get(input_streams[i]->st->codec->codec_id);
1929 AVCodecDescriptor const *output_descriptor = NULL;
1930 AVCodec const *output_codec =
1931 avcodec_find_encoder(oc->oformat->subtitle_codec);
1932 int input_props = 0, output_props = 0;
1934 output_descriptor = avcodec_descriptor_get(output_codec->id);
1935 if (input_descriptor)
1936 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1937 if (output_descriptor)
1938 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
1939 if (subtitle_codec_name ||
1940 input_props & output_props ||
1941 // Map dvb teletext which has neither property to any output subtitle encoder
1942 input_descriptor && output_descriptor &&
1943 (!input_descriptor->props ||
1944 !output_descriptor->props)) {
1945 new_subtitle_stream(o, oc, i);
1950 /* Data only if codec id match */
1951 if (!o->data_disable ) {
1952 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
1953 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
1954 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_DATA
1955 && input_streams[i]->st->codec->codec_id == codec_id )
1956 new_data_stream(o, oc, i);
1960 for (i = 0; i < o->nb_stream_maps; i++) {
1961 StreamMap *map = &o->stream_maps[i];
1966 if (map->linklabel) {
1968 OutputFilter *ofilter = NULL;
1971 for (j = 0; j < nb_filtergraphs; j++) {
1972 fg = filtergraphs[j];
1973 for (k = 0; k < fg->nb_outputs; k++) {
1974 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1975 if (out && !strcmp(out->name, map->linklabel)) {
1976 ofilter = fg->outputs[k];
1983 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1984 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
1987 init_output_filter(ofilter, o, oc);
1989 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
1991 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1992 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
1994 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1996 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1998 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
2001 switch (ist->st->codec->codec_type) {
2002 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2003 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2004 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2005 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2006 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2008 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
2009 map->file_index, map->stream_index);
2016 /* handle attached files */
2017 for (i = 0; i < o->nb_attachments; i++) {
2019 uint8_t *attachment;
2023 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2024 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2028 if ((len = avio_size(pb)) <= 0) {
2029 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2033 if (!(attachment = av_malloc(len))) {
2034 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
2038 avio_read(pb, attachment, len);
2040 ost = new_attachment_stream(o, oc, -1);
2041 ost->stream_copy = 0;
2042 ost->attachment_filename = o->attachments[i];
2044 ost->st->codec->extradata = attachment;
2045 ost->st->codec->extradata_size = len;
2047 p = strrchr(o->attachments[i], '/');
2048 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2052 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2053 AVDictionaryEntry *e;
2054 ost = output_streams[i];
2056 if ((ost->stream_copy || ost->attachment_filename)
2057 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2058 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2059 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2063 /* check if all codec options have been used */
2064 unused_opts = strip_specifiers(o->g->codec_opts);
2065 for (i = of->ost_index; i < nb_output_streams; i++) {
2067 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2068 AV_DICT_IGNORE_SUFFIX)))
2069 av_dict_set(&unused_opts, e->key, NULL, 0);
2073 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2074 const AVClass *class = avcodec_get_class();
2075 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2076 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2077 const AVClass *fclass = avformat_get_class();
2078 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2079 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2080 if (!option || foption)
2084 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2085 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2086 "output file #%d (%s) is not an encoding option.\n", e->key,
2087 option->help ? option->help : "", nb_output_files - 1,
2092 // gop_timecode is injected by generic code but not always used
2093 if (!strcmp(e->key, "gop_timecode"))
2096 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2097 "output file #%d (%s) has not been used for any stream. The most "
2098 "likely reason is either wrong type (e.g. a video option with "
2099 "no video streams) or that it is a private option of some encoder "
2100 "which was not actually used for any stream.\n", e->key,
2101 option->help ? option->help : "", nb_output_files - 1, filename);
2103 av_dict_free(&unused_opts);
2105 /* check filename in case of an image number is expected */
2106 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2107 if (!av_filename_number_test(oc->filename)) {
2108 print_error(oc->filename, AVERROR(EINVAL));
2113 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2114 av_log(NULL, AV_LOG_ERROR,
2115 "No input streams but output needs an input stream\n");
2119 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2120 /* test if it already exists to avoid losing precious files */
2121 assert_file_overwrite(filename);
2124 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2125 &oc->interrupt_callback,
2127 print_error(filename, err);
2130 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2131 assert_file_overwrite(filename);
2133 if (o->mux_preload) {
2134 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2136 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2139 for (i = 0; i < o->nb_metadata_map; i++) {
2141 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2143 if (in_file_index >= nb_input_files) {
2144 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2147 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2148 in_file_index >= 0 ?
2149 input_files[in_file_index]->ctx : NULL, o);
2153 if (o->chapters_input_file >= nb_input_files) {
2154 if (o->chapters_input_file == INT_MAX) {
2155 /* copy chapters from the first input file that has them*/
2156 o->chapters_input_file = -1;
2157 for (i = 0; i < nb_input_files; i++)
2158 if (input_files[i]->ctx->nb_chapters) {
2159 o->chapters_input_file = i;
2163 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2164 o->chapters_input_file);
2168 if (o->chapters_input_file >= 0)
2169 copy_chapters(input_files[o->chapters_input_file], of,
2170 !o->metadata_chapters_manual);
2172 /* copy global metadata by default */
2173 if (!o->metadata_global_manual && nb_input_files){
2174 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2175 AV_DICT_DONT_OVERWRITE);
2176 if(o->recording_time != INT64_MAX)
2177 av_dict_set(&oc->metadata, "duration", NULL, 0);
2178 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2180 if (!o->metadata_streams_manual)
2181 for (i = of->ost_index; i < nb_output_streams; i++) {
2183 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2185 ist = input_streams[output_streams[i]->source_index];
2186 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2187 if (!output_streams[i]->stream_copy) {
2188 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2189 if (ist->autorotate)
2190 av_dict_set(&output_streams[i]->st->metadata, "rotate", NULL, 0);
2194 /* process manually set metadata */
2195 for (i = 0; i < o->nb_metadata; i++) {
2198 const char *stream_spec;
2199 int index = 0, j, ret = 0;
2201 val = strchr(o->metadata[i].u.str, '=');
2203 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2204 o->metadata[i].u.str);
2209 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2211 for (j = 0; j < oc->nb_streams; j++) {
2212 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2213 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2224 if (index < 0 || index >= oc->nb_chapters) {
2225 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2228 m = &oc->chapters[index]->metadata;
2231 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2234 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2241 static int opt_target(void *optctx, const char *opt, const char *arg)
2243 OptionsContext *o = optctx;
2244 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2245 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2247 if (!strncmp(arg, "pal-", 4)) {
2250 } else if (!strncmp(arg, "ntsc-", 5)) {
2253 } else if (!strncmp(arg, "film-", 5)) {
2257 /* Try to determine PAL/NTSC by peeking in the input files */
2258 if (nb_input_files) {
2260 for (j = 0; j < nb_input_files; j++) {
2261 for (i = 0; i < input_files[j]->nb_streams; i++) {
2262 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
2263 if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
2266 fr = c->time_base.den * 1000 / c->time_base.num;
2270 } else if ((fr == 29970) || (fr == 23976)) {
2275 if (norm != UNKNOWN)
2279 if (norm != UNKNOWN)
2280 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2283 if (norm == UNKNOWN) {
2284 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2285 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2286 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2290 if (!strcmp(arg, "vcd")) {
2291 opt_video_codec(o, "c:v", "mpeg1video");
2292 opt_audio_codec(o, "c:a", "mp2");
2293 parse_option(o, "f", "vcd", options);
2295 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2296 parse_option(o, "r", frame_rates[norm], options);
2297 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2299 opt_default(NULL, "b:v", "1150000");
2300 opt_default(NULL, "maxrate", "1150000");
2301 opt_default(NULL, "minrate", "1150000");
2302 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
2304 opt_default(NULL, "b:a", "224000");
2305 parse_option(o, "ar", "44100", options);
2306 parse_option(o, "ac", "2", options);
2308 opt_default(NULL, "packetsize", "2324");
2309 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2311 /* We have to offset the PTS, so that it is consistent with the SCR.
2312 SCR starts at 36000, but the first two packs contain only padding
2313 and the first pack from the other stream, respectively, may also have
2314 been written before.
2315 So the real data starts at SCR 36000+3*1200. */
2316 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2317 } else if (!strcmp(arg, "svcd")) {
2319 opt_video_codec(o, "c:v", "mpeg2video");
2320 opt_audio_codec(o, "c:a", "mp2");
2321 parse_option(o, "f", "svcd", options);
2323 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2324 parse_option(o, "r", frame_rates[norm], options);
2325 parse_option(o, "pix_fmt", "yuv420p", options);
2326 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2328 opt_default(NULL, "b:v", "2040000");
2329 opt_default(NULL, "maxrate", "2516000");
2330 opt_default(NULL, "minrate", "0"); // 1145000;
2331 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2332 opt_default(NULL, "scan_offset", "1");
2334 opt_default(NULL, "b:a", "224000");
2335 parse_option(o, "ar", "44100", options);
2337 opt_default(NULL, "packetsize", "2324");
2339 } else if (!strcmp(arg, "dvd")) {
2341 opt_video_codec(o, "c:v", "mpeg2video");
2342 opt_audio_codec(o, "c:a", "ac3");
2343 parse_option(o, "f", "dvd", options);
2345 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2346 parse_option(o, "r", frame_rates[norm], options);
2347 parse_option(o, "pix_fmt", "yuv420p", options);
2348 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2350 opt_default(NULL, "b:v", "6000000");
2351 opt_default(NULL, "maxrate", "9000000");
2352 opt_default(NULL, "minrate", "0"); // 1500000;
2353 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2355 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2356 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2358 opt_default(NULL, "b:a", "448000");
2359 parse_option(o, "ar", "48000", options);
2361 } else if (!strncmp(arg, "dv", 2)) {
2363 parse_option(o, "f", "dv", options);
2365 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2366 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2367 norm == PAL ? "yuv420p" : "yuv411p", options);
2368 parse_option(o, "r", frame_rates[norm], options);
2370 parse_option(o, "ar", "48000", options);
2371 parse_option(o, "ac", "2", options);
2374 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2375 return AVERROR(EINVAL);
2378 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2379 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2384 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2386 av_free (vstats_filename);
2387 vstats_filename = av_strdup (arg);
2391 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2394 time_t today2 = time(NULL);
2395 struct tm *today = localtime(&today2);
2397 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2399 return opt_vstats_file(NULL, opt, filename);
2402 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2404 OptionsContext *o = optctx;
2405 return parse_option(o, "frames:v", arg, options);
2408 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2410 OptionsContext *o = optctx;
2411 return parse_option(o, "frames:a", arg, options);
2414 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2416 OptionsContext *o = optctx;
2417 return parse_option(o, "frames:d", arg, options);
2420 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2423 AVDictionary *cbak = codec_opts;
2424 AVDictionary *fbak = format_opts;
2428 ret = opt_default(NULL, opt, arg);
2430 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2431 av_dict_copy(&o->g->format_opts, format_opts, 0);
2432 av_dict_free(&codec_opts);
2433 av_dict_free(&format_opts);
2440 static int opt_preset(void *optctx, const char *opt, const char *arg)
2442 OptionsContext *o = optctx;
2444 char filename[1000], line[1000], tmp_line[1000];
2445 const char *codec_name = NULL;
2449 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2451 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2452 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2453 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2455 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2459 while (fgets(line, sizeof(line), f)) {
2460 char *key = tmp_line, *value, *endptr;
2462 if (strcspn(line, "#\n\r") == 0)
2464 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2465 if (!av_strtok(key, "=", &value) ||
2466 !av_strtok(value, "\r\n", &endptr)) {
2467 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2470 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2472 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2473 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2474 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2475 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2476 else if (opt_default_new(o, key, value) < 0) {
2477 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2478 filename, line, key, value);
2488 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2490 OptionsContext *o = optctx;
2491 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2492 int ret = parse_option(o, s, arg, options);
2497 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2499 OptionsContext *o = optctx;
2501 if(!strcmp(opt, "ab")){
2502 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
2504 } else if(!strcmp(opt, "b")){
2505 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2506 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2509 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2513 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2515 OptionsContext *o = optctx;
2518 if(!strcmp(opt, "qscale")){
2519 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2520 return parse_option(o, "q:v", arg, options);
2522 s = av_asprintf("q%s", opt + 6);
2523 ret = parse_option(o, s, arg, options);
2528 static int opt_profile(void *optctx, const char *opt, const char *arg)
2530 OptionsContext *o = optctx;
2531 if(!strcmp(opt, "profile")){
2532 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2533 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2536 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2540 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2542 OptionsContext *o = optctx;
2543 return parse_option(o, "filter:v", arg, options);
2546 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2548 OptionsContext *o = optctx;
2549 return parse_option(o, "filter:a", arg, options);
2552 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2554 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2555 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2556 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2557 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
2559 if (video_sync_method == VSYNC_AUTO)
2560 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2564 static int opt_timecode(void *optctx, const char *opt, const char *arg)
2566 OptionsContext *o = optctx;
2567 char *tcr = av_asprintf("timecode=%s", arg);
2568 int ret = parse_option(o, "metadata:g", tcr, options);
2570 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
2575 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2577 OptionsContext *o = optctx;
2578 char layout_str[32];
2581 int ret, channels, ac_str_size;
2584 layout = av_get_channel_layout(arg);
2586 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2587 return AVERROR(EINVAL);
2589 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2590 ret = opt_default_new(o, opt, layout_str);
2594 /* set 'ac' option based on channel layout */
2595 channels = av_get_channel_layout_nb_channels(layout);
2596 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2597 stream_str = strchr(opt, ':');
2598 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2599 ac_str = av_mallocz(ac_str_size);
2601 return AVERROR(ENOMEM);
2602 av_strlcpy(ac_str, "ac", 3);
2604 av_strlcat(ac_str, stream_str, ac_str_size);
2605 ret = parse_option(o, ac_str, layout_str, options);
2611 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2613 OptionsContext *o = optctx;
2614 return parse_option(o, "q:a", arg, options);
2617 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2619 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2620 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2621 return AVERROR(ENOMEM);
2622 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2623 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2624 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2625 return AVERROR(ENOMEM);
2627 input_stream_potentially_available = 1;
2632 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2634 uint8_t *graph_desc = read_file(arg);
2636 return AVERROR(EINVAL);
2638 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2639 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2640 return AVERROR(ENOMEM);
2641 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2642 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2644 input_stream_potentially_available = 1;
2649 void show_help_default(const char *opt, const char *arg)
2651 /* per-file options have at least one of those set */
2652 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2653 int show_advanced = 0, show_avoptions = 0;
2656 if (!strcmp(opt, "long"))
2658 else if (!strcmp(opt, "full"))
2659 show_advanced = show_avoptions = 1;
2661 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2666 printf("Getting help:\n"
2667 " -h -- print basic options\n"
2668 " -h long -- print more options\n"
2669 " -h full -- print all options (including all format and codec specific options, very long)\n"
2670 " See man %s for detailed description of the options.\n"
2671 "\n", program_name);
2673 show_help_options(options, "Print help / information / capabilities:",
2676 show_help_options(options, "Global options (affect whole program "
2677 "instead of just one file:",
2678 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2680 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2681 per_file | OPT_EXIT, 0);
2683 show_help_options(options, "Per-file main options:", 0,
2684 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2685 OPT_EXIT, per_file);
2687 show_help_options(options, "Advanced per-file options:",
2688 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2690 show_help_options(options, "Video options:",
2691 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2693 show_help_options(options, "Advanced Video options:",
2694 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2696 show_help_options(options, "Audio options:",
2697 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2699 show_help_options(options, "Advanced Audio options:",
2700 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2701 show_help_options(options, "Subtitle options:",
2702 OPT_SUBTITLE, 0, 0);
2705 if (show_avoptions) {
2706 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2707 show_help_children(avcodec_get_class(), flags);
2708 show_help_children(avformat_get_class(), flags);
2710 show_help_children(sws_get_class(), flags);
2712 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2713 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
2717 void show_usage(void)
2719 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
2720 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2721 av_log(NULL, AV_LOG_INFO, "\n");
2729 static const OptionGroupDef groups[] = {
2730 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2731 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2734 static int open_files(OptionGroupList *l, const char *inout,
2735 int (*open_file)(OptionsContext*, const char*))
2739 for (i = 0; i < l->nb_groups; i++) {
2740 OptionGroup *g = &l->groups[i];
2746 ret = parse_optgroup(&o, g);
2748 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2749 "%s.\n", inout, g->arg);
2753 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2754 ret = open_file(&o, g->arg);
2757 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2761 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2767 int ffmpeg_parse_options(int argc, char **argv)
2769 OptionParseContext octx;
2773 memset(&octx, 0, sizeof(octx));
2775 /* split the commandline into an internal representation */
2776 ret = split_commandline(&octx, argc, argv, options, groups,
2777 FF_ARRAY_ELEMS(groups));
2779 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2783 /* apply global options */
2784 ret = parse_optgroup(NULL, &octx.global_opts);
2786 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2790 /* open input files */
2791 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2793 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2797 /* open output files */
2798 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2800 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2805 uninit_parse_context(&octx);
2807 av_strerror(ret, error, sizeof(error));
2808 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2813 static int opt_progress(void *optctx, const char *opt, const char *arg)
2815 AVIOContext *avio = NULL;
2818 if (!strcmp(arg, "-"))
2820 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
2822 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
2823 arg, av_err2str(ret));
2826 progress_avio = avio;
2830 #define OFFSET(x) offsetof(OptionsContext, x)
2831 const OptionDef options[] = {
2833 #include "cmdutils_common_opts.h"
2834 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2835 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2836 "force format", "fmt" },
2837 { "y", OPT_BOOL, { &file_overwrite },
2838 "overwrite output files" },
2839 { "n", OPT_BOOL, { &no_file_overwrite },
2840 "never overwrite output files" },
2841 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2842 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2843 "codec name", "codec" },
2844 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2845 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2846 "codec name", "codec" },
2847 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2848 OPT_OUTPUT, { .off = OFFSET(presets) },
2849 "preset name", "preset" },
2850 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2851 OPT_OUTPUT, { .func_arg = opt_map },
2852 "set input stream mapping",
2853 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2854 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
2855 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
2856 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2857 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2858 "set metadata information of outfile from infile",
2859 "outfile[,metadata]:infile[,metadata]" },
2860 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2861 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2862 "set chapters mapping", "input_file_index" },
2863 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2864 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2865 "record or transcode \"duration\" seconds of audio/video",
2867 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },
2868 "record or transcode stop time", "time_stop" },
2869 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2870 "set the limit file size in bytes", "limit_size" },
2871 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2872 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2873 "set the start time offset", "time_off" },
2874 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
2875 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
2876 "enable/disable seeking by timestamp with -ss" },
2877 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2878 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2879 "enable/disable accurate seeking with -ss" },
2880 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2881 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2882 "set the input ts offset", "time_off" },
2883 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2884 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2885 "set the input ts scale", "scale" },
2886 { "timestamp", HAS_ARG | OPT_PERFILE, { .func_arg = opt_recording_timestamp },
2887 "set the recording timestamp ('now' to set the current time)", "time" },
2888 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2889 "add metadata", "string=string" },
2890 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2891 OPT_OUTPUT, { .func_arg = opt_data_frames },
2892 "set the number of data frames to output", "number" },
2893 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2894 "add timings for benchmarking" },
2895 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
2896 "add timings for each task" },
2897 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
2898 "write program-readable progress information", "url" },
2899 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
2900 "enable or disable interaction on standard input" },
2901 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2902 "set max runtime in seconds", "limit" },
2903 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2904 "dump each input packet" },
2905 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2906 "when dumping packets, also dump the payload" },
2907 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2908 OPT_INPUT, { .off = OFFSET(rate_emu) },
2909 "read input at native frame rate", "" },
2910 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2911 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2912 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2913 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2914 "video sync method", "" },
2915 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
2916 "frame drop threshold", "" },
2917 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2918 "audio sync method", "" },
2919 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2920 "audio drift threshold", "threshold" },
2921 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2922 "copy timestamps" },
2923 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
2924 "shift input timestamps to start at 0 when using copyts" },
2925 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
2926 "copy input stream time base when stream copying", "mode" },
2927 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2928 OPT_OUTPUT, { .off = OFFSET(shortest) },
2929 "finish encoding within shortest input" },
2930 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
2931 OPT_OUTPUT, { .off = OFFSET(apad) },
2933 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2934 "timestamp discontinuity delta threshold", "threshold" },
2935 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
2936 "timestamp error delta threshold", "threshold" },
2937 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2938 "exit on error", "error" },
2939 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2940 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2941 "copy initial non-keyframes" },
2942 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
2943 "copy or discard frames before start time" },
2944 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2945 "set the number of frames to output", "number" },
2946 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2947 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2948 "force codec tag/fourcc", "fourcc/tag" },
2949 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2950 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2951 "use fixed quality scale (VBR)", "q" },
2952 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2953 OPT_OUTPUT, { .func_arg = opt_qscale },
2954 "use fixed quality scale (VBR)", "q" },
2955 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
2956 "set profile", "profile" },
2957 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2958 "set stream filtergraph", "filter_graph" },
2959 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2960 "read stream filtergraph description from a file", "filename" },
2961 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
2962 "reinit filtergraph on input parameter changes", "" },
2963 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2964 "create a complex filtergraph", "graph_description" },
2965 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2966 "create a complex filtergraph", "graph_description" },
2967 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2968 "read complex filtergraph description from a file", "filename" },
2969 { "stats", OPT_BOOL, { &print_stats },
2970 "print progress report during encoding", },
2971 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2972 OPT_OUTPUT, { .func_arg = opt_attach },
2973 "add an attachment to the output file", "filename" },
2974 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2975 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2976 "extract an attachment into a file", "filename" },
2977 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
2978 "print timestamp debugging info" },
2979 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
2980 "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
2981 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
2982 OPT_INPUT, { .off = OFFSET(discard) },
2984 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
2985 OPT_OUTPUT, { .off = OFFSET(disposition) },
2986 "disposition", "" },
2987 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
2988 { .off = OFFSET(thread_queue_size) },
2989 "set the maximum number of queued packets from the demuxer" },
2992 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2993 "set the number of video frames to output", "number" },
2994 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2995 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2996 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2997 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
2998 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2999 "set frame size (WxH or abbreviation)", "size" },
3000 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3001 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3002 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3003 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3004 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3005 "set pixel format", "format" },
3006 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3007 "set the number of bits per raw sample", "number" },
3008 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3009 "deprecated use -g 1" },
3010 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3012 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3013 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3014 "rate control override for specific intervals", "override" },
3015 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3016 OPT_OUTPUT, { .func_arg = opt_video_codec },
3017 "force video codec ('copy' to copy stream)", "codec" },
3018 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3020 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3022 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3023 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3024 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3025 "select the pass number (1 to 3)", "n" },
3026 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3027 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3028 "select two pass log file name prefix", "prefix" },
3029 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3030 "this option is deprecated, use the yadif filter instead" },
3031 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3032 "calculate PSNR of compressed frames" },
3033 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
3034 "dump video coding statistics to file" },
3035 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
3036 "dump video coding statistics to file", "file" },
3037 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3038 "set video filters", "filter_graph" },
3039 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3040 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3041 "specify intra matrix coeffs", "matrix" },
3042 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3043 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3044 "specify inter matrix coeffs", "matrix" },
3045 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3046 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3047 "specify intra matrix coeffs", "matrix" },
3048 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3049 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3050 "top=1/bottom=0/auto=-1 field first", "" },
3051 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3052 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3053 "force video tag/fourcc", "fourcc/tag" },
3054 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3055 "show QP histogram" },
3056 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3057 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3058 "force the selected framerate, disable the best supported framerate selection" },
3059 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3060 OPT_OUTPUT, { .func_arg = opt_streamid },
3061 "set the value of an outfile streamid", "streamIndex:value" },
3062 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3063 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3064 "force key frames at specified timestamps", "timestamps" },
3065 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3066 "audio bitrate (please use -b:a)", "bitrate" },
3067 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3068 "video bitrate (please use -b:v)", "bitrate" },
3069 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3070 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3071 "use HW accelerated decoding", "hwaccel name" },
3072 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3073 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3074 "select a device for HW acceleration" "devicename" },
3076 { "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
3078 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3079 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3080 "automatically insert correct rotate filters" },
3083 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3084 "set the number of audio frames to output", "number" },
3085 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3086 "set audio quality (codec-specific)", "quality", },
3087 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3088 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3089 "set audio sampling rate (in Hz)", "rate" },
3090 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3091 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3092 "set number of audio channels", "channels" },
3093 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3095 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3096 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3097 "force audio codec ('copy' to copy stream)", "codec" },
3098 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3099 OPT_OUTPUT, { .func_arg = opt_old2new },
3100 "force audio tag/fourcc", "fourcc/tag" },
3101 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3102 "change audio volume (256=normal)" , "volume" },
3103 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3104 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3105 "set sample format", "format" },
3106 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3107 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3108 "set channel layout", "layout" },
3109 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3110 "set audio filters", "filter_graph" },
3111 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3112 "set the maximum number of channels to try to guess the channel layout" },
3114 /* subtitle options */
3115 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3116 "disable subtitle" },
3117 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3118 "force subtitle codec ('copy' to copy stream)", "codec" },
3119 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3120 , "force subtitle tag/fourcc", "fourcc/tag" },
3121 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3122 "fix subtitles duration" },
3123 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3124 "set canvas size (WxH or abbreviation)", "size" },
3127 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3128 "deprecated, use -channel", "channel" },
3129 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3130 "deprecated, use -standard", "standard" },
3131 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3134 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3135 "set the maximum demux-decode delay", "seconds" },
3136 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3137 "set the initial demux-decode delay", "seconds" },
3138 { "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
3139 "override the options from ffserver", "" },
3140 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { opt_sdp_file },
3141 "specify a file in which to print sdp information", "file" },
3143 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3144 "A comma-separated list of bitstream filters", "bitstream_filters" },
3145 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3146 "deprecated", "audio bitstream_filters" },
3147 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3148 "deprecated", "video bitstream_filters" },
3150 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3151 "set the audio options to the indicated preset", "preset" },
3152 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3153 "set the video options to the indicated preset", "preset" },
3154 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3155 "set the subtitle options to the indicated preset", "preset" },
3156 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3157 "set options from indicated preset file", "filename" },
3158 /* data codec support */
3159 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3160 "force data codec ('copy' to copy stream)", "codec" },
3161 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },