2 * ffmpeg option parsing
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavformat/avformat.h"
28 #include "libavcodec/avcodec.h"
30 #include "libavfilter/avfilter.h"
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 "ffmpeg2pass"
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 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
61 for (i = 0; i < o->nb_ ## name; i++) {\
62 char *spec = o->name[i].specifier;\
63 if (!strcmp(spec, mediatype))\
64 outvar = o->name[i].u.type;\
68 const HWAccel hwaccels[] = {
69 #if CONFIG_VIDEOTOOLBOX
70 { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
73 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
76 { "cuvid", cuvid_init, HWACCEL_CUVID, AV_PIX_FMT_CUDA },
80 AVBufferRef *hw_device_ctx;
81 HWDevice *filter_hw_device;
83 char *vstats_filename;
86 float audio_drift_threshold = 0.1;
87 float dts_delta_threshold = 10;
88 float dts_error_threshold = 3600*30;
90 int audio_volume = 256;
91 int audio_sync_method = 0;
92 int video_sync_method = VSYNC_AUTO;
93 float frame_drop_threshold = 0;
94 int do_deinterlace = 0;
96 int do_benchmark_all = 0;
100 int start_at_zero = 0;
103 int exit_on_error = 0;
104 int abort_on_flags = 0;
105 int print_stats = -1;
107 int stdin_interaction = 1;
108 int frame_bits_per_raw_sample = 0;
109 float max_error_rate = 2.0/3;
110 int filter_nbthreads = 0;
111 int filter_complex_nbthreads = 0;
112 int vstats_version = 2;
115 static int intra_only = 0;
116 static int file_overwrite = 0;
117 static int no_file_overwrite = 0;
118 static int do_psnr = 0;
119 static int input_sync;
120 static int input_stream_potentially_available = 0;
121 static int ignore_unknown_streams = 0;
122 static int copy_unknown_streams = 0;
123 static int find_stream_info = 1;
125 static void uninit_options(OptionsContext *o)
127 const OptionDef *po = options;
130 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
132 void *dst = (uint8_t*)o + po->u.off;
134 if (po->flags & OPT_SPEC) {
135 SpecifierOpt **so = dst;
136 int i, *count = (int*)(so + 1);
137 for (i = 0; i < *count; i++) {
138 av_freep(&(*so)[i].specifier);
139 if (po->flags & OPT_STRING)
140 av_freep(&(*so)[i].u.str);
144 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
149 for (i = 0; i < o->nb_stream_maps; i++)
150 av_freep(&o->stream_maps[i].linklabel);
151 av_freep(&o->stream_maps);
152 av_freep(&o->audio_channel_maps);
153 av_freep(&o->streamid_map);
154 av_freep(&o->attachments);
157 static void init_options(OptionsContext *o)
159 memset(o, 0, sizeof(*o));
161 o->stop_time = INT64_MAX;
162 o->mux_max_delay = 0.7;
163 o->start_time = AV_NOPTS_VALUE;
164 o->start_time_eof = AV_NOPTS_VALUE;
165 o->recording_time = INT64_MAX;
166 o->limit_filesize = UINT64_MAX;
167 o->chapters_input_file = INT_MAX;
168 o->accurate_seek = 1;
171 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
173 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
176 printf("Hardware acceleration methods:\n");
177 while ((type = av_hwdevice_iterate_types(type)) !=
178 AV_HWDEVICE_TYPE_NONE)
179 printf("%s\n", av_hwdevice_get_type_name(type));
180 for (i = 0; hwaccels[i].name; i++)
181 printf("%s\n", hwaccels[i].name);
186 /* return a copy of the input with the stream specifiers removed from the keys */
187 static AVDictionary *strip_specifiers(AVDictionary *dict)
189 AVDictionaryEntry *e = NULL;
190 AVDictionary *ret = NULL;
192 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
193 char *p = strchr(e->key, ':');
197 av_dict_set(&ret, e->key, e->value, 0);
204 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
206 static const AVOption opts[] = {
207 { "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
208 { "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
211 static const AVClass class = {
213 .item_name = av_default_item_name,
215 .version = LIBAVUTIL_VERSION_INT,
217 const AVClass *pclass = &class;
219 return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
222 static int opt_sameq(void *optctx, const char *opt, const char *arg)
224 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
225 "If you are looking for an option to preserve the quality (which is not "
226 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
228 return AVERROR(EINVAL);
231 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
233 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
234 return opt_default(optctx, "channel", arg);
237 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
239 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
240 return opt_default(optctx, "standard", arg);
243 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
245 OptionsContext *o = optctx;
246 return parse_option(o, "codec:a", arg, options);
249 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
251 OptionsContext *o = optctx;
252 return parse_option(o, "codec:v", arg, options);
255 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
257 OptionsContext *o = optctx;
258 return parse_option(o, "codec:s", arg, options);
261 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
263 OptionsContext *o = optctx;
264 return parse_option(o, "codec:d", arg, options);
267 static int opt_map(void *optctx, const char *opt, const char *arg)
269 OptionsContext *o = optctx;
271 int i, negative = 0, file_idx;
272 int sync_file_idx = -1, sync_stream_idx = 0;
281 map = av_strdup(arg);
283 return AVERROR(ENOMEM);
285 /* parse sync stream first, just pick first matching stream */
286 if (sync = strchr(map, ',')) {
288 sync_file_idx = strtol(sync + 1, &sync, 0);
289 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
290 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
295 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
296 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
297 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
301 if (i == input_files[sync_file_idx]->nb_streams) {
302 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
303 "match any streams.\n", arg);
310 /* this mapping refers to lavfi output */
311 const char *c = map + 1;
312 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
313 m = &o->stream_maps[o->nb_stream_maps - 1];
314 m->linklabel = av_get_token(&c, "]");
316 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
320 if (allow_unused = strchr(map, '?'))
322 file_idx = strtol(map, &p, 0);
323 if (file_idx >= nb_input_files || file_idx < 0) {
324 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
328 /* disable some already defined maps */
329 for (i = 0; i < o->nb_stream_maps; i++) {
330 m = &o->stream_maps[i];
331 if (file_idx == m->file_index &&
332 check_stream_specifier(input_files[m->file_index]->ctx,
333 input_files[m->file_index]->ctx->streams[m->stream_index],
334 *p == ':' ? p + 1 : p) > 0)
338 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
339 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
340 *p == ':' ? p + 1 : p) <= 0)
342 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
343 m = &o->stream_maps[o->nb_stream_maps - 1];
345 m->file_index = file_idx;
348 if (sync_file_idx >= 0) {
349 m->sync_file_index = sync_file_idx;
350 m->sync_stream_index = sync_stream_idx;
352 m->sync_file_index = file_idx;
353 m->sync_stream_index = i;
360 av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
362 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
363 "To ignore this, add a trailing '?' to the map.\n", arg);
372 static int opt_attach(void *optctx, const char *opt, const char *arg)
374 OptionsContext *o = optctx;
375 GROW_ARRAY(o->attachments, o->nb_attachments);
376 o->attachments[o->nb_attachments - 1] = arg;
380 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
382 OptionsContext *o = optctx;
388 mapchan = av_strdup(arg);
390 return AVERROR(ENOMEM);
392 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
393 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
395 /* muted channel syntax */
396 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
397 if ((n == 1 || n == 3) && m->channel_idx == -1) {
398 m->file_idx = m->stream_idx = -1;
400 m->ofile_idx = m->ostream_idx = -1;
406 n = sscanf(arg, "%d.%d.%d:%d.%d",
407 &m->file_idx, &m->stream_idx, &m->channel_idx,
408 &m->ofile_idx, &m->ostream_idx);
410 if (n != 3 && n != 5) {
411 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
412 "[file.stream.channel|-1][:syncfile:syncstream]\n");
416 if (n != 5) // only file.stream.channel specified
417 m->ofile_idx = m->ostream_idx = -1;
420 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
421 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
425 if (m->stream_idx < 0 ||
426 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
427 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
428 m->file_idx, m->stream_idx);
431 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
432 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
433 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
434 m->file_idx, m->stream_idx);
437 /* allow trailing ? to map_channel */
438 if (allow_unused = strchr(mapchan, '?'))
440 if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels) {
442 av_log(NULL, AV_LOG_VERBOSE, "mapchan: invalid audio channel #%d.%d.%d\n",
443 m->file_idx, m->stream_idx, m->channel_idx);
445 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n"
446 "To ignore this, add a trailing '?' to the map_channel.\n",
447 m->file_idx, m->stream_idx, m->channel_idx);
456 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
458 av_free(sdp_filename);
459 sdp_filename = av_strdup(arg);
464 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
467 const char *prefix = "vaapi:";
470 tmp = av_asprintf("%s%s", prefix, arg);
472 return AVERROR(ENOMEM);
473 err = hw_device_init_from_string(tmp, &dev);
477 hw_device_ctx = av_buffer_ref(dev->device_ref);
479 return AVERROR(ENOMEM);
484 static int opt_init_hw_device(void *optctx, const char *opt, const char *arg)
486 if (!strcmp(arg, "list")) {
487 enum AVHWDeviceType type = AV_HWDEVICE_TYPE_NONE;
488 printf("Supported hardware device types:\n");
489 while ((type = av_hwdevice_iterate_types(type)) !=
490 AV_HWDEVICE_TYPE_NONE)
491 printf("%s\n", av_hwdevice_get_type_name(type));
495 return hw_device_init_from_string(arg, NULL);
499 static int opt_filter_hw_device(void *optctx, const char *opt, const char *arg)
501 if (filter_hw_device) {
502 av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
503 return AVERROR(EINVAL);
505 filter_hw_device = hw_device_get_by_name(arg);
506 if (!filter_hw_device) {
507 av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg);
508 return AVERROR(EINVAL);
514 * Parse a metadata specifier passed as 'arg' parameter.
515 * @param arg metadata string to parse
516 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
517 * @param index for type c/p, chapter/program index is written here
518 * @param stream_spec for type s, the stream specifier is written here
520 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
528 if (*(++arg) && *arg != ':') {
529 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
532 *stream_spec = *arg == ':' ? arg + 1 : "";
537 *index = strtol(++arg, NULL, 0);
540 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
547 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
549 AVDictionary **meta_in = NULL;
550 AVDictionary **meta_out = NULL;
552 char type_in, type_out;
553 const char *istream_spec = NULL, *ostream_spec = NULL;
554 int idx_in = 0, idx_out = 0;
556 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
557 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
560 if (type_out == 'g' || !*outspec)
561 o->metadata_global_manual = 1;
562 if (type_out == 's' || !*outspec)
563 o->metadata_streams_manual = 1;
564 if (type_out == 'c' || !*outspec)
565 o->metadata_chapters_manual = 1;
569 if (type_in == 'g' || type_out == 'g')
570 o->metadata_global_manual = 1;
571 if (type_in == 's' || type_out == 's')
572 o->metadata_streams_manual = 1;
573 if (type_in == 'c' || type_out == 'c')
574 o->metadata_chapters_manual = 1;
576 /* ic is NULL when just disabling automatic mappings */
580 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
581 if ((index) < 0 || (index) >= (nb_elems)) {\
582 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
587 #define SET_DICT(type, meta, context, index)\
590 meta = &context->metadata;\
593 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
594 meta = &context->chapters[index]->metadata;\
597 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
598 meta = &context->programs[index]->metadata;\
601 break; /* handled separately below */ \
602 default: av_assert0(0);\
605 SET_DICT(type_in, meta_in, ic, idx_in);
606 SET_DICT(type_out, meta_out, oc, idx_out);
608 /* for input streams choose first matching stream */
609 if (type_in == 's') {
610 for (i = 0; i < ic->nb_streams; i++) {
611 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
612 meta_in = &ic->streams[i]->metadata;
618 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
623 if (type_out == 's') {
624 for (i = 0; i < oc->nb_streams; i++) {
625 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
626 meta_out = &oc->streams[i]->metadata;
627 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
632 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
637 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
639 OptionsContext *o = optctx;
641 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
642 struct tm time = *gmtime((time_t*)&recording_timestamp);
643 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
645 parse_option(o, "metadata", buf, options);
647 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
648 "tag instead.\n", opt);
652 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
654 const AVCodecDescriptor *desc;
655 const char *codec_string = encoder ? "encoder" : "decoder";
659 avcodec_find_encoder_by_name(name) :
660 avcodec_find_decoder_by_name(name);
662 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
663 codec = encoder ? avcodec_find_encoder(desc->id) :
664 avcodec_find_decoder(desc->id);
666 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
667 codec_string, codec->name, desc->name);
671 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
674 if (codec->type != type) {
675 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
681 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
683 char *codec_name = NULL;
685 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
687 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
688 st->codecpar->codec_id = codec->id;
691 return avcodec_find_decoder(st->codecpar->codec_id);
694 /* Add all the streams from the given input file to the global
695 * list of input streams. */
696 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
700 for (i = 0; i < ic->nb_streams; i++) {
701 AVStream *st = ic->streams[i];
702 AVCodecParameters *par = st->codecpar;
703 InputStream *ist = av_mallocz(sizeof(*ist));
704 char *framerate = NULL, *hwaccel_device = NULL;
705 const char *hwaccel = NULL;
706 char *hwaccel_output_format = NULL;
707 char *codec_tag = NULL;
709 char *discard_str = NULL;
710 const AVClass *cc = avcodec_get_class();
711 const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL, 0, 0);
716 GROW_ARRAY(input_streams, nb_input_streams);
717 input_streams[nb_input_streams - 1] = ist;
720 ist->file_index = nb_input_files;
722 st->discard = AVDISCARD_ALL;
724 ist->min_pts = INT64_MAX;
725 ist->max_pts = INT64_MIN;
728 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
731 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
733 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
735 uint32_t tag = strtol(codec_tag, &next, 0);
737 tag = AV_RL32(codec_tag);
738 st->codecpar->codec_tag = tag;
741 ist->dec = choose_decoder(o, ic, st);
742 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
744 ist->reinit_filters = -1;
745 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
747 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
748 ist->user_set_discard = AVDISCARD_NONE;
749 if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
750 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
755 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
757 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
759 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
763 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
765 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
770 ist->dec_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
772 switch (par->codec_type) {
773 case AVMEDIA_TYPE_VIDEO:
775 ist->dec = avcodec_find_decoder(par->codec_id);
777 if (st->codec->lowres) {
778 ist->dec_ctx->lowres = st->codec->lowres;
779 ist->dec_ctx->width = st->codec->width;
780 ist->dec_ctx->height = st->codec->height;
781 ist->dec_ctx->coded_width = st->codec->coded_width;
782 ist->dec_ctx->coded_height = st->codec->coded_height;
786 // avformat_find_stream_info() doesn't set this for us anymore.
787 ist->dec_ctx->framerate = st->avg_frame_rate;
789 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
790 if (framerate && av_parse_video_rate(&ist->framerate,
792 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
797 ist->top_field_first = -1;
798 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
800 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
802 // The NVDEC hwaccels use a CUDA device, so remap the name here.
803 if (!strcmp(hwaccel, "nvdec"))
806 if (!strcmp(hwaccel, "none"))
807 ist->hwaccel_id = HWACCEL_NONE;
808 else if (!strcmp(hwaccel, "auto"))
809 ist->hwaccel_id = HWACCEL_AUTO;
811 enum AVHWDeviceType type;
813 for (i = 0; hwaccels[i].name; i++) {
814 if (!strcmp(hwaccels[i].name, hwaccel)) {
815 ist->hwaccel_id = hwaccels[i].id;
820 if (!ist->hwaccel_id) {
821 type = av_hwdevice_find_type_by_name(hwaccel);
822 if (type != AV_HWDEVICE_TYPE_NONE) {
823 ist->hwaccel_id = HWACCEL_GENERIC;
824 ist->hwaccel_device_type = type;
828 if (!ist->hwaccel_id) {
829 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
831 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
832 type = AV_HWDEVICE_TYPE_NONE;
833 while ((type = av_hwdevice_iterate_types(type)) !=
834 AV_HWDEVICE_TYPE_NONE)
835 av_log(NULL, AV_LOG_FATAL, "%s ",
836 av_hwdevice_get_type_name(type));
837 for (i = 0; hwaccels[i].name; i++)
838 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
839 av_log(NULL, AV_LOG_FATAL, "\n");
845 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
846 if (hwaccel_device) {
847 ist->hwaccel_device = av_strdup(hwaccel_device);
848 if (!ist->hwaccel_device)
852 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
853 hwaccel_output_format, ic, st);
854 if (hwaccel_output_format) {
855 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
856 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
857 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
858 "format: %s", hwaccel_output_format);
861 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
864 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
867 case AVMEDIA_TYPE_AUDIO:
868 ist->guess_layout_max = INT_MAX;
869 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
870 guess_input_channel_layout(ist);
872 case AVMEDIA_TYPE_DATA:
873 case AVMEDIA_TYPE_SUBTITLE: {
874 char *canvas_size = NULL;
876 ist->dec = avcodec_find_decoder(par->codec_id);
877 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
878 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
880 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
881 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
886 case AVMEDIA_TYPE_ATTACHMENT:
887 case AVMEDIA_TYPE_UNKNOWN:
893 ret = avcodec_parameters_from_context(par, ist->dec_ctx);
895 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
901 static void assert_file_overwrite(const char *filename)
903 if (file_overwrite && no_file_overwrite) {
904 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
908 if (!file_overwrite) {
909 const char *proto_name = avio_find_protocol_name(filename);
910 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
911 if (stdin_interaction && !no_file_overwrite) {
912 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
915 signal(SIGINT, SIG_DFL);
917 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
923 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
930 static void dump_attachment(AVStream *st, const char *filename)
933 AVIOContext *out = NULL;
934 AVDictionaryEntry *e;
936 if (!st->codecpar->extradata_size) {
937 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
938 nb_input_files - 1, st->index);
941 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
944 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
945 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
949 assert_file_overwrite(filename);
951 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
952 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
957 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
962 static int open_input_file(OptionsContext *o, const char *filename)
966 AVInputFormat *file_iformat = NULL;
969 AVDictionary *unused_opts = NULL;
970 AVDictionaryEntry *e = NULL;
971 char * video_codec_name = NULL;
972 char * audio_codec_name = NULL;
973 char *subtitle_codec_name = NULL;
974 char * data_codec_name = NULL;
975 int scan_all_pmts_set = 0;
977 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
978 o->stop_time = INT64_MAX;
979 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
982 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
983 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
984 if (o->stop_time <= start_time) {
985 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
988 o->recording_time = o->stop_time - start_time;
993 if (!(file_iformat = av_find_input_format(o->format))) {
994 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
999 if (!strcmp(filename, "-"))
1002 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
1003 strcmp(filename, "/dev/stdin");
1005 /* get default parameters from command line */
1006 ic = avformat_alloc_context();
1008 print_error(filename, AVERROR(ENOMEM));
1011 if (o->nb_audio_sample_rate) {
1012 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
1014 if (o->nb_audio_channels) {
1015 /* because we set audio_channels based on both the "ac" and
1016 * "channel_layout" options, we need to check that the specified
1017 * demuxer actually has the "channels" option before setting it */
1018 if (file_iformat && file_iformat->priv_class &&
1019 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
1020 AV_OPT_SEARCH_FAKE_OBJ)) {
1021 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
1024 if (o->nb_frame_rates) {
1025 /* set the format-level framerate option;
1026 * this is important for video grabbers, e.g. x11 */
1027 if (file_iformat && file_iformat->priv_class &&
1028 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
1029 AV_OPT_SEARCH_FAKE_OBJ)) {
1030 av_dict_set(&o->g->format_opts, "framerate",
1031 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
1034 if (o->nb_frame_sizes) {
1035 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
1037 if (o->nb_frame_pix_fmts)
1038 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
1040 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
1041 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
1042 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
1043 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
1045 if (video_codec_name)
1046 ic->video_codec = find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
1047 if (audio_codec_name)
1048 ic->audio_codec = find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
1049 if (subtitle_codec_name)
1050 ic->subtitle_codec = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
1051 if (data_codec_name)
1052 ic->data_codec = find_codec_or_die(data_codec_name , AVMEDIA_TYPE_DATA , 0);
1054 ic->video_codec_id = video_codec_name ? ic->video_codec->id : AV_CODEC_ID_NONE;
1055 ic->audio_codec_id = audio_codec_name ? ic->audio_codec->id : AV_CODEC_ID_NONE;
1056 ic->subtitle_codec_id = subtitle_codec_name ? ic->subtitle_codec->id : AV_CODEC_ID_NONE;
1057 ic->data_codec_id = data_codec_name ? ic->data_codec->id : AV_CODEC_ID_NONE;
1059 ic->flags |= AVFMT_FLAG_NONBLOCK;
1061 ic->flags |= AVFMT_FLAG_BITEXACT;
1062 ic->interrupt_callback = int_cb;
1064 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
1065 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
1066 scan_all_pmts_set = 1;
1068 /* open the input file with generic avformat function */
1069 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1071 print_error(filename, err);
1072 if (err == AVERROR_PROTOCOL_NOT_FOUND)
1073 av_log(NULL, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1076 if (scan_all_pmts_set)
1077 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1078 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
1079 assert_avoptions(o->g->format_opts);
1081 /* apply forced codec ids */
1082 for (i = 0; i < ic->nb_streams; i++)
1083 choose_decoder(o, ic, ic->streams[i]);
1085 if (find_stream_info) {
1086 AVDictionary **opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
1087 int orig_nb_streams = ic->nb_streams;
1089 /* If not enough info to get the stream parameters, we decode the
1090 first frames to get it. (used in mpeg case for example) */
1091 ret = avformat_find_stream_info(ic, opts);
1093 for (i = 0; i < orig_nb_streams; i++)
1094 av_dict_free(&opts[i]);
1098 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
1099 if (ic->nb_streams == 0) {
1100 avformat_close_input(&ic);
1106 if (o->start_time_eof != AV_NOPTS_VALUE) {
1107 if (ic->duration>0) {
1108 o->start_time = o->start_time_eof + ic->duration;
1110 av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
1112 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
1113 /* add the stream start time */
1114 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1115 timestamp += ic->start_time;
1117 /* if seeking requested, we execute it */
1118 if (o->start_time != AV_NOPTS_VALUE) {
1119 int64_t seek_timestamp = timestamp;
1121 if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1122 int dts_heuristic = 0;
1123 for (i=0; i<ic->nb_streams; i++) {
1124 const AVCodecParameters *par = ic->streams[i]->codecpar;
1125 if (par->video_delay)
1128 if (dts_heuristic) {
1129 seek_timestamp -= 3*AV_TIME_BASE / 23;
1132 ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1134 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
1135 filename, (double)timestamp / AV_TIME_BASE);
1139 /* update the current parameters so that they match the one of the input stream */
1140 add_input_streams(o, ic);
1142 /* dump the file content */
1143 av_dump_format(ic, nb_input_files, filename, 0);
1145 GROW_ARRAY(input_files, nb_input_files);
1146 f = av_mallocz(sizeof(*f));
1149 input_files[nb_input_files - 1] = f;
1152 f->ist_index = nb_input_streams - ic->nb_streams;
1153 f->start_time = o->start_time;
1154 f->recording_time = o->recording_time;
1155 f->input_ts_offset = o->input_ts_offset;
1156 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1157 f->nb_streams = ic->nb_streams;
1158 f->rate_emu = o->rate_emu;
1159 f->accurate_seek = o->accurate_seek;
1162 f->time_base = (AVRational){ 1, 1 };
1164 f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
1167 /* check if all codec options have been used */
1168 unused_opts = strip_specifiers(o->g->codec_opts);
1169 for (i = f->ist_index; i < nb_input_streams; i++) {
1171 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1172 AV_DICT_IGNORE_SUFFIX)))
1173 av_dict_set(&unused_opts, e->key, NULL, 0);
1177 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1178 const AVClass *class = avcodec_get_class();
1179 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1180 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1181 const AVClass *fclass = avformat_get_class();
1182 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
1183 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1184 if (!option || foption)
1188 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1189 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1190 "input file #%d (%s) is not a decoding option.\n", e->key,
1191 option->help ? option->help : "", nb_input_files - 1,
1196 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1197 "input file #%d (%s) has not been used for any stream. The most "
1198 "likely reason is either wrong type (e.g. a video option with "
1199 "no video streams) or that it is a private option of some decoder "
1200 "which was not actually used for any stream.\n", e->key,
1201 option->help ? option->help : "", nb_input_files - 1, filename);
1203 av_dict_free(&unused_opts);
1205 for (i = 0; i < o->nb_dump_attachment; i++) {
1208 for (j = 0; j < ic->nb_streams; j++) {
1209 AVStream *st = ic->streams[j];
1211 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1212 dump_attachment(st, o->dump_attachment[i].u.str);
1216 input_stream_potentially_available = 1;
1221 static uint8_t *get_line(AVIOContext *s)
1227 if (avio_open_dyn_buf(&line) < 0) {
1228 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1232 while ((c = avio_r8(s)) && c != '\n')
1235 avio_close_dyn_buf(line, &buf);
1240 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1243 char filename[1000];
1244 const char *base[3] = { getenv("AVCONV_DATADIR"),
1249 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1253 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1254 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1255 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1258 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1259 i != 1 ? "" : "/.avconv", preset_name);
1260 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1266 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1268 enum AVMediaType type = ost->st->codecpar->codec_type;
1269 char *codec_name = NULL;
1271 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
1272 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1274 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->url,
1275 NULL, ost->st->codecpar->codec_type);
1276 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
1278 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
1279 "output stream #%d:%d. Default encoder for format %s (codec %s) is "
1280 "probably disabled. Please choose an encoder manually.\n",
1281 ost->file_index, ost->index, s->oformat->name,
1282 avcodec_get_name(ost->st->codecpar->codec_id));
1283 return AVERROR_ENCODER_NOT_FOUND;
1285 } else if (!strcmp(codec_name, "copy"))
1286 ost->stream_copy = 1;
1288 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
1289 ost->st->codecpar->codec_id = ost->enc->id;
1291 ost->encoding_needed = !ost->stream_copy;
1293 /* no encoding supported for other media types */
1294 ost->stream_copy = 1;
1295 ost->encoding_needed = 0;
1301 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1304 AVStream *st = avformat_new_stream(oc, NULL);
1305 int idx = oc->nb_streams - 1, ret = 0;
1306 const char *bsfs = NULL, *time_base = NULL;
1307 char *next, *codec_tag = NULL;
1312 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1316 if (oc->nb_streams - 1 < o->nb_streamid_map)
1317 st->id = o->streamid_map[oc->nb_streams - 1];
1319 GROW_ARRAY(output_streams, nb_output_streams);
1320 if (!(ost = av_mallocz(sizeof(*ost))))
1322 output_streams[nb_output_streams - 1] = ost;
1324 ost->file_index = nb_output_files - 1;
1327 st->codecpar->codec_type = type;
1329 ret = choose_encoder(o, oc, ost);
1331 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1332 "%d:%d\n", ost->file_index, ost->index);
1336 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1337 if (!ost->enc_ctx) {
1338 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1341 ost->enc_ctx->codec_type = type;
1343 ost->ref_par = avcodec_parameters_alloc();
1344 if (!ost->ref_par) {
1345 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding parameters.\n");
1350 AVIOContext *s = NULL;
1351 char *buf = NULL, *arg = NULL, *preset = NULL;
1353 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1355 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1356 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1359 if (!buf[0] || buf[0] == '#') {
1363 if (!(arg = strchr(buf, '='))) {
1364 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1368 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1370 } while (!s->eof_reached);
1374 av_log(NULL, AV_LOG_FATAL,
1375 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1376 preset, ost->file_index, ost->index);
1380 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1385 ost->enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
1387 MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
1390 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1391 q.num <= 0 || q.den <= 0) {
1392 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1398 MATCH_PER_STREAM_OPT(enc_time_bases, str, time_base, oc, st);
1401 if (av_parse_ratio(&q, time_base, INT_MAX, 0, NULL) < 0 ||
1403 av_log(NULL, AV_LOG_FATAL, "Invalid time base: %s\n", time_base);
1406 ost->enc_timebase = q;
1409 ost->max_frames = INT64_MAX;
1410 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1411 for (i = 0; i<o->nb_max_frames; i++) {
1412 char *p = o->max_frames[i].specifier;
1413 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1414 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1419 ost->copy_prior_start = -1;
1420 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1422 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1423 while (bsfs && *bsfs) {
1424 const AVBitStreamFilter *filter;
1425 char *bsf, *bsf_options_str, *bsf_name;
1427 bsf = av_get_token(&bsfs, ",");
1430 bsf_name = av_strtok(bsf, "=", &bsf_options_str);
1434 filter = av_bsf_get_by_name(bsf_name);
1436 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
1440 ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
1441 ost->nb_bitstream_filters + 1,
1442 sizeof(*ost->bsf_ctx));
1446 ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
1448 av_log(NULL, AV_LOG_ERROR, "Error allocating a bitstream filter context\n");
1452 ost->nb_bitstream_filters++;
1454 if (bsf_options_str && filter->priv_class) {
1455 const AVOption *opt = av_opt_next(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, NULL);
1456 const char * shorthand[2] = {NULL};
1459 shorthand[0] = opt->name;
1461 ret = av_opt_set_from_string(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, bsf_options_str, shorthand, "=", ":");
1463 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
1473 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1475 uint32_t tag = strtol(codec_tag, &next, 0);
1477 tag = AV_RL32(codec_tag);
1478 ost->st->codecpar->codec_tag =
1479 ost->enc_ctx->codec_tag = tag;
1482 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1484 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1485 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1488 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1489 ost->disposition = av_strdup(ost->disposition);
1491 ost->max_muxing_queue_size = 128;
1492 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1493 ost->max_muxing_queue_size *= sizeof(AVPacket);
1495 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1496 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1498 av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1500 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1501 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1502 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1504 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1506 ost->source_index = source_index;
1507 if (source_index >= 0) {
1508 ost->sync_ist = input_streams[source_index];
1509 input_streams[source_index]->discard = 0;
1510 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1512 ost->last_mux_dts = AV_NOPTS_VALUE;
1514 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1515 if (!ost->muxing_queue)
1521 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1524 const char *p = str;
1531 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1538 /* read file contents into a string */
1539 static uint8_t *read_file(const char *filename)
1541 AVIOContext *pb = NULL;
1542 AVIOContext *dyn_buf = NULL;
1543 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1544 uint8_t buf[1024], *str;
1547 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1551 ret = avio_open_dyn_buf(&dyn_buf);
1556 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1557 avio_write(dyn_buf, buf, ret);
1558 avio_w8(dyn_buf, 0);
1561 ret = avio_close_dyn_buf(dyn_buf, &str);
1567 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1570 AVStream *st = ost->st;
1572 if (ost->filters_script && ost->filters) {
1573 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1574 "output stream #%d:%d.\n", nb_output_files, st->index);
1578 if (ost->filters_script)
1579 return read_file(ost->filters_script);
1580 else if (ost->filters)
1581 return av_strdup(ost->filters);
1583 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1587 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1588 const OutputStream *ost, enum AVMediaType type)
1590 if (ost->filters_script || ost->filters) {
1591 av_log(NULL, AV_LOG_ERROR,
1592 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1593 "Filtering and streamcopy cannot be used together.\n",
1594 ost->filters ? "Filtergraph" : "Filtergraph script",
1595 ost->filters ? ost->filters : ost->filters_script,
1596 av_get_media_type_string(type), ost->file_index, ost->index);
1601 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1605 AVCodecContext *video_enc;
1606 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1608 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1610 video_enc = ost->enc_ctx;
1612 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1613 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1614 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1617 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1618 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1620 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1621 if (frame_aspect_ratio) {
1623 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1624 q.num <= 0 || q.den <= 0) {
1625 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1628 ost->frame_aspect_ratio = q;
1631 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1632 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1634 if (!ost->stream_copy) {
1635 const char *p = NULL;
1636 char *frame_size = NULL;
1637 char *frame_pix_fmt = NULL;
1638 char *intra_matrix = NULL, *inter_matrix = NULL;
1639 char *chroma_intra_matrix = NULL;
1643 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1644 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1645 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1649 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1650 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1651 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1652 ost->keep_pix_fmt = 1;
1653 if (!*++frame_pix_fmt)
1654 frame_pix_fmt = NULL;
1656 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1657 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1660 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1663 video_enc->gop_size = 0;
1664 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1666 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1667 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1670 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1672 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1673 if (chroma_intra_matrix) {
1674 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1676 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1679 video_enc->chroma_intra_matrix = p;
1680 parse_matrix_coeffs(p, chroma_intra_matrix);
1682 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1684 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1685 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1688 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1691 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1692 for (i = 0; p; i++) {
1694 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1696 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1699 video_enc->rc_override =
1700 av_realloc_array(video_enc->rc_override,
1701 i + 1, sizeof(RcOverride));
1702 if (!video_enc->rc_override) {
1703 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1706 video_enc->rc_override[i].start_frame = start;
1707 video_enc->rc_override[i].end_frame = end;
1709 video_enc->rc_override[i].qscale = q;
1710 video_enc->rc_override[i].quality_factor = 1.0;
1713 video_enc->rc_override[i].qscale = 0;
1714 video_enc->rc_override[i].quality_factor = -q/100.0;
1719 video_enc->rc_override_count = i;
1722 video_enc->flags|= AV_CODEC_FLAG_PSNR;
1725 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1728 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1729 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1732 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1733 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1737 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1738 if (ost->logfile_prefix &&
1739 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1743 char logfilename[1024];
1746 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1747 ost->logfile_prefix ? ost->logfile_prefix :
1748 DEFAULT_PASS_LOGFILENAME_PREFIX,
1750 if (!strcmp(ost->enc->name, "libx264")) {
1751 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1753 if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1754 char *logbuffer = read_file(logfilename);
1757 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1761 video_enc->stats_in = logbuffer;
1763 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1764 f = av_fopen_utf8(logfilename, "wb");
1766 av_log(NULL, AV_LOG_FATAL,
1767 "Cannot write log file '%s' for pass-1 encoding: %s\n",
1768 logfilename, strerror(errno));
1776 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1777 if (ost->forced_keyframes)
1778 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1780 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1782 ost->top_field_first = -1;
1783 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1786 ost->avfilter = get_ost_filters(o, oc, ost);
1790 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1793 if (ost->stream_copy)
1794 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1799 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1804 AVCodecContext *audio_enc;
1806 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1809 audio_enc = ost->enc_ctx;
1810 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1812 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1813 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1815 if (!ost->stream_copy) {
1816 char *sample_fmt = NULL;
1818 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1820 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1822 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1823 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1827 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1829 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1830 ost->apad = av_strdup(ost->apad);
1832 ost->avfilter = get_ost_filters(o, oc, ost);
1836 /* check for channel mapping for this audio stream */
1837 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1838 AudioChannelMap *map = &o->audio_channel_maps[n];
1839 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1840 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1843 if (map->channel_idx == -1) {
1845 } else if (ost->source_index < 0) {
1846 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1847 ost->file_index, ost->st->index);
1850 ist = input_streams[ost->source_index];
1853 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1854 if (av_reallocp_array(&ost->audio_channels_map,
1855 ost->audio_channels_mapped + 1,
1856 sizeof(*ost->audio_channels_map)
1860 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1866 if (ost->stream_copy)
1867 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1872 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1876 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1877 if (!ost->stream_copy) {
1878 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1885 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1889 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1890 if (!ost->stream_copy) {
1891 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1898 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1900 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1901 ost->stream_copy = 1;
1906 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1910 AVCodecContext *subtitle_enc;
1912 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1914 subtitle_enc = ost->enc_ctx;
1916 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1918 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1920 if (!ost->stream_copy) {
1921 char *frame_size = NULL;
1923 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1924 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1925 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1933 /* arg format is "output-stream-index:streamid-value". */
1934 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1936 OptionsContext *o = optctx;
1941 av_strlcpy(idx_str, arg, sizeof(idx_str));
1942 p = strchr(idx_str, ':');
1944 av_log(NULL, AV_LOG_FATAL,
1945 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1950 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1951 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1952 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1956 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1958 AVFormatContext *is = ifile->ctx;
1959 AVFormatContext *os = ofile->ctx;
1963 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1965 return AVERROR(ENOMEM);
1968 for (i = 0; i < is->nb_chapters; i++) {
1969 AVChapter *in_ch = is->chapters[i], *out_ch;
1970 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1971 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1972 AV_TIME_BASE_Q, in_ch->time_base);
1973 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1974 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1977 if (in_ch->end < ts_off)
1979 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1982 out_ch = av_mallocz(sizeof(AVChapter));
1984 return AVERROR(ENOMEM);
1986 out_ch->id = in_ch->id;
1987 out_ch->time_base = in_ch->time_base;
1988 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1989 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1992 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1994 os->chapters[os->nb_chapters++] = out_ch;
1999 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
2000 AVFormatContext *oc)
2004 switch (ofilter->type) {
2005 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
2006 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
2008 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
2013 ost->source_index = -1;
2014 ost->filter = ofilter;
2017 ofilter->format = -1;
2019 if (ost->stream_copy) {
2020 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
2021 "which is fed from a complex filtergraph. Filtering and streamcopy "
2022 "cannot be used together.\n", ost->file_index, ost->index);
2026 if (ost->avfilter && (ost->filters || ost->filters_script)) {
2027 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
2028 av_log(NULL, AV_LOG_ERROR,
2029 "%s '%s' was specified through the %s option "
2030 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
2031 "%s and -filter_complex cannot be used together for the same stream.\n",
2032 ost->filters ? "Filtergraph" : "Filtergraph script",
2033 ost->filters ? ost->filters : ost->filters_script,
2034 opt, ost->file_index, ost->index, opt);
2038 avfilter_inout_free(&ofilter->out_tmp);
2041 static int init_complex_filters(void)
2045 for (i = 0; i < nb_filtergraphs; i++) {
2046 ret = init_complex_filtergraph(filtergraphs[i]);
2053 static int open_output_file(OptionsContext *o, const char *filename)
2055 AVFormatContext *oc;
2060 AVDictionary *unused_opts = NULL;
2061 AVDictionaryEntry *e = NULL;
2062 int format_flags = 0;
2064 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
2065 o->stop_time = INT64_MAX;
2066 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
2069 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
2070 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
2071 if (o->stop_time <= start_time) {
2072 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
2075 o->recording_time = o->stop_time - start_time;
2079 GROW_ARRAY(output_files, nb_output_files);
2080 of = av_mallocz(sizeof(*of));
2083 output_files[nb_output_files - 1] = of;
2085 of->ost_index = nb_output_streams;
2086 of->recording_time = o->recording_time;
2087 of->start_time = o->start_time;
2088 of->limit_filesize = o->limit_filesize;
2089 of->shortest = o->shortest;
2090 av_dict_copy(&of->opts, o->g->format_opts, 0);
2092 if (!strcmp(filename, "-"))
2095 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
2097 print_error(filename, err);
2102 if (o->recording_time != INT64_MAX)
2103 oc->duration = o->recording_time;
2105 oc->interrupt_callback = int_cb;
2107 e = av_dict_get(o->g->format_opts, "fflags", NULL, 0);
2109 const AVOption *o = av_opt_find(oc, "fflags", NULL, 0, 0);
2110 av_opt_eval_flags(oc, o, e->value, &format_flags);
2113 format_flags |= AVFMT_FLAG_BITEXACT;
2114 oc->flags |= AVFMT_FLAG_BITEXACT;
2117 /* create streams for all unlabeled output pads */
2118 for (i = 0; i < nb_filtergraphs; i++) {
2119 FilterGraph *fg = filtergraphs[i];
2120 for (j = 0; j < fg->nb_outputs; j++) {
2121 OutputFilter *ofilter = fg->outputs[j];
2123 if (!ofilter->out_tmp || ofilter->out_tmp->name)
2126 switch (ofilter->type) {
2127 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
2128 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
2129 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
2131 init_output_filter(ofilter, o, oc);
2135 if (!o->nb_stream_maps) {
2136 char *subtitle_codec_name = NULL;
2137 /* pick the "best" stream of each type */
2139 /* video: highest resolution */
2140 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2141 int area = 0, idx = -1;
2142 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2143 for (i = 0; i < nb_input_streams; i++) {
2145 ist = input_streams[i];
2146 new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames;
2147 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2149 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
2151 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2158 new_video_stream(o, oc, idx);
2161 /* audio: most channels */
2162 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2163 int best_score = 0, idx = -1;
2164 for (i = 0; i < nb_input_streams; i++) {
2166 ist = input_streams[i];
2167 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames;
2168 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
2169 score > best_score) {
2175 new_audio_stream(o, oc, idx);
2178 /* subtitles: pick first */
2179 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2180 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2181 for (i = 0; i < nb_input_streams; i++)
2182 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2183 AVCodecDescriptor const *input_descriptor =
2184 avcodec_descriptor_get(input_streams[i]->st->codecpar->codec_id);
2185 AVCodecDescriptor const *output_descriptor = NULL;
2186 AVCodec const *output_codec =
2187 avcodec_find_encoder(oc->oformat->subtitle_codec);
2188 int input_props = 0, output_props = 0;
2190 output_descriptor = avcodec_descriptor_get(output_codec->id);
2191 if (input_descriptor)
2192 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2193 if (output_descriptor)
2194 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2195 if (subtitle_codec_name ||
2196 input_props & output_props ||
2197 // Map dvb teletext which has neither property to any output subtitle encoder
2198 input_descriptor && output_descriptor &&
2199 (!input_descriptor->props ||
2200 !output_descriptor->props)) {
2201 new_subtitle_stream(o, oc, i);
2206 /* Data only if codec id match */
2207 if (!o->data_disable ) {
2208 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2209 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2210 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
2211 && input_streams[i]->st->codecpar->codec_id == codec_id )
2212 new_data_stream(o, oc, i);
2216 for (i = 0; i < o->nb_stream_maps; i++) {
2217 StreamMap *map = &o->stream_maps[i];
2222 if (map->linklabel) {
2224 OutputFilter *ofilter = NULL;
2227 for (j = 0; j < nb_filtergraphs; j++) {
2228 fg = filtergraphs[j];
2229 for (k = 0; k < fg->nb_outputs; k++) {
2230 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2231 if (out && !strcmp(out->name, map->linklabel)) {
2232 ofilter = fg->outputs[k];
2239 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2240 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2243 init_output_filter(ofilter, o, oc);
2245 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2247 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2248 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
2250 if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
2252 if(o-> video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
2254 if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2258 switch (ist->st->codecpar->codec_type) {
2259 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2260 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2261 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2262 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2263 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2264 case AVMEDIA_TYPE_UNKNOWN:
2265 if (copy_unknown_streams) {
2266 ost = new_unknown_stream (o, oc, src_idx);
2270 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2271 "Cannot map stream #%d:%d - unsupported type.\n",
2272 map->file_index, map->stream_index);
2273 if (!ignore_unknown_streams) {
2274 av_log(NULL, AV_LOG_FATAL,
2275 "If you want unsupported types ignored instead "
2276 "of failing, please use the -ignore_unknown option\n"
2277 "If you want them copied, please use -copy_unknown\n");
2282 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2283 + map->sync_stream_index];
2288 /* handle attached files */
2289 for (i = 0; i < o->nb_attachments; i++) {
2291 uint8_t *attachment;
2295 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2296 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2300 if ((len = avio_size(pb)) <= 0) {
2301 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2305 if (!(attachment = av_malloc(len))) {
2306 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
2310 avio_read(pb, attachment, len);
2312 ost = new_attachment_stream(o, oc, -1);
2313 ost->stream_copy = 0;
2314 ost->attachment_filename = o->attachments[i];
2315 ost->st->codecpar->extradata = attachment;
2316 ost->st->codecpar->extradata_size = len;
2318 p = strrchr(o->attachments[i], '/');
2319 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2323 #if FF_API_LAVF_AVCTX
2324 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2325 AVDictionaryEntry *e;
2326 ost = output_streams[i];
2328 if ((ost->stream_copy || ost->attachment_filename)
2329 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2330 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2331 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2336 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2337 av_dump_format(oc, nb_output_files - 1, oc->url, 1);
2338 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2342 /* check if all codec options have been used */
2343 unused_opts = strip_specifiers(o->g->codec_opts);
2344 for (i = of->ost_index; i < nb_output_streams; i++) {
2346 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2347 AV_DICT_IGNORE_SUFFIX)))
2348 av_dict_set(&unused_opts, e->key, NULL, 0);
2352 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2353 const AVClass *class = avcodec_get_class();
2354 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2355 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2356 const AVClass *fclass = avformat_get_class();
2357 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2358 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2359 if (!option || foption)
2363 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2364 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2365 "output file #%d (%s) is not an encoding option.\n", e->key,
2366 option->help ? option->help : "", nb_output_files - 1,
2371 // gop_timecode is injected by generic code but not always used
2372 if (!strcmp(e->key, "gop_timecode"))
2375 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2376 "output file #%d (%s) has not been used for any stream. The most "
2377 "likely reason is either wrong type (e.g. a video option with "
2378 "no video streams) or that it is a private option of some encoder "
2379 "which was not actually used for any stream.\n", e->key,
2380 option->help ? option->help : "", nb_output_files - 1, filename);
2382 av_dict_free(&unused_opts);
2384 /* set the decoding_needed flags and create simple filtergraphs */
2385 for (i = of->ost_index; i < nb_output_streams; i++) {
2386 OutputStream *ost = output_streams[i];
2388 if (ost->encoding_needed && ost->source_index >= 0) {
2389 InputStream *ist = input_streams[ost->source_index];
2390 ist->decoding_needed |= DECODING_FOR_OST;
2392 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
2393 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2394 err = init_simple_filtergraph(ist, ost);
2396 av_log(NULL, AV_LOG_ERROR,
2397 "Error initializing a simple filtergraph between streams "
2398 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
2399 nb_output_files - 1, ost->st->index);
2405 /* set the filter output constraints */
2407 OutputFilter *f = ost->filter;
2409 switch (ost->enc_ctx->codec_type) {
2410 case AVMEDIA_TYPE_VIDEO:
2411 f->frame_rate = ost->frame_rate;
2412 f->width = ost->enc_ctx->width;
2413 f->height = ost->enc_ctx->height;
2414 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
2415 f->format = ost->enc_ctx->pix_fmt;
2416 } else if (ost->enc->pix_fmts) {
2418 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
2420 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2423 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
2426 case AVMEDIA_TYPE_AUDIO:
2427 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
2428 f->format = ost->enc_ctx->sample_fmt;
2429 } else if (ost->enc->sample_fmts) {
2431 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
2433 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2436 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
2438 if (ost->enc_ctx->sample_rate) {
2439 f->sample_rate = ost->enc_ctx->sample_rate;
2440 } else if (ost->enc->supported_samplerates) {
2442 while (ost->enc->supported_samplerates[count])
2444 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
2445 if (!f->sample_rates)
2447 memcpy(f->sample_rates, ost->enc->supported_samplerates,
2448 (count + 1) * sizeof(*f->sample_rates));
2450 if (ost->enc_ctx->channels) {
2451 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
2452 } else if (ost->enc->channel_layouts) {
2454 while (ost->enc->channel_layouts[count])
2456 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
2457 if (!f->channel_layouts)
2459 memcpy(f->channel_layouts, ost->enc->channel_layouts,
2460 (count + 1) * sizeof(*f->channel_layouts));
2467 /* check filename in case of an image number is expected */
2468 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2469 if (!av_filename_number_test(oc->url)) {
2470 print_error(oc->url, AVERROR(EINVAL));
2475 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2476 av_log(NULL, AV_LOG_ERROR,
2477 "No input streams but output needs an input stream\n");
2481 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2482 /* test if it already exists to avoid losing precious files */
2483 assert_file_overwrite(filename);
2486 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2487 &oc->interrupt_callback,
2489 print_error(filename, err);
2492 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2493 assert_file_overwrite(filename);
2495 if (o->mux_preload) {
2496 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2498 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2501 for (i = 0; i < o->nb_metadata_map; i++) {
2503 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2505 if (in_file_index >= nb_input_files) {
2506 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2509 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2510 in_file_index >= 0 ?
2511 input_files[in_file_index]->ctx : NULL, o);
2515 if (o->chapters_input_file >= nb_input_files) {
2516 if (o->chapters_input_file == INT_MAX) {
2517 /* copy chapters from the first input file that has them*/
2518 o->chapters_input_file = -1;
2519 for (i = 0; i < nb_input_files; i++)
2520 if (input_files[i]->ctx->nb_chapters) {
2521 o->chapters_input_file = i;
2525 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2526 o->chapters_input_file);
2530 if (o->chapters_input_file >= 0)
2531 copy_chapters(input_files[o->chapters_input_file], of,
2532 !o->metadata_chapters_manual);
2534 /* copy global metadata by default */
2535 if (!o->metadata_global_manual && nb_input_files){
2536 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2537 AV_DICT_DONT_OVERWRITE);
2538 if(o->recording_time != INT64_MAX)
2539 av_dict_set(&oc->metadata, "duration", NULL, 0);
2540 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2542 if (!o->metadata_streams_manual)
2543 for (i = of->ost_index; i < nb_output_streams; i++) {
2545 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2547 ist = input_streams[output_streams[i]->source_index];
2548 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2549 if (!output_streams[i]->stream_copy) {
2550 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2554 /* process manually set programs */
2555 for (i = 0; i < o->nb_program; i++) {
2556 const char *p = o->program[i].u.str;
2561 const char *p2 = av_get_token(&p, ":");
2562 const char *to_dealloc = p2;
2569 key = av_get_token(&p2, "=");
2571 av_freep(&to_dealloc);
2577 if (!strcmp(key, "program_num"))
2578 progid = strtol(p2, NULL, 0);
2579 av_freep(&to_dealloc);
2583 program = av_new_program(oc, progid);
2585 p = o->program[i].u.str;
2587 const char *p2 = av_get_token(&p, ":");
2588 const char *to_dealloc = p2;
2594 key = av_get_token(&p2, "=");
2596 av_log(NULL, AV_LOG_FATAL,
2597 "No '=' character in program string %s.\n",
2605 if (!strcmp(key, "title")) {
2606 av_dict_set(&program->metadata, "title", p2, 0);
2607 } else if (!strcmp(key, "program_num")) {
2608 } else if (!strcmp(key, "st")) {
2609 int st_num = strtol(p2, NULL, 0);
2610 av_program_add_stream_index(oc, progid, st_num);
2612 av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2615 av_freep(&to_dealloc);
2620 /* process manually set metadata */
2621 for (i = 0; i < o->nb_metadata; i++) {
2624 const char *stream_spec;
2625 int index = 0, j, ret = 0;
2627 val = strchr(o->metadata[i].u.str, '=');
2629 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2630 o->metadata[i].u.str);
2635 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2637 for (j = 0; j < oc->nb_streams; j++) {
2638 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2639 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2640 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2642 double theta = av_strtod(val, &tail);
2644 ost->rotate_overridden = 1;
2645 ost->rotate_override_value = theta;
2648 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2660 if (index < 0 || index >= oc->nb_chapters) {
2661 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2664 m = &oc->chapters[index]->metadata;
2667 if (index < 0 || index >= oc->nb_programs) {
2668 av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2671 m = &oc->programs[index]->metadata;
2674 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2677 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2684 static int opt_target(void *optctx, const char *opt, const char *arg)
2686 OptionsContext *o = optctx;
2687 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2688 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2690 if (!strncmp(arg, "pal-", 4)) {
2693 } else if (!strncmp(arg, "ntsc-", 5)) {
2696 } else if (!strncmp(arg, "film-", 5)) {
2700 /* Try to determine PAL/NTSC by peeking in the input files */
2701 if (nb_input_files) {
2703 for (j = 0; j < nb_input_files; j++) {
2704 for (i = 0; i < input_files[j]->nb_streams; i++) {
2705 AVStream *st = input_files[j]->ctx->streams[i];
2706 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2708 fr = st->time_base.den * 1000 / st->time_base.num;
2712 } else if ((fr == 29970) || (fr == 23976)) {
2717 if (norm != UNKNOWN)
2721 if (norm != UNKNOWN)
2722 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2725 if (norm == UNKNOWN) {
2726 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2727 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2728 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2732 if (!strcmp(arg, "vcd")) {
2733 opt_video_codec(o, "c:v", "mpeg1video");
2734 opt_audio_codec(o, "c:a", "mp2");
2735 parse_option(o, "f", "vcd", options);
2737 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2738 parse_option(o, "r", frame_rates[norm], options);
2739 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2741 opt_default(NULL, "b:v", "1150000");
2742 opt_default(NULL, "maxrate:v", "1150000");
2743 opt_default(NULL, "minrate:v", "1150000");
2744 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2746 opt_default(NULL, "b:a", "224000");
2747 parse_option(o, "ar", "44100", options);
2748 parse_option(o, "ac", "2", options);
2750 opt_default(NULL, "packetsize", "2324");
2751 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2753 /* We have to offset the PTS, so that it is consistent with the SCR.
2754 SCR starts at 36000, but the first two packs contain only padding
2755 and the first pack from the other stream, respectively, may also have
2756 been written before.
2757 So the real data starts at SCR 36000+3*1200. */
2758 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2759 } else if (!strcmp(arg, "svcd")) {
2761 opt_video_codec(o, "c:v", "mpeg2video");
2762 opt_audio_codec(o, "c:a", "mp2");
2763 parse_option(o, "f", "svcd", options);
2765 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2766 parse_option(o, "r", frame_rates[norm], options);
2767 parse_option(o, "pix_fmt", "yuv420p", options);
2768 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2770 opt_default(NULL, "b:v", "2040000");
2771 opt_default(NULL, "maxrate:v", "2516000");
2772 opt_default(NULL, "minrate:v", "0"); // 1145000;
2773 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2774 opt_default(NULL, "scan_offset", "1");
2776 opt_default(NULL, "b:a", "224000");
2777 parse_option(o, "ar", "44100", options);
2779 opt_default(NULL, "packetsize", "2324");
2781 } else if (!strcmp(arg, "dvd")) {
2783 opt_video_codec(o, "c:v", "mpeg2video");
2784 opt_audio_codec(o, "c:a", "ac3");
2785 parse_option(o, "f", "dvd", options);
2787 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2788 parse_option(o, "r", frame_rates[norm], options);
2789 parse_option(o, "pix_fmt", "yuv420p", options);
2790 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2792 opt_default(NULL, "b:v", "6000000");
2793 opt_default(NULL, "maxrate:v", "9000000");
2794 opt_default(NULL, "minrate:v", "0"); // 1500000;
2795 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2797 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2798 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2800 opt_default(NULL, "b:a", "448000");
2801 parse_option(o, "ar", "48000", options);
2803 } else if (!strncmp(arg, "dv", 2)) {
2805 parse_option(o, "f", "dv", options);
2807 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2808 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2809 norm == PAL ? "yuv420p" : "yuv411p", options);
2810 parse_option(o, "r", frame_rates[norm], options);
2812 parse_option(o, "ar", "48000", options);
2813 parse_option(o, "ac", "2", options);
2816 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2817 return AVERROR(EINVAL);
2820 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2821 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2826 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2828 av_free (vstats_filename);
2829 vstats_filename = av_strdup (arg);
2833 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2836 time_t today2 = time(NULL);
2837 struct tm *today = localtime(&today2);
2839 if (!today) { // maybe tomorrow
2840 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2844 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2846 return opt_vstats_file(NULL, opt, filename);
2849 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2851 OptionsContext *o = optctx;
2852 return parse_option(o, "frames:v", arg, options);
2855 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2857 OptionsContext *o = optctx;
2858 return parse_option(o, "frames:a", arg, options);
2861 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2863 OptionsContext *o = optctx;
2864 return parse_option(o, "frames:d", arg, options);
2867 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2870 AVDictionary *cbak = codec_opts;
2871 AVDictionary *fbak = format_opts;
2875 ret = opt_default(NULL, opt, arg);
2877 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2878 av_dict_copy(&o->g->format_opts, format_opts, 0);
2879 av_dict_free(&codec_opts);
2880 av_dict_free(&format_opts);
2887 static int opt_preset(void *optctx, const char *opt, const char *arg)
2889 OptionsContext *o = optctx;
2891 char filename[1000], line[1000], tmp_line[1000];
2892 const char *codec_name = NULL;
2896 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2898 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2899 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2900 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2902 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2906 while (fgets(line, sizeof(line), f)) {
2907 char *key = tmp_line, *value, *endptr;
2909 if (strcspn(line, "#\n\r") == 0)
2911 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2912 if (!av_strtok(key, "=", &value) ||
2913 !av_strtok(value, "\r\n", &endptr)) {
2914 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2917 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2919 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2920 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2921 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2922 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2923 else if (opt_default_new(o, key, value) < 0) {
2924 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2925 filename, line, key, value);
2935 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2937 OptionsContext *o = optctx;
2938 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2939 int ret = parse_option(o, s, arg, options);
2944 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2946 OptionsContext *o = optctx;
2948 if(!strcmp(opt, "ab")){
2949 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
2951 } else if(!strcmp(opt, "b")){
2952 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2953 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2956 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2960 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2962 OptionsContext *o = optctx;
2965 if(!strcmp(opt, "qscale")){
2966 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2967 return parse_option(o, "q:v", arg, options);
2969 s = av_asprintf("q%s", opt + 6);
2970 ret = parse_option(o, s, arg, options);
2975 static int opt_profile(void *optctx, const char *opt, const char *arg)
2977 OptionsContext *o = optctx;
2978 if(!strcmp(opt, "profile")){
2979 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2980 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2983 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2987 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2989 OptionsContext *o = optctx;
2990 return parse_option(o, "filter:v", arg, options);
2993 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2995 OptionsContext *o = optctx;
2996 return parse_option(o, "filter:a", arg, options);
2999 static int opt_vsync(void *optctx, const char *opt, const char *arg)
3001 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
3002 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
3003 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
3004 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
3006 if (video_sync_method == VSYNC_AUTO)
3007 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
3011 static int opt_timecode(void *optctx, const char *opt, const char *arg)
3013 OptionsContext *o = optctx;
3014 char *tcr = av_asprintf("timecode=%s", arg);
3015 int ret = parse_option(o, "metadata:g", tcr, options);
3017 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
3022 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
3024 OptionsContext *o = optctx;
3025 char layout_str[32];
3028 int ret, channels, ac_str_size;
3031 layout = av_get_channel_layout(arg);
3033 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
3034 return AVERROR(EINVAL);
3036 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
3037 ret = opt_default_new(o, opt, layout_str);
3041 /* set 'ac' option based on channel layout */
3042 channels = av_get_channel_layout_nb_channels(layout);
3043 snprintf(layout_str, sizeof(layout_str), "%d", channels);
3044 stream_str = strchr(opt, ':');
3045 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
3046 ac_str = av_mallocz(ac_str_size);
3048 return AVERROR(ENOMEM);
3049 av_strlcpy(ac_str, "ac", 3);
3051 av_strlcat(ac_str, stream_str, ac_str_size);
3052 ret = parse_option(o, ac_str, layout_str, options);
3058 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
3060 OptionsContext *o = optctx;
3061 return parse_option(o, "q:a", arg, options);
3064 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
3066 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3067 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3068 return AVERROR(ENOMEM);
3069 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3070 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
3071 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
3072 return AVERROR(ENOMEM);
3074 input_stream_potentially_available = 1;
3079 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
3081 uint8_t *graph_desc = read_file(arg);
3083 return AVERROR(EINVAL);
3085 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3086 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3087 return AVERROR(ENOMEM);
3088 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3089 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
3091 input_stream_potentially_available = 1;
3096 void show_help_default(const char *opt, const char *arg)
3098 /* per-file options have at least one of those set */
3099 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
3100 int show_advanced = 0, show_avoptions = 0;
3103 if (!strcmp(opt, "long"))
3105 else if (!strcmp(opt, "full"))
3106 show_advanced = show_avoptions = 1;
3108 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
3113 printf("Getting help:\n"
3114 " -h -- print basic options\n"
3115 " -h long -- print more options\n"
3116 " -h full -- print all options (including all format and codec specific options, very long)\n"
3117 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
3118 " See man %s for detailed description of the options.\n"
3119 "\n", program_name);
3121 show_help_options(options, "Print help / information / capabilities:",
3124 show_help_options(options, "Global options (affect whole program "
3125 "instead of just one file:",
3126 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
3128 show_help_options(options, "Advanced global options:", OPT_EXPERT,
3129 per_file | OPT_EXIT, 0);
3131 show_help_options(options, "Per-file main options:", 0,
3132 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
3133 OPT_EXIT, per_file);
3135 show_help_options(options, "Advanced per-file options:",
3136 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
3138 show_help_options(options, "Video options:",
3139 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
3141 show_help_options(options, "Advanced Video options:",
3142 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
3144 show_help_options(options, "Audio options:",
3145 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
3147 show_help_options(options, "Advanced Audio options:",
3148 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
3149 show_help_options(options, "Subtitle options:",
3150 OPT_SUBTITLE, 0, 0);
3153 if (show_avoptions) {
3154 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3155 show_help_children(avcodec_get_class(), flags);
3156 show_help_children(avformat_get_class(), flags);
3158 show_help_children(sws_get_class(), flags);
3160 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
3161 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
3165 void show_usage(void)
3167 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
3168 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3169 av_log(NULL, AV_LOG_INFO, "\n");
3177 static const OptionGroupDef groups[] = {
3178 [GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
3179 [GROUP_INFILE] = { "input url", "i", OPT_INPUT },
3182 static int open_files(OptionGroupList *l, const char *inout,
3183 int (*open_file)(OptionsContext*, const char*))
3187 for (i = 0; i < l->nb_groups; i++) {
3188 OptionGroup *g = &l->groups[i];
3194 ret = parse_optgroup(&o, g);
3196 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3197 "%s.\n", inout, g->arg);
3201 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3202 ret = open_file(&o, g->arg);
3205 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3209 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3215 int ffmpeg_parse_options(int argc, char **argv)
3217 OptionParseContext octx;
3221 memset(&octx, 0, sizeof(octx));
3223 /* split the commandline into an internal representation */
3224 ret = split_commandline(&octx, argc, argv, options, groups,
3225 FF_ARRAY_ELEMS(groups));
3227 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3231 /* apply global options */
3232 ret = parse_optgroup(NULL, &octx.global_opts);
3234 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3238 /* configure terminal and setup signal handlers */
3241 /* open input files */
3242 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3244 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3248 /* create the complex filtergraphs */
3249 ret = init_complex_filters();
3251 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3255 /* open output files */
3256 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3258 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3262 check_filter_outputs();
3265 uninit_parse_context(&octx);
3267 av_strerror(ret, error, sizeof(error));
3268 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3273 static int opt_progress(void *optctx, const char *opt, const char *arg)
3275 AVIOContext *avio = NULL;
3278 if (!strcmp(arg, "-"))
3280 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3282 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3283 arg, av_err2str(ret));
3286 progress_avio = avio;
3290 #define OFFSET(x) offsetof(OptionsContext, x)
3291 const OptionDef options[] = {
3293 CMDUTILS_COMMON_OPTIONS
3294 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3295 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3296 "force format", "fmt" },
3297 { "y", OPT_BOOL, { &file_overwrite },
3298 "overwrite output files" },
3299 { "n", OPT_BOOL, { &no_file_overwrite },
3300 "never overwrite output files" },
3301 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3302 "Ignore unknown stream types" },
3303 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
3304 "Copy unknown stream types" },
3305 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3306 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3307 "codec name", "codec" },
3308 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3309 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3310 "codec name", "codec" },
3311 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3312 OPT_OUTPUT, { .off = OFFSET(presets) },
3313 "preset name", "preset" },
3314 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3315 OPT_OUTPUT, { .func_arg = opt_map },
3316 "set input stream mapping",
3317 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3318 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3319 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3320 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3321 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3322 "set metadata information of outfile from infile",
3323 "outfile[,metadata]:infile[,metadata]" },
3324 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3325 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3326 "set chapters mapping", "input_file_index" },
3327 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3328 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3329 "record or transcode \"duration\" seconds of audio/video",
3331 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3332 "record or transcode stop time", "time_stop" },
3333 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3334 "set the limit file size in bytes", "limit_size" },
3335 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3336 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3337 "set the start time offset", "time_off" },
3338 { "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3339 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time_eof) },
3340 "set the start time offset relative to EOF", "time_off" },
3341 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3342 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3343 "enable/disable seeking by timestamp with -ss" },
3344 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3345 OPT_INPUT, { .off = OFFSET(accurate_seek) },
3346 "enable/disable accurate seeking with -ss" },
3347 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3348 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3349 "set the input ts offset", "time_off" },
3350 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3351 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3352 "set the input ts scale", "scale" },
3353 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3354 "set the recording timestamp ('now' to set the current time)", "time" },
3355 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3356 "add metadata", "string=string" },
3357 { "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3358 "add program with specified streams", "title=string:st=number..." },
3359 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3360 OPT_OUTPUT, { .func_arg = opt_data_frames },
3361 "set the number of data frames to output", "number" },
3362 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3363 "add timings for benchmarking" },
3364 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3365 "add timings for each task" },
3366 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3367 "write program-readable progress information", "url" },
3368 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3369 "enable or disable interaction on standard input" },
3370 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3371 "set max runtime in seconds", "limit" },
3372 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3373 "dump each input packet" },
3374 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3375 "when dumping packets, also dump the payload" },
3376 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3377 OPT_INPUT, { .off = OFFSET(rate_emu) },
3378 "read input at native frame rate", "" },
3379 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3380 "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3381 "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3382 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3383 "video sync method", "" },
3384 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3385 "frame drop threshold", "" },
3386 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3387 "audio sync method", "" },
3388 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3389 "audio drift threshold", "threshold" },
3390 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
3391 "copy timestamps" },
3392 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3393 "shift input timestamps to start at 0 when using copyts" },
3394 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
3395 "copy input stream time base when stream copying", "mode" },
3396 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3397 OPT_OUTPUT, { .off = OFFSET(shortest) },
3398 "finish encoding within shortest input" },
3399 { "bitexact", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3400 OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(bitexact) },
3402 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3403 OPT_OUTPUT, { .off = OFFSET(apad) },
3405 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3406 "timestamp discontinuity delta threshold", "threshold" },
3407 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3408 "timestamp error delta threshold", "threshold" },
3409 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3410 "exit on error", "error" },
3411 { "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3412 "abort on the specified condition flags", "flags" },
3413 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3414 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3415 "copy initial non-keyframes" },
3416 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3417 "copy or discard frames before start time" },
3418 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3419 "set the number of frames to output", "number" },
3420 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3421 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3422 "force codec tag/fourcc", "fourcc/tag" },
3423 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3424 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3425 "use fixed quality scale (VBR)", "q" },
3426 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3427 OPT_OUTPUT, { .func_arg = opt_qscale },
3428 "use fixed quality scale (VBR)", "q" },
3429 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3430 "set profile", "profile" },
3431 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3432 "set stream filtergraph", "filter_graph" },
3433 { "filter_threads", HAS_ARG | OPT_INT, { &filter_nbthreads },
3434 "number of non-complex filter threads" },
3435 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3436 "read stream filtergraph description from a file", "filename" },
3437 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3438 "reinit filtergraph on input parameter changes", "" },
3439 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3440 "create a complex filtergraph", "graph_description" },
3441 { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads },
3442 "number of threads for -filter_complex" },
3443 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3444 "create a complex filtergraph", "graph_description" },
3445 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3446 "read complex filtergraph description from a file", "filename" },
3447 { "stats", OPT_BOOL, { &print_stats },
3448 "print progress report during encoding", },
3449 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3450 OPT_OUTPUT, { .func_arg = opt_attach },
3451 "add an attachment to the output file", "filename" },
3452 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3453 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3454 "extract an attachment into a file", "filename" },
3455 { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3456 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3457 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3458 "print timestamp debugging info" },
3459 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3460 "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.", "maximum error rate" },
3461 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3462 OPT_INPUT, { .off = OFFSET(discard) },
3464 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3465 OPT_OUTPUT, { .off = OFFSET(disposition) },
3466 "disposition", "" },
3467 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3468 { .off = OFFSET(thread_queue_size) },
3469 "set the maximum number of queued packets from the demuxer" },
3470 { "find_stream_info", OPT_BOOL | OPT_PERFILE | OPT_INPUT | OPT_EXPERT, { &find_stream_info },
3471 "read and decode the streams to fill missing information with heuristics" },
3474 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3475 "set the number of video frames to output", "number" },
3476 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3477 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3478 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3479 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3480 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3481 "set frame size (WxH or abbreviation)", "size" },
3482 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3483 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3484 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3485 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3486 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3487 "set pixel format", "format" },
3488 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3489 "set the number of bits per raw sample", "number" },
3490 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3491 "deprecated use -g 1" },
3492 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3494 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3495 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3496 "rate control override for specific intervals", "override" },
3497 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3498 OPT_OUTPUT, { .func_arg = opt_video_codec },
3499 "force video codec ('copy' to copy stream)", "codec" },
3500 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3502 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3504 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3505 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3506 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3507 "select the pass number (1 to 3)", "n" },
3508 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3509 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3510 "select two pass log file name prefix", "prefix" },
3511 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3512 "this option is deprecated, use the yadif filter instead" },
3513 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3514 "calculate PSNR of compressed frames" },
3515 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3516 "dump video coding statistics to file" },
3517 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3518 "dump video coding statistics to file", "file" },
3519 { "vstats_version", OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT , { &vstats_version },
3520 "Version of the vstats format to use."},
3521 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3522 "set video filters", "filter_graph" },
3523 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3524 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3525 "specify intra matrix coeffs", "matrix" },
3526 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3527 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3528 "specify inter matrix coeffs", "matrix" },
3529 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3530 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3531 "specify intra matrix coeffs", "matrix" },
3532 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3533 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3534 "top=1/bottom=0/auto=-1 field first", "" },
3535 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3536 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3537 "force video tag/fourcc", "fourcc/tag" },
3538 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3539 "show QP histogram" },
3540 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3541 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3542 "force the selected framerate, disable the best supported framerate selection" },
3543 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3544 OPT_OUTPUT, { .func_arg = opt_streamid },
3545 "set the value of an outfile streamid", "streamIndex:value" },
3546 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3547 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3548 "force key frames at specified timestamps", "timestamps" },
3549 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3550 "audio bitrate (please use -b:a)", "bitrate" },
3551 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3552 "video bitrate (please use -b:v)", "bitrate" },
3553 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3554 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3555 "use HW accelerated decoding", "hwaccel name" },
3556 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3557 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3558 "select a device for HW acceleration", "devicename" },
3559 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3560 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
3561 "select output format used with HW accelerated decoding", "format" },
3562 #if CONFIG_VIDEOTOOLBOX
3563 { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3565 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3566 "show available HW acceleration methods" },
3567 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3568 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3569 "automatically insert correct rotate filters" },
3572 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3573 "set the number of audio frames to output", "number" },
3574 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3575 "set audio quality (codec-specific)", "quality", },
3576 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3577 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3578 "set audio sampling rate (in Hz)", "rate" },
3579 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3580 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3581 "set number of audio channels", "channels" },
3582 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3584 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3585 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3586 "force audio codec ('copy' to copy stream)", "codec" },
3587 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3588 OPT_OUTPUT, { .func_arg = opt_old2new },
3589 "force audio tag/fourcc", "fourcc/tag" },
3590 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3591 "change audio volume (256=normal)" , "volume" },
3592 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3593 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3594 "set sample format", "format" },
3595 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3596 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3597 "set channel layout", "layout" },
3598 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3599 "set audio filters", "filter_graph" },
3600 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3601 "set the maximum number of channels to try to guess the channel layout" },
3603 /* subtitle options */
3604 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3605 "disable subtitle" },
3606 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3607 "force subtitle codec ('copy' to copy stream)", "codec" },
3608 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3609 , "force subtitle tag/fourcc", "fourcc/tag" },
3610 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3611 "fix subtitles duration" },
3612 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3613 "set canvas size (WxH or abbreviation)", "size" },
3616 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3617 "deprecated, use -channel", "channel" },
3618 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3619 "deprecated, use -standard", "standard" },
3620 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3623 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3624 "set the maximum demux-decode delay", "seconds" },
3625 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3626 "set the initial demux-decode delay", "seconds" },
3627 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3628 "specify a file in which to print sdp information", "file" },
3630 { "time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(time_bases) },
3631 "set the desired time base hint for output stream (1:24, 1:48000 or 0.04166, 2.0833e-5)", "ratio" },
3632 { "enc_time_base", HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(enc_time_bases) },
3633 "set the desired time base for the encoder (1:24, 1:48000 or 0.04166, 2.0833e-5). "
3634 "two special values are defined - "
3635 "0 = use frame rate (video) or sample rate (audio),"
3636 "-1 = match source time base", "ratio" },
3638 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3639 "A comma-separated list of bitstream filters", "bitstream_filters" },
3640 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3641 "deprecated", "audio bitstream_filters" },
3642 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3643 "deprecated", "video bitstream_filters" },
3645 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3646 "set the audio options to the indicated preset", "preset" },
3647 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3648 "set the video options to the indicated preset", "preset" },
3649 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3650 "set the subtitle options to the indicated preset", "preset" },
3651 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3652 "set options from indicated preset file", "filename" },
3654 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
3655 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
3657 /* data codec support */
3658 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3659 "force data codec ('copy' to copy stream)", "codec" },
3660 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3664 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
3665 "set VAAPI hardware device (DRM path or X11 display name)", "device" },
3669 { "qsv_device", HAS_ARG | OPT_STRING | OPT_EXPERT, { &qsv_device },
3670 "set QSV hardware device (DirectX adapter index, DRM path or X11 display name)", "device"},
3673 { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device },
3674 "initialise hardware device", "args" },
3675 { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device },
3676 "set hardware device used when filtering", "device" },