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"
31 #include "libavfilter/avfiltergraph.h"
33 #include "libavutil/avassert.h"
34 #include "libavutil/avstring.h"
35 #include "libavutil/avutil.h"
36 #include "libavutil/channel_layout.h"
37 #include "libavutil/intreadwrite.h"
38 #include "libavutil/fifo.h"
39 #include "libavutil/mathematics.h"
40 #include "libavutil/opt.h"
41 #include "libavutil/parseutils.h"
42 #include "libavutil/pixdesc.h"
43 #include "libavutil/pixfmt.h"
45 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
48 for (i = 0; i < o->nb_ ## name; i++) {\
49 char *spec = o->name[i].specifier;\
50 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
51 outvar = o->name[i].u.type;\
57 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
60 for (i = 0; i < o->nb_ ## name; i++) {\
61 char *spec = o->name[i].specifier;\
62 if (!strcmp(spec, mediatype))\
63 outvar = o->name[i].u.type;\
66 char *vstats_filename;
68 float audio_drift_threshold = 0.1;
69 float dts_delta_threshold = 10;
70 float dts_error_threshold = 3600*30;
72 int audio_volume = 256;
73 int audio_sync_method = 0;
74 int video_sync_method = VSYNC_AUTO;
75 int do_deinterlace = 0;
77 int do_benchmark_all = 0;
83 int exit_on_error = 0;
86 int stdin_interaction = 1;
87 int frame_bits_per_raw_sample = 0;
90 static int intra_only = 0;
91 static int file_overwrite = 0;
92 static int no_file_overwrite = 0;
93 static int video_discard = 0;
94 static int intra_dc_precision = 8;
95 static int do_psnr = 0;
96 static int input_sync;
98 static void uninit_options(OptionsContext *o, int is_input)
100 const OptionDef *po = options;
103 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
105 void *dst = (uint8_t*)o + po->u.off;
107 if (po->flags & OPT_SPEC) {
108 SpecifierOpt **so = dst;
109 int i, *count = (int*)(so + 1);
110 for (i = 0; i < *count; i++) {
111 av_freep(&(*so)[i].specifier);
112 if (po->flags & OPT_STRING)
113 av_freep(&(*so)[i].u.str);
117 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
122 for (i = 0; i < o->nb_stream_maps; i++)
123 av_freep(&o->stream_maps[i].linklabel);
124 av_freep(&o->stream_maps);
125 av_freep(&o->audio_channel_maps);
126 av_freep(&o->streamid_map);
129 o->recording_time = INT64_MAX;
132 static void init_options(OptionsContext *o, int is_input)
134 OptionsContext bak= *o;
135 memset(o, 0, sizeof(*o));
138 o->recording_time = bak.recording_time;
139 if (o->recording_time != INT64_MAX)
140 av_log(NULL, AV_LOG_WARNING,
141 "-t is not an input option, keeping it for the next output;"
142 " consider fixing your command line.\n");
144 o->recording_time = INT64_MAX;
145 o->mux_max_delay = 0.7;
146 o->limit_filesize = UINT64_MAX;
147 o->chapters_input_file = INT_MAX;
150 static int opt_frame_crop(void *optctx, const char *opt, const char *arg)
152 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
153 return AVERROR(EINVAL);
156 static int opt_pad(void *optctx, const char *opt, const char *arg)
158 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
162 static int opt_sameq(void *optctx, const char *opt, const char *arg)
164 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
165 "If you are looking for an option to preserve the quality (which is not "
166 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
168 return AVERROR(EINVAL);
171 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
173 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
174 return opt_default(optctx, "channel", arg);
177 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
179 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
180 return opt_default(optctx, "standard", arg);
183 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
185 OptionsContext *o = optctx;
186 return parse_option(o, "codec:a", arg, options);
189 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
191 OptionsContext *o = optctx;
192 return parse_option(o, "codec:v", arg, options);
195 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
197 OptionsContext *o = optctx;
198 return parse_option(o, "codec:s", arg, options);
201 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
203 OptionsContext *o = optctx;
204 return parse_option(o, "codec:d", arg, options);
207 static int opt_map(void *optctx, const char *opt, const char *arg)
209 OptionsContext *o = optctx;
211 int i, negative = 0, file_idx;
212 int sync_file_idx = -1, sync_stream_idx = 0;
220 map = av_strdup(arg);
222 /* parse sync stream first, just pick first matching stream */
223 if (sync = strchr(map, ',')) {
225 sync_file_idx = strtol(sync + 1, &sync, 0);
226 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
227 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
232 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
233 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
234 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
238 if (i == input_files[sync_file_idx]->nb_streams) {
239 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
240 "match any streams.\n", arg);
247 /* this mapping refers to lavfi output */
248 const char *c = map + 1;
249 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
250 m = &o->stream_maps[o->nb_stream_maps - 1];
251 m->linklabel = av_get_token(&c, "]");
253 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
257 file_idx = strtol(map, &p, 0);
258 if (file_idx >= nb_input_files || file_idx < 0) {
259 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
263 /* disable some already defined maps */
264 for (i = 0; i < o->nb_stream_maps; i++) {
265 m = &o->stream_maps[i];
266 if (file_idx == m->file_index &&
267 check_stream_specifier(input_files[m->file_index]->ctx,
268 input_files[m->file_index]->ctx->streams[m->stream_index],
269 *p == ':' ? p + 1 : p) > 0)
273 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
274 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
275 *p == ':' ? p + 1 : p) <= 0)
277 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
278 m = &o->stream_maps[o->nb_stream_maps - 1];
280 m->file_index = file_idx;
283 if (sync_file_idx >= 0) {
284 m->sync_file_index = sync_file_idx;
285 m->sync_stream_index = sync_stream_idx;
287 m->sync_file_index = file_idx;
288 m->sync_stream_index = i;
294 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
302 static int opt_attach(void *optctx, const char *opt, const char *arg)
304 OptionsContext *o = optctx;
305 GROW_ARRAY(o->attachments, o->nb_attachments);
306 o->attachments[o->nb_attachments - 1] = arg;
310 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
312 OptionsContext *o = optctx;
317 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
318 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
320 /* muted channel syntax */
321 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
322 if ((n == 1 || n == 3) && m->channel_idx == -1) {
323 m->file_idx = m->stream_idx = -1;
325 m->ofile_idx = m->ostream_idx = -1;
330 n = sscanf(arg, "%d.%d.%d:%d.%d",
331 &m->file_idx, &m->stream_idx, &m->channel_idx,
332 &m->ofile_idx, &m->ostream_idx);
334 if (n != 3 && n != 5) {
335 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
336 "[file.stream.channel|-1][:syncfile:syncstream]\n");
340 if (n != 5) // only file.stream.channel specified
341 m->ofile_idx = m->ostream_idx = -1;
344 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
345 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
349 if (m->stream_idx < 0 ||
350 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
351 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
352 m->file_idx, m->stream_idx);
355 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
356 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
357 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
358 m->file_idx, m->stream_idx);
361 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
362 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
363 m->file_idx, m->stream_idx, m->channel_idx);
370 * Parse a metadata specifier passed as 'arg' parameter.
371 * @param arg metadata string to parse
372 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
373 * @param index for type c/p, chapter/program index is written here
374 * @param stream_spec for type s, the stream specifier is written here
376 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
384 if (*(++arg) && *arg != ':') {
385 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
388 *stream_spec = *arg == ':' ? arg + 1 : "";
393 *index = strtol(++arg, NULL, 0);
396 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
403 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
405 AVDictionary **meta_in = NULL;
406 AVDictionary **meta_out = NULL;
408 char type_in, type_out;
409 const char *istream_spec = NULL, *ostream_spec = NULL;
410 int idx_in = 0, idx_out = 0;
412 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
413 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
416 if (type_out == 'g' || !*outspec)
417 o->metadata_global_manual = 1;
418 if (type_out == 's' || !*outspec)
419 o->metadata_streams_manual = 1;
420 if (type_out == 'c' || !*outspec)
421 o->metadata_chapters_manual = 1;
425 if (type_in == 'g' || type_out == 'g')
426 o->metadata_global_manual = 1;
427 if (type_in == 's' || type_out == 's')
428 o->metadata_streams_manual = 1;
429 if (type_in == 'c' || type_out == 'c')
430 o->metadata_chapters_manual = 1;
432 /* ic is NULL when just disabling automatic mappings */
436 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
437 if ((index) < 0 || (index) >= (nb_elems)) {\
438 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
443 #define SET_DICT(type, meta, context, index)\
446 meta = &context->metadata;\
449 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
450 meta = &context->chapters[index]->metadata;\
453 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
454 meta = &context->programs[index]->metadata;\
457 break; /* handled separately below */ \
458 default: av_assert0(0);\
461 SET_DICT(type_in, meta_in, ic, idx_in);
462 SET_DICT(type_out, meta_out, oc, idx_out);
464 /* for input streams choose first matching stream */
465 if (type_in == 's') {
466 for (i = 0; i < ic->nb_streams; i++) {
467 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
468 meta_in = &ic->streams[i]->metadata;
474 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
479 if (type_out == 's') {
480 for (i = 0; i < oc->nb_streams; i++) {
481 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
482 meta_out = &oc->streams[i]->metadata;
483 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
488 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
493 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
495 OptionsContext *o = optctx;
497 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
498 struct tm time = *gmtime((time_t*)&recording_timestamp);
499 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
500 parse_option(o, "metadata", buf, options);
502 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
503 "tag instead.\n", opt);
507 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
509 const AVCodecDescriptor *desc;
510 const char *codec_string = encoder ? "encoder" : "decoder";
514 avcodec_find_encoder_by_name(name) :
515 avcodec_find_decoder_by_name(name);
517 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
518 codec = encoder ? avcodec_find_encoder(desc->id) :
519 avcodec_find_decoder(desc->id);
521 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
522 codec_string, codec->name, desc->name);
526 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
529 if (codec->type != type) {
530 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
536 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
538 char *codec_name = NULL;
540 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
542 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
543 st->codec->codec_id = codec->id;
546 return avcodec_find_decoder(st->codec->codec_id);
549 /* Add all the streams from the given input file to the global
550 * list of input streams. */
551 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
554 char *next, *codec_tag = NULL;
556 for (i = 0; i < ic->nb_streams; i++) {
557 AVStream *st = ic->streams[i];
558 AVCodecContext *dec = st->codec;
559 InputStream *ist = av_mallocz(sizeof(*ist));
560 char *framerate = NULL;
565 GROW_ARRAY(input_streams, nb_input_streams);
566 input_streams[nb_input_streams - 1] = ist;
569 ist->file_index = nb_input_files;
571 st->discard = AVDISCARD_ALL;
574 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
576 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
578 uint32_t tag = strtol(codec_tag, &next, 0);
580 tag = AV_RL32(codec_tag);
581 st->codec->codec_tag = tag;
584 ist->dec = choose_decoder(o, ic, st);
585 ist->opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
587 ist->reinit_filters = -1;
588 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
590 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
592 switch (dec->codec_type) {
593 case AVMEDIA_TYPE_VIDEO:
595 ist->dec = avcodec_find_decoder(dec->codec_id);
597 dec->flags |= CODEC_FLAG_EMU_EDGE;
600 ist->resample_height = dec->height;
601 ist->resample_width = dec->width;
602 ist->resample_pix_fmt = dec->pix_fmt;
604 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
605 if (framerate && av_parse_video_rate(&ist->framerate,
607 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
612 ist->top_field_first = -1;
613 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
616 case AVMEDIA_TYPE_AUDIO:
617 guess_input_channel_layout(ist);
619 ist->resample_sample_fmt = dec->sample_fmt;
620 ist->resample_sample_rate = dec->sample_rate;
621 ist->resample_channels = dec->channels;
622 ist->resample_channel_layout = dec->channel_layout;
625 case AVMEDIA_TYPE_DATA:
626 case AVMEDIA_TYPE_SUBTITLE:
628 ist->dec = avcodec_find_decoder(dec->codec_id);
629 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
631 case AVMEDIA_TYPE_ATTACHMENT:
632 case AVMEDIA_TYPE_UNKNOWN:
640 static void assert_file_overwrite(const char *filename)
642 if ((!file_overwrite || no_file_overwrite) &&
643 (strchr(filename, ':') == NULL || filename[1] == ':' ||
644 av_strstart(filename, "file:", NULL))) {
645 if (avio_check(filename, 0) == 0) {
646 if (stdin_interaction && (!no_file_overwrite || file_overwrite)) {
647 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
650 signal(SIGINT, SIG_DFL);
652 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
658 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
665 static void dump_attachment(AVStream *st, const char *filename)
668 AVIOContext *out = NULL;
669 AVDictionaryEntry *e;
671 if (!st->codec->extradata_size) {
672 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
673 nb_input_files - 1, st->index);
676 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
679 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
680 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
684 assert_file_overwrite(filename);
686 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
687 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
692 avio_write(out, st->codec->extradata, st->codec->extradata_size);
697 static int open_input_file(OptionsContext *o, const char *filename)
700 AVInputFormat *file_iformat = NULL;
705 int orig_nb_streams; // number of streams before avformat_find_stream_info
706 char * video_codec_name = NULL;
707 char * audio_codec_name = NULL;
708 char *subtitle_codec_name = NULL;
711 if (!(file_iformat = av_find_input_format(o->format))) {
712 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
717 if (!strcmp(filename, "-"))
720 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
721 strcmp(filename, "/dev/stdin");
723 /* get default parameters from command line */
724 ic = avformat_alloc_context();
726 print_error(filename, AVERROR(ENOMEM));
729 if (o->nb_audio_sample_rate) {
730 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
731 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
733 if (o->nb_audio_channels) {
734 /* because we set audio_channels based on both the "ac" and
735 * "channel_layout" options, we need to check that the specified
736 * demuxer actually has the "channels" option before setting it */
737 if (file_iformat && file_iformat->priv_class &&
738 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
739 AV_OPT_SEARCH_FAKE_OBJ)) {
740 snprintf(buf, sizeof(buf), "%d",
741 o->audio_channels[o->nb_audio_channels - 1].u.i);
742 av_dict_set(&o->g->format_opts, "channels", buf, 0);
745 if (o->nb_frame_rates) {
746 /* set the format-level framerate option;
747 * this is important for video grabbers, e.g. x11 */
748 if (file_iformat && file_iformat->priv_class &&
749 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
750 AV_OPT_SEARCH_FAKE_OBJ)) {
751 av_dict_set(&o->g->format_opts, "framerate",
752 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
755 if (o->nb_frame_sizes) {
756 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
758 if (o->nb_frame_pix_fmts)
759 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
761 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
762 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
763 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
765 ic->video_codec_id = video_codec_name ?
766 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
767 ic->audio_codec_id = audio_codec_name ?
768 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
769 ic->subtitle_codec_id= subtitle_codec_name ?
770 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
771 ic->flags |= AVFMT_FLAG_NONBLOCK;
772 ic->interrupt_callback = int_cb;
774 /* open the input file with generic avformat function */
775 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
777 print_error(filename, err);
780 assert_avoptions(o->g->format_opts);
782 /* apply forced codec ids */
783 for (i = 0; i < ic->nb_streams; i++)
784 choose_decoder(o, ic, ic->streams[i]);
786 /* Set AVCodecContext options for avformat_find_stream_info */
787 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
788 orig_nb_streams = ic->nb_streams;
790 /* If not enough info to get the stream parameters, we decode the
791 first frames to get it. (used in mpeg case for example) */
792 ret = avformat_find_stream_info(ic, opts);
794 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
795 avformat_close_input(&ic);
799 timestamp = o->start_time;
800 /* add the stream start time */
801 if (ic->start_time != AV_NOPTS_VALUE)
802 timestamp += ic->start_time;
804 /* if seeking requested, we execute it */
805 if (o->start_time != 0) {
806 ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, timestamp, 0);
808 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
809 filename, (double)timestamp / AV_TIME_BASE);
813 /* update the current parameters so that they match the one of the input stream */
814 add_input_streams(o, ic);
816 /* dump the file content */
817 av_dump_format(ic, nb_input_files, filename, 0);
819 GROW_ARRAY(input_files, nb_input_files);
820 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
823 input_files[nb_input_files - 1]->ctx = ic;
824 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
825 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
826 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
827 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
829 for (i = 0; i < o->nb_dump_attachment; i++) {
832 for (j = 0; j < ic->nb_streams; j++) {
833 AVStream *st = ic->streams[j];
835 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
836 dump_attachment(st, o->dump_attachment[i].u.str);
840 for (i = 0; i < orig_nb_streams; i++)
841 av_dict_free(&opts[i]);
847 static uint8_t *get_line(AVIOContext *s)
853 if (avio_open_dyn_buf(&line) < 0) {
854 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
858 while ((c = avio_r8(s)) && c != '\n')
861 avio_close_dyn_buf(line, &buf);
866 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
870 const char *base[3] = { getenv("AVCONV_DATADIR"),
875 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
879 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
880 i != 1 ? "" : "/.avconv", codec_name, preset_name);
881 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
884 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
885 i != 1 ? "" : "/.avconv", preset_name);
886 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
892 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
894 char *codec_name = NULL;
896 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
898 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
899 NULL, ost->st->codec->codec_type);
900 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
901 } else if (!strcmp(codec_name, "copy"))
902 ost->stream_copy = 1;
904 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
905 ost->st->codec->codec_id = ost->enc->id;
909 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
912 AVStream *st = avformat_new_stream(oc, NULL);
913 int idx = oc->nb_streams - 1, ret = 0;
914 char *bsf = NULL, *next, *codec_tag = NULL;
915 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
919 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
923 if (oc->nb_streams - 1 < o->nb_streamid_map)
924 st->id = o->streamid_map[oc->nb_streams - 1];
926 GROW_ARRAY(output_streams, nb_output_streams);
927 if (!(ost = av_mallocz(sizeof(*ost))))
929 output_streams[nb_output_streams - 1] = ost;
931 ost->file_index = nb_output_files;
934 st->codec->codec_type = type;
935 choose_encoder(o, oc, ost);
937 AVIOContext *s = NULL;
938 char *buf = NULL, *arg = NULL, *preset = NULL;
940 ost->opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
942 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
943 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
946 if (!buf[0] || buf[0] == '#') {
950 if (!(arg = strchr(buf, '='))) {
951 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
955 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
957 } while (!s->eof_reached);
961 av_log(NULL, AV_LOG_FATAL,
962 "Preset %s specified for stream %d:%d, but could not be opened.\n",
963 preset, ost->file_index, ost->index);
968 avcodec_get_context_defaults3(st->codec, ost->enc);
969 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
971 ost->max_frames = INT64_MAX;
972 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
974 ost->copy_prior_start = -1;
975 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
977 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
979 if (next = strchr(bsf, ','))
981 if (!(bsfc = av_bitstream_filter_init(bsf))) {
982 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
986 bsfc_prev->next = bsfc;
988 ost->bitstream_filters = bsfc;
994 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
996 uint32_t tag = strtol(codec_tag, &next, 0);
998 tag = AV_RL32(codec_tag);
999 st->codec->codec_tag = tag;
1002 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1004 st->codec->flags |= CODEC_FLAG_QSCALE;
1005 st->codec->global_quality = FF_QP2LAMBDA * qscale;
1008 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1009 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
1011 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1012 av_opt_get_int (o->g->swr_opts, "filter_type" , 0, &ost->swr_filter_type);
1013 av_opt_get_int (o->g->swr_opts, "dither_method", 0, &ost->swr_dither_method);
1014 av_opt_get_double(o->g->swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
1016 ost->source_index = source_index;
1017 if (source_index >= 0) {
1018 ost->sync_ist = input_streams[source_index];
1019 input_streams[source_index]->discard = 0;
1020 input_streams[source_index]->st->discard = AVDISCARD_NONE;
1026 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1029 const char *p = str;
1036 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1043 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1047 AVCodecContext *video_enc;
1048 char *frame_rate = NULL;
1050 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1052 video_enc = st->codec;
1054 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1055 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1056 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1060 if (!ost->stream_copy) {
1061 const char *p = NULL;
1062 char *frame_size = NULL;
1063 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
1064 char *intra_matrix = NULL, *inter_matrix = NULL;
1065 const char *filters = "null";
1069 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1070 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1071 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1075 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1076 if (frame_aspect_ratio) {
1078 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1079 q.num <= 0 || q.den <= 0) {
1080 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1083 ost->frame_aspect_ratio = av_q2d(q);
1086 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1087 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1088 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1089 ost->keep_pix_fmt = 1;
1090 if (!*++frame_pix_fmt)
1091 frame_pix_fmt = NULL;
1093 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1094 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1097 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1100 video_enc->gop_size = 0;
1101 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1103 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1104 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1107 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1109 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1111 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1112 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1115 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1118 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1119 for (i = 0; p; i++) {
1121 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1123 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1126 /* FIXME realloc failure */
1127 video_enc->rc_override =
1128 av_realloc(video_enc->rc_override,
1129 sizeof(RcOverride) * (i + 1));
1130 video_enc->rc_override[i].start_frame = start;
1131 video_enc->rc_override[i].end_frame = end;
1133 video_enc->rc_override[i].qscale = q;
1134 video_enc->rc_override[i].quality_factor = 1.0;
1137 video_enc->rc_override[i].qscale = 0;
1138 video_enc->rc_override[i].quality_factor = -q/100.0;
1143 video_enc->rc_override_count = i;
1144 if (!video_enc->rc_initial_buffer_occupancy)
1145 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
1146 video_enc->intra_dc_precision = intra_dc_precision - 8;
1149 video_enc->flags|= CODEC_FLAG_PSNR;
1152 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1155 video_enc->flags |= CODEC_FLAG_PASS1;
1158 video_enc->flags |= CODEC_FLAG_PASS2;
1162 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1163 if (ost->logfile_prefix &&
1164 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1167 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1168 if (ost->forced_keyframes)
1169 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1171 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1173 ost->top_field_first = -1;
1174 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1176 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
1177 ost->avfilter = av_strdup(filters);
1179 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1185 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1190 AVCodecContext *audio_enc;
1192 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1195 audio_enc = st->codec;
1196 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1198 if (!ost->stream_copy) {
1199 char *sample_fmt = NULL;
1200 const char *filters = "anull";
1202 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1204 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1206 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1207 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1211 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1213 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
1215 av_assert1(filters);
1216 ost->avfilter = av_strdup(filters);
1218 /* check for channel mapping for this audio stream */
1219 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1220 AudioChannelMap *map = &o->audio_channel_maps[n];
1221 InputStream *ist = input_streams[ost->source_index];
1222 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
1223 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1224 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1225 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
1226 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1228 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
1229 ost->file_index, ost->st->index);
1237 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1241 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1242 if (!ost->stream_copy) {
1243 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1250 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1252 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1253 ost->stream_copy = 1;
1257 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1261 AVCodecContext *subtitle_enc;
1263 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1265 subtitle_enc = st->codec;
1267 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1269 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1271 if (!ost->stream_copy) {
1272 char *frame_size = NULL;
1274 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1275 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1276 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1284 /* arg format is "output-stream-index:streamid-value". */
1285 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1287 OptionsContext *o = optctx;
1292 av_strlcpy(idx_str, arg, sizeof(idx_str));
1293 p = strchr(idx_str, ':');
1295 av_log(NULL, AV_LOG_FATAL,
1296 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1301 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1302 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1303 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1307 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1309 AVFormatContext *is = ifile->ctx;
1310 AVFormatContext *os = ofile->ctx;
1314 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1316 return AVERROR(ENOMEM);
1319 for (i = 0; i < is->nb_chapters; i++) {
1320 AVChapter *in_ch = is->chapters[i], *out_ch;
1321 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
1322 AV_TIME_BASE_Q, in_ch->time_base);
1323 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1324 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1327 if (in_ch->end < ts_off)
1329 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1332 out_ch = av_mallocz(sizeof(AVChapter));
1334 return AVERROR(ENOMEM);
1336 out_ch->id = in_ch->id;
1337 out_ch->time_base = in_ch->time_base;
1338 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1339 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1342 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1344 os->chapters[os->nb_chapters++] = out_ch;
1349 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1352 AVFormatContext *ic = avformat_alloc_context();
1354 ic->interrupt_callback = int_cb;
1355 err = avformat_open_input(&ic, filename, NULL, NULL);
1358 /* copy stream format */
1359 for(i=0;i<ic->nb_streams;i++) {
1363 AVCodecContext *avctx;
1365 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
1366 ost = new_output_stream(o, s, codec->type, -1);
1371 // FIXME: a more elegant solution is needed
1372 memcpy(st, ic->streams[i], sizeof(AVStream));
1374 st->info = av_malloc(sizeof(*st->info));
1375 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
1377 avcodec_copy_context(st->codec, ic->streams[i]->codec);
1379 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
1380 choose_sample_fmt(st, codec);
1381 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
1382 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
1385 /* ffserver seeking with date=... needs a date reference */
1386 err = parse_option(o, "metadata", "creation_time=now", options);
1388 avformat_close_input(&ic);
1392 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1393 AVFormatContext *oc)
1397 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1398 ofilter->out_tmp->pad_idx)) {
1399 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
1400 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1402 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1407 ost->source_index = -1;
1408 ost->filter = ofilter;
1412 if (ost->stream_copy) {
1413 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1414 "which is fed from a complex filtergraph. Filtering and streamcopy "
1415 "cannot be used together.\n", ost->file_index, ost->index);
1419 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1420 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1423 avfilter_inout_free(&ofilter->out_tmp);
1426 static int configure_complex_filters(void)
1430 for (i = 0; i < nb_filtergraphs; i++)
1431 if (!filtergraphs[i]->graph &&
1432 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1437 static int open_output_file(OptionsContext *o, const char *filename)
1439 AVFormatContext *oc;
1441 AVOutputFormat *file_oformat;
1445 if (configure_complex_filters() < 0) {
1446 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1450 if (!strcmp(filename, "-"))
1453 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
1455 print_error(filename, err);
1458 file_oformat= oc->oformat;
1459 oc->interrupt_callback = int_cb;
1461 /* create streams for all unlabeled output pads */
1462 for (i = 0; i < nb_filtergraphs; i++) {
1463 FilterGraph *fg = filtergraphs[i];
1464 for (j = 0; j < fg->nb_outputs; j++) {
1465 OutputFilter *ofilter = fg->outputs[j];
1467 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1470 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1471 ofilter->out_tmp->pad_idx)) {
1472 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1473 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1474 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1476 init_output_filter(ofilter, o, oc);
1480 if (!strcmp(file_oformat->name, "ffm") &&
1481 av_strstart(filename, "http:", NULL)) {
1483 /* special case for files sent to ffserver: we get the stream
1484 parameters from ffserver */
1485 int err = read_ffserver_streams(o, oc, filename);
1487 print_error(filename, err);
1490 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
1491 ost = output_streams[j];
1492 for (i = 0; i < nb_input_streams; i++) {
1493 ist = input_streams[i];
1494 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
1496 ost->source_index= i;
1497 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
1498 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
1500 ist->st->discard = AVDISCARD_NONE;
1505 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));
1509 } else if (!o->nb_stream_maps) {
1510 char *subtitle_codec_name = NULL;
1511 /* pick the "best" stream of each type */
1513 /* video: highest resolution */
1514 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1515 int area = 0, idx = -1;
1516 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
1517 for (i = 0; i < nb_input_streams; i++) {
1519 ist = input_streams[i];
1520 new_area = ist->st->codec->width * ist->st->codec->height;
1521 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1523 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1525 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
1532 new_video_stream(o, oc, idx);
1535 /* audio: most channels */
1536 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1537 int channels = 0, idx = -1;
1538 for (i = 0; i < nb_input_streams; i++) {
1539 ist = input_streams[i];
1540 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1541 ist->st->codec->channels > channels) {
1542 channels = ist->st->codec->channels;
1547 new_audio_stream(o, oc, idx);
1550 /* subtitles: pick first */
1551 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
1552 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != AV_CODEC_ID_NONE || subtitle_codec_name)) {
1553 for (i = 0; i < nb_input_streams; i++)
1554 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1555 new_subtitle_stream(o, oc, i);
1559 /* do something with data? */
1561 for (i = 0; i < o->nb_stream_maps; i++) {
1562 StreamMap *map = &o->stream_maps[i];
1563 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
1568 if (map->linklabel) {
1570 OutputFilter *ofilter = NULL;
1573 for (j = 0; j < nb_filtergraphs; j++) {
1574 fg = filtergraphs[j];
1575 for (k = 0; k < fg->nb_outputs; k++) {
1576 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1577 if (out && !strcmp(out->name, map->linklabel)) {
1578 ofilter = fg->outputs[k];
1585 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1586 "in any defined filter graph.\n", map->linklabel);
1589 init_output_filter(ofilter, o, oc);
1591 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1592 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
1594 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1596 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1598 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
1601 switch (ist->st->codec->codec_type) {
1602 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
1603 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
1604 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
1605 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
1606 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
1608 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1609 map->file_index, map->stream_index);
1617 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
1618 AVDictionaryEntry *e;
1619 ost = output_streams[i];
1621 if ( ost->stream_copy
1622 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
1623 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
1624 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
1628 /* handle attached files */
1629 for (i = 0; i < o->nb_attachments; i++) {
1631 uint8_t *attachment;
1635 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1636 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1640 if ((len = avio_size(pb)) <= 0) {
1641 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1645 if (!(attachment = av_malloc(len))) {
1646 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1650 avio_read(pb, attachment, len);
1652 ost = new_attachment_stream(o, oc, -1);
1653 ost->stream_copy = 0;
1654 ost->attachment_filename = o->attachments[i];
1655 ost->st->codec->extradata = attachment;
1656 ost->st->codec->extradata_size = len;
1658 p = strrchr(o->attachments[i], '/');
1659 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1663 GROW_ARRAY(output_files, nb_output_files);
1664 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
1667 output_files[nb_output_files - 1]->ctx = oc;
1668 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
1669 output_files[nb_output_files - 1]->recording_time = o->recording_time;
1670 if (o->recording_time != INT64_MAX)
1671 oc->duration = o->recording_time;
1672 output_files[nb_output_files - 1]->start_time = o->start_time;
1673 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
1674 output_files[nb_output_files - 1]->shortest = o->shortest;
1675 av_dict_copy(&output_files[nb_output_files - 1]->opts, o->g->format_opts, 0);
1677 /* check filename in case of an image number is expected */
1678 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1679 if (!av_filename_number_test(oc->filename)) {
1680 print_error(oc->filename, AVERROR(EINVAL));
1685 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1686 /* test if it already exists to avoid losing precious files */
1687 assert_file_overwrite(filename);
1690 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1691 &oc->interrupt_callback,
1692 &output_files[nb_output_files - 1]->opts)) < 0) {
1693 print_error(filename, err);
1698 if (o->mux_preload) {
1700 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1701 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
1703 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1706 for (i = 0; i < o->nb_metadata_map; i++) {
1708 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1710 if (in_file_index >= nb_input_files) {
1711 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1714 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1715 in_file_index >= 0 ?
1716 input_files[in_file_index]->ctx : NULL, o);
1720 if (o->chapters_input_file >= nb_input_files) {
1721 if (o->chapters_input_file == INT_MAX) {
1722 /* copy chapters from the first input file that has them*/
1723 o->chapters_input_file = -1;
1724 for (i = 0; i < nb_input_files; i++)
1725 if (input_files[i]->ctx->nb_chapters) {
1726 o->chapters_input_file = i;
1730 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1731 o->chapters_input_file);
1735 if (o->chapters_input_file >= 0)
1736 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
1737 !o->metadata_chapters_manual);
1739 /* copy global metadata by default */
1740 if (!o->metadata_global_manual && nb_input_files){
1741 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1742 AV_DICT_DONT_OVERWRITE);
1743 if(o->recording_time != INT64_MAX)
1744 av_dict_set(&oc->metadata, "duration", NULL, 0);
1745 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
1747 if (!o->metadata_streams_manual)
1748 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
1750 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1752 ist = input_streams[output_streams[i]->source_index];
1753 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1756 /* process manually set metadata */
1757 for (i = 0; i < o->nb_metadata; i++) {
1760 const char *stream_spec;
1761 int index = 0, j, ret = 0;
1763 val = strchr(o->metadata[i].u.str, '=');
1765 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1766 o->metadata[i].u.str);
1771 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1773 for (j = 0; j < oc->nb_streams; j++) {
1774 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1775 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1786 if (index < 0 || index >= oc->nb_chapters) {
1787 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1790 m = &oc->chapters[index]->metadata;
1793 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1796 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1803 static int opt_target(void *optctx, const char *opt, const char *arg)
1805 OptionsContext *o = optctx;
1806 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1807 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1809 if (!strncmp(arg, "pal-", 4)) {
1812 } else if (!strncmp(arg, "ntsc-", 5)) {
1815 } else if (!strncmp(arg, "film-", 5)) {
1819 /* Try to determine PAL/NTSC by peeking in the input files */
1820 if (nb_input_files) {
1822 for (j = 0; j < nb_input_files; j++) {
1823 for (i = 0; i < input_files[j]->nb_streams; i++) {
1824 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1825 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
1827 fr = c->time_base.den * 1000 / c->time_base.num;
1831 } else if ((fr == 29970) || (fr == 23976)) {
1836 if (norm != UNKNOWN)
1840 if (norm != UNKNOWN)
1841 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1844 if (norm == UNKNOWN) {
1845 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1846 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1847 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1851 if (!strcmp(arg, "vcd")) {
1852 opt_video_codec(o, "c:v", "mpeg1video");
1853 opt_audio_codec(o, "c:a", "mp2");
1854 parse_option(o, "f", "vcd", options);
1855 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
1857 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1858 parse_option(o, "r", frame_rates[norm], options);
1859 av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", 0);
1861 av_dict_set(&o->g->codec_opts, "b:v", "1150000", 0);
1862 av_dict_set(&o->g->codec_opts, "maxrate", "1150000", 0);
1863 av_dict_set(&o->g->codec_opts, "minrate", "1150000", 0);
1864 av_dict_set(&o->g->codec_opts, "bufsize", "327680", 0); // 40*1024*8;
1866 av_dict_set(&o->g->codec_opts, "b:a", "224000", 0);
1867 parse_option(o, "ar", "44100", options);
1868 parse_option(o, "ac", "2", options);
1870 av_dict_set(&o->g->format_opts, "packetsize", "2324", 0);
1871 av_dict_set(&o->g->format_opts, "muxrate", "1411200", 0); // 2352 * 75 * 8;
1873 /* We have to offset the PTS, so that it is consistent with the SCR.
1874 SCR starts at 36000, but the first two packs contain only padding
1875 and the first pack from the other stream, respectively, may also have
1876 been written before.
1877 So the real data starts at SCR 36000+3*1200. */
1878 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1879 } else if (!strcmp(arg, "svcd")) {
1881 opt_video_codec(o, "c:v", "mpeg2video");
1882 opt_audio_codec(o, "c:a", "mp2");
1883 parse_option(o, "f", "svcd", options);
1885 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1886 parse_option(o, "r", frame_rates[norm], options);
1887 parse_option(o, "pix_fmt", "yuv420p", options);
1888 av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", 0);
1890 av_dict_set(&o->g->codec_opts, "b:v", "2040000", 0);
1891 av_dict_set(&o->g->codec_opts, "maxrate", "2516000", 0);
1892 av_dict_set(&o->g->codec_opts, "minrate", "0", 0); // 1145000;
1893 av_dict_set(&o->g->codec_opts, "bufsize", "1835008", 0); // 224*1024*8;
1894 av_dict_set(&o->g->codec_opts, "scan_offset", "1", 0);
1896 av_dict_set(&o->g->codec_opts, "b:a", "224000", 0);
1897 parse_option(o, "ar", "44100", options);
1899 av_dict_set(&o->g->format_opts, "packetsize", "2324", 0);
1901 } else if (!strcmp(arg, "dvd")) {
1903 opt_video_codec(o, "c:v", "mpeg2video");
1904 opt_audio_codec(o, "c:a", "ac3");
1905 parse_option(o, "f", "dvd", options);
1907 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1908 parse_option(o, "r", frame_rates[norm], options);
1909 parse_option(o, "pix_fmt", "yuv420p", options);
1910 av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", 0);
1912 av_dict_set(&o->g->codec_opts, "b:v", "6000000", 0);
1913 av_dict_set(&o->g->codec_opts, "maxrate", "9000000", 0);
1914 av_dict_set(&o->g->codec_opts, "minrate", "0", 0); // 1500000;
1915 av_dict_set(&o->g->codec_opts, "bufsize", "1835008", 0); // 224*1024*8;
1917 av_dict_set(&o->g->format_opts, "packetsize", "2048", 0); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1918 av_dict_set(&o->g->format_opts, "muxrate", "10080000", 0); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
1920 av_dict_set(&o->g->codec_opts, "b:a", "448000", 0);
1921 parse_option(o, "ar", "48000", options);
1923 } else if (!strncmp(arg, "dv", 2)) {
1925 parse_option(o, "f", "dv", options);
1927 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1928 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1929 norm == PAL ? "yuv420p" : "yuv411p", options);
1930 parse_option(o, "r", frame_rates[norm], options);
1932 parse_option(o, "ar", "48000", options);
1933 parse_option(o, "ac", "2", options);
1936 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1937 return AVERROR(EINVAL);
1942 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1944 av_free (vstats_filename);
1945 vstats_filename = av_strdup (arg);
1949 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1952 time_t today2 = time(NULL);
1953 struct tm *today = localtime(&today2);
1955 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1957 return opt_vstats_file(NULL, opt, filename);
1960 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1962 OptionsContext *o = optctx;
1963 return parse_option(o, "frames:v", arg, options);
1966 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1968 OptionsContext *o = optctx;
1969 return parse_option(o, "frames:a", arg, options);
1972 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1974 OptionsContext *o = optctx;
1975 return parse_option(o, "frames:d", arg, options);
1978 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
1981 AVCodecContext *cbak = codec_opts;
1982 AVCodecContext *fbak = format_opts;
1986 ret = opt_default(NULL, opt, arg);
1988 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
1989 av_dict_copy(&o->g->format_opts, format_opts, 0);
1990 av_dict_free(&codec_opts);
1991 av_dict_free(&format_opts);
1998 static int opt_preset(void *optctx, const char *opt, const char *arg)
2000 OptionsContext *o = optctx;
2002 char filename[1000], line[1000], tmp_line[1000];
2003 const char *codec_name = NULL;
2007 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2009 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2010 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2011 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2013 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2017 while (fgets(line, sizeof(line), f)) {
2018 char *key = tmp_line, *value, *endptr;
2020 if (strcspn(line, "#\n\r") == 0)
2022 strcpy(tmp_line, line);
2023 if (!av_strtok(key, "=", &value) ||
2024 !av_strtok(value, "\r\n", &endptr)) {
2025 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2028 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2030 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2031 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2032 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2033 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2034 else if (opt_default_new(o, key, value) < 0) {
2035 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2036 filename, line, key, value);
2046 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2048 OptionsContext *o = optctx;
2049 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2050 int ret = parse_option(o, s, arg, options);
2055 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2057 OptionsContext *o = optctx;
2058 if(!strcmp(opt, "b")){
2059 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2060 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2063 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2067 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2069 OptionsContext *o = optctx;
2072 if(!strcmp(opt, "qscale")){
2073 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2074 return parse_option(o, "q:v", arg, options);
2076 s = av_asprintf("q%s", opt + 6);
2077 ret = parse_option(o, s, arg, options);
2082 static int opt_profile(void *optctx, const char *opt, const char *arg)
2084 OptionsContext *o = optctx;
2085 if(!strcmp(opt, "profile")){
2086 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2087 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2090 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2094 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2096 OptionsContext *o = optctx;
2097 return parse_option(o, "filter:v", arg, options);
2100 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2102 OptionsContext *o = optctx;
2103 return parse_option(o, "filter:a", arg, options);
2106 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2108 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2109 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2110 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2111 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
2113 if (video_sync_method == VSYNC_AUTO)
2114 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2118 static int opt_deinterlace(void *optctx, const char *opt, const char *arg)
2120 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
2125 static int opt_timecode(void *optctx, const char *opt, const char *arg)
2127 OptionsContext *o = optctx;
2128 char *tcr = av_asprintf("timecode=%s", arg);
2129 int ret = parse_option(o, "metadata:g", tcr, options);
2131 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
2136 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2138 OptionsContext *o = optctx;
2139 char layout_str[32];
2142 int ret, channels, ac_str_size;
2145 layout = av_get_channel_layout(arg);
2147 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2148 return AVERROR(EINVAL);
2150 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2151 ret = opt_default(NULL, opt, layout_str);
2155 /* set 'ac' option based on channel layout */
2156 channels = av_get_channel_layout_nb_channels(layout);
2157 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2158 stream_str = strchr(opt, ':');
2159 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2160 ac_str = av_mallocz(ac_str_size);
2162 return AVERROR(ENOMEM);
2163 av_strlcpy(ac_str, "ac", 3);
2165 av_strlcat(ac_str, stream_str, ac_str_size);
2166 ret = parse_option(o, ac_str, layout_str, options);
2172 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2174 OptionsContext *o = optctx;
2175 return parse_option(o, "q:a", arg, options);
2178 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2180 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2181 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2182 return AVERROR(ENOMEM);
2183 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2184 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
2188 void show_help_default(const char *opt, const char *arg)
2190 /* per-file options have at least one of those set */
2191 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2192 int show_advanced = 0, show_avoptions = 0;
2195 if (!strcmp(opt, "long"))
2197 else if (!strcmp(opt, "full"))
2198 show_advanced = show_avoptions = 1;
2200 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2205 printf("Getting help:\n"
2206 " -h -- print basic options\n"
2207 " -h long -- print more options\n"
2208 " -h full -- print all options (including all format and codec specific options, very long)\n"
2209 " See man %s for detailed description of the options.\n"
2210 "\n", program_name);
2212 show_help_options(options, "Print help / information / capabilities:",
2215 show_help_options(options, "Global options (affect whole program "
2216 "instead of just one file:",
2217 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2219 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2220 per_file | OPT_EXIT, 0);
2222 show_help_options(options, "Per-file main options:", 0,
2223 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2224 OPT_EXIT, per_file);
2226 show_help_options(options, "Advanced per-file options:",
2227 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2229 show_help_options(options, "Video options:",
2230 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2232 show_help_options(options, "Advanced Video options:",
2233 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2235 show_help_options(options, "Audio options:",
2236 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2238 show_help_options(options, "Advanced Audio options:",
2239 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2240 show_help_options(options, "Subtitle options:",
2241 OPT_SUBTITLE, 0, 0);
2244 if (show_avoptions) {
2245 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2246 show_help_children(avcodec_get_class(), flags);
2247 show_help_children(avformat_get_class(), flags);
2248 show_help_children(sws_get_class(), flags);
2249 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2250 show_help_children(avfilter_get_class(), AV_OPT_FLAG_FILTERING_PARAM);
2254 void show_usage(void)
2256 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
2257 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2258 av_log(NULL, AV_LOG_INFO, "\n");
2266 static const OptionGroupDef groups[] = {
2267 [GROUP_OUTFILE] = { "output file", NULL },
2268 [GROUP_INFILE] = { "input file", "i" },
2272 static int open_files(OptionGroupList *l, const char *inout,
2273 int (*open_file)(OptionsContext*, const char*))
2277 for (i = 0; i < l->nb_groups; i++) {
2278 OptionGroup *g = &l->groups[i];
2281 init_options(&o, !strcmp(inout, "input"));
2284 ret = parse_optgroup(&o, g);
2286 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2287 "%s.\n", inout, g->arg);
2291 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2292 ret = open_file(&o, g->arg);
2293 uninit_options(&o, !strcmp(inout, "input"));
2295 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2299 av_log(NULL, AV_LOG_DEBUG, "Successfully openened the file.\n");
2305 int ffmpeg_parse_options(int argc, char **argv)
2307 OptionParseContext octx;
2311 memset(&octx, 0, sizeof(octx));
2313 /* split the commandline into an internal representation */
2314 ret = split_commandline(&octx, argc, argv, options, groups);
2316 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2320 /* apply global options */
2321 ret = parse_optgroup(NULL, &octx.global_opts);
2323 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2327 /* open input files */
2328 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2330 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2334 /* open output files */
2335 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2337 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2342 uninit_parse_context(&octx);
2344 av_strerror(ret, error, sizeof(error));
2345 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2350 static int opt_progress(void *optctx, const char *opt, const char *arg)
2352 AVIOContext *avio = NULL;
2355 if (!strcmp(arg, "-"))
2357 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
2359 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
2360 arg, av_err2str(ret));
2363 progress_avio = avio;
2367 #define OFFSET(x) offsetof(OptionsContext, x)
2368 const OptionDef options[] = {
2370 #include "cmdutils_common_opts.h"
2371 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, { .off = OFFSET(format) },
2372 "force format", "fmt" },
2373 { "y", OPT_BOOL, { &file_overwrite },
2374 "overwrite output files" },
2375 { "n", OPT_BOOL, { &no_file_overwrite },
2376 "do not overwrite output files" },
2377 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(codec_names) },
2378 "codec name", "codec" },
2379 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(codec_names) },
2380 "codec name", "codec" },
2381 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(presets) },
2382 "preset name", "preset" },
2383 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_map },
2384 "set input stream mapping",
2385 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2386 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_map_channel },
2387 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
2388 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(metadata_map) },
2389 "set metadata information of outfile from infile",
2390 "outfile[,metadata]:infile[,metadata]" },
2391 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(chapters_input_file) },
2392 "set chapters mapping", "input_file_index" },
2393 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, { .off = OFFSET(recording_time) },
2394 "record or transcode \"duration\" seconds of audio/video",
2396 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, { .off = OFFSET(limit_filesize) },
2397 "set the limit file size in bytes", "limit_size" },
2398 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, { .off = OFFSET(start_time) },
2399 "set the start time offset", "time_off" },
2400 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_EXPERT,{ .off = OFFSET(input_ts_offset) },
2401 "set the input ts offset", "time_off" },
2402 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(ts_scale) },
2403 "set the input ts scale", "scale" },
2404 { "timestamp", HAS_ARG | OPT_PERFILE, { .func_arg = opt_recording_timestamp },
2405 "set the recording timestamp ('now' to set the current time)", "time" },
2406 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(metadata) },
2407 "add metadata", "string=string" },
2408 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_data_frames },
2409 "set the number of data frames to record", "number" },
2410 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2411 "add timings for benchmarking" },
2412 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
2413 "add timings for each task" },
2414 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
2415 "write program-readable progress information", "url" },
2416 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
2417 "enable or disable interaction on standard input" },
2418 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2419 "set max runtime in seconds", "limit" },
2420 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2421 "dump each input packet" },
2422 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2423 "when dumping packets, also dump the payload" },
2424 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(rate_emu) },
2425 "read input at native frame rate", "" },
2426 { "target", HAS_ARG | OPT_PERFILE, { .func_arg = opt_target },
2427 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2428 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2429 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2430 "video sync method", "" },
2431 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2432 "audio sync method", "" },
2433 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2434 "audio drift threshold", "threshold" },
2435 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2436 "copy timestamps" },
2437 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
2438 "copy input stream time base when stream copying", "mode" },
2439 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(shortest) },
2440 "finish encoding within shortest input" },
2441 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2442 "timestamp discontinuity delta threshold", "threshold" },
2443 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
2444 "timestamp error delta threshold", "threshold" },
2445 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2446 "exit on error", "error" },
2447 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_initial_nonkeyframes) },
2448 "copy initial non-keyframes" },
2449 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_prior_start) },
2450 "copy or discard frames before start time" },
2451 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, { .off = OFFSET(max_frames) },
2452 "set the number of frames to record", "number" },
2453 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(codec_tags) },
2454 "force codec tag/fourcc", "fourcc/tag" },
2455 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC,{ .off = OFFSET(qscale) },
2456 "use fixed quality scale (VBR)", "q" },
2457 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_qscale },
2458 "use fixed quality scale (VBR)", "q" },
2459 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_profile },
2460 "set profile", "profile" },
2461 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(filters) },
2462 "set stream filterchain", "filter_list" },
2463 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(reinit_filters) },
2464 "reinit filtergraph on input parameter changes", "" },
2465 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2466 "create a complex filtergraph", "graph_description" },
2467 { "stats", OPT_BOOL, { &print_stats },
2468 "print progress report during encoding", },
2469 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_attach },
2470 "add an attachment to the output file", "filename" },
2471 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |OPT_EXPERT,{ .off = OFFSET(dump_attachment) },
2472 "extract an attachment into a file", "filename" },
2473 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
2474 "print timestamp debugging info" },
2477 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_frames },
2478 "set the number of video frames to record", "number" },
2479 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_rates) },
2480 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2481 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC,{ .off = OFFSET(frame_sizes) },
2482 "set frame size (WxH or abbreviation)", "size" },
2483 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_aspect_ratios) },
2484 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2485 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_pix_fmts) },
2486 "set pixel format", "format" },
2487 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
2488 "set the number of bits per raw sample", "number" },
2489 { "croptop", OPT_VIDEO | HAS_ARG, { .func_arg = opt_frame_crop },
2490 "Removed, use the crop filter instead", "size" },
2491 { "cropbottom", OPT_VIDEO | HAS_ARG, { .func_arg = opt_frame_crop },
2492 "Removed, use the crop filter instead", "size" },
2493 { "cropleft", OPT_VIDEO | HAS_ARG, { .func_arg = opt_frame_crop },
2494 "Removed, use the crop filter instead", "size" },
2495 { "cropright", OPT_VIDEO | HAS_ARG, { .func_arg = opt_frame_crop },
2496 "Removed, use the crop filter instead", "size" },
2497 { "padtop", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2498 "Removed, use the pad filter instead", "size" },
2499 { "padbottom", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2500 "Removed, use the pad filter instead", "size" },
2501 { "padleft", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2502 "Removed, use the pad filter instead", "size" },
2503 { "padright", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2504 "Removed, use the pad filter instead", "size" },
2505 { "padcolor", OPT_VIDEO | HAS_ARG, { .func_arg = opt_pad },
2506 "Removed, use the pad filter instead", "color" },
2507 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
2508 "deprecated use -g 1" },
2509 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(video_disable) },
2511 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2512 "discard threshold", "n" },
2513 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(rc_overrides) },
2514 "rate control override for specific intervals", "override" },
2515 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_codec },
2516 "force video codec ('copy' to copy stream)", "codec" },
2517 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
2519 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
2521 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_timecode },
2522 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
2523 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT, { .off = OFFSET(pass) },
2524 "select the pass number (1 to 3)", "n" },
2525 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(passlogfiles) },
2526 "select two pass log file name prefix", "prefix" },
2527 { "deinterlace", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_deinterlace },
2528 "this option is deprecated, use the yadif filter instead" },
2529 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
2530 "calculate PSNR of compressed frames" },
2531 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2532 "dump video coding statistics to file" },
2533 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2534 "dump video coding statistics to file", "file" },
2535 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_filters },
2536 "video filters", "filter list" },
2537 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(intra_matrices) },
2538 "specify intra matrix coeffs", "matrix" },
2539 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC, { .off = OFFSET(inter_matrices) },
2540 "specify inter matrix coeffs", "matrix" },
2541 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC, { .off = OFFSET(top_field_first) },
2542 "top=1/bottom=0/auto=-1 field first", "" },
2543 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2544 "intra_dc_precision", "precision" },
2545 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new },
2546 "force video tag/fourcc", "fourcc/tag" },
2547 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2548 "show QP histogram" },
2549 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(force_fps) },
2550 "force the selected framerate, disable the best supported framerate selection" },
2551 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_streamid },
2552 "set the value of an outfile streamid", "streamIndex:value" },
2553 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_SPEC,
2554 { .off = OFFSET(forced_key_frames) },
2555 "force key frames at specified timestamps", "timestamps" },
2556 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_bitrate },
2557 "video bitrate (please use -b:v)", "bitrate" },
2560 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_frames },
2561 "set the number of audio frames to record", "number" },
2562 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_qscale },
2563 "set audio quality (codec-specific)", "quality", },
2564 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(audio_sample_rate) },
2565 "set audio sampling rate (in Hz)", "rate" },
2566 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC, { .off = OFFSET(audio_channels) },
2567 "set number of audio channels", "channels" },
2568 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(audio_disable) },
2570 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_codec },
2571 "force audio codec ('copy' to copy stream)", "codec" },
2572 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new },
2573 "force audio tag/fourcc", "fourcc/tag" },
2574 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2575 "change audio volume (256=normal)" , "volume" },
2576 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_STRING, { .off = OFFSET(sample_fmts) },
2577 "set sample format", "format" },
2578 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_channel_layout },
2579 "set channel layout", "layout" },
2580 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_audio_filters },
2581 "audio filters", "filter list" },
2583 /* subtitle options */
2584 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET, { .off = OFFSET(subtitle_disable) },
2585 "disable subtitle" },
2586 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE, { .func_arg = opt_subtitle_codec },
2587 "force subtitle codec ('copy' to copy stream)", "codec" },
2588 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE, { .func_arg = opt_old2new }
2589 , "force subtitle tag/fourcc", "fourcc/tag" },
2590 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC, { .off = OFFSET(fix_sub_duration) },
2591 "fix subtitles duration" },
2594 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
2595 "deprecated, use -channel", "channel" },
2596 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
2597 "deprecated, use -standard", "standard" },
2598 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2601 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(mux_max_delay) },
2602 "set the maximum demux-decode delay", "seconds" },
2603 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, { .off = OFFSET(mux_preload) },
2604 "set the initial demux-decode delay", "seconds" },
2606 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT, { .off = OFFSET(bitstream_filters) },
2607 "A comma-separated list of bitstream filters", "bitstream_filters" },
2608 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_old2new },
2609 "deprecated", "audio bitstream_filters" },
2610 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_old2new },
2611 "deprecated", "video bitstream_filters" },
2613 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2614 "set the audio options to the indicated preset", "preset" },
2615 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2616 "set the video options to the indicated preset", "preset" },
2617 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2618 "set the subtitle options to the indicated preset", "preset" },
2619 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
2620 "set options from indicated preset file", "filename" },
2621 /* data codec support */
2622 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_data_codec },
2623 "force data codec ('copy' to copy stream)", "codec" },
2624 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, { .off = OFFSET(data_disable) },