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;
84 char *vstats_filename;
86 float audio_drift_threshold = 0.1;
87 float dts_delta_threshold = 10;
89 int audio_volume = 256;
90 int audio_sync_method = 0;
91 int video_sync_method = VSYNC_AUTO;
97 int exit_on_error = 0;
101 static int file_overwrite = 0;
102 static int file_skip = 0;
103 static int video_discard = 0;
104 static int intra_dc_precision = 8;
105 static int using_stdin = 0;
106 static int input_sync;
108 static void uninit_options(OptionsContext *o)
110 const OptionDef *po = options;
113 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
115 void *dst = (uint8_t*)o + po->u.off;
117 if (po->flags & OPT_SPEC) {
118 SpecifierOpt **so = dst;
119 int i, *count = (int*)(so + 1);
120 for (i = 0; i < *count; i++) {
121 av_freep(&(*so)[i].specifier);
122 if (po->flags & OPT_STRING)
123 av_freep(&(*so)[i].u.str);
127 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
132 for (i = 0; i < o->nb_stream_maps; i++)
133 av_freep(&o->stream_maps[i].linklabel);
134 av_freep(&o->stream_maps);
135 av_freep(&o->meta_data_maps);
136 av_freep(&o->streamid_map);
139 static void init_options(OptionsContext *o)
141 memset(o, 0, sizeof(*o));
143 o->mux_max_delay = 0.7;
144 o->start_time = AV_NOPTS_VALUE;
145 o->recording_time = INT64_MAX;
146 o->limit_filesize = UINT64_MAX;
147 o->chapters_input_file = INT_MAX;
148 o->accurate_seek = 1;
151 /* return a copy of the input with the stream specifiers removed from the keys */
152 static AVDictionary *strip_specifiers(AVDictionary *dict)
154 AVDictionaryEntry *e = NULL;
155 AVDictionary *ret = NULL;
157 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
158 char *p = strchr(e->key, ':');
162 av_dict_set(&ret, e->key, e->value, 0);
169 static double parse_frame_aspect_ratio(const char *arg)
176 p = strchr(arg, ':');
178 x = strtol(arg, &end, 10);
180 y = strtol(end + 1, &end, 10);
182 ar = (double)x / (double)y;
184 ar = strtod(arg, NULL);
187 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
193 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
197 printf("Supported hardware acceleration:\n");
198 for (i = 0; hwaccels[i].name; i++) {
199 printf("%s\n", hwaccels[i].name);
205 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
207 OptionsContext *o = optctx;
208 return parse_option(o, "codec:a", arg, options);
211 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
213 OptionsContext *o = optctx;
214 return parse_option(o, "codec:v", arg, options);
217 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
219 OptionsContext *o = optctx;
220 return parse_option(o, "codec:s", arg, options);
223 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
225 OptionsContext *o = optctx;
226 return parse_option(o, "codec:d", arg, options);
229 static int opt_map(void *optctx, const char *opt, const char *arg)
231 OptionsContext *o = optctx;
233 int i, negative = 0, file_idx;
234 int sync_file_idx = -1, sync_stream_idx;
242 map = av_strdup(arg);
244 return AVERROR(ENOMEM);
246 /* parse sync stream first, just pick first matching stream */
247 if (sync = strchr(map, ',')) {
249 sync_file_idx = strtol(sync + 1, &sync, 0);
250 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
251 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
256 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
257 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
258 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
262 if (i == input_files[sync_file_idx]->nb_streams) {
263 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
264 "match any streams.\n", arg);
271 /* this mapping refers to lavfi output */
272 const char *c = map + 1;
273 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
274 m = &o->stream_maps[o->nb_stream_maps - 1];
275 m->linklabel = av_get_token(&c, "]");
277 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
281 file_idx = strtol(map, &p, 0);
282 if (file_idx >= nb_input_files || file_idx < 0) {
283 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
287 /* disable some already defined maps */
288 for (i = 0; i < o->nb_stream_maps; i++) {
289 m = &o->stream_maps[i];
290 if (file_idx == m->file_index &&
291 check_stream_specifier(input_files[m->file_index]->ctx,
292 input_files[m->file_index]->ctx->streams[m->stream_index],
293 *p == ':' ? p + 1 : p) > 0)
297 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
298 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
299 *p == ':' ? p + 1 : p) <= 0)
301 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
302 m = &o->stream_maps[o->nb_stream_maps - 1];
304 m->file_index = file_idx;
307 if (sync_file_idx >= 0) {
308 m->sync_file_index = sync_file_idx;
309 m->sync_stream_index = sync_stream_idx;
311 m->sync_file_index = file_idx;
312 m->sync_stream_index = i;
318 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
326 static int opt_attach(void *optctx, const char *opt, const char *arg)
328 OptionsContext *o = optctx;
329 GROW_ARRAY(o->attachments, o->nb_attachments);
330 o->attachments[o->nb_attachments - 1] = arg;
335 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
338 const char *prefix = "vaapi:";
341 tmp = av_malloc(strlen(prefix) + strlen(arg) + 1);
343 return AVERROR(ENOMEM);
346 err = hw_device_init_from_string(tmp, &dev);
350 hw_device_ctx = av_buffer_ref(dev->device_ref);
352 return AVERROR(ENOMEM);
357 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
359 if (!strcmp(arg, "list")) {
360 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
361 printf("Supported hardware device types:\n");
362 while ((type = av_hwdevice_iterate_types(type)) !=
363 AV_HWDEVICE_TYPE_NONE)
364 printf("%s\n", av_hwdevice_get_type_name(type));
368 return hw_device_init_from_string(arg, NULL);
373 * Parse a metadata specifier passed as 'arg' parameter.
374 * @param arg metadata string to parse
375 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
376 * @param index for type c/p, chapter/program index is written here
377 * @param stream_spec for type s, the stream specifier is written here
379 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
387 if (*(++arg) && *arg != ':') {
388 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
391 *stream_spec = *arg == ':' ? arg + 1 : "";
396 *index = strtol(++arg, NULL, 0);
399 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
406 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
408 AVDictionary **meta_in = NULL;
409 AVDictionary **meta_out;
411 char type_in, type_out;
412 const char *istream_spec = NULL, *ostream_spec = NULL;
413 int idx_in = 0, idx_out = 0;
415 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
416 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
418 if (type_in == 'g' || type_out == 'g')
419 o->metadata_global_manual = 1;
420 if (type_in == 's' || type_out == 's')
421 o->metadata_streams_manual = 1;
422 if (type_in == 'c' || type_out == 'c')
423 o->metadata_chapters_manual = 1;
425 /* ic is NULL when just disabling automatic mappings */
429 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
430 if ((index) < 0 || (index) >= (nb_elems)) {\
431 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
436 #define SET_DICT(type, meta, context, index)\
439 meta = &context->metadata;\
442 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
443 meta = &context->chapters[index]->metadata;\
446 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
447 meta = &context->programs[index]->metadata;\
450 break; /* handled separately below */ \
451 default: av_assert0(0);\
454 SET_DICT(type_in, meta_in, ic, idx_in);
455 SET_DICT(type_out, meta_out, oc, idx_out);
457 /* for input streams choose first matching stream */
458 if (type_in == 's') {
459 for (i = 0; i < ic->nb_streams; i++) {
460 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
461 meta_in = &ic->streams[i]->metadata;
467 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
472 if (type_out == 's') {
473 for (i = 0; i < oc->nb_streams; i++) {
474 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
475 meta_out = &oc->streams[i]->metadata;
476 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
481 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
486 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
488 const AVCodecDescriptor *desc;
489 const char *codec_string = encoder ? "encoder" : "decoder";
493 avcodec_find_encoder_by_name(name) :
494 avcodec_find_decoder_by_name(name);
496 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
497 codec = encoder ? avcodec_find_encoder(desc->id) :
498 avcodec_find_decoder(desc->id);
500 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
501 codec_string, codec->name, desc->name);
505 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
508 if (codec->type != type) {
509 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
515 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
517 char *codec_name = NULL;
519 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
521 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
522 st->codecpar->codec_id = codec->id;
525 return avcodec_find_decoder(st->codecpar->codec_id);
528 /* Add all the streams from the given input file to the global
529 * list of input streams. */
530 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
534 for (i = 0; i < ic->nb_streams; i++) {
535 AVStream *st = ic->streams[i];
536 AVCodecParameters *par = st->codecpar;
537 InputStream *ist = av_mallocz(sizeof(*ist));
538 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
539 char *hwaccel_output_format = NULL;
540 char *codec_tag = NULL;
546 GROW_ARRAY(input_streams, nb_input_streams);
547 input_streams[nb_input_streams - 1] = ist;
550 ist->file_index = nb_input_files;
552 st->discard = AVDISCARD_ALL;
554 ist->min_pts = INT64_MAX;
555 ist->max_pts = INT64_MIN;
558 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
561 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
563 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
565 uint32_t tag = strtol(codec_tag, &next, 0);
567 tag = AV_RL32(codec_tag);
568 st->codecpar->codec_tag = tag;
571 ist->dec = choose_decoder(o, ic, st);
572 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, par->codec_id, ic, st, ist->dec);
574 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
576 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
580 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
582 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
586 switch (par->codec_type) {
587 case AVMEDIA_TYPE_VIDEO:
588 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
589 if (framerate && av_parse_video_rate(&ist->framerate,
591 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
596 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
598 if (!strcmp(hwaccel, "none"))
599 ist->hwaccel_id = HWACCEL_NONE;
600 else if (!strcmp(hwaccel, "auto"))
601 ist->hwaccel_id = HWACCEL_AUTO;
604 for (i = 0; hwaccels[i].name; i++) {
605 if (!strcmp(hwaccels[i].name, hwaccel)) {
606 ist->hwaccel_id = hwaccels[i].id;
611 if (!ist->hwaccel_id) {
612 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
614 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
615 for (i = 0; hwaccels[i].name; i++)
616 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
617 av_log(NULL, AV_LOG_FATAL, "\n");
623 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
624 if (hwaccel_device) {
625 ist->hwaccel_device = av_strdup(hwaccel_device);
626 if (!ist->hwaccel_device)
630 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
631 hwaccel_output_format, ic, st);
632 if (hwaccel_output_format) {
633 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
634 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
635 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
636 "format: %s", hwaccel_output_format);
639 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
642 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
645 case AVMEDIA_TYPE_AUDIO:
646 guess_input_channel_layout(ist);
648 case AVMEDIA_TYPE_DATA:
649 case AVMEDIA_TYPE_SUBTITLE:
650 case AVMEDIA_TYPE_ATTACHMENT:
651 case AVMEDIA_TYPE_UNKNOWN:
659 static void assert_file_overwrite(const char *filename)
661 if (file_overwrite && file_skip) {
662 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
666 if (!file_overwrite &&
667 (!strchr(filename, ':') || filename[1] == ':' ||
668 av_strstart(filename, "file:", NULL))) {
669 if (avio_check(filename, 0) == 0) {
670 if (!using_stdin && !file_skip) {
671 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
674 fprintf(stderr, "Not overwriting - exiting\n");
679 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
686 static void dump_attachment(AVStream *st, const char *filename)
689 AVIOContext *out = NULL;
690 AVDictionaryEntry *e;
692 if (!st->codecpar->extradata_size) {
693 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
694 nb_input_files - 1, st->index);
697 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
700 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
701 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
705 assert_file_overwrite(filename);
707 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
708 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
713 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
718 static int open_input_file(OptionsContext *o, const char *filename)
722 AVInputFormat *file_iformat = NULL;
727 AVDictionary *unused_opts = NULL;
728 AVDictionaryEntry *e = NULL;
729 int orig_nb_streams; // number of streams before avformat_find_stream_info
732 if (!(file_iformat = av_find_input_format(o->format))) {
733 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
738 if (!strcmp(filename, "-"))
741 using_stdin |= !strncmp(filename, "pipe:", 5) ||
742 !strcmp(filename, "/dev/stdin");
744 /* get default parameters from command line */
745 ic = avformat_alloc_context();
747 print_error(filename, AVERROR(ENOMEM));
750 if (o->nb_audio_sample_rate) {
751 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
752 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
754 if (o->nb_audio_channels) {
755 /* because we set audio_channels based on both the "ac" and
756 * "channel_layout" options, we need to check that the specified
757 * demuxer actually has the "channels" option before setting it */
758 if (file_iformat && file_iformat->priv_class &&
759 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
760 AV_OPT_SEARCH_FAKE_OBJ)) {
761 snprintf(buf, sizeof(buf), "%d",
762 o->audio_channels[o->nb_audio_channels - 1].u.i);
763 av_dict_set(&o->g->format_opts, "channels", buf, 0);
766 if (o->nb_frame_rates) {
767 /* set the format-level framerate option;
768 * this is important for video grabbers, e.g. x11 */
769 if (file_iformat && file_iformat->priv_class &&
770 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
771 AV_OPT_SEARCH_FAKE_OBJ)) {
772 av_dict_set(&o->g->format_opts, "framerate",
773 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
776 if (o->nb_frame_sizes) {
777 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
779 if (o->nb_frame_pix_fmts)
780 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
782 ic->flags |= AVFMT_FLAG_NONBLOCK;
783 ic->interrupt_callback = int_cb;
785 /* open the input file with generic Libav function */
786 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
788 print_error(filename, err);
791 assert_avoptions(o->g->format_opts);
793 /* apply forced codec ids */
794 for (i = 0; i < ic->nb_streams; i++)
795 choose_decoder(o, ic, ic->streams[i]);
797 /* Set AVCodecContext options for avformat_find_stream_info */
798 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
799 orig_nb_streams = ic->nb_streams;
801 /* If not enough info to get the stream parameters, we decode the
802 first frames to get it. (used in mpeg case for example) */
803 ret = avformat_find_stream_info(ic, opts);
805 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
806 avformat_close_input(&ic);
810 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
811 /* add the stream start time */
812 if (ic->start_time != AV_NOPTS_VALUE)
813 timestamp += ic->start_time;
815 /* if seeking requested, we execute it */
816 if (o->start_time != AV_NOPTS_VALUE) {
817 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
819 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
820 filename, (double)timestamp / AV_TIME_BASE);
824 /* update the current parameters so that they match the one of the input stream */
825 add_input_streams(o, ic);
827 /* dump the file content */
828 av_dump_format(ic, nb_input_files, filename, 0);
830 GROW_ARRAY(input_files, nb_input_files);
831 f = av_mallocz(sizeof(*f));
834 input_files[nb_input_files - 1] = f;
837 f->ist_index = nb_input_streams - ic->nb_streams;
838 f->start_time = o->start_time;
839 f->recording_time = o->recording_time;
840 f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
841 f->nb_streams = ic->nb_streams;
842 f->rate_emu = o->rate_emu;
843 f->accurate_seek = o->accurate_seek;
846 f->time_base = (AVRational){ 1, 1 };
848 /* check if all codec options have been used */
849 unused_opts = strip_specifiers(o->g->codec_opts);
850 for (i = f->ist_index; i < nb_input_streams; i++) {
852 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
853 AV_DICT_IGNORE_SUFFIX)))
854 av_dict_set(&unused_opts, e->key, NULL, 0);
858 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
859 const AVClass *class = avcodec_get_class();
860 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
861 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
864 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
865 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
866 "input file #%d (%s) is not a decoding option.\n", e->key,
867 option->help ? option->help : "", nb_input_files - 1,
872 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
873 "input file #%d (%s) has not been used for any stream. The most "
874 "likely reason is either wrong type (e.g. a video option with "
875 "no video streams) or that it is a private option of some decoder "
876 "which was not actually used for any stream.\n", e->key,
877 option->help ? option->help : "", nb_input_files - 1, filename);
879 av_dict_free(&unused_opts);
881 for (i = 0; i < o->nb_dump_attachment; i++) {
884 for (j = 0; j < ic->nb_streams; j++) {
885 AVStream *st = ic->streams[j];
887 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
888 dump_attachment(st, o->dump_attachment[i].u.str);
892 for (i = 0; i < orig_nb_streams; i++)
893 av_dict_free(&opts[i]);
899 static uint8_t *get_line(AVIOContext *s)
905 if (avio_open_dyn_buf(&line) < 0) {
906 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
910 while ((c = avio_r8(s)) && c != '\n')
913 avio_close_dyn_buf(line, &buf);
918 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
922 const char *base[3] = { getenv("AVCONV_DATADIR"),
927 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
931 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
932 i != 1 ? "" : "/.avconv", codec_name, preset_name);
933 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
936 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
937 i != 1 ? "" : "/.avconv", preset_name);
938 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
944 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
946 enum AVMediaType type = ost->st->codecpar->codec_type;
947 char *codec_name = NULL;
949 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
950 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
952 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
953 NULL, ost->st->codecpar->codec_type);
954 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
956 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
957 "output stream #%d:%d. Default encoder for format %s is "
958 "probably disabled. Please choose an encoder manually.\n",
959 ost->file_index, ost->index, s->oformat->name);
960 return AVERROR_ENCODER_NOT_FOUND;
962 } else if (!strcmp(codec_name, "copy"))
963 ost->stream_copy = 1;
965 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
966 ost->st->codecpar->codec_id = ost->enc->id;
969 ost->encoding_needed = !ost->stream_copy;
971 /* no encoding supported for other media types */
972 ost->stream_copy = 1;
973 ost->encoding_needed = 0;
979 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
982 AVStream *st = avformat_new_stream(oc, NULL);
983 int idx = oc->nb_streams - 1, ret = 0;
984 const char *bsfs = NULL;
985 char *next, *codec_tag = NULL;
990 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
994 if (oc->nb_streams - 1 < o->nb_streamid_map)
995 st->id = o->streamid_map[oc->nb_streams - 1];
997 GROW_ARRAY(output_streams, nb_output_streams);
998 if (!(ost = av_mallocz(sizeof(*ost))))
1000 output_streams[nb_output_streams - 1] = ost;
1002 ost->file_index = nb_output_files - 1;
1005 st->codecpar->codec_type = type;
1007 ret = choose_encoder(o, oc, ost);
1009 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1010 "%d:%d\n", ost->file_index, ost->index);
1014 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1015 if (!ost->enc_ctx) {
1016 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1019 ost->enc_ctx->codec_type = type;
1022 AVIOContext *s = NULL;
1023 char *buf = NULL, *arg = NULL, *preset = NULL;
1025 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1027 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1028 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1031 if (!buf[0] || buf[0] == '#') {
1035 if (!(arg = strchr(buf, '='))) {
1036 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1040 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1042 } while (!s->eof_reached);
1046 av_log(NULL, AV_LOG_FATAL,
1047 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1048 preset, ost->file_index, ost->index);
1052 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1055 ost->max_frames = INT64_MAX;
1056 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1058 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1059 while (bsfs && *bsfs) {
1060 const AVBitStreamFilter *filter;
1061 const char *bsf, *bsf_options_str, *bsf_name;
1062 AVDictionary *bsf_options = NULL;
1064 bsf = bsf_options_str = av_get_token(&bsfs, ",");
1067 bsf_name = av_get_token(&bsf_options_str, "=");
1071 filter = av_bsf_get_by_name(bsf_name);
1073 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
1076 if (*bsf_options_str++) {
1077 ret = av_dict_parse_string(&bsf_options, bsf_options_str, "=", ":", 0);
1079 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
1085 ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
1086 ost->nb_bitstream_filters + 1,
1087 sizeof(*ost->bsf_ctx));
1091 ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
1093 av_log(NULL, AV_LOG_ERROR, "Error allocating a bistream filter context\n");
1096 ost->nb_bitstream_filters++;
1099 ret = av_opt_set_dict(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, &bsf_options);
1101 av_log(NULL, AV_LOG_ERROR, "Error setting options for bitstream filter %s\n", bsf_name);
1104 assert_avoptions(bsf_options);
1105 av_dict_free(&bsf_options);
1107 av_freep(&bsf_name);
1113 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1115 uint32_t tag = strtol(codec_tag, &next, 0);
1117 tag = AV_RL32(codec_tag);
1118 ost->enc_ctx->codec_tag = tag;
1121 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1123 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1124 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1127 MATCH_PER_STREAM_OPT(bitrates, i, bitrate, oc, st);
1129 if (ost->stream_copy)
1130 ost->bitrate_override = bitrate;
1132 ost->enc_ctx->bit_rate = bitrate;
1135 ost->max_muxing_queue_size = 128;
1136 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1137 ost->max_muxing_queue_size *= sizeof(AVPacket);
1139 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1140 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1142 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
1144 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1146 ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
1147 ost->last_mux_dts = AV_NOPTS_VALUE;
1149 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1150 if (!ost->muxing_queue)
1156 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1159 const char *p = str;
1166 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1173 /* read file contents into a string */
1174 static uint8_t *read_file(const char *filename)
1176 AVIOContext *pb = NULL;
1177 AVIOContext *dyn_buf = NULL;
1178 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1179 uint8_t buf[1024], *str;
1182 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1186 ret = avio_open_dyn_buf(&dyn_buf);
1191 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1192 avio_write(dyn_buf, buf, ret);
1193 avio_w8(dyn_buf, 0);
1196 ret = avio_close_dyn_buf(dyn_buf, &str);
1202 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1205 AVStream *st = ost->st;
1206 char *filter = NULL, *filter_script = NULL;
1208 MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
1209 MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
1211 if (filter_script && filter) {
1212 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1213 "output stream #%d:%d.\n", nb_output_files, st->index);
1218 return read_file(filter_script);
1220 return av_strdup(filter);
1222 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1226 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
1230 AVCodecContext *video_enc;
1231 char *frame_aspect_ratio = NULL;
1233 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
1235 video_enc = ost->enc_ctx;
1237 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1238 if (frame_aspect_ratio)
1239 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
1241 if (!ost->stream_copy) {
1242 const char *p = NULL;
1243 char *frame_rate = NULL, *frame_size = NULL;
1244 char *frame_pix_fmt = NULL;
1245 char *intra_matrix = NULL, *inter_matrix = NULL;
1249 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1250 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1251 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1255 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1256 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1257 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1261 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1262 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1263 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1266 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1268 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1270 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1271 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1274 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1276 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1278 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1279 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1282 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1285 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1286 for (i = 0; p; i++) {
1288 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1290 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1293 video_enc->rc_override =
1294 av_realloc(video_enc->rc_override,
1295 sizeof(RcOverride) * (i + 1));
1296 if (!video_enc->rc_override) {
1297 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1300 video_enc->rc_override[i].start_frame = start;
1301 video_enc->rc_override[i].end_frame = end;
1303 video_enc->rc_override[i].qscale = q;
1304 video_enc->rc_override[i].quality_factor = 1.0;
1307 video_enc->rc_override[i].qscale = 0;
1308 video_enc->rc_override[i].quality_factor = -q/100.0;
1313 video_enc->rc_override_count = i;
1314 video_enc->intra_dc_precision = intra_dc_precision - 8;
1317 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1320 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1322 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1326 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1327 if (ost->logfile_prefix &&
1328 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1332 char logfilename[1024];
1335 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1336 ost->logfile_prefix ? ost->logfile_prefix :
1337 DEFAULT_PASS_LOGFILENAME_PREFIX,
1339 if (!strcmp(ost->enc->name, "libx264")) {
1340 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1342 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1343 f = fopen(logfilename, "wb");
1345 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
1346 logfilename, strerror(errno));
1351 char *logbuffer = read_file(logfilename);
1354 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1358 video_enc->stats_in = logbuffer;
1363 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1364 if (ost->forced_keyframes)
1365 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1367 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1369 ost->top_field_first = -1;
1370 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1373 ost->avfilter = get_ost_filters(o, oc, ost);
1377 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1383 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1387 AVCodecContext *audio_enc;
1389 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1392 audio_enc = ost->enc_ctx;
1393 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1395 if (!ost->stream_copy) {
1396 char *sample_fmt = NULL;
1398 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1400 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1402 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1403 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1407 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1409 ost->avfilter = get_ost_filters(o, oc, ost);
1417 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1421 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1422 if (!ost->stream_copy) {
1423 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1430 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1432 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1433 ost->stream_copy = 1;
1438 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1441 AVCodecContext *subtitle_enc;
1443 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1444 subtitle_enc = ost->enc_ctx;
1446 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1451 /* arg format is "output-stream-index:streamid-value". */
1452 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1454 OptionsContext *o = optctx;
1459 av_strlcpy(idx_str, arg, sizeof(idx_str));
1460 p = strchr(idx_str, ':');
1462 av_log(NULL, AV_LOG_FATAL,
1463 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1468 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1469 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1470 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1474 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1476 AVFormatContext *is = ifile->ctx;
1477 AVFormatContext *os = ofile->ctx;
1481 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1483 return AVERROR(ENOMEM);
1486 for (i = 0; i < is->nb_chapters; i++) {
1487 AVChapter *in_ch = is->chapters[i], *out_ch;
1488 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1489 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1490 AV_TIME_BASE_Q, in_ch->time_base);
1491 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1492 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1495 if (in_ch->end < ts_off)
1497 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1500 out_ch = av_mallocz(sizeof(AVChapter));
1502 return AVERROR(ENOMEM);
1504 out_ch->id = in_ch->id;
1505 out_ch->time_base = in_ch->time_base;
1506 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1507 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1510 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1512 os->chapters[os->nb_chapters++] = out_ch;
1517 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1518 AVFormatContext *oc)
1522 switch (ofilter->type) {
1523 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1524 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1526 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1531 ost->source_index = -1;
1532 ost->filter = ofilter;
1535 ofilter->format = -1;
1537 if (ost->stream_copy) {
1538 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1539 "which is fed from a complex filtergraph. Filtering and streamcopy "
1540 "cannot be used together.\n", ost->file_index, ost->index);
1544 avfilter_inout_free(&ofilter->out_tmp);
1547 static int init_complex_filters(void)
1551 for (i = 0; i < nb_filtergraphs; i++) {
1552 ret = init_complex_filtergraph(filtergraphs[i]);
1559 static int open_output_file(OptionsContext *o, const char *filename)
1561 AVFormatContext *oc;
1563 AVOutputFormat *file_oformat;
1567 AVDictionary *unused_opts = NULL;
1568 AVDictionaryEntry *e = NULL;
1570 GROW_ARRAY(output_files, nb_output_files);
1571 of = av_mallocz(sizeof(*of));
1574 output_files[nb_output_files - 1] = of;
1576 of->ost_index = nb_output_streams;
1577 of->recording_time = o->recording_time;
1578 of->start_time = o->start_time;
1579 of->limit_filesize = o->limit_filesize;
1580 of->shortest = o->shortest;
1581 av_dict_copy(&of->opts, o->g->format_opts, 0);
1583 if (!strcmp(filename, "-"))
1586 oc = avformat_alloc_context();
1588 print_error(filename, AVERROR(ENOMEM));
1592 if (o->recording_time != INT64_MAX)
1593 oc->duration = o->recording_time;
1596 file_oformat = av_guess_format(o->format, NULL, NULL);
1597 if (!file_oformat) {
1598 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1602 file_oformat = av_guess_format(NULL, filename, NULL);
1603 if (!file_oformat) {
1604 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1610 oc->oformat = file_oformat;
1611 oc->interrupt_callback = int_cb;
1612 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1614 /* create streams for all unlabeled output pads */
1615 for (i = 0; i < nb_filtergraphs; i++) {
1616 FilterGraph *fg = filtergraphs[i];
1617 for (j = 0; j < fg->nb_outputs; j++) {
1618 OutputFilter *ofilter = fg->outputs[j];
1620 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1623 switch (ofilter->type) {
1624 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1625 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1626 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1628 init_output_filter(ofilter, o, oc);
1632 if (!o->nb_stream_maps) {
1633 /* pick the "best" stream of each type */
1634 #define NEW_STREAM(type, index)\
1636 ost = new_ ## type ## _stream(o, oc);\
1637 ost->source_index = index;\
1638 ost->sync_ist = input_streams[index];\
1639 input_streams[index]->discard = 0;\
1640 input_streams[index]->st->discard = AVDISCARD_NONE;\
1643 /* video: highest resolution */
1644 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1645 int area = 0, idx = -1;
1646 for (i = 0; i < nb_input_streams; i++) {
1647 ist = input_streams[i];
1648 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
1649 ist->st->codecpar->width * ist->st->codecpar->height > area) {
1650 area = ist->st->codecpar->width * ist->st->codecpar->height;
1654 NEW_STREAM(video, idx);
1657 /* audio: most channels */
1658 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1659 int channels = 0, idx = -1;
1660 for (i = 0; i < nb_input_streams; i++) {
1661 ist = input_streams[i];
1662 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
1663 ist->st->codecpar->channels > channels) {
1664 channels = ist->st->codecpar->channels;
1668 NEW_STREAM(audio, idx);
1671 /* subtitles: pick first */
1672 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1673 for (i = 0; i < nb_input_streams; i++)
1674 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1675 NEW_STREAM(subtitle, i);
1679 /* do something with data? */
1681 for (i = 0; i < o->nb_stream_maps; i++) {
1682 StreamMap *map = &o->stream_maps[i];
1687 if (map->linklabel) {
1689 OutputFilter *ofilter = NULL;
1692 for (j = 0; j < nb_filtergraphs; j++) {
1693 fg = filtergraphs[j];
1694 for (k = 0; k < fg->nb_outputs; k++) {
1695 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1696 if (out && !strcmp(out->name, map->linklabel)) {
1697 ofilter = fg->outputs[k];
1704 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1705 "in any defined filter graph.\n", map->linklabel);
1708 init_output_filter(ofilter, o, oc);
1710 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1711 switch (ist->st->codecpar->codec_type) {
1712 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1713 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1714 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1715 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1716 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1718 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1719 map->file_index, map->stream_index);
1723 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1724 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1725 map->sync_stream_index];
1727 ist->st->discard = AVDISCARD_NONE;
1732 /* handle attached files */
1733 for (i = 0; i < o->nb_attachments; i++) {
1735 uint8_t *attachment;
1739 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1740 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1744 if ((len = avio_size(pb)) <= 0) {
1745 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1749 if (!(attachment = av_malloc(len))) {
1750 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1754 avio_read(pb, attachment, len);
1756 ost = new_attachment_stream(o, oc);
1757 ost->stream_copy = 0;
1758 ost->source_index = -1;
1759 ost->attachment_filename = o->attachments[i];
1760 ost->st->codecpar->extradata = attachment;
1761 ost->st->codecpar->extradata_size = len;
1763 p = strrchr(o->attachments[i], '/');
1764 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1768 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
1769 av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
1770 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
1774 /* check if all codec options have been used */
1775 unused_opts = strip_specifiers(o->g->codec_opts);
1776 for (i = of->ost_index; i < nb_output_streams; i++) {
1778 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
1779 AV_DICT_IGNORE_SUFFIX)))
1780 av_dict_set(&unused_opts, e->key, NULL, 0);
1784 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1785 const AVClass *class = avcodec_get_class();
1786 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1787 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1790 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1791 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1792 "output file #%d (%s) is not an encoding option.\n", e->key,
1793 option->help ? option->help : "", nb_output_files - 1,
1798 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1799 "output file #%d (%s) has not been used for any stream. The most "
1800 "likely reason is either wrong type (e.g. a video option with "
1801 "no video streams) or that it is a private option of some encoder "
1802 "which was not actually used for any stream.\n", e->key,
1803 option->help ? option->help : "", nb_output_files - 1, filename);
1805 av_dict_free(&unused_opts);
1807 /* set the decoding_needed flags and create simple filtergraphs */
1808 for (i = of->ost_index; i < nb_output_streams; i++) {
1809 OutputStream *ost = output_streams[i];
1811 if (ost->encoding_needed && ost->source_index >= 0) {
1812 InputStream *ist = input_streams[ost->source_index];
1813 ist->decoding_needed = 1;
1815 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
1816 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
1817 err = init_simple_filtergraph(ist, ost);
1819 av_log(NULL, AV_LOG_ERROR,
1820 "Error initializing a simple filtergraph between streams "
1821 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
1822 nb_output_files - 1, ost->st->index);
1829 * We want CFR output if and only if one of those is true:
1830 * 1) user specified output framerate with -r
1831 * 2) user specified -vsync cfr
1832 * 3) output format is CFR and the user didn't force vsync to
1833 * something else than CFR
1835 * in such a case, set ost->frame_rate
1837 if (ost->encoding_needed && ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1838 int format_cfr = !(oc->oformat->flags & (AVFMT_NOTIMESTAMPS | AVFMT_VARIABLE_FPS));
1839 int need_cfr = !!ost->frame_rate.num;
1841 if (video_sync_method == VSYNC_CFR ||
1842 (video_sync_method == VSYNC_AUTO && format_cfr))
1845 if (need_cfr && !ost->frame_rate.num) {
1846 InputStream *ist = ost->source_index >= 0 ? input_streams[ost->source_index] : NULL;
1848 if (ist && ist->framerate.num)
1849 ost->frame_rate = ist->framerate;
1850 else if (ist && ist->st->avg_frame_rate.num)
1851 ost->frame_rate = ist->st->avg_frame_rate;
1853 av_log(NULL, AV_LOG_WARNING, "Constant framerate requested "
1854 "for the output stream #%d:%d, but no information "
1855 "about the input framerate is available. Falling "
1856 "back to a default value of 25fps. Use the -r option "
1857 "if you want a different framerate.\n",
1858 ost->file_index, ost->index);
1859 ost->frame_rate = (AVRational){ 25, 1 };
1863 if (need_cfr && ost->enc->supported_framerates && !ost->force_fps) {
1864 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
1865 ost->frame_rate = ost->enc->supported_framerates[idx];
1869 /* set the filter output constraints */
1871 OutputFilter *f = ost->filter;
1873 switch (ost->enc_ctx->codec_type) {
1874 case AVMEDIA_TYPE_VIDEO:
1875 f->frame_rate = ost->frame_rate;
1876 f->width = ost->enc_ctx->width;
1877 f->height = ost->enc_ctx->height;
1878 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
1879 f->format = ost->enc_ctx->pix_fmt;
1880 } else if (ost->enc->pix_fmts) {
1882 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
1884 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
1887 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
1890 case AVMEDIA_TYPE_AUDIO:
1891 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
1892 f->format = ost->enc_ctx->sample_fmt;
1893 } else if (ost->enc->sample_fmts) {
1895 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
1897 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
1900 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
1902 if (ost->enc_ctx->sample_rate) {
1903 f->sample_rate = ost->enc_ctx->sample_rate;
1904 } else if (ost->enc->supported_samplerates) {
1906 while (ost->enc->supported_samplerates[count])
1908 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
1909 if (!f->sample_rates)
1911 memcpy(f->sample_rates, ost->enc->supported_samplerates,
1912 (count + 1) * sizeof(*f->sample_rates));
1914 if (ost->enc_ctx->channels) {
1915 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
1916 } else if (ost->enc->channel_layouts) {
1918 while (ost->enc->channel_layouts[count])
1920 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
1921 if (!f->channel_layouts)
1923 memcpy(f->channel_layouts, ost->enc->channel_layouts,
1924 (count + 1) * sizeof(*f->channel_layouts));
1932 /* check filename in case of an image number is expected */
1933 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1934 if (!av_filename_number_test(oc->filename)) {
1935 print_error(oc->filename, AVERROR(EINVAL));
1940 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1941 /* test if it already exists to avoid losing precious files */
1942 assert_file_overwrite(filename);
1945 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1946 &oc->interrupt_callback,
1948 print_error(filename, err);
1953 if (o->mux_preload) {
1955 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1956 av_dict_set(&of->opts, "preload", buf, 0);
1958 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1959 oc->flags |= AVFMT_FLAG_NONBLOCK;
1962 for (i = 0; i < o->nb_metadata_map; i++) {
1964 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1966 if (in_file_index >= nb_input_files) {
1967 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1970 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1971 in_file_index >= 0 ?
1972 input_files[in_file_index]->ctx : NULL, o);
1976 if (o->chapters_input_file >= nb_input_files) {
1977 if (o->chapters_input_file == INT_MAX) {
1978 /* copy chapters from the first input file that has them*/
1979 o->chapters_input_file = -1;
1980 for (i = 0; i < nb_input_files; i++)
1981 if (input_files[i]->ctx->nb_chapters) {
1982 o->chapters_input_file = i;
1986 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1987 o->chapters_input_file);
1991 if (o->chapters_input_file >= 0)
1992 copy_chapters(input_files[o->chapters_input_file], of,
1993 !o->metadata_chapters_manual);
1995 /* copy global metadata by default */
1996 if (!o->metadata_global_manual && nb_input_files)
1997 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1998 AV_DICT_DONT_OVERWRITE);
1999 if (!o->metadata_streams_manual)
2000 for (i = of->ost_index; i < nb_output_streams; i++) {
2002 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2004 ist = input_streams[output_streams[i]->source_index];
2005 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2008 /* process manually set metadata */
2009 for (i = 0; i < o->nb_metadata; i++) {
2012 const char *stream_spec;
2013 int index = 0, j, ret;
2015 val = strchr(o->metadata[i].u.str, '=');
2017 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2018 o->metadata[i].u.str);
2023 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2025 for (j = 0; j < oc->nb_streams; j++) {
2026 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2027 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2038 if (index < 0 || index >= oc->nb_chapters) {
2039 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2042 m = &oc->chapters[index]->metadata;
2045 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2048 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2055 static int opt_target(void *optctx, const char *opt, const char *arg)
2057 OptionsContext *o = optctx;
2058 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2059 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2061 if (!strncmp(arg, "pal-", 4)) {
2064 } else if (!strncmp(arg, "ntsc-", 5)) {
2067 } else if (!strncmp(arg, "film-", 5)) {
2071 /* Try to determine PAL/NTSC by peeking in the input files */
2072 if (nb_input_files) {
2074 for (j = 0; j < nb_input_files; j++) {
2075 for (i = 0; i < input_files[j]->nb_streams; i++) {
2076 AVStream *st = input_files[j]->ctx->streams[i];
2077 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2079 fr = st->time_base.den * 1000 / st->time_base.num;
2083 } else if ((fr == 29970) || (fr == 23976)) {
2088 if (norm != UNKNOWN)
2092 if (norm != UNKNOWN)
2093 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2096 if (norm == UNKNOWN) {
2097 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2098 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2099 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2103 if (!strcmp(arg, "vcd")) {
2104 opt_video_codec(o, "c:v", "mpeg1video");
2105 opt_audio_codec(o, "c:a", "mp2");
2106 parse_option(o, "f", "vcd", options);
2108 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2109 parse_option(o, "r", frame_rates[norm], options);
2110 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2112 opt_default(NULL, "b", "1150000");
2113 opt_default(NULL, "maxrate", "1150000");
2114 opt_default(NULL, "minrate", "1150000");
2115 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
2117 opt_default(NULL, "b:a", "224000");
2118 parse_option(o, "ar", "44100", options);
2119 parse_option(o, "ac", "2", options);
2121 opt_default(NULL, "packetsize", "2324");
2122 opt_default(NULL, "muxrate", "3528"); // 2352 * 75 / 50;
2124 /* We have to offset the PTS, so that it is consistent with the SCR.
2125 SCR starts at 36000, but the first two packs contain only padding
2126 and the first pack from the other stream, respectively, may also have
2127 been written before.
2128 So the real data starts at SCR 36000+3*1200. */
2129 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2130 } else if (!strcmp(arg, "svcd")) {
2132 opt_video_codec(o, "c:v", "mpeg2video");
2133 opt_audio_codec(o, "c:a", "mp2");
2134 parse_option(o, "f", "svcd", options);
2136 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2137 parse_option(o, "r", frame_rates[norm], options);
2138 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2140 opt_default(NULL, "b", "2040000");
2141 opt_default(NULL, "maxrate", "2516000");
2142 opt_default(NULL, "minrate", "0"); // 1145000;
2143 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2144 opt_default(NULL, "scan_offset", "1");
2147 opt_default(NULL, "b:a", "224000");
2148 parse_option(o, "ar", "44100", options);
2150 opt_default(NULL, "packetsize", "2324");
2152 } else if (!strcmp(arg, "dvd")) {
2154 opt_video_codec(o, "c:v", "mpeg2video");
2155 opt_audio_codec(o, "c:a", "ac3");
2156 parse_option(o, "f", "dvd", options);
2158 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2159 parse_option(o, "r", frame_rates[norm], options);
2160 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2162 opt_default(NULL, "b", "6000000");
2163 opt_default(NULL, "maxrate", "9000000");
2164 opt_default(NULL, "minrate", "0"); // 1500000;
2165 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
2167 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2168 opt_default(NULL, "muxrate", "25200"); // from mplex project: data_rate = 1260000. mux_rate = data_rate / 50
2170 opt_default(NULL, "b:a", "448000");
2171 parse_option(o, "ar", "48000", options);
2173 } else if (!strncmp(arg, "dv", 2)) {
2175 parse_option(o, "f", "dv", options);
2177 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2178 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2179 norm == PAL ? "yuv420p" : "yuv411p", options);
2180 parse_option(o, "r", frame_rates[norm], options);
2182 parse_option(o, "ar", "48000", options);
2183 parse_option(o, "ac", "2", options);
2186 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2187 return AVERROR(EINVAL);
2190 av_dict_copy(&o->g->codec_opts, codec_opts, 0);
2191 av_dict_copy(&o->g->format_opts, format_opts, 0);
2196 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2198 av_free (vstats_filename);
2199 vstats_filename = av_strdup (arg);
2203 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2206 time_t today2 = time(NULL);
2207 struct tm *today = localtime(&today2);
2209 if (!today) { // maybe tomorrow
2210 av_log(NULL, AV_LOG_FATAL, "Unable to get current time.\n");
2214 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2216 return opt_vstats_file(NULL, opt, filename);
2219 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2221 OptionsContext *o = optctx;
2222 return parse_option(o, "frames:v", arg, options);
2225 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2227 OptionsContext *o = optctx;
2228 return parse_option(o, "frames:a", arg, options);
2231 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2233 OptionsContext *o = optctx;
2234 return parse_option(o, "frames:d", arg, options);
2237 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
2239 OptionsContext *o = optctx;
2240 return parse_option(o, "tag:v", arg, options);
2243 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
2245 OptionsContext *o = optctx;
2246 return parse_option(o, "tag:a", arg, options);
2249 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
2251 OptionsContext *o = optctx;
2252 return parse_option(o, "tag:s", arg, options);
2255 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2257 OptionsContext *o = optctx;
2258 return parse_option(o, "filter:v", arg, options);
2261 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2263 OptionsContext *o = optctx;
2264 return parse_option(o, "filter:a", arg, options);
2267 static int opt_vsync(void *optctx, const char *opt, const char *arg)
2269 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2270 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2271 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2273 if (video_sync_method == VSYNC_AUTO)
2274 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2278 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2280 OptionsContext *o = optctx;
2281 char layout_str[32];
2284 int ret, channels, ac_str_size;
2287 layout = av_get_channel_layout(arg);
2289 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2290 return AVERROR(EINVAL);
2292 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2293 ret = opt_default(NULL, opt, layout_str);
2297 /* set 'ac' option based on channel layout */
2298 channels = av_get_channel_layout_nb_channels(layout);
2299 snprintf(layout_str, sizeof(layout_str), "%d", channels);
2300 stream_str = strchr(opt, ':');
2301 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2302 ac_str = av_mallocz(ac_str_size);
2304 return AVERROR(ENOMEM);
2305 av_strlcpy(ac_str, "ac", 3);
2307 av_strlcat(ac_str, stream_str, ac_str_size);
2308 ret = parse_option(o, ac_str, layout_str, options);
2314 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2316 OptionsContext *o = optctx;
2317 return parse_option(o, "q:a", arg, options);
2320 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2322 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2323 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2324 return AVERROR(ENOMEM);
2325 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2326 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2327 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2328 return AVERROR(ENOMEM);
2332 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2334 uint8_t *graph_desc = read_file(arg);
2336 return AVERROR(EINVAL);
2338 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2339 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2340 return AVERROR(ENOMEM);
2341 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2342 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2346 void show_help_default(const char *opt, const char *arg)
2348 /* per-file options have at least one of those set */
2349 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2350 int show_advanced = 0, show_avoptions = 0;
2353 if (!strcmp(opt, "long"))
2355 else if (!strcmp(opt, "full"))
2356 show_advanced = show_avoptions = 1;
2358 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2363 printf("Getting help:\n"
2364 " -h -- print basic options\n"
2365 " -h long -- print more options\n"
2366 " -h full -- print all options (including all format and codec specific options, very long)\n"
2367 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
2368 " See man %s for detailed description of the options.\n"
2369 "\n", program_name);
2371 show_help_options(options, "Print help / information / capabilities:",
2374 show_help_options(options, "Global options (affect whole program "
2375 "instead of just one file:",
2376 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2378 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2379 per_file | OPT_EXIT, 0);
2381 show_help_options(options, "Per-file main options:", 0,
2382 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2383 OPT_EXIT, per_file);
2385 show_help_options(options, "Advanced per-file options:",
2386 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2388 show_help_options(options, "Video options:",
2389 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2391 show_help_options(options, "Advanced Video options:",
2392 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2394 show_help_options(options, "Audio options:",
2395 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2397 show_help_options(options, "Advanced Audio options:",
2398 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2399 show_help_options(options, "Subtitle options:",
2400 OPT_SUBTITLE, 0, 0);
2403 if (show_avoptions) {
2404 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2405 show_help_children(avcodec_get_class(), flags);
2406 show_help_children(avformat_get_class(), flags);
2407 show_help_children(sws_get_class(), flags);
2408 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM);
2412 void show_usage(void)
2414 printf("Hyper fast Audio and Video encoder\n");
2415 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2424 static const OptionGroupDef groups[] = {
2425 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2426 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2429 static int open_files(OptionGroupList *l, const char *inout,
2430 int (*open_file)(OptionsContext*, const char*))
2434 for (i = 0; i < l->nb_groups; i++) {
2435 OptionGroup *g = &l->groups[i];
2441 ret = parse_optgroup(&o, g);
2443 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2444 "%s.\n", inout, g->arg);
2448 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2449 ret = open_file(&o, g->arg);
2452 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2456 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2462 int avconv_parse_options(int argc, char **argv)
2464 OptionParseContext octx;
2468 memset(&octx, 0, sizeof(octx));
2470 /* split the commandline into an internal representation */
2471 ret = split_commandline(&octx, argc, argv, options, groups,
2472 FF_ARRAY_ELEMS(groups));
2474 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2478 /* apply global options */
2479 ret = parse_optgroup(NULL, &octx.global_opts);
2481 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2485 /* open input files */
2486 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2488 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2492 /* create the complex filtergraphs */
2493 ret = init_complex_filters();
2495 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
2499 /* open output files */
2500 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2502 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2507 uninit_parse_context(&octx);
2509 av_strerror(ret, error, sizeof(error));
2510 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2515 #define OFFSET(x) offsetof(OptionsContext, x)
2516 const OptionDef options[] = {
2518 CMDUTILS_COMMON_OPTIONS
2519 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2520 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2521 "force format", "fmt" },
2522 { "y", OPT_BOOL, { &file_overwrite },
2523 "overwrite output files" },
2524 { "n", OPT_BOOL, { &file_skip },
2525 "never overwrite output files" },
2526 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2527 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2528 "codec name", "codec" },
2529 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2530 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2531 "codec name", "codec" },
2532 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2533 OPT_OUTPUT, { .off = OFFSET(presets) },
2534 "preset name", "preset" },
2535 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2536 OPT_OUTPUT, { .func_arg = opt_map },
2537 "set input stream mapping",
2538 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2539 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2540 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2541 "set metadata information of outfile from infile",
2542 "outfile[,metadata]:infile[,metadata]" },
2543 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2544 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2545 "set chapters mapping", "input_file_index" },
2546 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2547 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2548 "record or transcode \"duration\" seconds of audio/video",
2550 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2551 "set the limit file size in bytes", "limit_size" },
2552 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2553 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2554 "set the start time offset", "time_off" },
2555 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2556 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2557 "enable/disable accurate seeking with -ss" },
2558 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2559 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2560 "set the input ts offset", "time_off" },
2561 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2562 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2563 "set the input ts scale", "scale" },
2564 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2565 "add metadata", "string=string" },
2566 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2567 OPT_OUTPUT, { .func_arg = opt_data_frames },
2568 "set the number of data frames to record", "number" },
2569 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2570 "add timings for benchmarking" },
2571 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2572 "set max runtime in seconds", "limit" },
2573 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2574 "dump each input packet" },
2575 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2576 "when dumping packets, also dump the payload" },
2577 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2578 OPT_INPUT, { .off = OFFSET(rate_emu) },
2579 "read input at native frame rate", "" },
2580 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2581 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2582 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2583 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
2584 "video sync method", "" },
2585 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2586 "audio sync method", "" },
2587 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2588 "audio drift threshold", "threshold" },
2589 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2590 "copy timestamps" },
2591 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2592 "copy input stream time base when stream copying" },
2593 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2594 OPT_OUTPUT, { .off = OFFSET(shortest) },
2595 "finish encoding within shortest input" },
2596 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2597 "timestamp discontinuity delta threshold", "threshold" },
2598 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2599 "exit on error", "error" },
2600 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2601 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2602 "copy initial non-keyframes" },
2603 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2604 "set the number of frames to record", "number" },
2605 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2606 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2607 "force codec tag/fourcc", "fourcc/tag" },
2608 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2609 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2610 "use fixed quality scale (VBR)", "q" },
2611 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2612 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2613 "use fixed quality scale (VBR)", "q" },
2614 { "b", HAS_ARG | OPT_INT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(bitrates) },
2615 "set stream bitrate in bits/second", "bitrate" },
2616 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2617 "set stream filterchain", "filter_list" },
2618 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2619 "read stream filtergraph description from a file", "filename" },
2620 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2621 "create a complex filtergraph", "graph_description" },
2622 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2623 "read complex filtergraph description from a file", "filename" },
2624 { "stats", OPT_BOOL, { &print_stats },
2625 "print progress report during encoding", },
2626 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2627 OPT_OUTPUT, { .func_arg = opt_attach },
2628 "add an attachment to the output file", "filename" },
2629 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2630 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2631 "extract an attachment into a file", "filename" },
2632 { "loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
2633 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
2636 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2637 "set the number of video frames to record", "number" },
2638 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2639 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2640 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2641 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2642 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2643 "set frame size (WxH or abbreviation)", "size" },
2644 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2645 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2646 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2647 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2648 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2649 "set pixel format", "format" },
2650 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2652 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2653 "discard threshold", "n" },
2654 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2655 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2656 "rate control override for specific intervals", "override" },
2657 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2658 OPT_OUTPUT, { .func_arg = opt_video_codec },
2659 "force video codec ('copy' to copy stream)", "codec" },
2660 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2661 "select the pass number (1 or 2)", "n" },
2662 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2663 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2664 "select two pass log file name prefix", "prefix" },
2665 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = &opt_vstats },
2666 "dump video coding statistics to file" },
2667 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
2668 "dump video coding statistics to file", "file" },
2669 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2670 "video filters", "filter list" },
2671 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2672 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2673 "specify intra matrix coeffs", "matrix" },
2674 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2675 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2676 "specify inter matrix coeffs", "matrix" },
2677 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2678 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2679 "top=1/bottom=0/auto=-1 field first", "" },
2680 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2681 "intra_dc_precision", "precision" },
2682 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2683 OPT_OUTPUT, { .func_arg = opt_video_tag },
2684 "force video tag/fourcc", "fourcc/tag" },
2685 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2686 "show QP histogram" },
2687 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2688 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2689 "force the selected framerate, disable the best supported framerate selection" },
2690 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2691 OPT_OUTPUT, { .func_arg = opt_streamid },
2692 "set the value of an outfile streamid", "streamIndex:value" },
2693 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2694 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2695 "force key frames at specified timestamps", "timestamps" },
2696 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2697 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
2698 "use HW accelerated decoding", "hwaccel name" },
2699 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2700 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
2701 "select a device for HW acceleration", "devicename" },
2702 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2703 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
2704 "select output format used with HW accelerated decoding", "format" },
2706 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
2707 "show available HW acceleration methods" },
2708 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
2709 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
2710 "automatically insert correct rotate filters" },
2711 { "hwaccel_lax_profile_check", OPT_BOOL | OPT_EXPERT, { &hwaccel_lax_profile_check},
2712 "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream" },
2715 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2716 "set the number of audio frames to record", "number" },
2717 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2718 "set audio quality (codec-specific)", "quality", },
2719 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2720 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2721 "set audio sampling rate (in Hz)", "rate" },
2722 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2723 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2724 "set number of audio channels", "channels" },
2725 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2727 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2728 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2729 "force audio codec ('copy' to copy stream)", "codec" },
2730 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2731 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2732 "force audio tag/fourcc", "fourcc/tag" },
2733 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2734 "change audio volume (256=normal)" , "volume" },
2735 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2736 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2737 "set sample format", "format" },
2738 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2739 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2740 "set channel layout", "layout" },
2741 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2742 "audio filters", "filter list" },
2744 /* subtitle options */
2745 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2746 "disable subtitle" },
2747 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2748 "force subtitle codec ('copy' to copy stream)", "codec" },
2749 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2750 , "force subtitle tag/fourcc", "fourcc/tag" },
2753 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2756 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2757 "set the maximum demux-decode delay", "seconds" },
2758 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2759 "set the initial demux-decode delay", "seconds" },
2761 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2762 "A comma-separated list of bitstream filters", "bitstream_filters" },
2764 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
2765 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
2767 /* data codec support */
2768 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2769 "force data codec ('copy' to copy stream)", "codec" },
2772 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
2773 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
2776 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
2777 "initialise hardware device", "args" },