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 MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
47 for (i = 0; i < o->nb_ ## name; i++) {\
48 char *spec = o->name[i].specifier;\
49 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
50 outvar = o->name[i].u.type;\
56 const HWAccel hwaccels[] = {
58 { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
61 { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
64 { "vda", vda_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
69 char *vstats_filename;
71 float audio_drift_threshold = 0.1;
72 float dts_delta_threshold = 10;
74 int audio_volume = 256;
75 int audio_sync_method = 0;
76 int video_sync_method = VSYNC_AUTO;
82 int exit_on_error = 0;
86 static int file_overwrite = 0;
87 static int file_skip = 0;
88 static int video_discard = 0;
89 static int intra_dc_precision = 8;
90 static int using_stdin = 0;
91 static int input_sync;
93 static void uninit_options(OptionsContext *o)
95 const OptionDef *po = options;
98 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
100 void *dst = (uint8_t*)o + po->u.off;
102 if (po->flags & OPT_SPEC) {
103 SpecifierOpt **so = dst;
104 int i, *count = (int*)(so + 1);
105 for (i = 0; i < *count; i++) {
106 av_freep(&(*so)[i].specifier);
107 if (po->flags & OPT_STRING)
108 av_freep(&(*so)[i].u.str);
112 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
117 for (i = 0; i < o->nb_stream_maps; i++)
118 av_freep(&o->stream_maps[i].linklabel);
119 av_freep(&o->stream_maps);
120 av_freep(&o->meta_data_maps);
121 av_freep(&o->streamid_map);
124 static void init_options(OptionsContext *o)
126 memset(o, 0, sizeof(*o));
128 o->mux_max_delay = 0.7;
129 o->start_time = AV_NOPTS_VALUE;
130 o->recording_time = INT64_MAX;
131 o->limit_filesize = UINT64_MAX;
132 o->chapters_input_file = INT_MAX;
133 o->accurate_seek = 1;
136 /* return a copy of the input with the stream specifiers removed from the keys */
137 static AVDictionary *strip_specifiers(AVDictionary *dict)
139 AVDictionaryEntry *e = NULL;
140 AVDictionary *ret = NULL;
142 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
143 char *p = strchr(e->key, ':');
147 av_dict_set(&ret, e->key, e->value, 0);
154 static double parse_frame_aspect_ratio(const char *arg)
161 p = strchr(arg, ':');
163 x = strtol(arg, &end, 10);
165 y = strtol(end + 1, &end, 10);
167 ar = (double)x / (double)y;
169 ar = strtod(arg, NULL);
172 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
178 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
180 OptionsContext *o = optctx;
181 return parse_option(o, "codec:a", arg, options);
184 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
186 OptionsContext *o = optctx;
187 return parse_option(o, "codec:v", arg, options);
190 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
192 OptionsContext *o = optctx;
193 return parse_option(o, "codec:s", arg, options);
196 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
198 OptionsContext *o = optctx;
199 return parse_option(o, "codec:d", arg, options);
202 static int opt_map(void *optctx, const char *opt, const char *arg)
204 OptionsContext *o = optctx;
206 int i, negative = 0, file_idx;
207 int sync_file_idx = -1, sync_stream_idx;
215 map = av_strdup(arg);
217 return AVERROR(ENOMEM);
219 /* parse sync stream first, just pick first matching stream */
220 if (sync = strchr(map, ',')) {
222 sync_file_idx = strtol(sync + 1, &sync, 0);
223 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
224 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
229 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
230 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
231 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
235 if (i == input_files[sync_file_idx]->nb_streams) {
236 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
237 "match any streams.\n", arg);
244 /* this mapping refers to lavfi output */
245 const char *c = map + 1;
246 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
247 m = &o->stream_maps[o->nb_stream_maps - 1];
248 m->linklabel = av_get_token(&c, "]");
250 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
254 file_idx = strtol(map, &p, 0);
255 if (file_idx >= nb_input_files || file_idx < 0) {
256 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
260 /* disable some already defined maps */
261 for (i = 0; i < o->nb_stream_maps; i++) {
262 m = &o->stream_maps[i];
263 if (file_idx == m->file_index &&
264 check_stream_specifier(input_files[m->file_index]->ctx,
265 input_files[m->file_index]->ctx->streams[m->stream_index],
266 *p == ':' ? p + 1 : p) > 0)
270 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
271 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
272 *p == ':' ? p + 1 : p) <= 0)
274 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
275 m = &o->stream_maps[o->nb_stream_maps - 1];
277 m->file_index = file_idx;
280 if (sync_file_idx >= 0) {
281 m->sync_file_index = sync_file_idx;
282 m->sync_stream_index = sync_stream_idx;
284 m->sync_file_index = file_idx;
285 m->sync_stream_index = i;
291 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
299 static int opt_attach(void *optctx, const char *opt, const char *arg)
301 OptionsContext *o = optctx;
302 GROW_ARRAY(o->attachments, o->nb_attachments);
303 o->attachments[o->nb_attachments - 1] = arg;
308 * Parse a metadata specifier passed as 'arg' parameter.
309 * @param arg metadata string to parse
310 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
311 * @param index for type c/p, chapter/program index is written here
312 * @param stream_spec for type s, the stream specifier is written here
314 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
322 if (*(++arg) && *arg != ':') {
323 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
326 *stream_spec = *arg == ':' ? arg + 1 : "";
331 *index = strtol(++arg, NULL, 0);
334 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
341 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
343 AVDictionary **meta_in = NULL;
344 AVDictionary **meta_out;
346 char type_in, type_out;
347 const char *istream_spec = NULL, *ostream_spec = NULL;
348 int idx_in = 0, idx_out = 0;
350 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
351 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
353 if (type_in == 'g' || type_out == 'g')
354 o->metadata_global_manual = 1;
355 if (type_in == 's' || type_out == 's')
356 o->metadata_streams_manual = 1;
357 if (type_in == 'c' || type_out == 'c')
358 o->metadata_chapters_manual = 1;
360 /* ic is NULL when just disabling automatic mappings */
364 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
365 if ((index) < 0 || (index) >= (nb_elems)) {\
366 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
371 #define SET_DICT(type, meta, context, index)\
374 meta = &context->metadata;\
377 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
378 meta = &context->chapters[index]->metadata;\
381 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
382 meta = &context->programs[index]->metadata;\
385 break; /* handled separately below */ \
386 default: av_assert0(0);\
389 SET_DICT(type_in, meta_in, ic, idx_in);
390 SET_DICT(type_out, meta_out, oc, idx_out);
392 /* for input streams choose first matching stream */
393 if (type_in == 's') {
394 for (i = 0; i < ic->nb_streams; i++) {
395 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
396 meta_in = &ic->streams[i]->metadata;
402 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
407 if (type_out == 's') {
408 for (i = 0; i < oc->nb_streams; i++) {
409 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
410 meta_out = &oc->streams[i]->metadata;
411 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
416 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
421 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
423 const AVCodecDescriptor *desc;
424 const char *codec_string = encoder ? "encoder" : "decoder";
428 avcodec_find_encoder_by_name(name) :
429 avcodec_find_decoder_by_name(name);
431 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
432 codec = encoder ? avcodec_find_encoder(desc->id) :
433 avcodec_find_decoder(desc->id);
435 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
436 codec_string, codec->name, desc->name);
440 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
443 if (codec->type != type) {
444 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
450 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
452 char *codec_name = NULL;
454 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
456 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
457 st->codec->codec_id = codec->id;
460 return avcodec_find_decoder(st->codec->codec_id);
463 /* Add all the streams from the given input file to the global
464 * list of input streams. */
465 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
469 for (i = 0; i < ic->nb_streams; i++) {
470 AVStream *st = ic->streams[i];
471 AVCodecContext *dec = st->codec;
472 InputStream *ist = av_mallocz(sizeof(*ist));
473 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
474 char *codec_tag = NULL;
480 GROW_ARRAY(input_streams, nb_input_streams);
481 input_streams[nb_input_streams - 1] = ist;
484 ist->file_index = nb_input_files;
486 st->discard = AVDISCARD_ALL;
489 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
491 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
493 uint32_t tag = strtol(codec_tag, &next, 0);
495 tag = AV_RL32(codec_tag);
496 st->codec->codec_tag = tag;
499 ist->dec = choose_decoder(o, ic, st);
500 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
502 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
504 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
508 ret = avcodec_copy_context(ist->dec_ctx, dec);
510 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
514 switch (dec->codec_type) {
515 case AVMEDIA_TYPE_VIDEO:
516 ist->resample_height = ist->dec_ctx->height;
517 ist->resample_width = ist->dec_ctx->width;
518 ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
520 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
521 if (framerate && av_parse_video_rate(&ist->framerate,
523 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
528 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
530 if (!strcmp(hwaccel, "none"))
531 ist->hwaccel_id = HWACCEL_NONE;
532 else if (!strcmp(hwaccel, "auto"))
533 ist->hwaccel_id = HWACCEL_AUTO;
536 for (i = 0; hwaccels[i].name; i++) {
537 if (!strcmp(hwaccels[i].name, hwaccel)) {
538 ist->hwaccel_id = hwaccels[i].id;
543 if (!ist->hwaccel_id) {
544 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
546 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
547 for (i = 0; hwaccels[i].name; i++)
548 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
549 av_log(NULL, AV_LOG_FATAL, "\n");
555 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
556 if (hwaccel_device) {
557 ist->hwaccel_device = av_strdup(hwaccel_device);
558 if (!ist->hwaccel_device)
561 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
564 case AVMEDIA_TYPE_AUDIO:
565 guess_input_channel_layout(ist);
567 ist->resample_sample_fmt = ist->dec_ctx->sample_fmt;
568 ist->resample_sample_rate = ist->dec_ctx->sample_rate;
569 ist->resample_channels = ist->dec_ctx->channels;
570 ist->resample_channel_layout = ist->dec_ctx->channel_layout;
573 case AVMEDIA_TYPE_DATA:
574 case AVMEDIA_TYPE_SUBTITLE:
575 case AVMEDIA_TYPE_ATTACHMENT:
576 case AVMEDIA_TYPE_UNKNOWN:
584 static void assert_file_overwrite(const char *filename)
586 if (file_overwrite && file_skip) {
587 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
591 if (!file_overwrite &&
592 (!strchr(filename, ':') || filename[1] == ':' ||
593 av_strstart(filename, "file:", NULL))) {
594 if (avio_check(filename, 0) == 0) {
595 if (!using_stdin && !file_skip) {
596 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
599 fprintf(stderr, "Not overwriting - exiting\n");
604 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
611 static void dump_attachment(AVStream *st, const char *filename)
614 AVIOContext *out = NULL;
615 AVDictionaryEntry *e;
617 if (!st->codec->extradata_size) {
618 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
619 nb_input_files - 1, st->index);
622 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
625 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
626 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
630 assert_file_overwrite(filename);
632 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
633 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
638 avio_write(out, st->codec->extradata, st->codec->extradata_size);
643 static int open_input_file(OptionsContext *o, const char *filename)
647 AVInputFormat *file_iformat = NULL;
652 AVDictionary *unused_opts = NULL;
653 AVDictionaryEntry *e = NULL;
654 int orig_nb_streams; // number of streams before avformat_find_stream_info
657 if (!(file_iformat = av_find_input_format(o->format))) {
658 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
663 if (!strcmp(filename, "-"))
666 using_stdin |= !strncmp(filename, "pipe:", 5) ||
667 !strcmp(filename, "/dev/stdin");
669 /* get default parameters from command line */
670 ic = avformat_alloc_context();
672 print_error(filename, AVERROR(ENOMEM));
675 if (o->nb_audio_sample_rate) {
676 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
677 av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
679 if (o->nb_audio_channels) {
680 /* because we set audio_channels based on both the "ac" and
681 * "channel_layout" options, we need to check that the specified
682 * demuxer actually has the "channels" option before setting it */
683 if (file_iformat && file_iformat->priv_class &&
684 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
685 AV_OPT_SEARCH_FAKE_OBJ)) {
686 snprintf(buf, sizeof(buf), "%d",
687 o->audio_channels[o->nb_audio_channels - 1].u.i);
688 av_dict_set(&o->g->format_opts, "channels", buf, 0);
691 if (o->nb_frame_rates) {
692 /* set the format-level framerate option;
693 * this is important for video grabbers, e.g. x11 */
694 if (file_iformat && file_iformat->priv_class &&
695 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
696 AV_OPT_SEARCH_FAKE_OBJ)) {
697 av_dict_set(&o->g->format_opts, "framerate",
698 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
701 if (o->nb_frame_sizes) {
702 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
704 if (o->nb_frame_pix_fmts)
705 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
707 ic->flags |= AVFMT_FLAG_NONBLOCK;
708 ic->interrupt_callback = int_cb;
710 /* open the input file with generic libav function */
711 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
713 print_error(filename, err);
716 assert_avoptions(o->g->format_opts);
718 /* apply forced codec ids */
719 for (i = 0; i < ic->nb_streams; i++)
720 choose_decoder(o, ic, ic->streams[i]);
722 /* Set AVCodecContext options for avformat_find_stream_info */
723 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
724 orig_nb_streams = ic->nb_streams;
726 /* If not enough info to get the stream parameters, we decode the
727 first frames to get it. (used in mpeg case for example) */
728 ret = avformat_find_stream_info(ic, opts);
730 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
731 avformat_close_input(&ic);
735 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
736 /* add the stream start time */
737 if (ic->start_time != AV_NOPTS_VALUE)
738 timestamp += ic->start_time;
740 /* if seeking requested, we execute it */
741 if (o->start_time != AV_NOPTS_VALUE) {
742 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
744 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
745 filename, (double)timestamp / AV_TIME_BASE);
749 /* update the current parameters so that they match the one of the input stream */
750 add_input_streams(o, ic);
752 /* dump the file content */
753 av_dump_format(ic, nb_input_files, filename, 0);
755 GROW_ARRAY(input_files, nb_input_files);
756 f = av_mallocz(sizeof(*f));
759 input_files[nb_input_files - 1] = f;
762 f->ist_index = nb_input_streams - ic->nb_streams;
763 f->start_time = o->start_time;
764 f->recording_time = o->recording_time;
765 f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
766 f->nb_streams = ic->nb_streams;
767 f->rate_emu = o->rate_emu;
768 f->accurate_seek = o->accurate_seek;
770 /* check if all codec options have been used */
771 unused_opts = strip_specifiers(o->g->codec_opts);
772 for (i = f->ist_index; i < nb_input_streams; i++) {
774 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
775 AV_DICT_IGNORE_SUFFIX)))
776 av_dict_set(&unused_opts, e->key, NULL, 0);
780 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
781 const AVClass *class = avcodec_get_class();
782 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
783 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
786 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
787 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
788 "input file #%d (%s) is not a decoding option.\n", e->key,
789 option->help ? option->help : "", nb_input_files - 1,
794 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
795 "input file #%d (%s) has not been used for any stream. The most "
796 "likely reason is either wrong type (e.g. a video option with "
797 "no video streams) or that it is a private option of some decoder "
798 "which was not actually used for any stream.\n", e->key,
799 option->help ? option->help : "", nb_input_files - 1, filename);
801 av_dict_free(&unused_opts);
803 for (i = 0; i < o->nb_dump_attachment; i++) {
806 for (j = 0; j < ic->nb_streams; j++) {
807 AVStream *st = ic->streams[j];
809 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
810 dump_attachment(st, o->dump_attachment[i].u.str);
814 for (i = 0; i < orig_nb_streams; i++)
815 av_dict_free(&opts[i]);
821 static uint8_t *get_line(AVIOContext *s)
827 if (avio_open_dyn_buf(&line) < 0) {
828 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
832 while ((c = avio_r8(s)) && c != '\n')
835 avio_close_dyn_buf(line, &buf);
840 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
844 const char *base[3] = { getenv("AVCONV_DATADIR"),
849 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
853 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
854 i != 1 ? "" : "/.avconv", codec_name, preset_name);
855 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
858 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
859 i != 1 ? "" : "/.avconv", preset_name);
860 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
866 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
868 char *codec_name = NULL;
870 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
872 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
873 NULL, ost->st->codec->codec_type);
874 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
875 } else if (!strcmp(codec_name, "copy"))
876 ost->stream_copy = 1;
878 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
879 ost->st->codec->codec_id = ost->enc->id;
883 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
886 AVStream *st = avformat_new_stream(oc, NULL);
887 int idx = oc->nb_streams - 1, ret = 0;
888 char *bsf = NULL, *next, *codec_tag = NULL;
889 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
893 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
897 if (oc->nb_streams - 1 < o->nb_streamid_map)
898 st->id = o->streamid_map[oc->nb_streams - 1];
900 GROW_ARRAY(output_streams, nb_output_streams);
901 if (!(ost = av_mallocz(sizeof(*ost))))
903 output_streams[nb_output_streams - 1] = ost;
905 ost->file_index = nb_output_files - 1;
908 st->codec->codec_type = type;
909 choose_encoder(o, oc, ost);
911 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
913 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
916 ost->enc_ctx->codec_type = type;
919 AVIOContext *s = NULL;
920 char *buf = NULL, *arg = NULL, *preset = NULL;
922 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
924 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
925 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
928 if (!buf[0] || buf[0] == '#') {
932 if (!(arg = strchr(buf, '='))) {
933 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
937 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
939 } while (!s->eof_reached);
943 av_log(NULL, AV_LOG_FATAL,
944 "Preset %s specified for stream %d:%d, but could not be opened.\n",
945 preset, ost->file_index, ost->index);
949 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
952 ost->max_frames = INT64_MAX;
953 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
955 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
957 if (next = strchr(bsf, ','))
959 if (!(bsfc = av_bitstream_filter_init(bsf))) {
960 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
964 bsfc_prev->next = bsfc;
966 ost->bitstream_filters = bsfc;
972 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
974 uint32_t tag = strtol(codec_tag, &next, 0);
976 tag = AV_RL32(codec_tag);
977 ost->enc_ctx->codec_tag = tag;
980 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
982 ost->enc_ctx->flags |= CODEC_FLAG_QSCALE;
983 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
986 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
987 ost->enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
989 av_opt_get_int(o->g->sws_opts, "sws_flags", 0, &ost->sws_flags);
991 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
993 ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
994 ost->last_mux_dts = AV_NOPTS_VALUE;
999 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1002 const char *p = str;
1009 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1016 /* read file contents into a string */
1017 static uint8_t *read_file(const char *filename)
1019 AVIOContext *pb = NULL;
1020 AVIOContext *dyn_buf = NULL;
1021 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1022 uint8_t buf[1024], *str;
1025 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1029 ret = avio_open_dyn_buf(&dyn_buf);
1034 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1035 avio_write(dyn_buf, buf, ret);
1036 avio_w8(dyn_buf, 0);
1039 ret = avio_close_dyn_buf(dyn_buf, &str);
1045 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1048 AVStream *st = ost->st;
1049 char *filter = NULL, *filter_script = NULL;
1051 MATCH_PER_STREAM_OPT(filter_scripts, str, filter_script, oc, st);
1052 MATCH_PER_STREAM_OPT(filters, str, filter, oc, st);
1054 if (filter_script && filter) {
1055 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1056 "output stream #%d:%d.\n", nb_output_files, st->index);
1061 return read_file(filter_script);
1063 return av_strdup(filter);
1065 return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
1069 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
1073 AVCodecContext *video_enc;
1074 char *frame_aspect_ratio = NULL;
1076 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
1078 video_enc = ost->enc_ctx;
1080 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1081 if (frame_aspect_ratio)
1082 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
1084 if (!ost->stream_copy) {
1085 const char *p = NULL;
1086 char *frame_rate = NULL, *frame_size = NULL;
1087 char *frame_pix_fmt = NULL;
1088 char *intra_matrix = NULL, *inter_matrix = NULL;
1092 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1093 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1094 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1098 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1099 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1100 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1104 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1105 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1106 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1109 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1111 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1113 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1114 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1117 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1119 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1121 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1122 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1125 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1128 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1129 for (i = 0; p; i++) {
1131 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1133 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1136 video_enc->rc_override =
1137 av_realloc(video_enc->rc_override,
1138 sizeof(RcOverride) * (i + 1));
1139 video_enc->rc_override[i].start_frame = start;
1140 video_enc->rc_override[i].end_frame = end;
1142 video_enc->rc_override[i].qscale = q;
1143 video_enc->rc_override[i].quality_factor = 1.0;
1146 video_enc->rc_override[i].qscale = 0;
1147 video_enc->rc_override[i].quality_factor = -q/100.0;
1152 video_enc->rc_override_count = i;
1153 video_enc->intra_dc_precision = intra_dc_precision - 8;
1156 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1159 video_enc->flags |= CODEC_FLAG_PASS1;
1161 video_enc->flags |= CODEC_FLAG_PASS2;
1165 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1166 if (ost->logfile_prefix &&
1167 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1170 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1171 if (ost->forced_keyframes)
1172 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1174 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1176 ost->top_field_first = -1;
1177 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1180 ost->avfilter = get_ost_filters(o, oc, ost);
1184 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1190 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
1194 AVCodecContext *audio_enc;
1196 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
1199 audio_enc = ost->enc_ctx;
1200 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1202 if (!ost->stream_copy) {
1203 char *sample_fmt = NULL;
1205 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1207 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1209 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1210 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1214 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1216 ost->avfilter = get_ost_filters(o, oc, ost);
1224 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
1228 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
1229 if (!ost->stream_copy) {
1230 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1237 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
1239 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
1240 ost->stream_copy = 1;
1245 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
1248 AVCodecContext *subtitle_enc;
1250 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
1251 subtitle_enc = ost->enc_ctx;
1253 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1258 /* arg format is "output-stream-index:streamid-value". */
1259 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1261 OptionsContext *o = optctx;
1266 av_strlcpy(idx_str, arg, sizeof(idx_str));
1267 p = strchr(idx_str, ':');
1269 av_log(NULL, AV_LOG_FATAL,
1270 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1275 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
1276 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1277 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1281 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1283 AVFormatContext *is = ifile->ctx;
1284 AVFormatContext *os = ofile->ctx;
1288 tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
1290 return AVERROR(ENOMEM);
1293 for (i = 0; i < is->nb_chapters; i++) {
1294 AVChapter *in_ch = is->chapters[i], *out_ch;
1295 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1296 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1297 AV_TIME_BASE_Q, in_ch->time_base);
1298 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1299 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1302 if (in_ch->end < ts_off)
1304 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1307 out_ch = av_mallocz(sizeof(AVChapter));
1309 return AVERROR(ENOMEM);
1311 out_ch->id = in_ch->id;
1312 out_ch->time_base = in_ch->time_base;
1313 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1314 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1317 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1319 os->chapters[os->nb_chapters++] = out_ch;
1324 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1325 AVFormatContext *oc)
1329 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1330 ofilter->out_tmp->pad_idx)) {
1331 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1332 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1334 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1339 ost->source_index = -1;
1340 ost->filter = ofilter;
1344 if (ost->stream_copy) {
1345 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1346 "which is fed from a complex filtergraph. Filtering and streamcopy "
1347 "cannot be used together.\n", ost->file_index, ost->index);
1351 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
1352 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
1355 avfilter_inout_free(&ofilter->out_tmp);
1358 static int configure_complex_filters(void)
1362 for (i = 0; i < nb_filtergraphs; i++)
1363 if (!filtergraphs[i]->graph &&
1364 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1369 static int open_output_file(OptionsContext *o, const char *filename)
1371 AVFormatContext *oc;
1373 AVOutputFormat *file_oformat;
1377 AVDictionary *unused_opts = NULL;
1378 AVDictionaryEntry *e = NULL;
1380 if (configure_complex_filters() < 0) {
1381 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
1385 GROW_ARRAY(output_files, nb_output_files);
1386 of = av_mallocz(sizeof(*of));
1389 output_files[nb_output_files - 1] = of;
1391 of->ost_index = nb_output_streams;
1392 of->recording_time = o->recording_time;
1393 of->start_time = o->start_time;
1394 of->limit_filesize = o->limit_filesize;
1395 of->shortest = o->shortest;
1396 av_dict_copy(&of->opts, o->g->format_opts, 0);
1398 if (!strcmp(filename, "-"))
1401 oc = avformat_alloc_context();
1403 print_error(filename, AVERROR(ENOMEM));
1407 if (o->recording_time != INT64_MAX)
1408 oc->duration = o->recording_time;
1411 file_oformat = av_guess_format(o->format, NULL, NULL);
1412 if (!file_oformat) {
1413 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
1417 file_oformat = av_guess_format(NULL, filename, NULL);
1418 if (!file_oformat) {
1419 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
1425 oc->oformat = file_oformat;
1426 oc->interrupt_callback = int_cb;
1427 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
1429 /* create streams for all unlabeled output pads */
1430 for (i = 0; i < nb_filtergraphs; i++) {
1431 FilterGraph *fg = filtergraphs[i];
1432 for (j = 0; j < fg->nb_outputs; j++) {
1433 OutputFilter *ofilter = fg->outputs[j];
1435 if (!ofilter->out_tmp || ofilter->out_tmp->name)
1438 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
1439 ofilter->out_tmp->pad_idx)) {
1440 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1441 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1442 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1444 init_output_filter(ofilter, o, oc);
1448 if (!o->nb_stream_maps) {
1449 /* pick the "best" stream of each type */
1450 #define NEW_STREAM(type, index)\
1452 ost = new_ ## type ## _stream(o, oc);\
1453 ost->source_index = index;\
1454 ost->sync_ist = input_streams[index];\
1455 input_streams[index]->discard = 0;\
1456 input_streams[index]->st->discard = AVDISCARD_NONE;\
1459 /* video: highest resolution */
1460 if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
1461 int area = 0, idx = -1;
1462 for (i = 0; i < nb_input_streams; i++) {
1463 ist = input_streams[i];
1464 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1465 ist->st->codec->width * ist->st->codec->height > area) {
1466 area = ist->st->codec->width * ist->st->codec->height;
1470 NEW_STREAM(video, idx);
1473 /* audio: most channels */
1474 if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
1475 int channels = 0, idx = -1;
1476 for (i = 0; i < nb_input_streams; i++) {
1477 ist = input_streams[i];
1478 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
1479 ist->st->codec->channels > channels) {
1480 channels = ist->st->codec->channels;
1484 NEW_STREAM(audio, idx);
1487 /* subtitles: pick first */
1488 if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
1489 for (i = 0; i < nb_input_streams; i++)
1490 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
1491 NEW_STREAM(subtitle, i);
1495 /* do something with data? */
1497 for (i = 0; i < o->nb_stream_maps; i++) {
1498 StreamMap *map = &o->stream_maps[i];
1503 if (map->linklabel) {
1505 OutputFilter *ofilter = NULL;
1508 for (j = 0; j < nb_filtergraphs; j++) {
1509 fg = filtergraphs[j];
1510 for (k = 0; k < fg->nb_outputs; k++) {
1511 AVFilterInOut *out = fg->outputs[k]->out_tmp;
1512 if (out && !strcmp(out->name, map->linklabel)) {
1513 ofilter = fg->outputs[k];
1520 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
1521 "in any defined filter graph.\n", map->linklabel);
1524 init_output_filter(ofilter, o, oc);
1526 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
1527 switch (ist->st->codec->codec_type) {
1528 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
1529 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
1530 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
1531 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
1532 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
1534 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
1535 map->file_index, map->stream_index);
1539 ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
1540 ost->sync_ist = input_streams[input_files[map->sync_file_index]->ist_index +
1541 map->sync_stream_index];
1543 ist->st->discard = AVDISCARD_NONE;
1548 /* handle attached files */
1549 for (i = 0; i < o->nb_attachments; i++) {
1551 uint8_t *attachment;
1555 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
1556 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
1560 if ((len = avio_size(pb)) <= 0) {
1561 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
1565 if (!(attachment = av_malloc(len))) {
1566 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
1570 avio_read(pb, attachment, len);
1572 ost = new_attachment_stream(o, oc);
1573 ost->stream_copy = 0;
1574 ost->source_index = -1;
1575 ost->attachment_filename = o->attachments[i];
1576 ost->st->codec->extradata = attachment;
1577 ost->st->codec->extradata_size = len;
1579 p = strrchr(o->attachments[i], '/');
1580 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
1584 /* check if all codec options have been used */
1585 unused_opts = strip_specifiers(o->g->codec_opts);
1586 for (i = of->ost_index; i < nb_output_streams; i++) {
1588 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
1589 AV_DICT_IGNORE_SUFFIX)))
1590 av_dict_set(&unused_opts, e->key, NULL, 0);
1594 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1595 const AVClass *class = avcodec_get_class();
1596 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1597 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1600 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
1601 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1602 "output file #%d (%s) is not an encoding option.\n", e->key,
1603 option->help ? option->help : "", nb_output_files - 1,
1608 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1609 "output file #%d (%s) has not been used for any stream. The most "
1610 "likely reason is either wrong type (e.g. a video option with "
1611 "no video streams) or that it is a private option of some encoder "
1612 "which was not actually used for any stream.\n", e->key,
1613 option->help ? option->help : "", nb_output_files - 1, filename);
1615 av_dict_free(&unused_opts);
1617 /* check filename in case of an image number is expected */
1618 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
1619 if (!av_filename_number_test(oc->filename)) {
1620 print_error(oc->filename, AVERROR(EINVAL));
1625 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
1626 /* test if it already exists to avoid losing precious files */
1627 assert_file_overwrite(filename);
1630 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
1631 &oc->interrupt_callback,
1633 print_error(filename, err);
1638 if (o->mux_preload) {
1640 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
1641 av_dict_set(&of->opts, "preload", buf, 0);
1643 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
1644 oc->flags |= AVFMT_FLAG_NONBLOCK;
1647 for (i = 0; i < o->nb_metadata_map; i++) {
1649 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
1651 if (in_file_index >= nb_input_files) {
1652 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
1655 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
1656 in_file_index >= 0 ?
1657 input_files[in_file_index]->ctx : NULL, o);
1661 if (o->chapters_input_file >= nb_input_files) {
1662 if (o->chapters_input_file == INT_MAX) {
1663 /* copy chapters from the first input file that has them*/
1664 o->chapters_input_file = -1;
1665 for (i = 0; i < nb_input_files; i++)
1666 if (input_files[i]->ctx->nb_chapters) {
1667 o->chapters_input_file = i;
1671 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
1672 o->chapters_input_file);
1676 if (o->chapters_input_file >= 0)
1677 copy_chapters(input_files[o->chapters_input_file], of,
1678 !o->metadata_chapters_manual);
1680 /* copy global metadata by default */
1681 if (!o->metadata_global_manual && nb_input_files)
1682 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
1683 AV_DICT_DONT_OVERWRITE);
1684 if (!o->metadata_streams_manual)
1685 for (i = of->ost_index; i < nb_output_streams; i++) {
1687 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
1689 ist = input_streams[output_streams[i]->source_index];
1690 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
1693 /* process manually set metadata */
1694 for (i = 0; i < o->nb_metadata; i++) {
1697 const char *stream_spec;
1698 int index = 0, j, ret;
1700 val = strchr(o->metadata[i].u.str, '=');
1702 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
1703 o->metadata[i].u.str);
1708 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
1710 for (j = 0; j < oc->nb_streams; j++) {
1711 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
1712 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
1723 if (index < 0 || index >= oc->nb_chapters) {
1724 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
1727 m = &oc->chapters[index]->metadata;
1730 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
1733 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
1740 static int opt_target(void *optctx, const char *opt, const char *arg)
1742 OptionsContext *o = optctx;
1743 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
1744 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
1746 if (!strncmp(arg, "pal-", 4)) {
1749 } else if (!strncmp(arg, "ntsc-", 5)) {
1752 } else if (!strncmp(arg, "film-", 5)) {
1756 /* Try to determine PAL/NTSC by peeking in the input files */
1757 if (nb_input_files) {
1759 for (j = 0; j < nb_input_files; j++) {
1760 for (i = 0; i < input_files[j]->nb_streams; i++) {
1761 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
1762 if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
1765 fr = c->time_base.den * 1000 / c->time_base.num;
1769 } else if ((fr == 29970) || (fr == 23976)) {
1774 if (norm != UNKNOWN)
1778 if (norm != UNKNOWN)
1779 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
1782 if (norm == UNKNOWN) {
1783 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
1784 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
1785 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
1789 if (!strcmp(arg, "vcd")) {
1790 opt_video_codec(o, "c:v", "mpeg1video");
1791 opt_audio_codec(o, "c:a", "mp2");
1792 parse_option(o, "f", "vcd", options);
1794 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
1795 parse_option(o, "r", frame_rates[norm], options);
1796 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1798 opt_default(NULL, "b", "1150000");
1799 opt_default(NULL, "maxrate", "1150000");
1800 opt_default(NULL, "minrate", "1150000");
1801 opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
1803 opt_default(NULL, "b:a", "224000");
1804 parse_option(o, "ar", "44100", options);
1805 parse_option(o, "ac", "2", options);
1807 opt_default(NULL, "packetsize", "2324");
1808 opt_default(NULL, "muxrate", "3528"); // 2352 * 75 / 50;
1810 /* We have to offset the PTS, so that it is consistent with the SCR.
1811 SCR starts at 36000, but the first two packs contain only padding
1812 and the first pack from the other stream, respectively, may also have
1813 been written before.
1814 So the real data starts at SCR 36000+3*1200. */
1815 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
1816 } else if (!strcmp(arg, "svcd")) {
1818 opt_video_codec(o, "c:v", "mpeg2video");
1819 opt_audio_codec(o, "c:a", "mp2");
1820 parse_option(o, "f", "svcd", options);
1822 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
1823 parse_option(o, "r", frame_rates[norm], options);
1824 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1826 opt_default(NULL, "b", "2040000");
1827 opt_default(NULL, "maxrate", "2516000");
1828 opt_default(NULL, "minrate", "0"); // 1145000;
1829 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1830 opt_default(NULL, "scan_offset", "1");
1833 opt_default(NULL, "b:a", "224000");
1834 parse_option(o, "ar", "44100", options);
1836 opt_default(NULL, "packetsize", "2324");
1838 } else if (!strcmp(arg, "dvd")) {
1840 opt_video_codec(o, "c:v", "mpeg2video");
1841 opt_audio_codec(o, "c:a", "ac3");
1842 parse_option(o, "f", "dvd", options);
1844 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1845 parse_option(o, "r", frame_rates[norm], options);
1846 opt_default(NULL, "g", norm == PAL ? "15" : "18");
1848 opt_default(NULL, "b", "6000000");
1849 opt_default(NULL, "maxrate", "9000000");
1850 opt_default(NULL, "minrate", "0"); // 1500000;
1851 opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
1853 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
1854 opt_default(NULL, "muxrate", "25200"); // from mplex project: data_rate = 1260000. mux_rate = data_rate / 50
1856 opt_default(NULL, "b:a", "448000");
1857 parse_option(o, "ar", "48000", options);
1859 } else if (!strncmp(arg, "dv", 2)) {
1861 parse_option(o, "f", "dv", options);
1863 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
1864 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
1865 norm == PAL ? "yuv420p" : "yuv411p", options);
1866 parse_option(o, "r", frame_rates[norm], options);
1868 parse_option(o, "ar", "48000", options);
1869 parse_option(o, "ac", "2", options);
1872 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
1873 return AVERROR(EINVAL);
1876 av_dict_copy(&o->g->codec_opts, codec_opts, 0);
1877 av_dict_copy(&o->g->format_opts, format_opts, 0);
1882 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
1884 av_free (vstats_filename);
1885 vstats_filename = av_strdup (arg);
1889 static int opt_vstats(void *optctx, const char *opt, const char *arg)
1892 time_t today2 = time(NULL);
1893 struct tm *today = localtime(&today2);
1895 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
1897 return opt_vstats_file(NULL, opt, filename);
1900 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
1902 OptionsContext *o = optctx;
1903 return parse_option(o, "frames:v", arg, options);
1906 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
1908 OptionsContext *o = optctx;
1909 return parse_option(o, "frames:a", arg, options);
1912 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
1914 OptionsContext *o = optctx;
1915 return parse_option(o, "frames:d", arg, options);
1918 static int opt_video_tag(void *optctx, const char *opt, const char *arg)
1920 OptionsContext *o = optctx;
1921 return parse_option(o, "tag:v", arg, options);
1924 static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
1926 OptionsContext *o = optctx;
1927 return parse_option(o, "tag:a", arg, options);
1930 static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
1932 OptionsContext *o = optctx;
1933 return parse_option(o, "tag:s", arg, options);
1936 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
1938 OptionsContext *o = optctx;
1939 return parse_option(o, "filter:v", arg, options);
1942 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
1944 OptionsContext *o = optctx;
1945 return parse_option(o, "filter:a", arg, options);
1948 static int opt_vsync(void *optctx, const char *opt, const char *arg)
1950 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
1951 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
1952 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
1954 if (video_sync_method == VSYNC_AUTO)
1955 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
1959 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
1961 OptionsContext *o = optctx;
1962 char layout_str[32];
1965 int ret, channels, ac_str_size;
1968 layout = av_get_channel_layout(arg);
1970 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
1971 return AVERROR(EINVAL);
1973 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
1974 ret = opt_default(NULL, opt, layout_str);
1978 /* set 'ac' option based on channel layout */
1979 channels = av_get_channel_layout_nb_channels(layout);
1980 snprintf(layout_str, sizeof(layout_str), "%d", channels);
1981 stream_str = strchr(opt, ':');
1982 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
1983 ac_str = av_mallocz(ac_str_size);
1985 return AVERROR(ENOMEM);
1986 av_strlcpy(ac_str, "ac", 3);
1988 av_strlcat(ac_str, stream_str, ac_str_size);
1989 ret = parse_option(o, ac_str, layout_str, options);
1995 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
1997 OptionsContext *o = optctx;
1998 return parse_option(o, "q:a", arg, options);
2001 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2003 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2004 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2005 return AVERROR(ENOMEM);
2006 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2007 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2008 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2009 return AVERROR(ENOMEM);
2013 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2015 uint8_t *graph_desc = read_file(arg);
2017 return AVERROR(EINVAL);
2019 GROW_ARRAY(filtergraphs, nb_filtergraphs);
2020 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2021 return AVERROR(ENOMEM);
2022 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2023 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2027 void show_help_default(const char *opt, const char *arg)
2029 /* per-file options have at least one of those set */
2030 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2031 int show_advanced = 0, show_avoptions = 0;
2034 if (!strcmp(opt, "long"))
2036 else if (!strcmp(opt, "full"))
2037 show_advanced = show_avoptions = 1;
2039 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2044 printf("Getting help:\n"
2045 " -h -- print basic options\n"
2046 " -h long -- print more options\n"
2047 " -h full -- print all options (including all format and codec specific options, very long)\n"
2048 " See man %s for detailed description of the options.\n"
2049 "\n", program_name);
2051 show_help_options(options, "Print help / information / capabilities:",
2054 show_help_options(options, "Global options (affect whole program "
2055 "instead of just one file:",
2056 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2058 show_help_options(options, "Advanced global options:", OPT_EXPERT,
2059 per_file | OPT_EXIT, 0);
2061 show_help_options(options, "Per-file main options:", 0,
2062 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2063 OPT_EXIT, per_file);
2065 show_help_options(options, "Advanced per-file options:",
2066 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2068 show_help_options(options, "Video options:",
2069 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2071 show_help_options(options, "Advanced Video options:",
2072 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2074 show_help_options(options, "Audio options:",
2075 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2077 show_help_options(options, "Advanced Audio options:",
2078 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2079 show_help_options(options, "Subtitle options:",
2080 OPT_SUBTITLE, 0, 0);
2083 if (show_avoptions) {
2084 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2085 show_help_children(avcodec_get_class(), flags);
2086 show_help_children(avformat_get_class(), flags);
2087 show_help_children(sws_get_class(), flags);
2088 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM);
2092 void show_usage(void)
2094 printf("Hyper fast Audio and Video encoder\n");
2095 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2104 static const OptionGroupDef groups[] = {
2105 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2106 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2109 static int open_files(OptionGroupList *l, const char *inout,
2110 int (*open_file)(OptionsContext*, const char*))
2114 for (i = 0; i < l->nb_groups; i++) {
2115 OptionGroup *g = &l->groups[i];
2121 ret = parse_optgroup(&o, g);
2123 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
2124 "%s.\n", inout, g->arg);
2128 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
2129 ret = open_file(&o, g->arg);
2132 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
2136 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
2142 int avconv_parse_options(int argc, char **argv)
2144 OptionParseContext octx;
2148 memset(&octx, 0, sizeof(octx));
2150 /* split the commandline into an internal representation */
2151 ret = split_commandline(&octx, argc, argv, options, groups,
2152 FF_ARRAY_ELEMS(groups));
2154 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
2158 /* apply global options */
2159 ret = parse_optgroup(NULL, &octx.global_opts);
2161 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
2165 /* open input files */
2166 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
2168 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
2172 /* open output files */
2173 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
2175 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
2180 uninit_parse_context(&octx);
2182 av_strerror(ret, error, sizeof(error));
2183 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
2188 #define OFFSET(x) offsetof(OptionsContext, x)
2189 const OptionDef options[] = {
2191 #include "cmdutils_common_opts.h"
2192 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
2193 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
2194 "force format", "fmt" },
2195 { "y", OPT_BOOL, { &file_overwrite },
2196 "overwrite output files" },
2197 { "n", OPT_BOOL, { &file_skip },
2198 "never overwrite output files" },
2199 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
2200 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2201 "codec name", "codec" },
2202 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
2203 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
2204 "codec name", "codec" },
2205 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
2206 OPT_OUTPUT, { .off = OFFSET(presets) },
2207 "preset name", "preset" },
2208 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2209 OPT_OUTPUT, { .func_arg = opt_map },
2210 "set input stream mapping",
2211 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2212 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
2213 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
2214 "set metadata information of outfile from infile",
2215 "outfile[,metadata]:infile[,metadata]" },
2216 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
2217 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
2218 "set chapters mapping", "input_file_index" },
2219 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
2220 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
2221 "record or transcode \"duration\" seconds of audio/video",
2223 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
2224 "set the limit file size in bytes", "limit_size" },
2225 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
2226 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
2227 "set the start time offset", "time_off" },
2228 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
2229 OPT_INPUT, { .off = OFFSET(accurate_seek) },
2230 "enable/disable accurate seeking with -ss" },
2231 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
2232 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
2233 "set the input ts offset", "time_off" },
2234 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
2235 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
2236 "set the input ts scale", "scale" },
2237 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
2238 "add metadata", "string=string" },
2239 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2240 OPT_OUTPUT, { .func_arg = opt_data_frames },
2241 "set the number of data frames to record", "number" },
2242 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
2243 "add timings for benchmarking" },
2244 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
2245 "set max runtime in seconds", "limit" },
2246 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
2247 "dump each input packet" },
2248 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
2249 "when dumping packets, also dump the payload" },
2250 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2251 OPT_INPUT, { .off = OFFSET(rate_emu) },
2252 "read input at native frame rate", "" },
2253 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
2254 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2255 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2256 { "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
2257 "video sync method", "" },
2258 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
2259 "audio sync method", "" },
2260 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
2261 "audio drift threshold", "threshold" },
2262 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
2263 "copy timestamps" },
2264 { "copytb", OPT_BOOL | OPT_EXPERT, { ©_tb },
2265 "copy input stream time base when stream copying" },
2266 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
2267 OPT_OUTPUT, { .off = OFFSET(shortest) },
2268 "finish encoding within shortest input" },
2269 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
2270 "timestamp discontinuity delta threshold", "threshold" },
2271 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
2272 "exit on error", "error" },
2273 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2274 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
2275 "copy initial non-keyframes" },
2276 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
2277 "set the number of frames to record", "number" },
2278 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
2279 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
2280 "force codec tag/fourcc", "fourcc/tag" },
2281 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2282 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2283 "use fixed quality scale (VBR)", "q" },
2284 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
2285 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
2286 "use fixed quality scale (VBR)", "q" },
2287 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
2288 "set stream filterchain", "filter_list" },
2289 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
2290 "read stream filtergraph description from a file", "filename" },
2291 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
2292 "create a complex filtergraph", "graph_description" },
2293 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
2294 "read complex filtergraph description from a file", "filename" },
2295 { "stats", OPT_BOOL, { &print_stats },
2296 "print progress report during encoding", },
2297 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
2298 OPT_OUTPUT, { .func_arg = opt_attach },
2299 "add an attachment to the output file", "filename" },
2300 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
2301 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
2302 "extract an attachment into a file", "filename" },
2305 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
2306 "set the number of video frames to record", "number" },
2307 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2308 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
2309 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2310 { "s", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2311 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
2312 "set frame size (WxH or abbreviation)", "size" },
2313 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
2314 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
2315 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2316 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2317 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
2318 "set pixel format", "format" },
2319 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(video_disable) },
2321 { "vdt", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &video_discard },
2322 "discard threshold", "n" },
2323 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2324 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
2325 "rate control override for specific intervals", "override" },
2326 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
2327 OPT_OUTPUT, { .func_arg = opt_video_codec },
2328 "force video codec ('copy' to copy stream)", "codec" },
2329 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
2330 "select the pass number (1 or 2)", "n" },
2331 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
2332 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
2333 "select two pass log file name prefix", "prefix" },
2334 { "vstats", OPT_VIDEO | OPT_EXPERT , { &opt_vstats },
2335 "dump video coding statistics to file" },
2336 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { opt_vstats_file },
2337 "dump video coding statistics to file", "file" },
2338 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
2339 "video filters", "filter list" },
2340 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2341 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
2342 "specify intra matrix coeffs", "matrix" },
2343 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
2344 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
2345 "specify inter matrix coeffs", "matrix" },
2346 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
2347 OPT_OUTPUT, { .off = OFFSET(top_field_first) },
2348 "top=1/bottom=0/auto=-1 field first", "" },
2349 { "dc", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &intra_dc_precision },
2350 "intra_dc_precision", "precision" },
2351 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2352 OPT_OUTPUT, { .func_arg = opt_video_tag },
2353 "force video tag/fourcc", "fourcc/tag" },
2354 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
2355 "show QP histogram" },
2356 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
2357 OPT_OUTPUT, { .off = OFFSET(force_fps) },
2358 "force the selected framerate, disable the best supported framerate selection" },
2359 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2360 OPT_OUTPUT, { .func_arg = opt_streamid },
2361 "set the value of an outfile streamid", "streamIndex:value" },
2362 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2363 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
2364 "force key frames at specified timestamps", "timestamps" },
2365 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2366 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
2367 "use HW accelerated decoding", "hwaccel name" },
2368 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
2369 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
2370 "select a device for HW acceleration" "devicename" },
2373 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
2374 "set the number of audio frames to record", "number" },
2375 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
2376 "set audio quality (codec-specific)", "quality", },
2377 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2378 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
2379 "set audio sampling rate (in Hz)", "rate" },
2380 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
2381 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
2382 "set number of audio channels", "channels" },
2383 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(audio_disable) },
2385 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
2386 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
2387 "force audio codec ('copy' to copy stream)", "codec" },
2388 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2389 OPT_OUTPUT, { .func_arg = opt_audio_tag },
2390 "force audio tag/fourcc", "fourcc/tag" },
2391 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
2392 "change audio volume (256=normal)" , "volume" },
2393 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
2394 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
2395 "set sample format", "format" },
2396 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
2397 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
2398 "set channel layout", "layout" },
2399 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
2400 "audio filters", "filter list" },
2402 /* subtitle options */
2403 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
2404 "disable subtitle" },
2405 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
2406 "force subtitle codec ('copy' to copy stream)", "codec" },
2407 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_subtitle_tag }
2408 , "force subtitle tag/fourcc", "fourcc/tag" },
2411 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
2414 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
2415 "set the maximum demux-decode delay", "seconds" },
2416 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
2417 "set the initial demux-decode delay", "seconds" },
2419 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
2420 "A comma-separated list of bitstream filters", "bitstream_filters" },
2422 /* data codec support */
2423 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
2424 "force data codec ('copy' to copy stream)", "codec" },