2 * avconv option parsing
4 * This file is part of Libav.
6 * Libav 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 * Libav 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 Libav; 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 DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
46 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
49 for (i = 0; i < o->nb_ ## name; i++) {\
50 char *spec = o->name[i].specifier;\
51 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
52 outvar = o->name[i].u.type;\
58 const HWAccel hwaccels[] = {
60 { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
63 { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
66 { "vda", vda_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
69 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
72 { "vaapi", vaapi_decode_init, HWACCEL_VAAPI, AV_PIX_FMT_VAAPI },
76 int hwaccel_lax_profile_check = 0;
77 AVBufferRef *hw_device_ctx;
79 char *vstats_filename;
81 float audio_drift_threshold = 0.1;
82 float dts_delta_threshold = 10;
84 int audio_volume = 256;
85 int audio_sync_method = 0;
86 int video_sync_method = VSYNC_AUTO;
92 int exit_on_error = 0;
96 static int file_overwrite = 0;
97 static int file_skip = 0;
98 static int video_discard = 0;
99 static int intra_dc_precision = 8;
100 static int using_stdin = 0;
101 static int input_sync;
103 static void uninit_options(OptionsContext *o)
105 const OptionDef *po = options;
108 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
110 void *dst = (uint8_t*)o + po->u.off;
112 if (po->flags & OPT_SPEC) {
113 SpecifierOpt **so = dst;
114 int i, *count = (int*)(so + 1);
115 for (i = 0; i < *count; i++) {
116 av_freep(&(*so)[i].specifier);
117 if (po->flags & OPT_STRING)
118 av_freep(&(*so)[i].u.str);
122 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
127 for (i = 0; i < o->nb_stream_maps; i++)
128 av_freep(&o->stream_maps[i].linklabel);
129 av_freep(&o->stream_maps);
130 av_freep(&o->meta_data_maps);
131 av_freep(&o->streamid_map);
134 static void init_options(OptionsContext *o)
136 memset(o, 0, sizeof(*o));
138 o->mux_max_delay = 0.7;
139 o->start_time = AV_NOPTS_VALUE;
140 o->recording_time = INT64_MAX;
141 o->limit_filesize = UINT64_MAX;
142 o->chapters_input_file = INT_MAX;
143 o->accurate_seek = 1;
146 /* return a copy of the input with the stream specifiers removed from the keys */
147 static AVDictionary *strip_specifiers(AVDictionary *dict)
149 AVDictionaryEntry *e = NULL;
150 AVDictionary *ret = NULL;
152 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
153 char *p = strchr(e->key, ':');
157 av_dict_set(&ret, e->key, e->value, 0);
164 static double parse_frame_aspect_ratio(const char *arg)
171 p = strchr(arg, ':');
173 x = strtol(arg, &end, 10);
175 y = strtol(end + 1, &end, 10);
177 ar = (double)x / (double)y;
179 ar = strtod(arg, NULL);
182 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
188 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
192 printf("Supported hardware acceleration:\n");
193 for (i = 0; hwaccels[i].name; i++) {
194 printf("%s\n", hwaccels[i].name);
200 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
202 OptionsContext *o = optctx;
203 return parse_option(o, "codec:a", arg, options);
206 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
208 OptionsContext *o = optctx;
209 return parse_option(o, "codec:v", arg, options);
212 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
214 OptionsContext *o = optctx;
215 return parse_option(o, "codec:s", arg, options);
218 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
220 OptionsContext *o = optctx;
221 return parse_option(o, "codec:d", arg, options);
224 static int opt_map(void *optctx, const char *opt, const char *arg)
226 OptionsContext *o = optctx;
228 int i, negative = 0, file_idx;
229 int sync_file_idx = -1, sync_stream_idx;
237 map = av_strdup(arg);
239 return AVERROR(ENOMEM);
241 /* parse sync stream first, just pick first matching stream */
242 if (sync = strchr(map, ',')) {
244 sync_file_idx = strtol(sync + 1, &sync, 0);
245 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
246 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
251 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
252 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
253 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
257 if (i == input_files[sync_file_idx]->nb_streams) {
258 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
259 "match any streams.\n", arg);
266 /* this mapping refers to lavfi output */
267 const char *c = map + 1;
268 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
269 m = &o->stream_maps[o->nb_stream_maps - 1];
270 m->linklabel = av_get_token(&c, "]");
272 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
276 file_idx = strtol(map, &p, 0);
277 if (file_idx >= nb_input_files || file_idx < 0) {
278 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
282 /* disable some already defined maps */
283 for (i = 0; i < o->nb_stream_maps; i++) {
284 m = &o->stream_maps[i];
285 if (file_idx == m->file_index &&
286 check_stream_specifier(input_files[m->file_index]->ctx,
287 input_files[m->file_index]->ctx->streams[m->stream_index],
288 *p == ':' ? p + 1 : p) > 0)
292 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
293 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
294 *p == ':' ? p + 1 : p) <= 0)
296 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
297 m = &o->stream_maps[o->nb_stream_maps - 1];
299 m->file_index = file_idx;
302 if (sync_file_idx >= 0) {
303 m->sync_file_index = sync_file_idx;
304 m->sync_stream_index = sync_stream_idx;
306 m->sync_file_index = file_idx;
307 m->sync_stream_index = i;
313 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
321 static int opt_attach(void *optctx, const char *opt, const char *arg)
323 OptionsContext *o = optctx;
324 GROW_ARRAY(o->attachments, o->nb_attachments);
325 o->attachments[o->nb_attachments - 1] = arg;
330 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
333 err = vaapi_device_init(arg);
341 * Parse a metadata specifier passed as 'arg' parameter.
342 * @param arg metadata string to parse
343 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
344 * @param index for type c/p, chapter/program index is written here
345 * @param stream_spec for type s, the stream specifier is written here
347 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
355 if (*(++arg) && *arg != ':') {
356 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
359 *stream_spec = *arg == ':' ? arg + 1 : "";
364 *index = strtol(++arg, NULL, 0);
367 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
374 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
376 AVDictionary **meta_in = NULL;
377 AVDictionary **meta_out;
379 char type_in, type_out;
380 const char *istream_spec = NULL, *ostream_spec = NULL;
381 int idx_in = 0, idx_out = 0;
383 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
384 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
386 if (type_in == 'g' || type_out == 'g')
387 o->metadata_global_manual = 1;
388 if (type_in == 's' || type_out == 's')
389 o->metadata_streams_manual = 1;
390 if (type_in == 'c' || type_out == 'c')
391 o->metadata_chapters_manual = 1;
393 /* ic is NULL when just disabling automatic mappings */
397 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
398 if ((index) < 0 || (index) >= (nb_elems)) {\
399 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
404 #define SET_DICT(type, meta, context, index)\
407 meta = &context->metadata;\
410 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
411 meta = &context->chapters[index]->metadata;\
414 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
415 meta = &context->programs[index]->metadata;\
418 break; /* handled separately below */ \
419 default: av_assert0(0);\
422 SET_DICT(type_in, meta_in, ic, idx_in);
423 SET_DICT(type_out, meta_out, oc, idx_out);
425 /* for input streams choose first matching stream */
426 if (type_in == 's') {
427 for (i = 0; i < ic->nb_streams; i++) {
428 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
429 meta_in = &ic->streams[i]->metadata;
435 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
440 if (type_out == 's') {
441 for (i = 0; i < oc->nb_streams; i++) {
442 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
443 meta_out = &oc->streams[i]->metadata;
444 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
449 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
454 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
456 const AVCodecDescriptor *desc;
457 const char *codec_string = encoder ? "encoder" : "decoder";
461 avcodec_find_encoder_by_name(name) :
462 avcodec_find_decoder_by_name(name);
464 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
465 codec = encoder ? avcodec_find_encoder(desc->id) :
466 avcodec_find_decoder(desc->id);
468 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
469 codec_string, codec->name, desc->name);
473 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
476 if (codec->type != type) {
477 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
483 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
485 char *codec_name = NULL;
487 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
489 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
490 st->codecpar->codec_id = codec->id;
493 return avcodec_find_decoder(st->codecpar->codec_id);
496 /* Add all the streams from the given input file to the global
497 * list of input streams. */
498 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
502 for (i = 0; i < ic->nb_streams; i++) {
503 AVStream *st = ic->streams[i];
504 AVCodecParameters *par = st->codecpar;
505 InputStream *ist = av_mallocz(sizeof(*ist));
506 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
507 char *hwaccel_output_format = NULL;
508 char *codec_tag = NULL;
514 GROW_ARRAY(input_streams, nb_input_streams);
515 input_streams[nb_input_streams - 1] = ist;
518 ist->file_index = nb_input_files;
520 st->discard = AVDISCARD_ALL;
522 ist->min_pts = INT64_MAX;
523 ist->max_pts = INT64_MIN;
526 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
529 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
531 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
533 uint32_t tag = strtol(codec_tag, &next, 0);
535 tag = AV_RL32(codec_tag);
536 st->codecpar->codec_tag = tag;
539 ist->dec = choose_decoder(o, ic, st);
540 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, par->codec_id, ic, st, ist->dec);
542 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
544 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
548 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
550 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
554 switch (par->codec_type) {
555 case AVMEDIA_TYPE_VIDEO:
556 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
557 if (framerate && av_parse_video_rate(&ist->framerate,
559 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
564 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
566 if (!strcmp(hwaccel, "none"))
567 ist->hwaccel_id = HWACCEL_NONE;
568 else if (!strcmp(hwaccel, "auto"))
569 ist->hwaccel_id = HWACCEL_AUTO;
572 for (i = 0; hwaccels[i].name; i++) {
573 if (!strcmp(hwaccels[i].name, hwaccel)) {
574 ist->hwaccel_id = hwaccels[i].id;
579 if (!ist->hwaccel_id) {
580 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
582 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
583 for (i = 0; hwaccels[i].name; i++)
584 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
585 av_log(NULL, AV_LOG_FATAL, "\n");
591 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
592 if (hwaccel_device) {
593 ist->hwaccel_device = av_strdup(hwaccel_device);
594 if (!ist->hwaccel_device)
598 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
599 hwaccel_output_format, ic, st);
600 if (hwaccel_output_format) {
601 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
602 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
603 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
604 "format: %s", hwaccel_output_format);
607 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
610 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
613 case AVMEDIA_TYPE_AUDIO:
614 guess_input_channel_layout(ist);
616 case AVMEDIA_TYPE_DATA:
617 case AVMEDIA_TYPE_SUBTITLE:
618 case AVMEDIA_TYPE_ATTACHMENT:
619 case AVMEDIA_TYPE_UNKNOWN:
627 static void assert_file_overwrite(const char *filename)
629 if (file_overwrite && file_skip) {
630 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
634 if (!file_overwrite &&
635 (!strchr(filename, ':') || filename[1] == ':' ||
636 av_strstart(filename, "file:", NULL))) {
637 if (avio_check(filename, 0) == 0) {
638 if (!using_stdin && !file_skip) {
639 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
642 fprintf(stderr, "Not overwriting - exiting\n");
647 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
654 static void dump_attachment(AVStream *st, const char *filename)
657 AVIOContext *out = NULL;
658 AVDictionaryEntry *e;
660 if (!st->codecpar->extradata_size) {
661 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
662 nb_input_files - 1, st->index);
665 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
668 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
669 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
673 assert_file_overwrite(filename);
675 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
676 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
681 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
686 static int open_input_file(OptionsContext *o, const char *filename)
690 AVInputFormat *file_iformat = NULL;
695 AVDictionary *unused_opts = NULL;
696 AVDictionaryEntry *e = NULL;
697 int orig_nb_streams; // number of streams before avformat_find_stream_info
700 if (!(file_iformat = av_find_input_format(o->format))) {
701 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
706 if (!strcmp(filename, "-"))
709 using_stdin |= !strncmp(filename, "pipe:", 5) ||
710 !strcmp(filename, "/dev/stdin");
712 /* get default parameters from command line */
713 ic = avformat_alloc_context();
715 print_error(filename, AVERROR(ENOMEM));
718 if (o->nb_audio_sample_rate) {
719 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
720 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
722 if (o->nb_audio_channels) {
723 /* because we set audio_channels based on both the "ac" and
724 * "channel_layout" options, we need to check that the specified
725 * demuxer actually has the "channels" option before setting it */
726 if (file_iformat && file_iformat->priv_class &&
727 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
728 AV_OPT_SEARCH_FAKE_OBJ)) {
729 snprintf(buf, sizeof(buf), "%d",
730 o->audio_channels[o->nb_audio_channels - 1].u.i);
731 av_dict_set(&o->g->format_opts, "channels", buf, 0);
734 if (o->nb_frame_rates) {
735 /* set the format-level framerate option;
736 * this is important for video grabbers, e.g. x11 */
737 if (file_iformat && file_iformat->priv_class &&
738 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
739 AV_OPT_SEARCH_FAKE_OBJ)) {
740 av_dict_set(&o->g->format_opts, "framerate",
741 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
744 if (o->nb_frame_sizes) {
745 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
747 if (o->nb_frame_pix_fmts)
748 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
750 ic->flags |= AVFMT_FLAG_NONBLOCK;
751 ic->interrupt_callback = int_cb;
753 /* open the input file with generic Libav function */
754 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
756 print_error(filename, err);
759 assert_avoptions(o->g->format_opts);
761 /* apply forced codec ids */
762 for (i = 0; i < ic->nb_streams; i++)
763 choose_decoder(o, ic, ic->streams[i]);
765 /* Set AVCodecContext options for avformat_find_stream_info */
766 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
767 orig_nb_streams = ic->nb_streams;
769 /* If not enough info to get the stream parameters, we decode the
770 first frames to get it. (used in mpeg case for example) */
771 ret = avformat_find_stream_info(ic, opts);
773 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
774 avformat_close_input(&ic);
778 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
779 /* add the stream start time */
780 if (ic->start_time != AV_NOPTS_VALUE)
781 timestamp += ic->start_time;
783 /* if seeking requested, we execute it */
784 if (o->start_time != AV_NOPTS_VALUE) {
785 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
787 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
788 filename, (double)timestamp / AV_TIME_BASE);
792 /* update the current parameters so that they match the one of the input stream */
793 add_input_streams(o, ic);
795 /* dump the file content */
796 av_dump_format(ic, nb_input_files, filename, 0);
798 GROW_ARRAY(input_files, nb_input_files);
799 f = av_mallocz(sizeof(*f));
802 input_files[nb_input_files - 1] = f;
805 f->ist_index = nb_input_streams - ic->nb_streams;
806 f->start_time = o->start_time;
807 f->recording_time = o->recording_time;
808 f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
809 f->nb_streams = ic->nb_streams;
810 f->rate_emu = o->rate_emu;
811 f->accurate_seek = o->accurate_seek;
814 f->time_base = (AVRational){ 1, 1 };
816 /* check if all codec options have been used */
817 unused_opts = strip_specifiers(o->g->codec_opts);
818 for (i = f->ist_index; i < nb_input_streams; i++) {
820 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
821 AV_DICT_IGNORE_SUFFIX)))
822 av_dict_set(&unused_opts, e->key, NULL, 0);
826 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
827 const AVClass *class = avcodec_get_class();
828 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
829 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
832 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
833 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
834 "input file #%d (%s) is not a decoding option.\n", e->key,
835 option->help ? option->help : "", nb_input_files - 1,
840 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
841 "input file #%d (%s) has not been used for any stream. The most "
842 "likely reason is either wrong type (e.g. a video option with "
843 "no video streams) or that it is a private option of some decoder "
844 "which was not actually used for any stream.\n", e->key,
845 option->help ? option->help : "", nb_input_files - 1, filename);
847 av_dict_free(&unused_opts);
849 for (i = 0; i < o->nb_dump_attachment; i++) {
852 for (j = 0; j < ic->nb_streams; j++) {
853 AVStream *st = ic->streams[j];
855 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
856 dump_attachment(st, o->dump_attachment[i].u.str);
860 for (i = 0; i < orig_nb_streams; i++)
861 av_dict_free(&opts[i]);
867 static uint8_t *get_line(AVIOContext *s)
873 if (avio_open_dyn_buf(&line) < 0) {
874 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
878 while ((c = avio_r8(s)) && c != '\n')
881 avio_close_dyn_buf(line, &buf);
886 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
890 const char *base[3] = { getenv("AVCONV_DATADIR"),
895 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
899 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
900 i != 1 ? "" : "/.avconv", codec_name, preset_name);
901 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
904 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
905 i != 1 ? "" : "/.avconv", preset_name);
906 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
912 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
914 enum AVMediaType type = ost->st->codecpar->codec_type;
915 char *codec_name = NULL;
917 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
918 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
920 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
921 NULL, ost->st->codecpar->codec_type);
922 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
924 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
925 "output stream #%d:%d. Default encoder for format %s is "
926 "probably disabled. Please choose an encoder manually.\n",
927 ost->file_index, ost->index, s->oformat->name);
928 return AVERROR_ENCODER_NOT_FOUND;
930 } else if (!strcmp(codec_name, "copy"))
931 ost->stream_copy = 1;
933 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
934 ost->st->codecpar->codec_id = ost->enc->id;
937 ost->encoding_needed = !ost->stream_copy;
939 /* no encoding supported for other media types */
940 ost->stream_copy = 1;
941 ost->encoding_needed = 0;
947 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
950 AVStream *st = avformat_new_stream(oc, NULL);
951 int idx = oc->nb_streams - 1, ret = 0;
952 const char *bsfs = NULL;
953 char *next, *codec_tag = NULL;
958 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
962 if (oc->nb_streams - 1 < o->nb_streamid_map)
963 st->id = o->streamid_map[oc->nb_streams - 1];
965 GROW_ARRAY(output_streams, nb_output_streams);
966 if (!(ost = av_mallocz(sizeof(*ost))))
968 output_streams[nb_output_streams - 1] = ost;
970 ost->file_index = nb_output_files - 1;
973 st->codecpar->codec_type = type;
975 ret = choose_encoder(o, oc, ost);
977 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
978 "%d:%d\n", ost->file_index, ost->index);
982 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
984 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
987 ost->enc_ctx->codec_type = type;
990 AVIOContext *s = NULL;
991 char *buf = NULL, *arg = NULL, *preset = NULL;
993 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
995 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
996 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
999 if (!buf[0] || buf[0] == '#') {
1003 if (!(arg = strchr(buf, '='))) {
1004 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1008 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1010 } while (!s->eof_reached);
1014 av_log(NULL, AV_LOG_FATAL,
1015 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1016 preset, ost->file_index, ost->index);
1020 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1023 ost->max_frames = INT64_MAX;
1024 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1026 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1027 while (bsfs && *bsfs) {
1028 const AVBitStreamFilter *filter;
1029 const char *bsf, *bsf_options_str, *bsf_name;
1030 AVDictionary *bsf_options = NULL;
1032 bsf = bsf_options_str = av_get_token(&bsfs, ",");
1035 bsf_name = av_get_token(&bsf_options_str, "=");
1039 filter = av_bsf_get_by_name(bsf_name);
1041 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
1044 if (*bsf_options_str++) {
1045 ret = av_dict_parse_string(&bsf_options, bsf_options_str, "=", ":", 0);
1047 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
1053 ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
1054 ost->nb_bitstream_filters + 1,
1055 sizeof(*ost->bsf_ctx));
1059 ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
1061 av_log(NULL, AV_LOG_ERROR, "Error allocating a bistream filter context\n");
1064 ost->nb_bitstream_filters++;
1067 ret = av_opt_set_dict(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, &bsf_options);
1069 av_log(NULL, AV_LOG_ERROR, "Error setting options for bitstream filter %s\n", bsf_name);
1072 assert_avoptions(bsf_options);
1073 av_dict_free(&bsf_options);
1075 av_freep(&bsf_name);
1081 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1083 uint32_t tag = strtol(codec_tag, &next, 0);
1085 tag = AV_RL32(codec_tag);
1086 ost->enc_ctx->codec_tag = tag;
1089 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1091 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1092 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1095 MATCH_PER_STREAM_OPT(bitrates, i, bitrate, oc, st);
1097 if (ost->stream_copy)
1098 ost->bitrate_override = bitrate;
1100 ost->enc_ctx->bit_rate = bitrate;
1103 ost->max_muxing_queue_size = 128;
1104 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1105 ost->max_muxing_queue_size *= sizeof(AVPacket);
1107 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1108 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1110 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1112 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1114 ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
1115 ost->last_mux_dts = AV_NOPTS_VALUE;
1117 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1118 if (!ost->muxing_queue)
1124 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1127 const char *p = str;
1134 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1141 /* read file contents into a string */
1142 static uint8_t *read_file(const char *filename)
1144 AVIOContext *pb = NULL;
1145 AVIOContext *dyn_buf = NULL;
1146 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1147 uint8_t buf[1024], *str;
1150 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1154 ret = avio_open_dyn_buf(&dyn_buf);
1159 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1160 avio_write(dyn_buf, buf, ret);
1161 avio_w8(dyn_buf, 0);
1164 ret = avio_close_dyn_buf(dyn_buf, &str);
1170 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1173 AVStream *st = ost->st;
1174 char *filter = NULL, *filter_script = NULL;
1176 MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
1177 MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
1179 if (filter_script && filter) {
1180 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1181 "output stream #%d:%d.\n", nb_output_files, st->index);
1186 return read_file(filter_script);
1188 return av_strdup(filter);
1190 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1194 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
1198 AVCodecContext *video_enc;
1199 char *frame_aspect_ratio = NULL;
1201 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
1203 video_enc = ost->enc_ctx;
1205 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1206 if (frame_aspect_ratio)
1207 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
1209 if (!ost->stream_copy) {
1210 const char *p = NULL;
1211 char *frame_rate = NULL, *frame_size = NULL;
1212 char *frame_pix_fmt = NULL;
1213 char *intra_matrix = NULL, *inter_matrix = NULL;
1217 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1218 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1219 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1223 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1224 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1225 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1229 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1230 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1231 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1234 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1236 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1238 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1239 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1242 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1244 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1246 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1247 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1250 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1253 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1254 for (i = 0; p; i++) {
1256 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1258 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1261 video_enc->rc_override =
1262 av_realloc(video_enc->rc_override,
1263 sizeof(RcOverride) * (i + 1));
1264 if (!video_enc->rc_override) {
1265 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1268 video_enc->rc_override[i].start_frame = start;
1269 video_enc->rc_override[i].end_frame = end;
1271 video_enc->rc_override[i].qscale = q;
1272 video_enc->rc_override[i].quality_factor = 1.0;
1275 video_enc->rc_override[i].qscale = 0;
1276 video_enc->rc_override[i].quality_factor = -q/100.0;
1281 video_enc->rc_override_count = i;
1282 video_enc->intra_dc_precision = intra_dc_precision - 8;
1285 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1288 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1290 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1294 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1295 if (ost->logfile_prefix &&
1296 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1300 char logfilename[1024];
1303 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1304 ost->logfile_prefix ? ost->logfile_prefix :
1305 DEFAULT_PASS_LOGFILENAME_PREFIX,
1307 if (!strcmp(ost->enc->name, "libx264")) {
1308 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1310 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1311 f = fopen(logfilename, "wb");
1313 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
1314 logfilename, strerror(errno));
1319 char *logbuffer = read_file(logfilename);
1322 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1326 video_enc->stats_in = logbuffer;
1331 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1332 if (ost->forced_keyframes)
1333 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1335 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1337 ost->top_field_first = -1;
1338 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1341 ost->avfilter = get_ost_filters(o, oc, ost);
1345 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1351 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1355 AVCodecContext *audio_enc;
1357 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1360 audio_enc = ost->enc_ctx;
1361 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1363 if (!ost->stream_copy) {
1364 char *sample_fmt = NULL;
1366 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1368 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1370 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1371 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1375 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1377 ost->avfilter = get_ost_filters(o, oc, ost);
1385 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1389 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1390 if (!ost->stream_copy) {
1391 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1398 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1400 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1401 ost->stream_copy = 1;
1406 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1409 AVCodecContext *subtitle_enc;
1411 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1412 subtitle_enc = ost->enc_ctx;
1414 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1419 /* arg format is "output-stream-index:streamid-value". */
1420 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1422 OptionsContext *o = optctx;
1427 av_strlcpy(idx_str, arg, sizeof(idx_str));
1428 p = strchr(idx_str, ':');
1430 av_log(NULL, AV_LOG_FATAL,
1431 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1436 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1437 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1438 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1442 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1444 AVFormatContext *is = ifile->ctx;
1445 AVFormatContext *os = ofile->ctx;
1449 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1451 return AVERROR(ENOMEM);
1454 for (i = 0; i < is->nb_chapters; i++) {
1455 AVChapter *in_ch = is->chapters[i], *out_ch;
1456 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1457 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1458 AV_TIME_BASE_Q, in_ch->time_base);
1459 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1460 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1463 if (in_ch->end < ts_off)
1465 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1468 out_ch = av_mallocz(sizeof(AVChapter));
1470 return AVERROR(ENOMEM);
1472 out_ch->id = in_ch->id;
1473 out_ch->time_base = in_ch->time_base;
1474 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1475 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1478 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1480 os->chapters[os->nb_chapters++] = out_ch;
1485 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1486 AVFormatContext *oc)
1490 switch (ofilter->type) {
1491 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1492 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1494 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1499 ost->source_index = -1;
1500 ost->filter = ofilter;
1503 ofilter->format = -1;
1505 if (ost->stream_copy) {
1506 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1507 "which is fed from a complex filtergraph. Filtering and streamcopy "
1508 "cannot be used together.\n", ost->file_index, ost->index);
1512 avfilter_inout_free(&ofilter->out_tmp);
1515 static int init_complex_filters(void)
1519 for (i = 0; i < nb_filtergraphs; i++) {
1520 ret = init_complex_filtergraph(filtergraphs[i]);
1527 static int open_output_file(OptionsContext *o, const char *filename)
1529 AVFormatContext *oc;
1531 AVOutputFormat *file_oformat;
1535 AVDictionary *unused_opts = NULL;
1536 AVDictionaryEntry *e = NULL;
1538 GROW_ARRAY(output_files, nb_output_files);
1539 of = av_mallocz(sizeof(*of));
1542 output_files[nb_output_files - 1] = of;
1544 of->ost_index = nb_output_streams;
1545 of->recording_time = o->recording_time;
1546 of->start_time = o->start_time;
1547 of->limit_filesize = o->limit_filesize;
1548 of->shortest = o->shortest;
1549 av_dict_copy(&of->opts, o->g->format_opts, 0);
1551 if (!strcmp(filename, "-"))
1554 oc = avformat_alloc_context();
1556 print_error(filename, AVERROR(ENOMEM));
1560 if (o->recording_time != INT64_MAX)
1561 oc->duration = o->recording_time;
1564 file_oformat = av_guess_format(o->format, NULL, NULL);
1565 if (!file_oformat) {
1566 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1570 file_oformat = av_guess_format(NULL, filename, NULL);
1571 if (!file_oformat) {
1572 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1578 oc->oformat = file_oformat;
1579 oc->interrupt_callback = int_cb;
1580 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1582 /* create streams for all unlabeled output pads */
1583 for (i = 0; i < nb_filtergraphs; i++) {
1584 FilterGraph *fg = filtergraphs[i];
1585 for (j = 0; j < fg->nb_outputs; j++) {
1586 OutputFilter *ofilter = fg->outputs[j];
1588 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1591 switch (ofilter->type) {
1592 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1593 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1594 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1596 init_output_filter(ofilter, o, oc);
1600 if (!o->nb_stream_maps) {
1601 /* pick the "best" stream of each type */
1602 #define NEW_STREAM(type, index)\
1604 ost = new_ ## type ## _stream(o, oc);\
1605 ost->source_index = index;\
1606 ost->sync_ist = input_streams[index];\
1607 input_streams[index]->discard = 0;\
1608 input_streams[index]->st->discard = AVDISCARD_NONE;\
1611 /* video: highest resolution */
1612 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1613 int area = 0, idx = -1;
1614 for (i = 0; i < nb_input_streams; i++) {
1615 ist = input_streams[i];
1616 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
1617 ist->st->codecpar->width * ist->st->codecpar->height > area) {
1618 area = ist->st->codecpar->width * ist->st->codecpar->height;
1622 NEW_STREAM(video, idx);
1625 /* audio: most channels */
1626 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1627 int channels = 0, idx = -1;
1628 for (i = 0; i < nb_input_streams; i++) {
1629 ist = input_streams[i];
1630 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
1631 ist->st->codecpar->channels > channels) {
1632 channels = ist->st->codecpar->channels;
1636 NEW_STREAM(audio, idx);
1639 /* subtitles: pick first */
1640 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1641 for (i = 0; i < nb_input_streams; i++)
1642 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1643 NEW_STREAM(subtitle, i);
1647 /* do something with data? */
1649 for (i = 0; i < o->nb_stream_maps; i++) {
1650 StreamMap *map = &o->stream_maps[i];
1655 if (map->linklabel) {
1657 OutputFilter *ofilter = NULL;
1660 for (j = 0; j < nb_filtergraphs; j++) {
1661 fg = filtergraphs[j];
1662 for (k = 0; k < fg->nb_outputs; k++) {
1663 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1664 if (out && !strcmp(out->name, map->linklabel)) {
1665 ofilter = fg->outputs[k];
1672 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1673 "in any defined filter graph.\n", map->linklabel);
1676 init_output_filter(ofilter, o, oc);
1678 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1679 switch (ist->st->codecpar->codec_type) {
1680 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1681 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1682 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1683 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1684 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1686 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1687 map->file_index, map->stream_index);
1691 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1692 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1693 map->sync_stream_index];
1695 ist->st->discard = AVDISCARD_NONE;
1700 /* handle attached files */
1701 for (i = 0; i < o->nb_attachments; i++) {
1703 uint8_t *attachment;
1707 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1708 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1712 if ((len = avio_size(pb)) <= 0) {
1713 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1717 if (!(attachment = av_malloc(len))) {
1718 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1722 avio_read(pb, attachment, len);
1724 ost = new_attachment_stream(o, oc);
1725 ost->stream_copy = 0;
1726 ost->source_index = -1;
1727 ost->attachment_filename = o->attachments[i];
1728 ost->st->codecpar->extradata = attachment;
1729 ost->st->codecpar->extradata_size = len;
1731 p = strrchr(o->attachments[i], '/');
1732 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1736 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
1737 av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
1738 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
1742 /* check if all codec options have been used */
1743 unused_opts = strip_specifiers(o->g->codec_opts);
1744 for (i = of->ost_index; i < nb_output_streams; i++) {
1746 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
1747 AV_DICT_IGNORE_SUFFIX)))
1748 av_dict_set(&unused_opts, e->key, NULL, 0);
1752 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1753 const AVClass *class = avcodec_get_class();
1754 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1755 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1758 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1759 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1760 "output file #%d (%s) is not an encoding option.\n", e->key,
1761 option->help ? option->help : "", nb_output_files - 1,
1766 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1767 "output file #%d (%s) has not been used for any stream. The most "
1768 "likely reason is either wrong type (e.g. a video option with "
1769 "no video streams) or that it is a private option of some encoder "
1770 "which was not actually used for any stream.\n", e->key,
1771 option->help ? option->help : "", nb_output_files - 1, filename);
1773 av_dict_free(&unused_opts);
1775 /* set the decoding_needed flags and create simple filtergraphs */
1776 for (i = of->ost_index; i < nb_output_streams; i++) {
1777 OutputStream *ost = output_streams[i];
1779 if (ost->encoding_needed && ost->source_index >= 0) {
1780 InputStream *ist = input_streams[ost->source_index];
1781 ist->decoding_needed = 1;
1783 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
1784 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1785 err = init_simple_filtergraph(ist, ost);
1787 av_log(NULL, AV_LOG_ERROR,
1788 "Error initializing a simple filtergraph between streams "
1789 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
1790 nb_output_files - 1, ost->st->index);
1797 * We want CFR output if and only if one of those is true:
1798 * 1) user specified output framerate with -r
1799 * 2) user specified -vsync cfr
1800 * 3) output format is CFR and the user didn't force vsync to
1801 * something else than CFR
1803 * in such a case, set ost->frame_rate
1805 if (ost->encoding_needed && ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1806 int format_cfr = !(oc->oformat->flags & (AVFMT_NOTIMESTAMPS | AVFMT_VARIABLE_FPS));
1807 int need_cfr = !!ost->frame_rate.num;
1809 if (video_sync_method == VSYNC_CFR ||
1810 (video_sync_method == VSYNC_AUTO && format_cfr))
1813 if (need_cfr && !ost->frame_rate.num) {
1814 InputStream *ist = ost->source_index >= 0 ? input_streams[ost->source_index] : NULL;
1816 if (ist && ist->framerate.num)
1817 ost->frame_rate = ist->framerate;
1818 else if (ist && ist->st->avg_frame_rate.num)
1819 ost->frame_rate = ist->st->avg_frame_rate;
1821 av_log(NULL, AV_LOG_WARNING, "Constant framerate requested "
1822 "for the output stream #%d:%d, but no information "
1823 "about the input framerate is available. Falling "
1824 "back to a default value of 25fps. Use the -r option "
1825 "if you want a different framerate.\n",
1826 ost->file_index, ost->index);
1827 ost->frame_rate = (AVRational){ 25, 1 };
1831 if (need_cfr && ost->enc->supported_framerates && !ost->force_fps) {
1832 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
1833 ost->frame_rate = ost->enc->supported_framerates[idx];
1837 /* set the filter output constraints */
1839 OutputFilter *f = ost->filter;
1841 switch (ost->enc_ctx->codec_type) {
1842 case AVMEDIA_TYPE_VIDEO:
1843 f->frame_rate = ost->frame_rate;
1844 f->width = ost->enc_ctx->width;
1845 f->height = ost->enc_ctx->height;
1846 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
1847 f->format = ost->enc_ctx->pix_fmt;
1848 } else if (ost->enc->pix_fmts) {
1850 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
1852 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
1855 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
1858 case AVMEDIA_TYPE_AUDIO:
1859 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
1860 f->format = ost->enc_ctx->sample_fmt;
1861 } else if (ost->enc->sample_fmts) {
1863 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
1865 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
1868 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
1870 if (ost->enc_ctx->sample_rate) {
1871 f->sample_rate = ost->enc_ctx->sample_rate;
1872 } else if (ost->enc->supported_samplerates) {
1874 while (ost->enc->supported_samplerates[count])
1876 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
1877 if (!f->sample_rates)
1879 memcpy(f->sample_rates, ost->enc->supported_samplerates,
1880 (count + 1) * sizeof(*f->sample_rates));
1882 if (ost->enc_ctx->channels) {
1883 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
1884 } else if (ost->enc->channel_layouts) {
1886 while (ost->enc->channel_layouts[count])
1888 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
1889 if (!f->channel_layouts)
1891 memcpy(f->channel_layouts, ost->enc->channel_layouts,
1892 (count + 1) * sizeof(*f->channel_layouts));
1900 /* check filename in case of an image number is expected */
1901 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1902 if (!av_filename_number_test(oc->filename)) {
1903 print_error(oc->filename, AVERROR(EINVAL));
1908 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1909 /* test if it already exists to avoid losing precious files */
1910 assert_file_overwrite(filename);
1913 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1914 &oc->interrupt_callback,
1916 print_error(filename, err);
1921 if (o->mux_preload) {
1923 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1924 av_dict_set(&of->opts, "preload", buf, 0);
1926 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1927 oc->flags |= AVFMT_FLAG_NONBLOCK;
1930 for (i = 0; i < o->nb_metadata_map; i++) {
1932 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1934 if (in_file_index >= nb_input_files) {
1935 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1938 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1939 in_file_index >= 0 ?
1940 input_files[in_file_index]->ctx : NULL, o);
1944 if (o->chapters_input_file >= nb_input_files) {
1945 if (o->chapters_input_file == INT_MAX) {
1946 /* copy chapters from the first input file that has them*/
1947 o->chapters_input_file = -1;
1948 for (i = 0; i < nb_input_files; i++)
1949 if (input_files[i]->ctx->nb_chapters) {
1950 o->chapters_input_file = i;
1954 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1955 o->chapters_input_file);
1959 if (o->chapters_input_file >= 0)
1960 copy_chapters(input_files[o->chapters_input_file], of,
1961 !o->metadata_chapters_manual);
1963 /* copy global metadata by default */
1964 if (!o->metadata_global_manual && nb_input_files)
1965 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1966 AV_DICT_DONT_OVERWRITE);
1967 if (!o->metadata_streams_manual)
1968 for (i = of->ost_index; i < nb_output_streams; i++) {
1970 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1972 ist = input_streams[output_streams[i]->source_index];
1973 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1976 /* process manually set metadata */
1977 for (i = 0; i < o->nb_metadata; i++) {
1980 const char *stream_spec;
1981 int index = 0, j, ret;
1983 val = strchr(o->metadata[i].u.str, '=');
1985 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1986 o->metadata[i].u.str);
1991 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1993 for (j = 0; j < oc->nb_streams; j++) {
1994 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1995 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2006 if (index < 0 || index >= oc->nb_chapters) {
2007 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2010 m = &oc->chapters[index]->metadata;
2013 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2016 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2023 static int opt_target(void *optctx, const char *opt, const char *arg)
2025 OptionsContext *o = optctx;
2026 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2027 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2029 if (!strncmp(arg, "pal-", 4)) {
2032 } else if (!strncmp(arg, "ntsc-", 5)) {
2035 } else if (!strncmp(arg, "film-", 5)) {
2039 /* Try to determine PAL/NTSC by peeking in the input files */
2040 if (nb_input_files) {
2042 for (j = 0; j < nb_input_files; j++) {
2043 for (i = 0; i < input_files[j]->nb_streams; i++) {
2044 AVStream *st = input_files[j]->ctx->streams[i];
2045 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2047 fr = st->time_base.den * 1000 / st->time_base.num;
2051 } else if ((fr == 29970) || (fr == 23976)) {
2056 if (norm != UNKNOWN)
2060 if (norm != UNKNOWN)
2061 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2064 if (norm == UNKNOWN) {
2065 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2066 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2067 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2071 if (!strcmp(arg, "vcd")) {
2072 opt_video_codec(o, "c:v", "mpeg1video");
2073 opt_audio_codec(o, "c:a", "mp2");
2074 parse_option(o, "f", "vcd", options);
2076 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2077 parse_option(o, "r", frame_rates[norm], options);
2078 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2080 opt_default(NULL, "b", "1150000");
2081 opt_default(NULL, "maxrate", "1150000");
2082 opt_default(NULL, "minrate", "1150000");
2083 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
2085 opt_default(NULL, "b:a", "224000");
2086 parse_option(o, "ar", "44100", options);
2087 parse_option(o, "ac", "2", options);
2089 opt_default(NULL, "packetsize", "2324");
2090 opt_default(NULL, "muxrate", "3528"); // 2352 * 75 / 50;
2092 /* We have to offset the PTS, so that it is consistent with the SCR.
2093 SCR starts at 36000, but the first two packs contain only padding
2094 and the first pack from the other stream, respectively, may also have
2095 been written before.
2096 So the real data starts at SCR 36000+3*1200. */
2097 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2098 } else if (!strcmp(arg, "svcd")) {
2100 opt_video_codec(o, "c:v", "mpeg2video");
2101 opt_audio_codec(o, "c:a", "mp2");
2102 parse_option(o, "f", "svcd", options);
2104 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2105 parse_option(o, "r", frame_rates[norm], options);
2106 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2108 opt_default(NULL, "b", "2040000");
2109 opt_default(NULL, "maxrate", "2516000");
2110 opt_default(NULL, "minrate", "0"); // 1145000;
2111 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2112 opt_default(NULL, "scan_offset", "1");
2115 opt_default(NULL, "b:a", "224000");
2116 parse_option(o, "ar", "44100", options);
2118 opt_default(NULL, "packetsize", "2324");
2120 } else if (!strcmp(arg, "dvd")) {
2122 opt_video_codec(o, "c:v", "mpeg2video");
2123 opt_audio_codec(o, "c:a", "ac3");
2124 parse_option(o, "f", "dvd", options);
2126 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2127 parse_option(o, "r", frame_rates[norm], options);
2128 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2130 opt_default(NULL, "b", "6000000");
2131 opt_default(NULL, "maxrate", "9000000");
2132 opt_default(NULL, "minrate", "0"); // 1500000;
2133 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2135 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2136 opt_default(NULL, "muxrate", "25200"); // from mplex project: data_rate = 1260000. mux_rate = data_rate / 50
2138 opt_default(NULL, "b:a", "448000");
2139 parse_option(o, "ar", "48000", options);
2141 } else if (!strncmp(arg, "dv", 2)) {
2143 parse_option(o, "f", "dv", options);
2145 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2146 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2147 norm == PAL ? "yuv420p" : "yuv411p", options);
2148 parse_option(o, "r", frame_rates[norm], options);
2150 parse_option(o, "ar", "48000", options);
2151 parse_option(o, "ac", "2", options);
2154 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2155 return AVERROR(EINVAL);
2158 av_dict_copy(&o->g->codec_opts, codec_opts, 0);
2159 av_dict_copy(&o->g->format_opts, format_opts, 0);
2164 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2166 av_free (vstats_filename);
2167 vstats_filename = av_strdup (arg);
2171 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2174 time_t today2 = time(NULL);
2175 struct tm *today = localtime(&today2);
2177 if (!today) { // maybe tomorrow
2178 av_log(NULL, AV_LOG_FATAL, "Unable to get current time.\n");
2182 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2184 return opt_vstats_file(NULL, opt, filename);
2187 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2189 OptionsContext *o = optctx;
2190 return parse_option(o, "frames:v", arg, options);
2193 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2195 OptionsContext *o = optctx;
2196 return parse_option(o, "frames:a", arg, options);
2199 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2201 OptionsContext *o = optctx;
2202 return parse_option(o, "frames:d", arg, options);
2205 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
2207 OptionsContext *o = optctx;
2208 return parse_option(o, "tag:v", arg, options);
2211 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
2213 OptionsContext *o = optctx;
2214 return parse_option(o, "tag:a", arg, options);
2217 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
2219 OptionsContext *o = optctx;
2220 return parse_option(o, "tag:s", arg, options);
2223 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2225 OptionsContext *o = optctx;
2226 return parse_option(o, "filter:v", arg, options);
2229 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2231 OptionsContext *o = optctx;
2232 return parse_option(o, "filter:a", arg, options);
2235 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2237 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2238 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2239 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2241 if (video_sync_method == VSYNC_AUTO)
2242 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2246 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2248 OptionsContext *o = optctx;
2249 char layout_str[32];
2252 int ret, channels, ac_str_size;
2255 layout = av_get_channel_layout(arg);
2257 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2258 return AVERROR(EINVAL);
2260 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2261 ret = opt_default(NULL, opt, layout_str);
2265 /* set 'ac' option based on channel layout */
2266 channels = av_get_channel_layout_nb_channels(layout);
2267 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2268 stream_str = strchr(opt, ':');
2269 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2270 ac_str = av_mallocz(ac_str_size);
2272 return AVERROR(ENOMEM);
2273 av_strlcpy(ac_str, "ac", 3);
2275 av_strlcat(ac_str, stream_str, ac_str_size);
2276 ret = parse_option(o, ac_str, layout_str, options);
2282 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2284 OptionsContext *o = optctx;
2285 return parse_option(o, "q:a", arg, options);
2288 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2290 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2291 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2292 return AVERROR(ENOMEM);
2293 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2294 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2295 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2296 return AVERROR(ENOMEM);
2300 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2302 uint8_t *graph_desc = read_file(arg);
2304 return AVERROR(EINVAL);
2306 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2307 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2308 return AVERROR(ENOMEM);
2309 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2310 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2314 void show_help_default(const char *opt, const char *arg)
2316 /* per-file options have at least one of those set */
2317 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2318 int show_advanced = 0, show_avoptions = 0;
2321 if (!strcmp(opt, "long"))
2323 else if (!strcmp(opt, "full"))
2324 show_advanced = show_avoptions = 1;
2326 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2331 printf("Getting help:\n"
2332 " -h -- print basic options\n"
2333 " -h long -- print more options\n"
2334 " -h full -- print all options (including all format and codec specific options, very long)\n"
2335 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
2336 " See man %s for detailed description of the options.\n"
2337 "\n", program_name);
2339 show_help_options(options, "Print help / information / capabilities:",
2342 show_help_options(options, "Global options (affect whole program "
2343 "instead of just one file:",
2344 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2346 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2347 per_file | OPT_EXIT, 0);
2349 show_help_options(options, "Per-file main options:", 0,
2350 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2351 OPT_EXIT, per_file);
2353 show_help_options(options, "Advanced per-file options:",
2354 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2356 show_help_options(options, "Video options:",
2357 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2359 show_help_options(options, "Advanced Video options:",
2360 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2362 show_help_options(options, "Audio options:",
2363 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2365 show_help_options(options, "Advanced Audio options:",
2366 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2367 show_help_options(options, "Subtitle options:",
2368 OPT_SUBTITLE, 0, 0);
2371 if (show_avoptions) {
2372 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2373 show_help_children(avcodec_get_class(), flags);
2374 show_help_children(avformat_get_class(), flags);
2375 show_help_children(sws_get_class(), flags);
2376 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM);
2380 void show_usage(void)
2382 printf("Hyper fast Audio and Video encoder\n");
2383 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2392 static const OptionGroupDef groups[] = {
2393 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2394 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2397 static int open_files(OptionGroupList *l, const char *inout,
2398 int (*open_file)(OptionsContext*, const char*))
2402 for (i = 0; i < l->nb_groups; i++) {
2403 OptionGroup *g = &l->groups[i];
2409 ret = parse_optgroup(&o, g);
2411 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2412 "%s.\n", inout, g->arg);
2416 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2417 ret = open_file(&o, g->arg);
2420 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2424 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2430 int avconv_parse_options(int argc, char **argv)
2432 OptionParseContext octx;
2436 memset(&octx, 0, sizeof(octx));
2438 /* split the commandline into an internal representation */
2439 ret = split_commandline(&octx, argc, argv, options, groups,
2440 FF_ARRAY_ELEMS(groups));
2442 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2446 /* apply global options */
2447 ret = parse_optgroup(NULL, &octx.global_opts);
2449 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2453 /* open input files */
2454 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2456 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2460 /* create the complex filtergraphs */
2461 ret = init_complex_filters();
2463 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
2467 /* open output files */
2468 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2470 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2475 uninit_parse_context(&octx);
2477 av_strerror(ret, error, sizeof(error));
2478 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2483 #define OFFSET(x) offsetof(OptionsContext, x)
2484 const OptionDef options[] = {
2486 CMDUTILS_COMMON_OPTIONS
2487 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2488 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2489 "force format", "fmt" },
2490 { "y", OPT_BOOL, { &file_overwrite },
2491 "overwrite output files" },
2492 { "n", OPT_BOOL, { &file_skip },
2493 "never overwrite output files" },
2494 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2495 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2496 "codec name", "codec" },
2497 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2498 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2499 "codec name", "codec" },
2500 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2501 OPT_OUTPUT, { .off = OFFSET(presets) },
2502 "preset name", "preset" },
2503 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2504 OPT_OUTPUT, { .func_arg = opt_map },
2505 "set input stream mapping",
2506 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2507 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2508 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2509 "set metadata information of outfile from infile",
2510 "outfile[,metadata]:infile[,metadata]" },
2511 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2512 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2513 "set chapters mapping", "input_file_index" },
2514 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2515 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2516 "record or transcode \"duration\" seconds of audio/video",
2518 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2519 "set the limit file size in bytes", "limit_size" },
2520 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2521 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2522 "set the start time offset", "time_off" },
2523 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2524 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2525 "enable/disable accurate seeking with -ss" },
2526 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2527 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2528 "set the input ts offset", "time_off" },
2529 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2530 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2531 "set the input ts scale", "scale" },
2532 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2533 "add metadata", "string=string" },
2534 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2535 OPT_OUTPUT, { .func_arg = opt_data_frames },
2536 "set the number of data frames to record", "number" },
2537 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2538 "add timings for benchmarking" },
2539 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2540 "set max runtime in seconds", "limit" },
2541 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2542 "dump each input packet" },
2543 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2544 "when dumping packets, also dump the payload" },
2545 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2546 OPT_INPUT, { .off = OFFSET(rate_emu) },
2547 "read input at native frame rate", "" },
2548 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2549 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2550 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2551 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
2552 "video sync method", "" },
2553 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2554 "audio sync method", "" },
2555 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2556 "audio drift threshold", "threshold" },
2557 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2558 "copy timestamps" },
2559 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2560 "copy input stream time base when stream copying" },
2561 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2562 OPT_OUTPUT, { .off = OFFSET(shortest) },
2563 "finish encoding within shortest input" },
2564 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2565 "timestamp discontinuity delta threshold", "threshold" },
2566 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2567 "exit on error", "error" },
2568 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2569 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2570 "copy initial non-keyframes" },
2571 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2572 "set the number of frames to record", "number" },
2573 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2574 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2575 "force codec tag/fourcc", "fourcc/tag" },
2576 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2577 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2578 "use fixed quality scale (VBR)", "q" },
2579 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2580 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2581 "use fixed quality scale (VBR)", "q" },
2582 { "b", HAS_ARG | OPT_INT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(bitrates) },
2583 "set stream bitrate in bits/second", "bitrate" },
2584 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2585 "set stream filterchain", "filter_list" },
2586 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2587 "read stream filtergraph description from a file", "filename" },
2588 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2589 "create a complex filtergraph", "graph_description" },
2590 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2591 "read complex filtergraph description from a file", "filename" },
2592 { "stats", OPT_BOOL, { &print_stats },
2593 "print progress report during encoding", },
2594 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2595 OPT_OUTPUT, { .func_arg = opt_attach },
2596 "add an attachment to the output file", "filename" },
2597 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2598 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2599 "extract an attachment into a file", "filename" },
2600 { "loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
2601 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
2604 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2605 "set the number of video frames to record", "number" },
2606 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2607 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2608 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2609 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2610 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2611 "set frame size (WxH or abbreviation)", "size" },
2612 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2613 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2614 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2615 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2616 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2617 "set pixel format", "format" },
2618 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2620 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2621 "discard threshold", "n" },
2622 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2623 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2624 "rate control override for specific intervals", "override" },
2625 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2626 OPT_OUTPUT, { .func_arg = opt_video_codec },
2627 "force video codec ('copy' to copy stream)", "codec" },
2628 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2629 "select the pass number (1 or 2)", "n" },
2630 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2631 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2632 "select two pass log file name prefix", "prefix" },
2633 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = &opt_vstats },
2634 "dump video coding statistics to file" },
2635 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
2636 "dump video coding statistics to file", "file" },
2637 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2638 "video filters", "filter list" },
2639 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2640 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2641 "specify intra matrix coeffs", "matrix" },
2642 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2643 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2644 "specify inter matrix coeffs", "matrix" },
2645 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2646 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2647 "top=1/bottom=0/auto=-1 field first", "" },
2648 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2649 "intra_dc_precision", "precision" },
2650 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2651 OPT_OUTPUT, { .func_arg = opt_video_tag },
2652 "force video tag/fourcc", "fourcc/tag" },
2653 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2654 "show QP histogram" },
2655 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2656 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2657 "force the selected framerate, disable the best supported framerate selection" },
2658 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2659 OPT_OUTPUT, { .func_arg = opt_streamid },
2660 "set the value of an outfile streamid", "streamIndex:value" },
2661 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2662 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2663 "force key frames at specified timestamps", "timestamps" },
2664 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2665 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
2666 "use HW accelerated decoding", "hwaccel name" },
2667 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2668 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
2669 "select a device for HW acceleration", "devicename" },
2670 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2671 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
2672 "select output format used with HW accelerated decoding", "format" },
2674 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
2675 "show available HW acceleration methods" },
2676 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
2677 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
2678 "automatically insert correct rotate filters" },
2679 { "hwaccel_lax_profile_check", OPT_BOOL | OPT_EXPERT, { &hwaccel_lax_profile_check},
2680 "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream" },
2683 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2684 "set the number of audio frames to record", "number" },
2685 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2686 "set audio quality (codec-specific)", "quality", },
2687 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2688 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2689 "set audio sampling rate (in Hz)", "rate" },
2690 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2691 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2692 "set number of audio channels", "channels" },
2693 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2695 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2696 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2697 "force audio codec ('copy' to copy stream)", "codec" },
2698 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2699 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2700 "force audio tag/fourcc", "fourcc/tag" },
2701 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2702 "change audio volume (256=normal)" , "volume" },
2703 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2704 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2705 "set sample format", "format" },
2706 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2707 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2708 "set channel layout", "layout" },
2709 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2710 "audio filters", "filter list" },
2712 /* subtitle options */
2713 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2714 "disable subtitle" },
2715 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2716 "force subtitle codec ('copy' to copy stream)", "codec" },
2717 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2718 , "force subtitle tag/fourcc", "fourcc/tag" },
2721 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2724 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2725 "set the maximum demux-decode delay", "seconds" },
2726 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2727 "set the initial demux-decode delay", "seconds" },
2729 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2730 "A comma-separated list of bitstream filters", "bitstream_filters" },
2732 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
2733 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
2735 /* data codec support */
2736 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2737 "force data codec ('copy' to copy stream)", "codec" },
2740 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
2741 "set VAAPI hardware device (DRM path or X11 display name)", "device" },