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", hwaccel_decode_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU,
61 AV_HWDEVICE_TYPE_VDPAU },
64 { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD,
65 AV_HWDEVICE_TYPE_NONE },
68 { "vda", vda_init, HWACCEL_VDA, AV_PIX_FMT_VDA,
69 AV_HWDEVICE_TYPE_NONE },
72 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV,
73 AV_HWDEVICE_TYPE_NONE },
76 { "vaapi", hwaccel_decode_init, HWACCEL_VAAPI, AV_PIX_FMT_VAAPI,
77 AV_HWDEVICE_TYPE_VAAPI },
81 int hwaccel_lax_profile_check = 0;
82 AVBufferRef *hw_device_ctx;
83 HWDevice *filter_hw_device;
85 char *vstats_filename;
87 float audio_drift_threshold = 0.1;
88 float dts_delta_threshold = 10;
90 int audio_volume = 256;
91 int audio_sync_method = 0;
92 int video_sync_method = VSYNC_AUTO;
98 int exit_on_error = 0;
102 static int file_overwrite = 0;
103 static int file_skip = 0;
104 static int video_discard = 0;
105 static int intra_dc_precision = 8;
106 static int using_stdin = 0;
107 static int input_sync;
109 static void uninit_options(OptionsContext *o)
111 const OptionDef *po = options;
114 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
116 void *dst = (uint8_t*)o + po->u.off;
118 if (po->flags & OPT_SPEC) {
119 SpecifierOpt **so = dst;
120 int i, *count = (int*)(so + 1);
121 for (i = 0; i < *count; i++) {
122 av_freep(&(*so)[i].specifier);
123 if (po->flags & OPT_STRING)
124 av_freep(&(*so)[i].u.str);
128 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
133 for (i = 0; i < o->nb_stream_maps; i++)
134 av_freep(&o->stream_maps[i].linklabel);
135 av_freep(&o->stream_maps);
136 av_freep(&o->meta_data_maps);
137 av_freep(&o->streamid_map);
140 static void init_options(OptionsContext *o)
142 memset(o, 0, sizeof(*o));
144 o->mux_max_delay = 0.7;
145 o->start_time = AV_NOPTS_VALUE;
146 o->recording_time = INT64_MAX;
147 o->limit_filesize = UINT64_MAX;
148 o->chapters_input_file = INT_MAX;
149 o->accurate_seek = 1;
152 /* return a copy of the input with the stream specifiers removed from the keys */
153 static AVDictionary *strip_specifiers(AVDictionary *dict)
155 AVDictionaryEntry *e = NULL;
156 AVDictionary *ret = NULL;
158 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
159 char *p = strchr(e->key, ':');
163 av_dict_set(&ret, e->key, e->value, 0);
170 static double parse_frame_aspect_ratio(const char *arg)
177 p = strchr(arg, ':');
179 x = strtol(arg, &end, 10);
181 y = strtol(end + 1, &end, 10);
183 ar = (double)x / (double)y;
185 ar = strtod(arg, NULL);
188 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
194 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
198 printf("Supported hardware acceleration:\n");
199 for (i = 0; hwaccels[i].name; i++) {
200 printf("%s\n", hwaccels[i].name);
206 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
208 OptionsContext *o = optctx;
209 return parse_option(o, "codec:a", arg, options);
212 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
214 OptionsContext *o = optctx;
215 return parse_option(o, "codec:v", arg, options);
218 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
220 OptionsContext *o = optctx;
221 return parse_option(o, "codec:s", arg, options);
224 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
226 OptionsContext *o = optctx;
227 return parse_option(o, "codec:d", arg, options);
230 static int opt_map(void *optctx, const char *opt, const char *arg)
232 OptionsContext *o = optctx;
234 int i, negative = 0, file_idx;
235 int sync_file_idx = -1, sync_stream_idx;
243 map = av_strdup(arg);
245 return AVERROR(ENOMEM);
247 /* parse sync stream first, just pick first matching stream */
248 if (sync = strchr(map, ',')) {
250 sync_file_idx = strtol(sync + 1, &sync, 0);
251 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
252 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
257 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
258 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
259 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
263 if (i == input_files[sync_file_idx]->nb_streams) {
264 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
265 "match any streams.\n", arg);
272 /* this mapping refers to lavfi output */
273 const char *c = map + 1;
274 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
275 m = &o->stream_maps[o->nb_stream_maps - 1];
276 m->linklabel = av_get_token(&c, "]");
278 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
282 file_idx = strtol(map, &p, 0);
283 if (file_idx >= nb_input_files || file_idx < 0) {
284 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
288 /* disable some already defined maps */
289 for (i = 0; i < o->nb_stream_maps; i++) {
290 m = &o->stream_maps[i];
291 if (file_idx == m->file_index &&
292 check_stream_specifier(input_files[m->file_index]->ctx,
293 input_files[m->file_index]->ctx->streams[m->stream_index],
294 *p == ':' ? p + 1 : p) > 0)
298 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
299 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
300 *p == ':' ? p + 1 : p) <= 0)
302 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
303 m = &o->stream_maps[o->nb_stream_maps - 1];
305 m->file_index = file_idx;
308 if (sync_file_idx >= 0) {
309 m->sync_file_index = sync_file_idx;
310 m->sync_stream_index = sync_stream_idx;
312 m->sync_file_index = file_idx;
313 m->sync_stream_index = i;
319 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
327 static int opt_attach(void *optctx, const char *opt, const char *arg)
329 OptionsContext *o = optctx;
330 GROW_ARRAY(o->attachments, o->nb_attachments);
331 o->attachments[o->nb_attachments - 1] = arg;
336 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
339 const char *prefix = "vaapi:";
342 tmp = av_malloc(strlen(prefix) + strlen(arg) + 1);
344 return AVERROR(ENOMEM);
347 err = hw_device_init_from_string(tmp, &dev);
351 hw_device_ctx = av_buffer_ref(dev->device_ref);
353 return AVERROR(ENOMEM);
358 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
360 if (!strcmp(arg, "list")) {
361 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
362 printf("Supported hardware device types:\n");
363 while ((type = av_hwdevice_iterate_types(type)) !=
364 AV_HWDEVICE_TYPE_NONE)
365 printf("%s\n", av_hwdevice_get_type_name(type));
369 return hw_device_init_from_string(arg, NULL);
373 static int opt_filter_hw_device(void *optctx, const char *opt, const char *arg)
375 if (filter_hw_device) {
376 av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
377 return AVERROR(EINVAL);
379 filter_hw_device = hw_device_get_by_name(arg);
380 if (!filter_hw_device) {
381 av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg);
382 return AVERROR(EINVAL);
388 * Parse a metadata specifier passed as 'arg' parameter.
389 * @param arg metadata string to parse
390 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
391 * @param index for type c/p, chapter/program index is written here
392 * @param stream_spec for type s, the stream specifier is written here
394 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
402 if (*(++arg) && *arg != ':') {
403 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
406 *stream_spec = *arg == ':' ? arg + 1 : "";
411 *index = strtol(++arg, NULL, 0);
414 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
421 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
423 AVDictionary **meta_in = NULL;
424 AVDictionary **meta_out;
426 char type_in, type_out;
427 const char *istream_spec = NULL, *ostream_spec = NULL;
428 int idx_in = 0, idx_out = 0;
430 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
431 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
433 if (type_in == 'g' || type_out == 'g')
434 o->metadata_global_manual = 1;
435 if (type_in == 's' || type_out == 's')
436 o->metadata_streams_manual = 1;
437 if (type_in == 'c' || type_out == 'c')
438 o->metadata_chapters_manual = 1;
440 /* ic is NULL when just disabling automatic mappings */
444 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
445 if ((index) < 0 || (index) >= (nb_elems)) {\
446 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
451 #define SET_DICT(type, meta, context, index)\
454 meta = &context->metadata;\
457 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
458 meta = &context->chapters[index]->metadata;\
461 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
462 meta = &context->programs[index]->metadata;\
465 break; /* handled separately below */ \
466 default: av_assert0(0);\
469 SET_DICT(type_in, meta_in, ic, idx_in);
470 SET_DICT(type_out, meta_out, oc, idx_out);
472 /* for input streams choose first matching stream */
473 if (type_in == 's') {
474 for (i = 0; i < ic->nb_streams; i++) {
475 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
476 meta_in = &ic->streams[i]->metadata;
482 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
487 if (type_out == 's') {
488 for (i = 0; i < oc->nb_streams; i++) {
489 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
490 meta_out = &oc->streams[i]->metadata;
491 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
496 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
501 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
503 const AVCodecDescriptor *desc;
504 const char *codec_string = encoder ? "encoder" : "decoder";
508 avcodec_find_encoder_by_name(name) :
509 avcodec_find_decoder_by_name(name);
511 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
512 codec = encoder ? avcodec_find_encoder(desc->id) :
513 avcodec_find_decoder(desc->id);
515 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
516 codec_string, codec->name, desc->name);
520 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
523 if (codec->type != type) {
524 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
530 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
532 char *codec_name = NULL;
534 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
536 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
537 st->codecpar->codec_id = codec->id;
540 return avcodec_find_decoder(st->codecpar->codec_id);
543 /* Add all the streams from the given input file to the global
544 * list of input streams. */
545 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
549 for (i = 0; i < ic->nb_streams; i++) {
550 AVStream *st = ic->streams[i];
551 AVCodecParameters *par = st->codecpar;
552 InputStream *ist = av_mallocz(sizeof(*ist));
553 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
554 char *hwaccel_output_format = NULL;
555 char *codec_tag = NULL;
561 GROW_ARRAY(input_streams, nb_input_streams);
562 input_streams[nb_input_streams - 1] = ist;
565 ist->file_index = nb_input_files;
567 st->discard = AVDISCARD_ALL;
569 ist->min_pts = INT64_MAX;
570 ist->max_pts = INT64_MIN;
573 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
576 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
578 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
580 uint32_t tag = strtol(codec_tag, &next, 0);
582 tag = AV_RL32(codec_tag);
583 st->codecpar->codec_tag = tag;
586 ist->dec = choose_decoder(o, ic, st);
587 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, par->codec_id, ic, st, ist->dec);
589 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
591 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
595 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
597 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
601 switch (par->codec_type) {
602 case AVMEDIA_TYPE_VIDEO:
603 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
604 if (framerate && av_parse_video_rate(&ist->framerate,
606 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
611 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
613 if (!strcmp(hwaccel, "none"))
614 ist->hwaccel_id = HWACCEL_NONE;
615 else if (!strcmp(hwaccel, "auto"))
616 ist->hwaccel_id = HWACCEL_AUTO;
619 for (i = 0; hwaccels[i].name; i++) {
620 if (!strcmp(hwaccels[i].name, hwaccel)) {
621 ist->hwaccel_id = hwaccels[i].id;
626 if (!ist->hwaccel_id) {
627 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
629 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
630 for (i = 0; hwaccels[i].name; i++)
631 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
632 av_log(NULL, AV_LOG_FATAL, "\n");
638 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
639 if (hwaccel_device) {
640 ist->hwaccel_device = av_strdup(hwaccel_device);
641 if (!ist->hwaccel_device)
645 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
646 hwaccel_output_format, ic, st);
647 if (hwaccel_output_format) {
648 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
649 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
650 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
651 "format: %s", hwaccel_output_format);
654 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
657 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
660 case AVMEDIA_TYPE_AUDIO:
661 guess_input_channel_layout(ist);
663 case AVMEDIA_TYPE_DATA:
664 case AVMEDIA_TYPE_SUBTITLE:
665 case AVMEDIA_TYPE_ATTACHMENT:
666 case AVMEDIA_TYPE_UNKNOWN:
674 static void assert_file_overwrite(const char *filename)
676 if (file_overwrite && file_skip) {
677 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
681 if (!file_overwrite &&
682 (!strchr(filename, ':') || filename[1] == ':' ||
683 av_strstart(filename, "file:", NULL))) {
684 if (avio_check(filename, 0) == 0) {
685 if (!using_stdin && !file_skip) {
686 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
689 fprintf(stderr, "Not overwriting - exiting\n");
694 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
701 static void dump_attachment(AVStream *st, const char *filename)
704 AVIOContext *out = NULL;
705 AVDictionaryEntry *e;
707 if (!st->codecpar->extradata_size) {
708 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
709 nb_input_files - 1, st->index);
712 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
715 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
716 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
720 assert_file_overwrite(filename);
722 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
723 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
728 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
733 static int open_input_file(OptionsContext *o, const char *filename)
737 AVInputFormat *file_iformat = NULL;
742 AVDictionary *unused_opts = NULL;
743 AVDictionaryEntry *e = NULL;
744 int orig_nb_streams; // number of streams before avformat_find_stream_info
747 if (!(file_iformat = av_find_input_format(o->format))) {
748 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
753 if (!strcmp(filename, "-"))
756 using_stdin |= !strncmp(filename, "pipe:", 5) ||
757 !strcmp(filename, "/dev/stdin");
759 /* get default parameters from command line */
760 ic = avformat_alloc_context();
762 print_error(filename, AVERROR(ENOMEM));
765 if (o->nb_audio_sample_rate) {
766 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
767 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
769 if (o->nb_audio_channels) {
770 /* because we set audio_channels based on both the "ac" and
771 * "channel_layout" options, we need to check that the specified
772 * demuxer actually has the "channels" option before setting it */
773 if (file_iformat && file_iformat->priv_class &&
774 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
775 AV_OPT_SEARCH_FAKE_OBJ)) {
776 snprintf(buf, sizeof(buf), "%d",
777 o->audio_channels[o->nb_audio_channels - 1].u.i);
778 av_dict_set(&o->g->format_opts, "channels", buf, 0);
781 if (o->nb_frame_rates) {
782 /* set the format-level framerate option;
783 * this is important for video grabbers, e.g. x11 */
784 if (file_iformat && file_iformat->priv_class &&
785 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
786 AV_OPT_SEARCH_FAKE_OBJ)) {
787 av_dict_set(&o->g->format_opts, "framerate",
788 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
791 if (o->nb_frame_sizes) {
792 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
794 if (o->nb_frame_pix_fmts)
795 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
797 ic->flags |= AVFMT_FLAG_NONBLOCK;
798 ic->interrupt_callback = int_cb;
800 /* open the input file with generic Libav function */
801 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
803 print_error(filename, err);
806 assert_avoptions(o->g->format_opts);
808 /* apply forced codec ids */
809 for (i = 0; i < ic->nb_streams; i++)
810 choose_decoder(o, ic, ic->streams[i]);
812 /* Set AVCodecContext options for avformat_find_stream_info */
813 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
814 orig_nb_streams = ic->nb_streams;
816 /* If not enough info to get the stream parameters, we decode the
817 first frames to get it. (used in mpeg case for example) */
818 ret = avformat_find_stream_info(ic, opts);
820 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
821 avformat_close_input(&ic);
825 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
826 /* add the stream start time */
827 if (ic->start_time != AV_NOPTS_VALUE)
828 timestamp += ic->start_time;
830 /* if seeking requested, we execute it */
831 if (o->start_time != AV_NOPTS_VALUE) {
832 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
834 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
835 filename, (double)timestamp / AV_TIME_BASE);
839 /* update the current parameters so that they match the one of the input stream */
840 add_input_streams(o, ic);
842 /* dump the file content */
843 av_dump_format(ic, nb_input_files, filename, 0);
845 GROW_ARRAY(input_files, nb_input_files);
846 f = av_mallocz(sizeof(*f));
849 input_files[nb_input_files - 1] = f;
852 f->ist_index = nb_input_streams - ic->nb_streams;
853 f->start_time = o->start_time;
854 f->recording_time = o->recording_time;
855 f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
856 f->nb_streams = ic->nb_streams;
857 f->rate_emu = o->rate_emu;
858 f->accurate_seek = o->accurate_seek;
861 f->time_base = (AVRational){ 1, 1 };
863 /* check if all codec options have been used */
864 unused_opts = strip_specifiers(o->g->codec_opts);
865 for (i = f->ist_index; i < nb_input_streams; i++) {
867 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
868 AV_DICT_IGNORE_SUFFIX)))
869 av_dict_set(&unused_opts, e->key, NULL, 0);
873 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
874 const AVClass *class = avcodec_get_class();
875 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
876 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
879 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
880 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
881 "input file #%d (%s) is not a decoding option.\n", e->key,
882 option->help ? option->help : "", nb_input_files - 1,
887 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
888 "input file #%d (%s) has not been used for any stream. The most "
889 "likely reason is either wrong type (e.g. a video option with "
890 "no video streams) or that it is a private option of some decoder "
891 "which was not actually used for any stream.\n", e->key,
892 option->help ? option->help : "", nb_input_files - 1, filename);
894 av_dict_free(&unused_opts);
896 for (i = 0; i < o->nb_dump_attachment; i++) {
899 for (j = 0; j < ic->nb_streams; j++) {
900 AVStream *st = ic->streams[j];
902 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
903 dump_attachment(st, o->dump_attachment[i].u.str);
907 for (i = 0; i < orig_nb_streams; i++)
908 av_dict_free(&opts[i]);
914 static uint8_t *get_line(AVIOContext *s)
920 if (avio_open_dyn_buf(&line) < 0) {
921 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
925 while ((c = avio_r8(s)) && c != '\n')
928 avio_close_dyn_buf(line, &buf);
933 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
937 const char *base[3] = { getenv("AVCONV_DATADIR"),
942 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
946 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
947 i != 1 ? "" : "/.avconv", codec_name, preset_name);
948 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
951 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
952 i != 1 ? "" : "/.avconv", preset_name);
953 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
959 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
961 enum AVMediaType type = ost->st->codecpar->codec_type;
962 char *codec_name = NULL;
964 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
965 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
967 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
968 NULL, ost->st->codecpar->codec_type);
969 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
971 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
972 "output stream #%d:%d. Default encoder for format %s is "
973 "probably disabled. Please choose an encoder manually.\n",
974 ost->file_index, ost->index, s->oformat->name);
975 return AVERROR_ENCODER_NOT_FOUND;
977 } else if (!strcmp(codec_name, "copy"))
978 ost->stream_copy = 1;
980 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
981 ost->st->codecpar->codec_id = ost->enc->id;
984 ost->encoding_needed = !ost->stream_copy;
986 /* no encoding supported for other media types */
987 ost->stream_copy = 1;
988 ost->encoding_needed = 0;
994 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
997 AVStream *st = avformat_new_stream(oc, NULL);
998 int idx = oc->nb_streams - 1, ret = 0;
999 const char *bsfs = NULL;
1000 char *next, *codec_tag = NULL;
1005 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1009 if (oc->nb_streams - 1 < o->nb_streamid_map)
1010 st->id = o->streamid_map[oc->nb_streams - 1];
1012 GROW_ARRAY(output_streams, nb_output_streams);
1013 if (!(ost = av_mallocz(sizeof(*ost))))
1015 output_streams[nb_output_streams - 1] = ost;
1017 ost->file_index = nb_output_files - 1;
1020 st->codecpar->codec_type = type;
1022 ret = choose_encoder(o, oc, ost);
1024 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1025 "%d:%d\n", ost->file_index, ost->index);
1029 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1030 if (!ost->enc_ctx) {
1031 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1034 ost->enc_ctx->codec_type = type;
1037 AVIOContext *s = NULL;
1038 char *buf = NULL, *arg = NULL, *preset = NULL;
1040 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1042 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1043 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1046 if (!buf[0] || buf[0] == '#') {
1050 if (!(arg = strchr(buf, '='))) {
1051 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1055 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1057 } while (!s->eof_reached);
1061 av_log(NULL, AV_LOG_FATAL,
1062 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1063 preset, ost->file_index, ost->index);
1067 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1070 ost->max_frames = INT64_MAX;
1071 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1073 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1074 while (bsfs && *bsfs) {
1075 const AVBitStreamFilter *filter;
1076 const char *bsf, *bsf_options_str, *bsf_name;
1077 AVDictionary *bsf_options = NULL;
1079 bsf = bsf_options_str = av_get_token(&bsfs, ",");
1082 bsf_name = av_get_token(&bsf_options_str, "=");
1086 filter = av_bsf_get_by_name(bsf_name);
1088 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
1091 if (*bsf_options_str++) {
1092 ret = av_dict_parse_string(&bsf_options, bsf_options_str, "=", ":", 0);
1094 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
1100 ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
1101 ost->nb_bitstream_filters + 1,
1102 sizeof(*ost->bsf_ctx));
1106 ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
1108 av_log(NULL, AV_LOG_ERROR, "Error allocating a bistream filter context\n");
1111 ost->nb_bitstream_filters++;
1114 ret = av_opt_set_dict(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, &bsf_options);
1116 av_log(NULL, AV_LOG_ERROR, "Error setting options for bitstream filter %s\n", bsf_name);
1119 assert_avoptions(bsf_options);
1120 av_dict_free(&bsf_options);
1122 av_freep(&bsf_name);
1128 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1130 uint32_t tag = strtol(codec_tag, &next, 0);
1132 tag = AV_RL32(codec_tag);
1133 ost->enc_ctx->codec_tag = tag;
1136 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1138 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1139 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1142 MATCH_PER_STREAM_OPT(bitrates, i, bitrate, oc, st);
1144 if (ost->stream_copy)
1145 ost->bitrate_override = bitrate;
1147 ost->enc_ctx->bit_rate = bitrate;
1150 ost->max_muxing_queue_size = 128;
1151 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1152 ost->max_muxing_queue_size *= sizeof(AVPacket);
1154 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1155 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1157 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1159 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1161 ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
1162 ost->last_mux_dts = AV_NOPTS_VALUE;
1164 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1165 if (!ost->muxing_queue)
1171 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1174 const char *p = str;
1181 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1188 /* read file contents into a string */
1189 static uint8_t *read_file(const char *filename)
1191 AVIOContext *pb = NULL;
1192 AVIOContext *dyn_buf = NULL;
1193 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1194 uint8_t buf[1024], *str;
1197 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1201 ret = avio_open_dyn_buf(&dyn_buf);
1206 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1207 avio_write(dyn_buf, buf, ret);
1208 avio_w8(dyn_buf, 0);
1211 ret = avio_close_dyn_buf(dyn_buf, &str);
1217 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1220 AVStream *st = ost->st;
1221 char *filter = NULL, *filter_script = NULL;
1223 MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
1224 MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
1226 if (filter_script && filter) {
1227 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1228 "output stream #%d:%d.\n", nb_output_files, st->index);
1233 return read_file(filter_script);
1235 return av_strdup(filter);
1237 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1241 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
1245 AVCodecContext *video_enc;
1246 char *frame_aspect_ratio = NULL;
1248 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
1250 video_enc = ost->enc_ctx;
1252 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1253 if (frame_aspect_ratio)
1254 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
1256 if (!ost->stream_copy) {
1257 const char *p = NULL;
1258 char *frame_rate = NULL, *frame_size = NULL;
1259 char *frame_pix_fmt = NULL;
1260 char *intra_matrix = NULL, *inter_matrix = NULL;
1264 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1265 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1266 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1270 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1271 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1272 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1276 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1277 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1278 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1281 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1283 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1285 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1286 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1289 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1291 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1293 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1294 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1297 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1300 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1301 for (i = 0; p; i++) {
1303 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1305 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1308 video_enc->rc_override =
1309 av_realloc(video_enc->rc_override,
1310 sizeof(RcOverride) * (i + 1));
1311 if (!video_enc->rc_override) {
1312 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1315 video_enc->rc_override[i].start_frame = start;
1316 video_enc->rc_override[i].end_frame = end;
1318 video_enc->rc_override[i].qscale = q;
1319 video_enc->rc_override[i].quality_factor = 1.0;
1322 video_enc->rc_override[i].qscale = 0;
1323 video_enc->rc_override[i].quality_factor = -q/100.0;
1328 video_enc->rc_override_count = i;
1329 video_enc->intra_dc_precision = intra_dc_precision - 8;
1332 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1335 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1337 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1341 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1342 if (ost->logfile_prefix &&
1343 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1347 char logfilename[1024];
1350 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1351 ost->logfile_prefix ? ost->logfile_prefix :
1352 DEFAULT_PASS_LOGFILENAME_PREFIX,
1354 if (!strcmp(ost->enc->name, "libx264")) {
1355 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1357 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1358 f = fopen(logfilename, "wb");
1360 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
1361 logfilename, strerror(errno));
1366 char *logbuffer = read_file(logfilename);
1369 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1373 video_enc->stats_in = logbuffer;
1378 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1379 if (ost->forced_keyframes)
1380 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1382 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1384 ost->top_field_first = -1;
1385 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1388 ost->avfilter = get_ost_filters(o, oc, ost);
1392 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1398 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1402 AVCodecContext *audio_enc;
1404 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1407 audio_enc = ost->enc_ctx;
1408 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1410 if (!ost->stream_copy) {
1411 char *sample_fmt = NULL;
1413 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1415 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1417 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1418 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1422 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1424 ost->avfilter = get_ost_filters(o, oc, ost);
1432 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1436 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1437 if (!ost->stream_copy) {
1438 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1445 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1447 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1448 ost->stream_copy = 1;
1453 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1456 AVCodecContext *subtitle_enc;
1458 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1459 subtitle_enc = ost->enc_ctx;
1461 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1466 /* arg format is "output-stream-index:streamid-value". */
1467 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1469 OptionsContext *o = optctx;
1474 av_strlcpy(idx_str, arg, sizeof(idx_str));
1475 p = strchr(idx_str, ':');
1477 av_log(NULL, AV_LOG_FATAL,
1478 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1483 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1484 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1485 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1489 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1491 AVFormatContext *is = ifile->ctx;
1492 AVFormatContext *os = ofile->ctx;
1496 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1498 return AVERROR(ENOMEM);
1501 for (i = 0; i < is->nb_chapters; i++) {
1502 AVChapter *in_ch = is->chapters[i], *out_ch;
1503 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1504 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1505 AV_TIME_BASE_Q, in_ch->time_base);
1506 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1507 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1510 if (in_ch->end < ts_off)
1512 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1515 out_ch = av_mallocz(sizeof(AVChapter));
1517 return AVERROR(ENOMEM);
1519 out_ch->id = in_ch->id;
1520 out_ch->time_base = in_ch->time_base;
1521 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1522 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1525 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1527 os->chapters[os->nb_chapters++] = out_ch;
1532 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1533 AVFormatContext *oc)
1537 switch (ofilter->type) {
1538 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1539 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1541 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1546 ost->source_index = -1;
1547 ost->filter = ofilter;
1550 ofilter->format = -1;
1552 if (ost->stream_copy) {
1553 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1554 "which is fed from a complex filtergraph. Filtering and streamcopy "
1555 "cannot be used together.\n", ost->file_index, ost->index);
1559 avfilter_inout_free(&ofilter->out_tmp);
1562 static int init_complex_filters(void)
1566 for (i = 0; i < nb_filtergraphs; i++) {
1567 ret = init_complex_filtergraph(filtergraphs[i]);
1574 static int open_output_file(OptionsContext *o, const char *filename)
1576 AVFormatContext *oc;
1578 AVOutputFormat *file_oformat;
1582 AVDictionary *unused_opts = NULL;
1583 AVDictionaryEntry *e = NULL;
1585 GROW_ARRAY(output_files, nb_output_files);
1586 of = av_mallocz(sizeof(*of));
1589 output_files[nb_output_files - 1] = of;
1591 of->ost_index = nb_output_streams;
1592 of->recording_time = o->recording_time;
1593 of->start_time = o->start_time;
1594 of->limit_filesize = o->limit_filesize;
1595 of->shortest = o->shortest;
1596 av_dict_copy(&of->opts, o->g->format_opts, 0);
1598 if (!strcmp(filename, "-"))
1601 oc = avformat_alloc_context();
1603 print_error(filename, AVERROR(ENOMEM));
1607 if (o->recording_time != INT64_MAX)
1608 oc->duration = o->recording_time;
1611 file_oformat = av_guess_format(o->format, NULL, NULL);
1612 if (!file_oformat) {
1613 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1617 file_oformat = av_guess_format(NULL, filename, NULL);
1618 if (!file_oformat) {
1619 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1625 oc->oformat = file_oformat;
1626 oc->interrupt_callback = int_cb;
1627 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1629 /* create streams for all unlabeled output pads */
1630 for (i = 0; i < nb_filtergraphs; i++) {
1631 FilterGraph *fg = filtergraphs[i];
1632 for (j = 0; j < fg->nb_outputs; j++) {
1633 OutputFilter *ofilter = fg->outputs[j];
1635 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1638 switch (ofilter->type) {
1639 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1640 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1641 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1643 init_output_filter(ofilter, o, oc);
1647 if (!o->nb_stream_maps) {
1648 /* pick the "best" stream of each type */
1649 #define NEW_STREAM(type, index)\
1651 ost = new_ ## type ## _stream(o, oc);\
1652 ost->source_index = index;\
1653 ost->sync_ist = input_streams[index];\
1654 input_streams[index]->discard = 0;\
1655 input_streams[index]->st->discard = AVDISCARD_NONE;\
1658 /* video: highest resolution */
1659 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1660 int area = 0, idx = -1;
1661 for (i = 0; i < nb_input_streams; i++) {
1662 ist = input_streams[i];
1663 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
1664 ist->st->codecpar->width * ist->st->codecpar->height > area) {
1665 area = ist->st->codecpar->width * ist->st->codecpar->height;
1669 NEW_STREAM(video, idx);
1672 /* audio: most channels */
1673 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1674 int channels = 0, idx = -1;
1675 for (i = 0; i < nb_input_streams; i++) {
1676 ist = input_streams[i];
1677 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
1678 ist->st->codecpar->channels > channels) {
1679 channels = ist->st->codecpar->channels;
1683 NEW_STREAM(audio, idx);
1686 /* subtitles: pick first */
1687 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1688 for (i = 0; i < nb_input_streams; i++)
1689 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1690 NEW_STREAM(subtitle, i);
1694 /* do something with data? */
1696 for (i = 0; i < o->nb_stream_maps; i++) {
1697 StreamMap *map = &o->stream_maps[i];
1702 if (map->linklabel) {
1704 OutputFilter *ofilter = NULL;
1707 for (j = 0; j < nb_filtergraphs; j++) {
1708 fg = filtergraphs[j];
1709 for (k = 0; k < fg->nb_outputs; k++) {
1710 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1711 if (out && !strcmp(out->name, map->linklabel)) {
1712 ofilter = fg->outputs[k];
1719 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1720 "in any defined filter graph.\n", map->linklabel);
1723 init_output_filter(ofilter, o, oc);
1725 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1726 switch (ist->st->codecpar->codec_type) {
1727 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1728 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1729 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1730 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1731 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1733 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1734 map->file_index, map->stream_index);
1738 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1739 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1740 map->sync_stream_index];
1742 ist->st->discard = AVDISCARD_NONE;
1747 /* handle attached files */
1748 for (i = 0; i < o->nb_attachments; i++) {
1750 uint8_t *attachment;
1754 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1755 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1759 if ((len = avio_size(pb)) <= 0) {
1760 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1764 if (!(attachment = av_malloc(len))) {
1765 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1769 avio_read(pb, attachment, len);
1771 ost = new_attachment_stream(o, oc);
1772 ost->stream_copy = 0;
1773 ost->source_index = -1;
1774 ost->attachment_filename = o->attachments[i];
1775 ost->st->codecpar->extradata = attachment;
1776 ost->st->codecpar->extradata_size = len;
1778 p = strrchr(o->attachments[i], '/');
1779 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1783 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
1784 av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
1785 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
1789 /* check if all codec options have been used */
1790 unused_opts = strip_specifiers(o->g->codec_opts);
1791 for (i = of->ost_index; i < nb_output_streams; i++) {
1793 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
1794 AV_DICT_IGNORE_SUFFIX)))
1795 av_dict_set(&unused_opts, e->key, NULL, 0);
1799 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1800 const AVClass *class = avcodec_get_class();
1801 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1802 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1805 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1806 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1807 "output file #%d (%s) is not an encoding option.\n", e->key,
1808 option->help ? option->help : "", nb_output_files - 1,
1813 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1814 "output file #%d (%s) has not been used for any stream. The most "
1815 "likely reason is either wrong type (e.g. a video option with "
1816 "no video streams) or that it is a private option of some encoder "
1817 "which was not actually used for any stream.\n", e->key,
1818 option->help ? option->help : "", nb_output_files - 1, filename);
1820 av_dict_free(&unused_opts);
1822 /* set the decoding_needed flags and create simple filtergraphs */
1823 for (i = of->ost_index; i < nb_output_streams; i++) {
1824 OutputStream *ost = output_streams[i];
1826 if (ost->encoding_needed && ost->source_index >= 0) {
1827 InputStream *ist = input_streams[ost->source_index];
1828 ist->decoding_needed = 1;
1830 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
1831 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1832 err = init_simple_filtergraph(ist, ost);
1834 av_log(NULL, AV_LOG_ERROR,
1835 "Error initializing a simple filtergraph between streams "
1836 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
1837 nb_output_files - 1, ost->st->index);
1844 * We want CFR output if and only if one of those is true:
1845 * 1) user specified output framerate with -r
1846 * 2) user specified -vsync cfr
1847 * 3) output format is CFR and the user didn't force vsync to
1848 * something else than CFR
1850 * in such a case, set ost->frame_rate
1852 if (ost->encoding_needed && ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1853 int format_cfr = !(oc->oformat->flags & (AVFMT_NOTIMESTAMPS | AVFMT_VARIABLE_FPS));
1854 int need_cfr = !!ost->frame_rate.num;
1856 if (video_sync_method == VSYNC_CFR ||
1857 (video_sync_method == VSYNC_AUTO && format_cfr))
1860 if (need_cfr && !ost->frame_rate.num) {
1861 InputStream *ist = ost->source_index >= 0 ? input_streams[ost->source_index] : NULL;
1863 if (ist && ist->framerate.num)
1864 ost->frame_rate = ist->framerate;
1865 else if (ist && ist->st->avg_frame_rate.num)
1866 ost->frame_rate = ist->st->avg_frame_rate;
1868 av_log(NULL, AV_LOG_WARNING, "Constant framerate requested "
1869 "for the output stream #%d:%d, but no information "
1870 "about the input framerate is available. Falling "
1871 "back to a default value of 25fps. Use the -r option "
1872 "if you want a different framerate.\n",
1873 ost->file_index, ost->index);
1874 ost->frame_rate = (AVRational){ 25, 1 };
1878 if (need_cfr && ost->enc->supported_framerates && !ost->force_fps) {
1879 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
1880 ost->frame_rate = ost->enc->supported_framerates[idx];
1884 /* set the filter output constraints */
1886 OutputFilter *f = ost->filter;
1888 switch (ost->enc_ctx->codec_type) {
1889 case AVMEDIA_TYPE_VIDEO:
1890 f->frame_rate = ost->frame_rate;
1891 f->width = ost->enc_ctx->width;
1892 f->height = ost->enc_ctx->height;
1893 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
1894 f->format = ost->enc_ctx->pix_fmt;
1895 } else if (ost->enc->pix_fmts) {
1897 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
1899 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
1902 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
1905 case AVMEDIA_TYPE_AUDIO:
1906 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
1907 f->format = ost->enc_ctx->sample_fmt;
1908 } else if (ost->enc->sample_fmts) {
1910 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
1912 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
1915 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
1917 if (ost->enc_ctx->sample_rate) {
1918 f->sample_rate = ost->enc_ctx->sample_rate;
1919 } else if (ost->enc->supported_samplerates) {
1921 while (ost->enc->supported_samplerates[count])
1923 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
1924 if (!f->sample_rates)
1926 memcpy(f->sample_rates, ost->enc->supported_samplerates,
1927 (count + 1) * sizeof(*f->sample_rates));
1929 if (ost->enc_ctx->channels) {
1930 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
1931 } else if (ost->enc->channel_layouts) {
1933 while (ost->enc->channel_layouts[count])
1935 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
1936 if (!f->channel_layouts)
1938 memcpy(f->channel_layouts, ost->enc->channel_layouts,
1939 (count + 1) * sizeof(*f->channel_layouts));
1947 /* check filename in case of an image number is expected */
1948 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1949 if (!av_filename_number_test(oc->filename)) {
1950 print_error(oc->filename, AVERROR(EINVAL));
1955 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1956 /* test if it already exists to avoid losing precious files */
1957 assert_file_overwrite(filename);
1960 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1961 &oc->interrupt_callback,
1963 print_error(filename, err);
1968 if (o->mux_preload) {
1970 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1971 av_dict_set(&of->opts, "preload", buf, 0);
1973 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1974 oc->flags |= AVFMT_FLAG_NONBLOCK;
1977 for (i = 0; i < o->nb_metadata_map; i++) {
1979 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1981 if (in_file_index >= nb_input_files) {
1982 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1985 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1986 in_file_index >= 0 ?
1987 input_files[in_file_index]->ctx : NULL, o);
1991 if (o->chapters_input_file >= nb_input_files) {
1992 if (o->chapters_input_file == INT_MAX) {
1993 /* copy chapters from the first input file that has them*/
1994 o->chapters_input_file = -1;
1995 for (i = 0; i < nb_input_files; i++)
1996 if (input_files[i]->ctx->nb_chapters) {
1997 o->chapters_input_file = i;
2001 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2002 o->chapters_input_file);
2006 if (o->chapters_input_file >= 0)
2007 copy_chapters(input_files[o->chapters_input_file], of,
2008 !o->metadata_chapters_manual);
2010 /* copy global metadata by default */
2011 if (!o->metadata_global_manual && nb_input_files)
2012 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2013 AV_DICT_DONT_OVERWRITE);
2014 if (!o->metadata_streams_manual)
2015 for (i = of->ost_index; i < nb_output_streams; i++) {
2017 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2019 ist = input_streams[output_streams[i]->source_index];
2020 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2023 /* process manually set metadata */
2024 for (i = 0; i < o->nb_metadata; i++) {
2027 const char *stream_spec;
2028 int index = 0, j, ret;
2030 val = strchr(o->metadata[i].u.str, '=');
2032 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2033 o->metadata[i].u.str);
2038 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2040 for (j = 0; j < oc->nb_streams; j++) {
2041 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2042 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2053 if (index < 0 || index >= oc->nb_chapters) {
2054 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2057 m = &oc->chapters[index]->metadata;
2060 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2063 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2070 static int opt_target(void *optctx, const char *opt, const char *arg)
2072 OptionsContext *o = optctx;
2073 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2074 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2076 if (!strncmp(arg, "pal-", 4)) {
2079 } else if (!strncmp(arg, "ntsc-", 5)) {
2082 } else if (!strncmp(arg, "film-", 5)) {
2086 /* Try to determine PAL/NTSC by peeking in the input files */
2087 if (nb_input_files) {
2089 for (j = 0; j < nb_input_files; j++) {
2090 for (i = 0; i < input_files[j]->nb_streams; i++) {
2091 AVStream *st = input_files[j]->ctx->streams[i];
2092 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2094 fr = st->time_base.den * 1000 / st->time_base.num;
2098 } else if ((fr == 29970) || (fr == 23976)) {
2103 if (norm != UNKNOWN)
2107 if (norm != UNKNOWN)
2108 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2111 if (norm == UNKNOWN) {
2112 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2113 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2114 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2118 if (!strcmp(arg, "vcd")) {
2119 opt_video_codec(o, "c:v", "mpeg1video");
2120 opt_audio_codec(o, "c:a", "mp2");
2121 parse_option(o, "f", "vcd", options);
2123 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2124 parse_option(o, "r", frame_rates[norm], options);
2125 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2127 opt_default(NULL, "b", "1150000");
2128 opt_default(NULL, "maxrate", "1150000");
2129 opt_default(NULL, "minrate", "1150000");
2130 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
2132 opt_default(NULL, "b:a", "224000");
2133 parse_option(o, "ar", "44100", options);
2134 parse_option(o, "ac", "2", options);
2136 opt_default(NULL, "packetsize", "2324");
2137 opt_default(NULL, "muxrate", "3528"); // 2352 * 75 / 50;
2139 /* We have to offset the PTS, so that it is consistent with the SCR.
2140 SCR starts at 36000, but the first two packs contain only padding
2141 and the first pack from the other stream, respectively, may also have
2142 been written before.
2143 So the real data starts at SCR 36000+3*1200. */
2144 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2145 } else if (!strcmp(arg, "svcd")) {
2147 opt_video_codec(o, "c:v", "mpeg2video");
2148 opt_audio_codec(o, "c:a", "mp2");
2149 parse_option(o, "f", "svcd", options);
2151 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2152 parse_option(o, "r", frame_rates[norm], options);
2153 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2155 opt_default(NULL, "b", "2040000");
2156 opt_default(NULL, "maxrate", "2516000");
2157 opt_default(NULL, "minrate", "0"); // 1145000;
2158 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2159 opt_default(NULL, "scan_offset", "1");
2162 opt_default(NULL, "b:a", "224000");
2163 parse_option(o, "ar", "44100", options);
2165 opt_default(NULL, "packetsize", "2324");
2167 } else if (!strcmp(arg, "dvd")) {
2169 opt_video_codec(o, "c:v", "mpeg2video");
2170 opt_audio_codec(o, "c:a", "ac3");
2171 parse_option(o, "f", "dvd", options);
2173 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2174 parse_option(o, "r", frame_rates[norm], options);
2175 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2177 opt_default(NULL, "b", "6000000");
2178 opt_default(NULL, "maxrate", "9000000");
2179 opt_default(NULL, "minrate", "0"); // 1500000;
2180 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2182 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2183 opt_default(NULL, "muxrate", "25200"); // from mplex project: data_rate = 1260000. mux_rate = data_rate / 50
2185 opt_default(NULL, "b:a", "448000");
2186 parse_option(o, "ar", "48000", options);
2188 } else if (!strncmp(arg, "dv", 2)) {
2190 parse_option(o, "f", "dv", options);
2192 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2193 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2194 norm == PAL ? "yuv420p" : "yuv411p", options);
2195 parse_option(o, "r", frame_rates[norm], options);
2197 parse_option(o, "ar", "48000", options);
2198 parse_option(o, "ac", "2", options);
2201 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2202 return AVERROR(EINVAL);
2205 av_dict_copy(&o->g->codec_opts, codec_opts, 0);
2206 av_dict_copy(&o->g->format_opts, format_opts, 0);
2211 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2213 av_free (vstats_filename);
2214 vstats_filename = av_strdup (arg);
2218 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2221 time_t today2 = time(NULL);
2222 struct tm *today = localtime(&today2);
2224 if (!today) { // maybe tomorrow
2225 av_log(NULL, AV_LOG_FATAL, "Unable to get current time.\n");
2229 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2231 return opt_vstats_file(NULL, opt, filename);
2234 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2236 OptionsContext *o = optctx;
2237 return parse_option(o, "frames:v", arg, options);
2240 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2242 OptionsContext *o = optctx;
2243 return parse_option(o, "frames:a", arg, options);
2246 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2248 OptionsContext *o = optctx;
2249 return parse_option(o, "frames:d", arg, options);
2252 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
2254 OptionsContext *o = optctx;
2255 return parse_option(o, "tag:v", arg, options);
2258 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
2260 OptionsContext *o = optctx;
2261 return parse_option(o, "tag:a", arg, options);
2264 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
2266 OptionsContext *o = optctx;
2267 return parse_option(o, "tag:s", arg, options);
2270 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2272 OptionsContext *o = optctx;
2273 return parse_option(o, "filter:v", arg, options);
2276 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2278 OptionsContext *o = optctx;
2279 return parse_option(o, "filter:a", arg, options);
2282 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2284 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2285 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2286 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2288 if (video_sync_method == VSYNC_AUTO)
2289 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2293 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2295 OptionsContext *o = optctx;
2296 char layout_str[32];
2299 int ret, channels, ac_str_size;
2302 layout = av_get_channel_layout(arg);
2304 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2305 return AVERROR(EINVAL);
2307 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2308 ret = opt_default(NULL, opt, layout_str);
2312 /* set 'ac' option based on channel layout */
2313 channels = av_get_channel_layout_nb_channels(layout);
2314 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2315 stream_str = strchr(opt, ':');
2316 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2317 ac_str = av_mallocz(ac_str_size);
2319 return AVERROR(ENOMEM);
2320 av_strlcpy(ac_str, "ac", 3);
2322 av_strlcat(ac_str, stream_str, ac_str_size);
2323 ret = parse_option(o, ac_str, layout_str, options);
2329 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2331 OptionsContext *o = optctx;
2332 return parse_option(o, "q:a", arg, options);
2335 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2337 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2338 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2339 return AVERROR(ENOMEM);
2340 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2341 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2342 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2343 return AVERROR(ENOMEM);
2347 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2349 uint8_t *graph_desc = read_file(arg);
2351 return AVERROR(EINVAL);
2353 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2354 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2355 return AVERROR(ENOMEM);
2356 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2357 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2361 void show_help_default(const char *opt, const char *arg)
2363 /* per-file options have at least one of those set */
2364 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2365 int show_advanced = 0, show_avoptions = 0;
2368 if (!strcmp(opt, "long"))
2370 else if (!strcmp(opt, "full"))
2371 show_advanced = show_avoptions = 1;
2373 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2378 printf("Getting help:\n"
2379 " -h -- print basic options\n"
2380 " -h long -- print more options\n"
2381 " -h full -- print all options (including all format and codec specific options, very long)\n"
2382 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
2383 " See man %s for detailed description of the options.\n"
2384 "\n", program_name);
2386 show_help_options(options, "Print help / information / capabilities:",
2389 show_help_options(options, "Global options (affect whole program "
2390 "instead of just one file:",
2391 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2393 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2394 per_file | OPT_EXIT, 0);
2396 show_help_options(options, "Per-file main options:", 0,
2397 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2398 OPT_EXIT, per_file);
2400 show_help_options(options, "Advanced per-file options:",
2401 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2403 show_help_options(options, "Video options:",
2404 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2406 show_help_options(options, "Advanced Video options:",
2407 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2409 show_help_options(options, "Audio options:",
2410 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2412 show_help_options(options, "Advanced Audio options:",
2413 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2414 show_help_options(options, "Subtitle options:",
2415 OPT_SUBTITLE, 0, 0);
2418 if (show_avoptions) {
2419 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2420 show_help_children(avcodec_get_class(), flags);
2421 show_help_children(avformat_get_class(), flags);
2422 show_help_children(sws_get_class(), flags);
2423 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM);
2427 void show_usage(void)
2429 printf("Hyper fast Audio and Video encoder\n");
2430 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2439 static const OptionGroupDef groups[] = {
2440 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2441 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2444 static int open_files(OptionGroupList *l, const char *inout,
2445 int (*open_file)(OptionsContext*, const char*))
2449 for (i = 0; i < l->nb_groups; i++) {
2450 OptionGroup *g = &l->groups[i];
2456 ret = parse_optgroup(&o, g);
2458 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2459 "%s.\n", inout, g->arg);
2463 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2464 ret = open_file(&o, g->arg);
2467 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2471 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2477 int avconv_parse_options(int argc, char **argv)
2479 OptionParseContext octx;
2483 memset(&octx, 0, sizeof(octx));
2485 /* split the commandline into an internal representation */
2486 ret = split_commandline(&octx, argc, argv, options, groups,
2487 FF_ARRAY_ELEMS(groups));
2489 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2493 /* apply global options */
2494 ret = parse_optgroup(NULL, &octx.global_opts);
2496 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2500 /* open input files */
2501 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2503 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2507 /* create the complex filtergraphs */
2508 ret = init_complex_filters();
2510 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
2514 /* open output files */
2515 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2517 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2522 uninit_parse_context(&octx);
2524 av_strerror(ret, error, sizeof(error));
2525 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2530 #define OFFSET(x) offsetof(OptionsContext, x)
2531 const OptionDef options[] = {
2533 CMDUTILS_COMMON_OPTIONS
2534 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2535 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2536 "force format", "fmt" },
2537 { "y", OPT_BOOL, { &file_overwrite },
2538 "overwrite output files" },
2539 { "n", OPT_BOOL, { &file_skip },
2540 "never overwrite output files" },
2541 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2542 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2543 "codec name", "codec" },
2544 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2545 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2546 "codec name", "codec" },
2547 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2548 OPT_OUTPUT, { .off = OFFSET(presets) },
2549 "preset name", "preset" },
2550 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2551 OPT_OUTPUT, { .func_arg = opt_map },
2552 "set input stream mapping",
2553 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2554 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2555 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2556 "set metadata information of outfile from infile",
2557 "outfile[,metadata]:infile[,metadata]" },
2558 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2559 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2560 "set chapters mapping", "input_file_index" },
2561 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2562 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2563 "record or transcode \"duration\" seconds of audio/video",
2565 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2566 "set the limit file size in bytes", "limit_size" },
2567 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2568 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2569 "set the start time offset", "time_off" },
2570 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2571 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2572 "enable/disable accurate seeking with -ss" },
2573 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2574 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2575 "set the input ts offset", "time_off" },
2576 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2577 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2578 "set the input ts scale", "scale" },
2579 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2580 "add metadata", "string=string" },
2581 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2582 OPT_OUTPUT, { .func_arg = opt_data_frames },
2583 "set the number of data frames to record", "number" },
2584 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2585 "add timings for benchmarking" },
2586 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2587 "set max runtime in seconds", "limit" },
2588 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2589 "dump each input packet" },
2590 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2591 "when dumping packets, also dump the payload" },
2592 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2593 OPT_INPUT, { .off = OFFSET(rate_emu) },
2594 "read input at native frame rate", "" },
2595 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2596 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2597 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2598 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
2599 "video sync method", "" },
2600 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2601 "audio sync method", "" },
2602 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2603 "audio drift threshold", "threshold" },
2604 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2605 "copy timestamps" },
2606 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2607 "copy input stream time base when stream copying" },
2608 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2609 OPT_OUTPUT, { .off = OFFSET(shortest) },
2610 "finish encoding within shortest input" },
2611 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2612 "timestamp discontinuity delta threshold", "threshold" },
2613 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2614 "exit on error", "error" },
2615 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2616 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2617 "copy initial non-keyframes" },
2618 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2619 "set the number of frames to record", "number" },
2620 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2621 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2622 "force codec tag/fourcc", "fourcc/tag" },
2623 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2624 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2625 "use fixed quality scale (VBR)", "q" },
2626 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2627 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2628 "use fixed quality scale (VBR)", "q" },
2629 { "b", HAS_ARG | OPT_INT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(bitrates) },
2630 "set stream bitrate in bits/second", "bitrate" },
2631 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2632 "set stream filterchain", "filter_list" },
2633 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2634 "read stream filtergraph description from a file", "filename" },
2635 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2636 "create a complex filtergraph", "graph_description" },
2637 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2638 "read complex filtergraph description from a file", "filename" },
2639 { "stats", OPT_BOOL, { &print_stats },
2640 "print progress report during encoding", },
2641 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2642 OPT_OUTPUT, { .func_arg = opt_attach },
2643 "add an attachment to the output file", "filename" },
2644 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2645 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2646 "extract an attachment into a file", "filename" },
2647 { "loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
2648 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
2651 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2652 "set the number of video frames to record", "number" },
2653 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2654 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2655 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2656 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2657 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2658 "set frame size (WxH or abbreviation)", "size" },
2659 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2660 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2661 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2662 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2663 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2664 "set pixel format", "format" },
2665 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2667 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2668 "discard threshold", "n" },
2669 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2670 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2671 "rate control override for specific intervals", "override" },
2672 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2673 OPT_OUTPUT, { .func_arg = opt_video_codec },
2674 "force video codec ('copy' to copy stream)", "codec" },
2675 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2676 "select the pass number (1 or 2)", "n" },
2677 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2678 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2679 "select two pass log file name prefix", "prefix" },
2680 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = &opt_vstats },
2681 "dump video coding statistics to file" },
2682 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
2683 "dump video coding statistics to file", "file" },
2684 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2685 "video filters", "filter list" },
2686 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2687 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2688 "specify intra matrix coeffs", "matrix" },
2689 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2690 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2691 "specify inter matrix coeffs", "matrix" },
2692 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2693 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2694 "top=1/bottom=0/auto=-1 field first", "" },
2695 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2696 "intra_dc_precision", "precision" },
2697 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2698 OPT_OUTPUT, { .func_arg = opt_video_tag },
2699 "force video tag/fourcc", "fourcc/tag" },
2700 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2701 "show QP histogram" },
2702 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2703 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2704 "force the selected framerate, disable the best supported framerate selection" },
2705 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2706 OPT_OUTPUT, { .func_arg = opt_streamid },
2707 "set the value of an outfile streamid", "streamIndex:value" },
2708 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2709 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2710 "force key frames at specified timestamps", "timestamps" },
2711 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2712 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
2713 "use HW accelerated decoding", "hwaccel name" },
2714 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2715 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
2716 "select a device for HW acceleration", "devicename" },
2717 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2718 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
2719 "select output format used with HW accelerated decoding", "format" },
2721 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
2722 "show available HW acceleration methods" },
2723 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
2724 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
2725 "automatically insert correct rotate filters" },
2726 { "hwaccel_lax_profile_check", OPT_BOOL | OPT_EXPERT, { &hwaccel_lax_profile_check},
2727 "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream" },
2730 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2731 "set the number of audio frames to record", "number" },
2732 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2733 "set audio quality (codec-specific)", "quality", },
2734 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2735 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2736 "set audio sampling rate (in Hz)", "rate" },
2737 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2738 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2739 "set number of audio channels", "channels" },
2740 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2742 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2743 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2744 "force audio codec ('copy' to copy stream)", "codec" },
2745 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2746 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2747 "force audio tag/fourcc", "fourcc/tag" },
2748 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2749 "change audio volume (256=normal)" , "volume" },
2750 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2751 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2752 "set sample format", "format" },
2753 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2754 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2755 "set channel layout", "layout" },
2756 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2757 "audio filters", "filter list" },
2759 /* subtitle options */
2760 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2761 "disable subtitle" },
2762 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2763 "force subtitle codec ('copy' to copy stream)", "codec" },
2764 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2765 , "force subtitle tag/fourcc", "fourcc/tag" },
2768 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2771 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2772 "set the maximum demux-decode delay", "seconds" },
2773 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2774 "set the initial demux-decode delay", "seconds" },
2776 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2777 "A comma-separated list of bitstream filters", "bitstream_filters" },
2779 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
2780 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
2782 /* data codec support */
2783 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2784 "force data codec ('copy' to copy stream)", "codec" },
2787 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
2788 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
2791 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
2792 "initialise hardware device", "args" },
2793 { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device },
2794 "set hardware device used when filtering", "device" },