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 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2213 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2214 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2215 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2216 ost->rotate_overridden = 1;
2228 if (index < 0 || index >= oc->nb_chapters) {
2229 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2232 m = &oc->chapters[index]->metadata;
2235 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2238 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2245 static int opt_target(void *optctx, const char *opt, const char *arg)
2247 OptionsContext *o = optctx;
2248 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2249 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2251 if (!strncmp(arg, "pal-", 4)) {
2254 } else if (!strncmp(arg, "ntsc-", 5)) {
2257 } else if (!strncmp(arg, "film-", 5)) {
2261 /* Try to determine PAL/NTSC by peeking in the input files */
2262 if (nb_input_files) {
2264 for (j = 0; j < nb_input_files; j++) {
2265 for (i = 0; i < input_files[j]->nb_streams; i++) {
2266 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
2267 if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
2270 fr = c->time_base.den * 1000 / c->time_base.num;
2274 } else if ((fr == 29970) || (fr == 23976)) {
2279 if (norm != UNKNOWN)
2283 if (norm != UNKNOWN)
2284 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2287 if (norm == UNKNOWN) {
2288 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2289 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2290 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2294 if (!strcmp(arg, "vcd")) {
2295 opt_video_codec(o, "c:v", "mpeg1video");
2296 opt_audio_codec(o, "c:a", "mp2");
2297 parse_option(o, "f", "vcd", options);
2299 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2300 parse_option(o, "r", frame_rates[norm], options);
2301 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2303 opt_default(NULL, "b:v", "1150000");
2304 opt_default(NULL, "maxrate", "1150000");
2305 opt_default(NULL, "minrate", "1150000");
2306 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
2308 opt_default(NULL, "b:a", "224000");
2309 parse_option(o, "ar", "44100", options);
2310 parse_option(o, "ac", "2", options);
2312 opt_default(NULL, "packetsize", "2324");
2313 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2315 /* We have to offset the PTS, so that it is consistent with the SCR.
2316 SCR starts at 36000, but the first two packs contain only padding
2317 and the first pack from the other stream, respectively, may also have
2318 been written before.
2319 So the real data starts at SCR 36000+3*1200. */
2320 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2321 } else if (!strcmp(arg, "svcd")) {
2323 opt_video_codec(o, "c:v", "mpeg2video");
2324 opt_audio_codec(o, "c:a", "mp2");
2325 parse_option(o, "f", "svcd", options);
2327 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2328 parse_option(o, "r", frame_rates[norm], options);
2329 parse_option(o, "pix_fmt", "yuv420p", options);
2330 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2332 opt_default(NULL, "b:v", "2040000");
2333 opt_default(NULL, "maxrate", "2516000");
2334 opt_default(NULL, "minrate", "0"); // 1145000;
2335 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2336 opt_default(NULL, "scan_offset", "1");
2338 opt_default(NULL, "b:a", "224000");
2339 parse_option(o, "ar", "44100", options);
2341 opt_default(NULL, "packetsize", "2324");
2343 } else if (!strcmp(arg, "dvd")) {
2345 opt_video_codec(o, "c:v", "mpeg2video");
2346 opt_audio_codec(o, "c:a", "ac3");
2347 parse_option(o, "f", "dvd", options);
2349 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2350 parse_option(o, "r", frame_rates[norm], options);
2351 parse_option(o, "pix_fmt", "yuv420p", options);
2352 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2354 opt_default(NULL, "b:v", "6000000");
2355 opt_default(NULL, "maxrate", "9000000");
2356 opt_default(NULL, "minrate", "0"); // 1500000;
2357 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2359 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2360 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2362 opt_default(NULL, "b:a", "448000");
2363 parse_option(o, "ar", "48000", options);
2365 } else if (!strncmp(arg, "dv", 2)) {
2367 parse_option(o, "f", "dv", options);
2369 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2370 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2371 norm == PAL ? "yuv420p" : "yuv411p", options);
2372 parse_option(o, "r", frame_rates[norm], options);
2374 parse_option(o, "ar", "48000", options);
2375 parse_option(o, "ac", "2", options);
2378 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2379 return AVERROR(EINVAL);
2382 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2383 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2388 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2390 av_free (vstats_filename);
2391 vstats_filename = av_strdup (arg);
2395 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2398 time_t today2 = time(NULL);
2399 struct tm *today = localtime(&today2);
2401 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2403 return opt_vstats_file(NULL, opt, filename);
2406 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2408 OptionsContext *o = optctx;
2409 return parse_option(o, "frames:v", arg, options);
2412 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2414 OptionsContext *o = optctx;
2415 return parse_option(o, "frames:a", arg, options);
2418 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2420 OptionsContext *o = optctx;
2421 return parse_option(o, "frames:d", arg, options);
2424 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2427 AVDictionary *cbak = codec_opts;
2428 AVDictionary *fbak = format_opts;
2432 ret = opt_default(NULL, opt, arg);
2434 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2435 av_dict_copy(&o->g->format_opts, format_opts, 0);
2436 av_dict_free(&codec_opts);
2437 av_dict_free(&format_opts);
2444 static int opt_preset(void *optctx, const char *opt, const char *arg)
2446 OptionsContext *o = optctx;
2448 char filename[1000], line[1000], tmp_line[1000];
2449 const char *codec_name = NULL;
2453 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2455 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2456 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2457 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2459 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2463 while (fgets(line, sizeof(line), f)) {
2464 char *key = tmp_line, *value, *endptr;
2466 if (strcspn(line, "#\n\r") == 0)
2468 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2469 if (!av_strtok(key, "=", &value) ||
2470 !av_strtok(value, "\r\n", &endptr)) {
2471 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2474 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2476 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2477 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2478 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2479 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2480 else if (opt_default_new(o, key, value) < 0) {
2481 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2482 filename, line, key, value);
2492 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2494 OptionsContext *o = optctx;
2495 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2496 int ret = parse_option(o, s, arg, options);
2501 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2503 OptionsContext *o = optctx;
2505 if(!strcmp(opt, "ab")){
2506 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
2508 } else if(!strcmp(opt, "b")){
2509 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2510 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2513 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2517 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2519 OptionsContext *o = optctx;
2522 if(!strcmp(opt, "qscale")){
2523 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2524 return parse_option(o, "q:v", arg, options);
2526 s = av_asprintf("q%s", opt + 6);
2527 ret = parse_option(o, s, arg, options);
2532 static int opt_profile(void *optctx, const char *opt, const char *arg)
2534 OptionsContext *o = optctx;
2535 if(!strcmp(opt, "profile")){
2536 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2537 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2540 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2544 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2546 OptionsContext *o = optctx;
2547 return parse_option(o, "filter:v", arg, options);
2550 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2552 OptionsContext *o = optctx;
2553 return parse_option(o, "filter:a", arg, options);
2556 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2558 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2559 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2560 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2561 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
2563 if (video_sync_method == VSYNC_AUTO)
2564 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2568 static int opt_timecode(void *optctx, const char *opt, const char *arg)
2570 OptionsContext *o = optctx;
2571 char *tcr = av_asprintf("timecode=%s", arg);
2572 int ret = parse_option(o, "metadata:g", tcr, options);
2574 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
2579 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2581 OptionsContext *o = optctx;
2582 char layout_str[32];
2585 int ret, channels, ac_str_size;
2588 layout = av_get_channel_layout(arg);
2590 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2591 return AVERROR(EINVAL);
2593 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2594 ret = opt_default_new(o, opt, layout_str);
2598 /* set 'ac' option based on channel layout */
2599 channels = av_get_channel_layout_nb_channels(layout);
2600 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2601 stream_str = strchr(opt, ':');
2602 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2603 ac_str = av_mallocz(ac_str_size);
2605 return AVERROR(ENOMEM);
2606 av_strlcpy(ac_str, "ac", 3);
2608 av_strlcat(ac_str, stream_str, ac_str_size);
2609 ret = parse_option(o, ac_str, layout_str, options);
2615 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2617 OptionsContext *o = optctx;
2618 return parse_option(o, "q:a", arg, options);
2621 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2623 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2624 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2625 return AVERROR(ENOMEM);
2626 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2627 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2628 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2629 return AVERROR(ENOMEM);
2631 input_stream_potentially_available = 1;
2636 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2638 uint8_t *graph_desc = read_file(arg);
2640 return AVERROR(EINVAL);
2642 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2643 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2644 return AVERROR(ENOMEM);
2645 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2646 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2648 input_stream_potentially_available = 1;
2653 void show_help_default(const char *opt, const char *arg)
2655 /* per-file options have at least one of those set */
2656 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2657 int show_advanced = 0, show_avoptions = 0;
2660 if (!strcmp(opt, "long"))
2662 else if (!strcmp(opt, "full"))
2663 show_advanced = show_avoptions = 1;
2665 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2670 printf("Getting help:\n"
2671 " -h -- print basic options\n"
2672 " -h long -- print more options\n"
2673 " -h full -- print all options (including all format and codec specific options, very long)\n"
2674 " See man %s for detailed description of the options.\n"
2675 "\n", program_name);
2677 show_help_options(options, "Print help / information / capabilities:",
2680 show_help_options(options, "Global options (affect whole program "
2681 "instead of just one file:",
2682 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2684 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2685 per_file | OPT_EXIT, 0);
2687 show_help_options(options, "Per-file main options:", 0,
2688 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2689 OPT_EXIT, per_file);
2691 show_help_options(options, "Advanced per-file options:",
2692 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2694 show_help_options(options, "Video options:",
2695 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2697 show_help_options(options, "Advanced Video options:",
2698 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2700 show_help_options(options, "Audio options:",
2701 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2703 show_help_options(options, "Advanced Audio options:",
2704 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2705 show_help_options(options, "Subtitle options:",
2706 OPT_SUBTITLE, 0, 0);
2709 if (show_avoptions) {
2710 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2711 show_help_children(avcodec_get_class(), flags);
2712 show_help_children(avformat_get_class(), flags);
2714 show_help_children(sws_get_class(), flags);
2716 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2717 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
2721 void show_usage(void)
2723 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
2724 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2725 av_log(NULL, AV_LOG_INFO, "\n");
2733 static const OptionGroupDef groups[] = {
2734 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2735 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2738 static int open_files(OptionGroupList *l, const char *inout,
2739 int (*open_file)(OptionsContext*, const char*))
2743 for (i = 0; i < l->nb_groups; i++) {
2744 OptionGroup *g = &l->groups[i];
2750 ret = parse_optgroup(&o, g);
2752 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2753 "%s.\n", inout, g->arg);
2757 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2758 ret = open_file(&o, g->arg);
2761 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2765 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2771 int ffmpeg_parse_options(int argc, char **argv)
2773 OptionParseContext octx;
2777 memset(&octx, 0, sizeof(octx));
2779 /* split the commandline into an internal representation */
2780 ret = split_commandline(&octx, argc, argv, options, groups,
2781 FF_ARRAY_ELEMS(groups));
2783 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2787 /* apply global options */
2788 ret = parse_optgroup(NULL, &octx.global_opts);
2790 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2794 /* open input files */
2795 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2797 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2801 /* open output files */
2802 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2804 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2809 uninit_parse_context(&octx);
2811 av_strerror(ret, error, sizeof(error));
2812 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2817 static int opt_progress(void *optctx, const char *opt, const char *arg)
2819 AVIOContext *avio = NULL;
2822 if (!strcmp(arg, "-"))
2824 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
2826 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
2827 arg, av_err2str(ret));
2830 progress_avio = avio;
2834 #define OFFSET(x) offsetof(OptionsContext, x)
2835 const OptionDef options[] = {
2837 #include "cmdutils_common_opts.h"
2838 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2839 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2840 "force format", "fmt" },
2841 { "y", OPT_BOOL, { &file_overwrite },
2842 "overwrite output files" },
2843 { "n", OPT_BOOL, { &no_file_overwrite },
2844 "never overwrite output files" },
2845 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2846 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2847 "codec name", "codec" },
2848 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2849 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2850 "codec name", "codec" },
2851 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2852 OPT_OUTPUT, { .off = OFFSET(presets) },
2853 "preset name", "preset" },
2854 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2855 OPT_OUTPUT, { .func_arg = opt_map },
2856 "set input stream mapping",
2857 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2858 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
2859 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
2860 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2861 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2862 "set metadata information of outfile from infile",
2863 "outfile[,metadata]:infile[,metadata]" },
2864 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2865 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2866 "set chapters mapping", "input_file_index" },
2867 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2868 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2869 "record or transcode \"duration\" seconds of audio/video",
2871 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },
2872 "record or transcode stop time", "time_stop" },
2873 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2874 "set the limit file size in bytes", "limit_size" },
2875 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2876 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2877 "set the start time offset", "time_off" },
2878 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
2879 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
2880 "enable/disable seeking by timestamp with -ss" },
2881 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2882 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2883 "enable/disable accurate seeking with -ss" },
2884 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2885 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2886 "set the input ts offset", "time_off" },
2887 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2888 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2889 "set the input ts scale", "scale" },
2890 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
2891 "set the recording timestamp ('now' to set the current time)", "time" },
2892 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2893 "add metadata", "string=string" },
2894 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2895 OPT_OUTPUT, { .func_arg = opt_data_frames },
2896 "set the number of data frames to output", "number" },
2897 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2898 "add timings for benchmarking" },
2899 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
2900 "add timings for each task" },
2901 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
2902 "write program-readable progress information", "url" },
2903 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
2904 "enable or disable interaction on standard input" },
2905 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2906 "set max runtime in seconds", "limit" },
2907 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2908 "dump each input packet" },
2909 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2910 "when dumping packets, also dump the payload" },
2911 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2912 OPT_INPUT, { .off = OFFSET(rate_emu) },
2913 "read input at native frame rate", "" },
2914 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2915 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2916 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2917 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2918 "video sync method", "" },
2919 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
2920 "frame drop threshold", "" },
2921 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2922 "audio sync method", "" },
2923 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2924 "audio drift threshold", "threshold" },
2925 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2926 "copy timestamps" },
2927 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
2928 "shift input timestamps to start at 0 when using copyts" },
2929 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
2930 "copy input stream time base when stream copying", "mode" },
2931 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2932 OPT_OUTPUT, { .off = OFFSET(shortest) },
2933 "finish encoding within shortest input" },
2934 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
2935 OPT_OUTPUT, { .off = OFFSET(apad) },
2937 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2938 "timestamp discontinuity delta threshold", "threshold" },
2939 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
2940 "timestamp error delta threshold", "threshold" },
2941 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2942 "exit on error", "error" },
2943 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2944 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2945 "copy initial non-keyframes" },
2946 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
2947 "copy or discard frames before start time" },
2948 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2949 "set the number of frames to output", "number" },
2950 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2951 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2952 "force codec tag/fourcc", "fourcc/tag" },
2953 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2954 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2955 "use fixed quality scale (VBR)", "q" },
2956 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2957 OPT_OUTPUT, { .func_arg = opt_qscale },
2958 "use fixed quality scale (VBR)", "q" },
2959 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
2960 "set profile", "profile" },
2961 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2962 "set stream filtergraph", "filter_graph" },
2963 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2964 "read stream filtergraph description from a file", "filename" },
2965 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
2966 "reinit filtergraph on input parameter changes", "" },
2967 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2968 "create a complex filtergraph", "graph_description" },
2969 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2970 "create a complex filtergraph", "graph_description" },
2971 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2972 "read complex filtergraph description from a file", "filename" },
2973 { "stats", OPT_BOOL, { &print_stats },
2974 "print progress report during encoding", },
2975 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2976 OPT_OUTPUT, { .func_arg = opt_attach },
2977 "add an attachment to the output file", "filename" },
2978 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2979 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2980 "extract an attachment into a file", "filename" },
2981 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
2982 "print timestamp debugging info" },
2983 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
2984 "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
2985 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
2986 OPT_INPUT, { .off = OFFSET(discard) },
2988 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
2989 OPT_OUTPUT, { .off = OFFSET(disposition) },
2990 "disposition", "" },
2991 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
2992 { .off = OFFSET(thread_queue_size) },
2993 "set the maximum number of queued packets from the demuxer" },
2996 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2997 "set the number of video frames to output", "number" },
2998 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2999 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3000 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3001 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3002 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3003 "set frame size (WxH or abbreviation)", "size" },
3004 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3005 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3006 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3007 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3008 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3009 "set pixel format", "format" },
3010 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3011 "set the number of bits per raw sample", "number" },
3012 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3013 "deprecated use -g 1" },
3014 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3016 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3017 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3018 "rate control override for specific intervals", "override" },
3019 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3020 OPT_OUTPUT, { .func_arg = opt_video_codec },
3021 "force video codec ('copy' to copy stream)", "codec" },
3022 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3024 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3026 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3027 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3028 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3029 "select the pass number (1 to 3)", "n" },
3030 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3031 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3032 "select two pass log file name prefix", "prefix" },
3033 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3034 "this option is deprecated, use the yadif filter instead" },
3035 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3036 "calculate PSNR of compressed frames" },
3037 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
3038 "dump video coding statistics to file" },
3039 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
3040 "dump video coding statistics to file", "file" },
3041 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3042 "set video filters", "filter_graph" },
3043 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3044 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3045 "specify intra matrix coeffs", "matrix" },
3046 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3047 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3048 "specify inter matrix coeffs", "matrix" },
3049 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3050 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3051 "specify intra matrix coeffs", "matrix" },
3052 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3053 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3054 "top=1/bottom=0/auto=-1 field first", "" },
3055 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3056 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3057 "force video tag/fourcc", "fourcc/tag" },
3058 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3059 "show QP histogram" },
3060 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3061 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3062 "force the selected framerate, disable the best supported framerate selection" },
3063 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3064 OPT_OUTPUT, { .func_arg = opt_streamid },
3065 "set the value of an outfile streamid", "streamIndex:value" },
3066 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3067 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3068 "force key frames at specified timestamps", "timestamps" },
3069 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3070 "audio bitrate (please use -b:a)", "bitrate" },
3071 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3072 "video bitrate (please use -b:v)", "bitrate" },
3073 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3074 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3075 "use HW accelerated decoding", "hwaccel name" },
3076 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3077 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3078 "select a device for HW acceleration" "devicename" },
3080 { "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
3082 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3083 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3084 "automatically insert correct rotate filters" },
3087 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3088 "set the number of audio frames to output", "number" },
3089 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3090 "set audio quality (codec-specific)", "quality", },
3091 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3092 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3093 "set audio sampling rate (in Hz)", "rate" },
3094 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3095 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3096 "set number of audio channels", "channels" },
3097 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3099 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3100 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3101 "force audio codec ('copy' to copy stream)", "codec" },
3102 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3103 OPT_OUTPUT, { .func_arg = opt_old2new },
3104 "force audio tag/fourcc", "fourcc/tag" },
3105 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3106 "change audio volume (256=normal)" , "volume" },
3107 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3108 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3109 "set sample format", "format" },
3110 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3111 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3112 "set channel layout", "layout" },
3113 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3114 "set audio filters", "filter_graph" },
3115 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3116 "set the maximum number of channels to try to guess the channel layout" },
3118 /* subtitle options */
3119 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3120 "disable subtitle" },
3121 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3122 "force subtitle codec ('copy' to copy stream)", "codec" },
3123 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3124 , "force subtitle tag/fourcc", "fourcc/tag" },
3125 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3126 "fix subtitles duration" },
3127 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3128 "set canvas size (WxH or abbreviation)", "size" },
3131 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3132 "deprecated, use -channel", "channel" },
3133 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3134 "deprecated, use -standard", "standard" },
3135 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3138 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3139 "set the maximum demux-decode delay", "seconds" },
3140 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3141 "set the initial demux-decode delay", "seconds" },
3142 { "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
3143 "override the options from ffserver", "" },
3144 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { opt_sdp_file },
3145 "specify a file in which to print sdp information", "file" },
3147 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3148 "A comma-separated list of bitstream filters", "bitstream_filters" },
3149 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3150 "deprecated", "audio bitstream_filters" },
3151 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3152 "deprecated", "video bitstream_filters" },
3154 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3155 "set the audio options to the indicated preset", "preset" },
3156 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3157 "set the video options to the indicated preset", "preset" },
3158 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3159 "set the subtitle options to the indicated preset", "preset" },
3160 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3161 "set options from indicated preset file", "filename" },
3162 /* data codec support */
3163 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3164 "force data codec ('copy' to copy stream)", "codec" },
3165 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },