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[] = {
70 { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
73 { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
76 { "vda", videotoolbox_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
78 #if CONFIG_VIDEOTOOLBOX
79 { "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
82 { "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
85 { "vaapi", vaapi_decode_init, HWACCEL_VAAPI, AV_PIX_FMT_VAAPI },
88 { "cuvid", cuvid_init, HWACCEL_CUVID, AV_PIX_FMT_CUDA },
92 int hwaccel_lax_profile_check = 0;
93 AVBufferRef *hw_device_ctx;
95 char *vstats_filename;
98 float audio_drift_threshold = 0.1;
99 float dts_delta_threshold = 10;
100 float dts_error_threshold = 3600*30;
102 int audio_volume = 256;
103 int audio_sync_method = 0;
104 int video_sync_method = VSYNC_AUTO;
105 float frame_drop_threshold = 0;
106 int do_deinterlace = 0;
107 int do_benchmark = 0;
108 int do_benchmark_all = 0;
112 int start_at_zero = 0;
115 int exit_on_error = 0;
116 int abort_on_flags = 0;
117 int print_stats = -1;
119 int stdin_interaction = 1;
120 int frame_bits_per_raw_sample = 0;
121 float max_error_rate = 2.0/3;
122 int filter_nbthreads = 0;
123 int filter_complex_nbthreads = 0;
126 static int intra_only = 0;
127 static int file_overwrite = 0;
128 static int no_file_overwrite = 0;
129 static int do_psnr = 0;
130 static int input_sync;
131 static int override_ffserver = 0;
132 static int input_stream_potentially_available = 0;
133 static int ignore_unknown_streams = 0;
134 static int copy_unknown_streams = 0;
136 static void uninit_options(OptionsContext *o)
138 const OptionDef *po = options;
141 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
143 void *dst = (uint8_t*)o + po->u.off;
145 if (po->flags & OPT_SPEC) {
146 SpecifierOpt **so = dst;
147 int i, *count = (int*)(so + 1);
148 for (i = 0; i < *count; i++) {
149 av_freep(&(*so)[i].specifier);
150 if (po->flags & OPT_STRING)
151 av_freep(&(*so)[i].u.str);
155 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
160 for (i = 0; i < o->nb_stream_maps; i++)
161 av_freep(&o->stream_maps[i].linklabel);
162 av_freep(&o->stream_maps);
163 av_freep(&o->audio_channel_maps);
164 av_freep(&o->streamid_map);
165 av_freep(&o->attachments);
168 static void init_options(OptionsContext *o)
170 memset(o, 0, sizeof(*o));
172 o->stop_time = INT64_MAX;
173 o->mux_max_delay = 0.7;
174 o->start_time = AV_NOPTS_VALUE;
175 o->start_time_eof = AV_NOPTS_VALUE;
176 o->recording_time = INT64_MAX;
177 o->limit_filesize = UINT64_MAX;
178 o->chapters_input_file = INT_MAX;
179 o->accurate_seek = 1;
182 static int show_hwaccels(void *optctx, const char *opt, const char *arg)
186 printf("Hardware acceleration methods:\n");
187 for (i = 0; i < FF_ARRAY_ELEMS(hwaccels) - 1; i++) {
188 printf("%s\n", hwaccels[i].name);
194 /* return a copy of the input with the stream specifiers removed from the keys */
195 static AVDictionary *strip_specifiers(AVDictionary *dict)
197 AVDictionaryEntry *e = NULL;
198 AVDictionary *ret = NULL;
200 while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
201 char *p = strchr(e->key, ':');
205 av_dict_set(&ret, e->key, e->value, 0);
212 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
214 static const AVOption opts[] = {
215 { "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
216 { "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
219 static const AVClass class = {
221 .item_name = av_default_item_name,
223 .version = LIBAVUTIL_VERSION_INT,
225 const AVClass *pclass = &class;
227 return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
230 static int opt_sameq(void *optctx, const char *opt, const char *arg)
232 av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
233 "If you are looking for an option to preserve the quality (which is not "
234 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
236 return AVERROR(EINVAL);
239 static int opt_video_channel(void *optctx, const char *opt, const char *arg)
241 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
242 return opt_default(optctx, "channel", arg);
245 static int opt_video_standard(void *optctx, const char *opt, const char *arg)
247 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
248 return opt_default(optctx, "standard", arg);
251 static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
253 OptionsContext *o = optctx;
254 return parse_option(o, "codec:a", arg, options);
257 static int opt_video_codec(void *optctx, const char *opt, const char *arg)
259 OptionsContext *o = optctx;
260 return parse_option(o, "codec:v", arg, options);
263 static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
265 OptionsContext *o = optctx;
266 return parse_option(o, "codec:s", arg, options);
269 static int opt_data_codec(void *optctx, const char *opt, const char *arg)
271 OptionsContext *o = optctx;
272 return parse_option(o, "codec:d", arg, options);
275 static int opt_map(void *optctx, const char *opt, const char *arg)
277 OptionsContext *o = optctx;
279 int i, negative = 0, file_idx;
280 int sync_file_idx = -1, sync_stream_idx = 0;
289 map = av_strdup(arg);
291 return AVERROR(ENOMEM);
293 /* parse sync stream first, just pick first matching stream */
294 if (sync = strchr(map, ',')) {
296 sync_file_idx = strtol(sync + 1, &sync, 0);
297 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
298 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
303 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
304 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
305 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
309 if (i == input_files[sync_file_idx]->nb_streams) {
310 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
311 "match any streams.\n", arg);
318 /* this mapping refers to lavfi output */
319 const char *c = map + 1;
320 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
321 m = &o->stream_maps[o->nb_stream_maps - 1];
322 m->linklabel = av_get_token(&c, "]");
324 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
328 if (allow_unused = strchr(map, '?'))
330 file_idx = strtol(map, &p, 0);
331 if (file_idx >= nb_input_files || file_idx < 0) {
332 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
336 /* disable some already defined maps */
337 for (i = 0; i < o->nb_stream_maps; i++) {
338 m = &o->stream_maps[i];
339 if (file_idx == m->file_index &&
340 check_stream_specifier(input_files[m->file_index]->ctx,
341 input_files[m->file_index]->ctx->streams[m->stream_index],
342 *p == ':' ? p + 1 : p) > 0)
346 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
347 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
348 *p == ':' ? p + 1 : p) <= 0)
350 GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
351 m = &o->stream_maps[o->nb_stream_maps - 1];
353 m->file_index = file_idx;
356 if (sync_file_idx >= 0) {
357 m->sync_file_index = sync_file_idx;
358 m->sync_stream_index = sync_stream_idx;
360 m->sync_file_index = file_idx;
361 m->sync_stream_index = i;
368 av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
370 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
371 "To ignore this, add a trailing '?' to the map.\n", arg);
380 static int opt_attach(void *optctx, const char *opt, const char *arg)
382 OptionsContext *o = optctx;
383 GROW_ARRAY(o->attachments, o->nb_attachments);
384 o->attachments[o->nb_attachments - 1] = arg;
388 static int opt_map_channel(void *optctx, const char *opt, const char *arg)
390 OptionsContext *o = optctx;
395 GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
396 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
398 /* muted channel syntax */
399 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
400 if ((n == 1 || n == 3) && m->channel_idx == -1) {
401 m->file_idx = m->stream_idx = -1;
403 m->ofile_idx = m->ostream_idx = -1;
408 n = sscanf(arg, "%d.%d.%d:%d.%d",
409 &m->file_idx, &m->stream_idx, &m->channel_idx,
410 &m->ofile_idx, &m->ostream_idx);
412 if (n != 3 && n != 5) {
413 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
414 "[file.stream.channel|-1][:syncfile:syncstream]\n");
418 if (n != 5) // only file.stream.channel specified
419 m->ofile_idx = m->ostream_idx = -1;
422 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
423 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
427 if (m->stream_idx < 0 ||
428 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
429 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
430 m->file_idx, m->stream_idx);
433 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
434 if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO) {
435 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
436 m->file_idx, m->stream_idx);
439 if (m->channel_idx < 0 || m->channel_idx >= st->codecpar->channels) {
440 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
441 m->file_idx, m->stream_idx, m->channel_idx);
447 static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
449 av_free(sdp_filename);
450 sdp_filename = av_strdup(arg);
455 static int opt_vaapi_device(void *optctx, const char *opt, const char *arg)
458 err = vaapi_device_init(arg);
466 * Parse a metadata specifier passed as 'arg' parameter.
467 * @param arg metadata string to parse
468 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
469 * @param index for type c/p, chapter/program index is written here
470 * @param stream_spec for type s, the stream specifier is written here
472 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
480 if (*(++arg) && *arg != ':') {
481 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
484 *stream_spec = *arg == ':' ? arg + 1 : "";
489 *index = strtol(++arg, NULL, 0);
492 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
499 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
501 AVDictionary **meta_in = NULL;
502 AVDictionary **meta_out = NULL;
504 char type_in, type_out;
505 const char *istream_spec = NULL, *ostream_spec = NULL;
506 int idx_in = 0, idx_out = 0;
508 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
509 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
512 if (type_out == 'g' || !*outspec)
513 o->metadata_global_manual = 1;
514 if (type_out == 's' || !*outspec)
515 o->metadata_streams_manual = 1;
516 if (type_out == 'c' || !*outspec)
517 o->metadata_chapters_manual = 1;
521 if (type_in == 'g' || type_out == 'g')
522 o->metadata_global_manual = 1;
523 if (type_in == 's' || type_out == 's')
524 o->metadata_streams_manual = 1;
525 if (type_in == 'c' || type_out == 'c')
526 o->metadata_chapters_manual = 1;
528 /* ic is NULL when just disabling automatic mappings */
532 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
533 if ((index) < 0 || (index) >= (nb_elems)) {\
534 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
539 #define SET_DICT(type, meta, context, index)\
542 meta = &context->metadata;\
545 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
546 meta = &context->chapters[index]->metadata;\
549 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
550 meta = &context->programs[index]->metadata;\
553 break; /* handled separately below */ \
554 default: av_assert0(0);\
557 SET_DICT(type_in, meta_in, ic, idx_in);
558 SET_DICT(type_out, meta_out, oc, idx_out);
560 /* for input streams choose first matching stream */
561 if (type_in == 's') {
562 for (i = 0; i < ic->nb_streams; i++) {
563 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
564 meta_in = &ic->streams[i]->metadata;
570 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
575 if (type_out == 's') {
576 for (i = 0; i < oc->nb_streams; i++) {
577 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
578 meta_out = &oc->streams[i]->metadata;
579 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
584 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
589 static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
591 OptionsContext *o = optctx;
593 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
594 struct tm time = *gmtime((time_t*)&recording_timestamp);
595 if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
597 parse_option(o, "metadata", buf, options);
599 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
600 "tag instead.\n", opt);
604 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
606 const AVCodecDescriptor *desc;
607 const char *codec_string = encoder ? "encoder" : "decoder";
611 avcodec_find_encoder_by_name(name) :
612 avcodec_find_decoder_by_name(name);
614 if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
615 codec = encoder ? avcodec_find_encoder(desc->id) :
616 avcodec_find_decoder(desc->id);
618 av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
619 codec_string, codec->name, desc->name);
623 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
626 if (codec->type != type) {
627 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
633 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
635 char *codec_name = NULL;
637 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
639 AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
640 st->codecpar->codec_id = codec->id;
643 return avcodec_find_decoder(st->codecpar->codec_id);
646 /* Add all the streams from the given input file to the global
647 * list of input streams. */
648 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
652 for (i = 0; i < ic->nb_streams; i++) {
653 AVStream *st = ic->streams[i];
654 AVCodecParameters *par = st->codecpar;
655 InputStream *ist = av_mallocz(sizeof(*ist));
656 char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
657 char *hwaccel_output_format = NULL;
658 char *codec_tag = NULL;
660 char *discard_str = NULL;
661 const AVClass *cc = avcodec_get_class();
662 const AVOption *discard_opt = av_opt_find(&cc, "skip_frame", NULL, 0, 0);
667 GROW_ARRAY(input_streams, nb_input_streams);
668 input_streams[nb_input_streams - 1] = ist;
671 ist->file_index = nb_input_files;
673 st->discard = AVDISCARD_ALL;
675 ist->min_pts = INT64_MAX;
676 ist->max_pts = INT64_MIN;
679 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
682 MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
684 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
686 uint32_t tag = strtol(codec_tag, &next, 0);
688 tag = AV_RL32(codec_tag);
689 st->codecpar->codec_tag = tag;
692 ist->dec = choose_decoder(o, ic, st);
693 ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codecpar->codec_id, ic, st, ist->dec);
695 ist->reinit_filters = -1;
696 MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
698 MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
699 ist->user_set_discard = AVDISCARD_NONE;
700 if (discard_str && av_opt_eval_int(&cc, discard_opt, discard_str, &ist->user_set_discard) < 0) {
701 av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
706 ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
708 ist->dec_ctx = avcodec_alloc_context3(ist->dec);
710 av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
714 ret = avcodec_parameters_to_context(ist->dec_ctx, par);
716 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
720 switch (par->codec_type) {
721 case AVMEDIA_TYPE_VIDEO:
723 ist->dec = avcodec_find_decoder(par->codec_id);
725 if (av_codec_get_lowres(st->codec)) {
726 av_codec_set_lowres(ist->dec_ctx, av_codec_get_lowres(st->codec));
727 ist->dec_ctx->width = st->codec->width;
728 ist->dec_ctx->height = st->codec->height;
729 ist->dec_ctx->coded_width = st->codec->coded_width;
730 ist->dec_ctx->coded_height = st->codec->coded_height;
731 ist->dec_ctx->flags |= CODEC_FLAG_EMU_EDGE;
735 // avformat_find_stream_info() doesn't set this for us anymore.
736 ist->dec_ctx->framerate = st->avg_frame_rate;
738 ist->resample_height = ist->dec_ctx->height;
739 ist->resample_width = ist->dec_ctx->width;
740 ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
742 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
743 if (framerate && av_parse_video_rate(&ist->framerate,
745 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
750 ist->top_field_first = -1;
751 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
753 MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
755 if (!strcmp(hwaccel, "none"))
756 ist->hwaccel_id = HWACCEL_NONE;
757 else if (!strcmp(hwaccel, "auto"))
758 ist->hwaccel_id = HWACCEL_AUTO;
761 for (i = 0; hwaccels[i].name; i++) {
762 if (!strcmp(hwaccels[i].name, hwaccel)) {
763 ist->hwaccel_id = hwaccels[i].id;
768 if (!ist->hwaccel_id) {
769 av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
771 av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
772 for (i = 0; hwaccels[i].name; i++)
773 av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
774 av_log(NULL, AV_LOG_FATAL, "\n");
780 MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
781 if (hwaccel_device) {
782 ist->hwaccel_device = av_strdup(hwaccel_device);
783 if (!ist->hwaccel_device)
787 MATCH_PER_STREAM_OPT(hwaccel_output_formats, str,
788 hwaccel_output_format, ic, st);
789 if (hwaccel_output_format) {
790 ist->hwaccel_output_format = av_get_pix_fmt(hwaccel_output_format);
791 if (ist->hwaccel_output_format == AV_PIX_FMT_NONE) {
792 av_log(NULL, AV_LOG_FATAL, "Unrecognised hwaccel output "
793 "format: %s", hwaccel_output_format);
796 ist->hwaccel_output_format = AV_PIX_FMT_NONE;
799 ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
802 case AVMEDIA_TYPE_AUDIO:
803 ist->guess_layout_max = INT_MAX;
804 MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
805 guess_input_channel_layout(ist);
807 ist->resample_sample_fmt = ist->dec_ctx->sample_fmt;
808 ist->resample_sample_rate = ist->dec_ctx->sample_rate;
809 ist->resample_channels = ist->dec_ctx->channels;
810 ist->resample_channel_layout = ist->dec_ctx->channel_layout;
813 case AVMEDIA_TYPE_DATA:
814 case AVMEDIA_TYPE_SUBTITLE: {
815 char *canvas_size = NULL;
817 ist->dec = avcodec_find_decoder(par->codec_id);
818 MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
819 MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
821 av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
822 av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
827 case AVMEDIA_TYPE_ATTACHMENT:
828 case AVMEDIA_TYPE_UNKNOWN:
834 ret = avcodec_parameters_from_context(par, ist->dec_ctx);
836 av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
842 static void assert_file_overwrite(const char *filename)
844 if (file_overwrite && no_file_overwrite) {
845 fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
849 if (!file_overwrite) {
850 const char *proto_name = avio_find_protocol_name(filename);
851 if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
852 if (stdin_interaction && !no_file_overwrite) {
853 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
856 signal(SIGINT, SIG_DFL);
858 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
864 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
871 static void dump_attachment(AVStream *st, const char *filename)
874 AVIOContext *out = NULL;
875 AVDictionaryEntry *e;
877 if (!st->codecpar->extradata_size) {
878 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
879 nb_input_files - 1, st->index);
882 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
885 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
886 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
890 assert_file_overwrite(filename);
892 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
893 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
898 avio_write(out, st->codecpar->extradata, st->codecpar->extradata_size);
903 static int open_input_file(OptionsContext *o, const char *filename)
907 AVInputFormat *file_iformat = NULL;
911 AVDictionary *unused_opts = NULL;
912 AVDictionaryEntry *e = NULL;
913 int orig_nb_streams; // number of streams before avformat_find_stream_info
914 char * video_codec_name = NULL;
915 char * audio_codec_name = NULL;
916 char *subtitle_codec_name = NULL;
917 char * data_codec_name = NULL;
918 int scan_all_pmts_set = 0;
921 if (!(file_iformat = av_find_input_format(o->format))) {
922 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
927 if (!strcmp(filename, "-"))
930 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
931 strcmp(filename, "/dev/stdin");
933 /* get default parameters from command line */
934 ic = avformat_alloc_context();
936 print_error(filename, AVERROR(ENOMEM));
939 if (o->nb_audio_sample_rate) {
940 av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
942 if (o->nb_audio_channels) {
943 /* because we set audio_channels based on both the "ac" and
944 * "channel_layout" options, we need to check that the specified
945 * demuxer actually has the "channels" option before setting it */
946 if (file_iformat && file_iformat->priv_class &&
947 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
948 AV_OPT_SEARCH_FAKE_OBJ)) {
949 av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
952 if (o->nb_frame_rates) {
953 /* set the format-level framerate option;
954 * this is important for video grabbers, e.g. x11 */
955 if (file_iformat && file_iformat->priv_class &&
956 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
957 AV_OPT_SEARCH_FAKE_OBJ)) {
958 av_dict_set(&o->g->format_opts, "framerate",
959 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
962 if (o->nb_frame_sizes) {
963 av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
965 if (o->nb_frame_pix_fmts)
966 av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
968 MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
969 MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
970 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
971 MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
973 ic->video_codec_id = video_codec_name ?
974 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
975 ic->audio_codec_id = audio_codec_name ?
976 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
977 ic->subtitle_codec_id= subtitle_codec_name ?
978 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
979 ic->data_codec_id = data_codec_name ?
980 find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0)->id : AV_CODEC_ID_NONE;
982 if (video_codec_name)
983 av_format_set_video_codec (ic, find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0));
984 if (audio_codec_name)
985 av_format_set_audio_codec (ic, find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0));
986 if (subtitle_codec_name)
987 av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
989 av_format_set_data_codec(ic, find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0));
991 ic->flags |= AVFMT_FLAG_NONBLOCK;
992 ic->interrupt_callback = int_cb;
994 if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
995 av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
996 scan_all_pmts_set = 1;
998 /* open the input file with generic avformat function */
999 err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
1001 print_error(filename, err);
1002 if (err == AVERROR_PROTOCOL_NOT_FOUND)
1003 av_log(NULL, AV_LOG_ERROR, "Did you mean file:%s?\n", filename);
1006 if (scan_all_pmts_set)
1007 av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
1008 remove_avoptions(&o->g->format_opts, o->g->codec_opts);
1009 assert_avoptions(o->g->format_opts);
1011 /* apply forced codec ids */
1012 for (i = 0; i < ic->nb_streams; i++)
1013 choose_decoder(o, ic, ic->streams[i]);
1015 /* Set AVCodecContext options for avformat_find_stream_info */
1016 opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
1017 orig_nb_streams = ic->nb_streams;
1019 /* If not enough info to get the stream parameters, we decode the
1020 first frames to get it. (used in mpeg case for example) */
1021 ret = avformat_find_stream_info(ic, opts);
1023 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
1024 if (ic->nb_streams == 0) {
1025 avformat_close_input(&ic);
1030 if (o->start_time_eof != AV_NOPTS_VALUE) {
1031 if (ic->duration>0) {
1032 o->start_time = o->start_time_eof + ic->duration;
1034 av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
1036 timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
1037 /* add the stream start time */
1038 if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
1039 timestamp += ic->start_time;
1041 /* if seeking requested, we execute it */
1042 if (o->start_time != AV_NOPTS_VALUE) {
1043 int64_t seek_timestamp = timestamp;
1045 if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
1046 int dts_heuristic = 0;
1047 for (i=0; i<ic->nb_streams; i++) {
1048 const AVCodecParameters *par = ic->streams[i]->codecpar;
1049 if (par->video_delay)
1052 if (dts_heuristic) {
1053 seek_timestamp -= 3*AV_TIME_BASE / 23;
1056 ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1058 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
1059 filename, (double)timestamp / AV_TIME_BASE);
1063 /* update the current parameters so that they match the one of the input stream */
1064 add_input_streams(o, ic);
1066 /* dump the file content */
1067 av_dump_format(ic, nb_input_files, filename, 0);
1069 GROW_ARRAY(input_files, nb_input_files);
1070 f = av_mallocz(sizeof(*f));
1073 input_files[nb_input_files - 1] = f;
1076 f->ist_index = nb_input_streams - ic->nb_streams;
1077 f->start_time = o->start_time;
1078 f->recording_time = o->recording_time;
1079 f->input_ts_offset = o->input_ts_offset;
1080 f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1081 f->nb_streams = ic->nb_streams;
1082 f->rate_emu = o->rate_emu;
1083 f->accurate_seek = o->accurate_seek;
1086 f->time_base = (AVRational){ 1, 1 };
1088 f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
1091 /* check if all codec options have been used */
1092 unused_opts = strip_specifiers(o->g->codec_opts);
1093 for (i = f->ist_index; i < nb_input_streams; i++) {
1095 while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1096 AV_DICT_IGNORE_SUFFIX)))
1097 av_dict_set(&unused_opts, e->key, NULL, 0);
1101 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1102 const AVClass *class = avcodec_get_class();
1103 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1104 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1105 const AVClass *fclass = avformat_get_class();
1106 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
1107 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1108 if (!option || foption)
1112 if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1113 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1114 "input file #%d (%s) is not a decoding option.\n", e->key,
1115 option->help ? option->help : "", nb_input_files - 1,
1120 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1121 "input file #%d (%s) has not been used for any stream. The most "
1122 "likely reason is either wrong type (e.g. a video option with "
1123 "no video streams) or that it is a private option of some decoder "
1124 "which was not actually used for any stream.\n", e->key,
1125 option->help ? option->help : "", nb_input_files - 1, filename);
1127 av_dict_free(&unused_opts);
1129 for (i = 0; i < o->nb_dump_attachment; i++) {
1132 for (j = 0; j < ic->nb_streams; j++) {
1133 AVStream *st = ic->streams[j];
1135 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1136 dump_attachment(st, o->dump_attachment[i].u.str);
1140 for (i = 0; i < orig_nb_streams; i++)
1141 av_dict_free(&opts[i]);
1144 input_stream_potentially_available = 1;
1149 static uint8_t *get_line(AVIOContext *s)
1155 if (avio_open_dyn_buf(&line) < 0) {
1156 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1160 while ((c = avio_r8(s)) && c != '\n')
1163 avio_close_dyn_buf(line, &buf);
1168 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1171 char filename[1000];
1172 const char *base[3] = { getenv("AVCONV_DATADIR"),
1177 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1181 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1182 i != 1 ? "" : "/.avconv", codec_name, preset_name);
1183 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1186 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1187 i != 1 ? "" : "/.avconv", preset_name);
1188 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1194 static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1196 enum AVMediaType type = ost->st->codecpar->codec_type;
1197 char *codec_name = NULL;
1199 if (type == AVMEDIA_TYPE_VIDEO || type == AVMEDIA_TYPE_AUDIO || type == AVMEDIA_TYPE_SUBTITLE) {
1200 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1202 ost->st->codecpar->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
1203 NULL, ost->st->codecpar->codec_type);
1204 ost->enc = avcodec_find_encoder(ost->st->codecpar->codec_id);
1206 av_log(NULL, AV_LOG_FATAL, "Automatic encoder selection failed for "
1207 "output stream #%d:%d. Default encoder for format %s (codec %s) is "
1208 "probably disabled. Please choose an encoder manually.\n",
1209 ost->file_index, ost->index, s->oformat->name,
1210 avcodec_get_name(ost->st->codecpar->codec_id));
1211 return AVERROR_ENCODER_NOT_FOUND;
1213 } else if (!strcmp(codec_name, "copy"))
1214 ost->stream_copy = 1;
1216 ost->enc = find_codec_or_die(codec_name, ost->st->codecpar->codec_type, 1);
1217 ost->st->codecpar->codec_id = ost->enc->id;
1219 ost->encoding_needed = !ost->stream_copy;
1221 /* no encoding supported for other media types */
1222 ost->stream_copy = 1;
1223 ost->encoding_needed = 0;
1229 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1232 AVStream *st = avformat_new_stream(oc, NULL);
1233 int idx = oc->nb_streams - 1, ret = 0;
1234 const char *bsfs = NULL;
1235 char *next, *codec_tag = NULL;
1240 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1244 if (oc->nb_streams - 1 < o->nb_streamid_map)
1245 st->id = o->streamid_map[oc->nb_streams - 1];
1247 GROW_ARRAY(output_streams, nb_output_streams);
1248 if (!(ost = av_mallocz(sizeof(*ost))))
1250 output_streams[nb_output_streams - 1] = ost;
1252 ost->file_index = nb_output_files - 1;
1255 st->codecpar->codec_type = type;
1257 ret = choose_encoder(o, oc, ost);
1259 av_log(NULL, AV_LOG_FATAL, "Error selecting an encoder for stream "
1260 "%d:%d\n", ost->file_index, ost->index);
1264 ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1265 if (!ost->enc_ctx) {
1266 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1269 ost->enc_ctx->codec_type = type;
1271 ost->ref_par = avcodec_parameters_alloc();
1272 if (!ost->ref_par) {
1273 av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding parameters.\n");
1278 AVIOContext *s = NULL;
1279 char *buf = NULL, *arg = NULL, *preset = NULL;
1281 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1283 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1284 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1287 if (!buf[0] || buf[0] == '#') {
1291 if (!(arg = strchr(buf, '='))) {
1292 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
1296 av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1298 } while (!s->eof_reached);
1302 av_log(NULL, AV_LOG_FATAL,
1303 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1304 preset, ost->file_index, ost->index);
1308 ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1311 ost->max_frames = INT64_MAX;
1312 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1313 for (i = 0; i<o->nb_max_frames; i++) {
1314 char *p = o->max_frames[i].specifier;
1315 if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1316 av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1321 ost->copy_prior_start = -1;
1322 MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1324 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st);
1325 while (bsfs && *bsfs) {
1326 const AVBitStreamFilter *filter;
1327 char *bsf, *bsf_options_str, *bsf_name;
1329 bsf = av_get_token(&bsfs, ",");
1332 bsf_name = av_strtok(bsf, "=", &bsf_options_str);
1336 filter = av_bsf_get_by_name(bsf_name);
1338 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name);
1342 ost->bsf_ctx = av_realloc_array(ost->bsf_ctx,
1343 ost->nb_bitstream_filters + 1,
1344 sizeof(*ost->bsf_ctx));
1348 ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]);
1350 av_log(NULL, AV_LOG_ERROR, "Error allocating a bitstream filter context\n");
1354 ost->nb_bitstream_filters++;
1356 if (bsf_options_str && filter->priv_class) {
1357 const AVOption *opt = av_opt_next(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, NULL);
1358 const char * shorthand[2] = {NULL};
1361 shorthand[0] = opt->name;
1363 ret = av_opt_set_from_string(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, bsf_options_str, shorthand, "=", ":");
1365 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name);
1374 if (ost->nb_bitstream_filters) {
1375 ost->bsf_extradata_updated = av_mallocz_array(ost->nb_bitstream_filters, sizeof(*ost->bsf_extradata_updated));
1376 if (!ost->bsf_extradata_updated) {
1377 av_log(NULL, AV_LOG_FATAL, "Bitstream filter memory allocation failed\n");
1382 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1384 uint32_t tag = strtol(codec_tag, &next, 0);
1386 tag = AV_RL32(codec_tag);
1387 ost->st->codecpar->codec_tag =
1388 ost->enc_ctx->codec_tag = tag;
1391 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1393 ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1394 ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1397 MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1398 ost->disposition = av_strdup(ost->disposition);
1400 ost->max_muxing_queue_size = 128;
1401 MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
1402 ost->max_muxing_queue_size *= sizeof(AVPacket);
1404 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1405 ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1407 av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1409 av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1410 if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1411 av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1413 av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1415 ost->source_index = source_index;
1416 if (source_index >= 0) {
1417 ost->sync_ist = input_streams[source_index];
1418 input_streams[source_index]->discard = 0;
1419 input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1421 ost->last_mux_dts = AV_NOPTS_VALUE;
1423 ost->muxing_queue = av_fifo_alloc(8 * sizeof(AVPacket));
1424 if (!ost->muxing_queue)
1430 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1433 const char *p = str;
1440 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1447 /* read file contents into a string */
1448 static uint8_t *read_file(const char *filename)
1450 AVIOContext *pb = NULL;
1451 AVIOContext *dyn_buf = NULL;
1452 int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1453 uint8_t buf[1024], *str;
1456 av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1460 ret = avio_open_dyn_buf(&dyn_buf);
1465 while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1466 avio_write(dyn_buf, buf, ret);
1467 avio_w8(dyn_buf, 0);
1470 ret = avio_close_dyn_buf(dyn_buf, &str);
1476 static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1479 AVStream *st = ost->st;
1481 if (ost->filters_script && ost->filters) {
1482 av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1483 "output stream #%d:%d.\n", nb_output_files, st->index);
1487 if (ost->filters_script)
1488 return read_file(ost->filters_script);
1489 else if (ost->filters)
1490 return av_strdup(ost->filters);
1492 return av_strdup(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ?
1496 static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1497 const OutputStream *ost, enum AVMediaType type)
1499 if (ost->filters_script || ost->filters) {
1500 av_log(NULL, AV_LOG_ERROR,
1501 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1502 "Filtering and streamcopy cannot be used together.\n",
1503 ost->filters ? "Filtergraph" : "Filtergraph script",
1504 ost->filters ? ost->filters : ost->filters_script,
1505 av_get_media_type_string(type), ost->file_index, ost->index);
1510 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1514 AVCodecContext *video_enc;
1515 char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1517 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1519 video_enc = ost->enc_ctx;
1521 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1522 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1523 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1526 if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1527 av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1529 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1530 if (frame_aspect_ratio) {
1532 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1533 q.num <= 0 || q.den <= 0) {
1534 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1537 ost->frame_aspect_ratio = q;
1540 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1541 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1543 if (!ost->stream_copy) {
1544 const char *p = NULL;
1545 char *frame_size = NULL;
1546 char *frame_pix_fmt = NULL;
1547 char *intra_matrix = NULL, *inter_matrix = NULL;
1548 char *chroma_intra_matrix = NULL;
1552 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1553 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1554 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1558 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1559 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1560 if (frame_pix_fmt && *frame_pix_fmt == '+') {
1561 ost->keep_pix_fmt = 1;
1562 if (!*++frame_pix_fmt)
1563 frame_pix_fmt = NULL;
1565 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1566 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1569 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1572 video_enc->gop_size = 0;
1573 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1575 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1576 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1579 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1581 MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1582 if (chroma_intra_matrix) {
1583 uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1585 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1588 av_codec_set_chroma_intra_matrix(video_enc, p);
1589 parse_matrix_coeffs(p, chroma_intra_matrix);
1591 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1593 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1594 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1597 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1600 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1601 for (i = 0; p; i++) {
1603 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1605 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1608 video_enc->rc_override =
1609 av_realloc_array(video_enc->rc_override,
1610 i + 1, sizeof(RcOverride));
1611 if (!video_enc->rc_override) {
1612 av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1615 video_enc->rc_override[i].start_frame = start;
1616 video_enc->rc_override[i].end_frame = end;
1618 video_enc->rc_override[i].qscale = q;
1619 video_enc->rc_override[i].quality_factor = 1.0;
1622 video_enc->rc_override[i].qscale = 0;
1623 video_enc->rc_override[i].quality_factor = -q/100.0;
1628 video_enc->rc_override_count = i;
1631 video_enc->flags|= AV_CODEC_FLAG_PSNR;
1634 MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1637 video_enc->flags |= AV_CODEC_FLAG_PASS1;
1638 av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1641 video_enc->flags |= AV_CODEC_FLAG_PASS2;
1642 av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1646 MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1647 if (ost->logfile_prefix &&
1648 !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1652 char logfilename[1024];
1655 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1656 ost->logfile_prefix ? ost->logfile_prefix :
1657 DEFAULT_PASS_LOGFILENAME_PREFIX,
1659 if (!strcmp(ost->enc->name, "libx264")) {
1660 av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1662 if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1663 char *logbuffer = read_file(logfilename);
1666 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1670 video_enc->stats_in = logbuffer;
1672 if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1673 f = av_fopen_utf8(logfilename, "wb");
1675 av_log(NULL, AV_LOG_FATAL,
1676 "Cannot write log file '%s' for pass-1 encoding: %s\n",
1677 logfilename, strerror(errno));
1685 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1686 if (ost->forced_keyframes)
1687 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1689 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1691 ost->top_field_first = -1;
1692 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1695 ost->avfilter = get_ost_filters(o, oc, ost);
1699 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1702 if (ost->stream_copy)
1703 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1708 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1713 AVCodecContext *audio_enc;
1715 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1718 audio_enc = ost->enc_ctx;
1719 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1721 MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1722 MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1724 if (!ost->stream_copy) {
1725 char *sample_fmt = NULL;
1727 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1729 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1731 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1732 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1736 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1738 MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1739 ost->apad = av_strdup(ost->apad);
1741 ost->avfilter = get_ost_filters(o, oc, ost);
1745 /* check for channel mapping for this audio stream */
1746 for (n = 0; n < o->nb_audio_channel_maps; n++) {
1747 AudioChannelMap *map = &o->audio_channel_maps[n];
1748 if ((map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
1749 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
1752 if (map->channel_idx == -1) {
1754 } else if (ost->source_index < 0) {
1755 av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1756 ost->file_index, ost->st->index);
1759 ist = input_streams[ost->source_index];
1762 if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1763 if (av_reallocp_array(&ost->audio_channels_map,
1764 ost->audio_channels_mapped + 1,
1765 sizeof(*ost->audio_channels_map)
1769 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1775 if (ost->stream_copy)
1776 check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1781 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1785 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1786 if (!ost->stream_copy) {
1787 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1794 static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1798 ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1799 if (!ost->stream_copy) {
1800 av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1807 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1809 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1810 ost->stream_copy = 1;
1815 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1819 AVCodecContext *subtitle_enc;
1821 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1823 subtitle_enc = ost->enc_ctx;
1825 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1827 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1829 if (!ost->stream_copy) {
1830 char *frame_size = NULL;
1832 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1833 if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1834 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1842 /* arg format is "output-stream-index:streamid-value". */
1843 static int opt_streamid(void *optctx, const char *opt, const char *arg)
1845 OptionsContext *o = optctx;
1850 av_strlcpy(idx_str, arg, sizeof(idx_str));
1851 p = strchr(idx_str, ':');
1853 av_log(NULL, AV_LOG_FATAL,
1854 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1859 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1860 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1861 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1865 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1867 AVFormatContext *is = ifile->ctx;
1868 AVFormatContext *os = ofile->ctx;
1872 tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1874 return AVERROR(ENOMEM);
1877 for (i = 0; i < is->nb_chapters; i++) {
1878 AVChapter *in_ch = is->chapters[i], *out_ch;
1879 int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1880 int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1881 AV_TIME_BASE_Q, in_ch->time_base);
1882 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1883 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1886 if (in_ch->end < ts_off)
1888 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1891 out_ch = av_mallocz(sizeof(AVChapter));
1893 return AVERROR(ENOMEM);
1895 out_ch->id = in_ch->id;
1896 out_ch->time_base = in_ch->time_base;
1897 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1898 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1901 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1903 os->chapters[os->nb_chapters++] = out_ch;
1908 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1911 AVFormatContext *ic = avformat_alloc_context();
1913 ic->interrupt_callback = int_cb;
1914 err = avformat_open_input(&ic, filename, NULL, NULL);
1917 /* copy stream format */
1918 for(i=0;i<ic->nb_streams;i++) {
1922 const char *enc_config;
1924 codec = avcodec_find_encoder(ic->streams[i]->codecpar->codec_id);
1926 av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codecpar->codec_id);
1927 return AVERROR(EINVAL);
1929 if (codec->type == AVMEDIA_TYPE_AUDIO)
1930 opt_audio_codec(o, "c:a", codec->name);
1931 else if (codec->type == AVMEDIA_TYPE_VIDEO)
1932 opt_video_codec(o, "c:v", codec->name);
1933 ost = new_output_stream(o, s, codec->type, -1);
1936 avcodec_get_context_defaults3(st->codec, codec);
1937 enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
1939 AVDictionary *opts = NULL;
1940 av_dict_parse_string(&opts, enc_config, "=", ",", 0);
1941 av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
1942 av_dict_free(&opts);
1945 if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
1946 choose_sample_fmt(st, codec);
1947 else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
1948 choose_pixel_fmt(st, st->codec, codec, st->codecpar->format);
1949 avcodec_copy_context(ost->enc_ctx, st->codec);
1951 av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
1954 avformat_close_input(&ic);
1958 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1959 AVFormatContext *oc)
1963 switch (ofilter->type) {
1964 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
1965 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1967 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1972 ost->source_index = -1;
1973 ost->filter = ofilter;
1976 ofilter->format = -1;
1978 if (ost->stream_copy) {
1979 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1980 "which is fed from a complex filtergraph. Filtering and streamcopy "
1981 "cannot be used together.\n", ost->file_index, ost->index);
1985 if (ost->avfilter && (ost->filters || ost->filters_script)) {
1986 const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
1987 av_log(NULL, AV_LOG_ERROR,
1988 "%s '%s' was specified through the %s option "
1989 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
1990 "%s and -filter_complex cannot be used together for the same stream.\n",
1991 ost->filters ? "Filtergraph" : "Filtergraph script",
1992 ost->filters ? ost->filters : ost->filters_script,
1993 opt, ost->file_index, ost->index, opt);
1997 avfilter_inout_free(&ofilter->out_tmp);
2000 static int init_complex_filters(void)
2004 for (i = 0; i < nb_filtergraphs; i++) {
2005 ret = init_complex_filtergraph(filtergraphs[i]);
2012 static int configure_complex_filters(void)
2016 for (i = 0; i < nb_filtergraphs; i++) {
2017 FilterGraph *fg = filtergraphs[i];
2019 if (filtergraph_is_simple(fg))
2022 for (j = 0; j < fg->nb_inputs; j++) {
2023 ret = ifilter_parameters_from_decoder(fg->inputs[j],
2024 fg->inputs[j]->ist->dec_ctx);
2026 av_log(NULL, AV_LOG_ERROR,
2027 "Error initializing filtergraph %d input %d\n", i, j);
2032 ret = configure_filtergraph(filtergraphs[i]);
2039 static int open_output_file(OptionsContext *o, const char *filename)
2041 AVFormatContext *oc;
2043 AVOutputFormat *file_oformat;
2047 AVDictionary *unused_opts = NULL;
2048 AVDictionaryEntry *e = NULL;
2051 if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
2052 o->stop_time = INT64_MAX;
2053 av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
2056 if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
2057 int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
2058 if (o->stop_time <= start_time) {
2059 av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
2062 o->recording_time = o->stop_time - start_time;
2066 GROW_ARRAY(output_files, nb_output_files);
2067 of = av_mallocz(sizeof(*of));
2070 output_files[nb_output_files - 1] = of;
2072 of->ost_index = nb_output_streams;
2073 of->recording_time = o->recording_time;
2074 of->start_time = o->start_time;
2075 of->limit_filesize = o->limit_filesize;
2076 of->shortest = o->shortest;
2077 av_dict_copy(&of->opts, o->g->format_opts, 0);
2079 if (!strcmp(filename, "-"))
2082 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
2084 print_error(filename, err);
2089 if (o->recording_time != INT64_MAX)
2090 oc->duration = o->recording_time;
2092 file_oformat= oc->oformat;
2093 oc->interrupt_callback = int_cb;
2095 /* create streams for all unlabeled output pads */
2096 for (i = 0; i < nb_filtergraphs; i++) {
2097 FilterGraph *fg = filtergraphs[i];
2098 for (j = 0; j < fg->nb_outputs; j++) {
2099 OutputFilter *ofilter = fg->outputs[j];
2101 if (!ofilter->out_tmp || ofilter->out_tmp->name)
2104 switch (ofilter->type) {
2105 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
2106 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
2107 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
2109 init_output_filter(ofilter, o, oc);
2113 /* ffserver seeking with date=... needs a date reference */
2114 if (!strcmp(file_oformat->name, "ffm") &&
2115 av_strstart(filename, "http:", NULL)) {
2116 int err = parse_option(o, "metadata", "creation_time=now", options);
2118 print_error(filename, err);
2123 if (!strcmp(file_oformat->name, "ffm") && !override_ffserver &&
2124 av_strstart(filename, "http:", NULL)) {
2126 /* special case for files sent to ffserver: we get the stream
2127 parameters from ffserver */
2128 int err = read_ffserver_streams(o, oc, filename);
2130 print_error(filename, err);
2133 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
2134 ost = output_streams[j];
2135 for (i = 0; i < nb_input_streams; i++) {
2136 ist = input_streams[i];
2137 if(ist->st->codecpar->codec_type == ost->st->codecpar->codec_type){
2139 ost->source_index= i;
2140 if(ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
2141 if(ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
2143 ist->st->discard = ist->user_set_discard;
2148 av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codecpar->codec_type));
2152 } else if (!o->nb_stream_maps) {
2153 char *subtitle_codec_name = NULL;
2154 /* pick the "best" stream of each type */
2156 /* video: highest resolution */
2157 if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2158 int area = 0, idx = -1;
2159 int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2160 for (i = 0; i < nb_input_streams; i++) {
2162 ist = input_streams[i];
2163 new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames;
2164 if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2166 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
2168 if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2175 new_video_stream(o, oc, idx);
2178 /* audio: most channels */
2179 if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2180 int best_score = 0, idx = -1;
2181 for (i = 0; i < nb_input_streams; i++) {
2183 ist = input_streams[i];
2184 score = ist->st->codecpar->channels + 100000000*!!ist->st->codec_info_nb_frames;
2185 if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
2186 score > best_score) {
2192 new_audio_stream(o, oc, idx);
2195 /* subtitles: pick first */
2196 MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2197 if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2198 for (i = 0; i < nb_input_streams; i++)
2199 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2200 AVCodecDescriptor const *input_descriptor =
2201 avcodec_descriptor_get(input_streams[i]->st->codecpar->codec_id);
2202 AVCodecDescriptor const *output_descriptor = NULL;
2203 AVCodec const *output_codec =
2204 avcodec_find_encoder(oc->oformat->subtitle_codec);
2205 int input_props = 0, output_props = 0;
2207 output_descriptor = avcodec_descriptor_get(output_codec->id);
2208 if (input_descriptor)
2209 input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2210 if (output_descriptor)
2211 output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2212 if (subtitle_codec_name ||
2213 input_props & output_props ||
2214 // Map dvb teletext which has neither property to any output subtitle encoder
2215 input_descriptor && output_descriptor &&
2216 (!input_descriptor->props ||
2217 !output_descriptor->props)) {
2218 new_subtitle_stream(o, oc, i);
2223 /* Data only if codec id match */
2224 if (!o->data_disable ) {
2225 enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2226 for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2227 if (input_streams[i]->st->codecpar->codec_type == AVMEDIA_TYPE_DATA
2228 && input_streams[i]->st->codecpar->codec_id == codec_id )
2229 new_data_stream(o, oc, i);
2233 for (i = 0; i < o->nb_stream_maps; i++) {
2234 StreamMap *map = &o->stream_maps[i];
2239 if (map->linklabel) {
2241 OutputFilter *ofilter = NULL;
2244 for (j = 0; j < nb_filtergraphs; j++) {
2245 fg = filtergraphs[j];
2246 for (k = 0; k < fg->nb_outputs; k++) {
2247 AVFilterInOut *out = fg->outputs[k]->out_tmp;
2248 if (out && !strcmp(out->name, map->linklabel)) {
2249 ofilter = fg->outputs[k];
2256 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2257 "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2260 init_output_filter(ofilter, o, oc);
2262 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2264 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2265 if(o->subtitle_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
2267 if(o-> audio_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
2269 if(o-> video_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
2271 if(o-> data_disable && ist->st->codecpar->codec_type == AVMEDIA_TYPE_DATA)
2275 switch (ist->st->codecpar->codec_type) {
2276 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2277 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2278 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2279 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2280 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2281 case AVMEDIA_TYPE_UNKNOWN:
2282 if (copy_unknown_streams) {
2283 ost = new_unknown_stream (o, oc, src_idx);
2287 av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2288 "Cannot map stream #%d:%d - unsupported type.\n",
2289 map->file_index, map->stream_index);
2290 if (!ignore_unknown_streams) {
2291 av_log(NULL, AV_LOG_FATAL,
2292 "If you want unsupported types ignored instead "
2293 "of failing, please use the -ignore_unknown option\n"
2294 "If you want them copied, please use -copy_unknown\n");
2299 ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2300 + map->sync_stream_index];
2305 /* handle attached files */
2306 for (i = 0; i < o->nb_attachments; i++) {
2308 uint8_t *attachment;
2312 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2313 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2317 if ((len = avio_size(pb)) <= 0) {
2318 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2322 if (!(attachment = av_malloc(len))) {
2323 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
2327 avio_read(pb, attachment, len);
2329 ost = new_attachment_stream(o, oc, -1);
2330 ost->stream_copy = 0;
2331 ost->attachment_filename = o->attachments[i];
2332 ost->st->codecpar->extradata = attachment;
2333 ost->st->codecpar->extradata_size = len;
2335 p = strrchr(o->attachments[i], '/');
2336 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
2340 #if FF_API_LAVF_AVCTX
2341 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2342 AVDictionaryEntry *e;
2343 ost = output_streams[i];
2345 if ((ost->stream_copy || ost->attachment_filename)
2346 && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2347 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2348 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2353 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2354 av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
2355 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2359 /* check if all codec options have been used */
2360 unused_opts = strip_specifiers(o->g->codec_opts);
2361 for (i = of->ost_index; i < nb_output_streams; i++) {
2363 while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2364 AV_DICT_IGNORE_SUFFIX)))
2365 av_dict_set(&unused_opts, e->key, NULL, 0);
2369 while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2370 const AVClass *class = avcodec_get_class();
2371 const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2372 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2373 const AVClass *fclass = avformat_get_class();
2374 const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2375 AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2376 if (!option || foption)
2380 if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2381 av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2382 "output file #%d (%s) is not an encoding option.\n", e->key,
2383 option->help ? option->help : "", nb_output_files - 1,
2388 // gop_timecode is injected by generic code but not always used
2389 if (!strcmp(e->key, "gop_timecode"))
2392 av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2393 "output file #%d (%s) has not been used for any stream. The most "
2394 "likely reason is either wrong type (e.g. a video option with "
2395 "no video streams) or that it is a private option of some encoder "
2396 "which was not actually used for any stream.\n", e->key,
2397 option->help ? option->help : "", nb_output_files - 1, filename);
2399 av_dict_free(&unused_opts);
2401 /* set the decoding_needed flags and create simple filtergraphs */
2402 for (i = of->ost_index; i < nb_output_streams; i++) {
2403 OutputStream *ost = output_streams[i];
2405 if (ost->encoding_needed && ost->source_index >= 0) {
2406 InputStream *ist = input_streams[ost->source_index];
2407 ist->decoding_needed |= DECODING_FOR_OST;
2409 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ||
2410 ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
2411 err = init_simple_filtergraph(ist, ost);
2413 av_log(NULL, AV_LOG_ERROR,
2414 "Error initializing a simple filtergraph between streams "
2415 "%d:%d->%d:%d\n", ist->file_index, ost->source_index,
2416 nb_output_files - 1, ost->st->index);
2422 /* set the filter output constraints */
2424 OutputFilter *f = ost->filter;
2426 switch (ost->enc_ctx->codec_type) {
2427 case AVMEDIA_TYPE_VIDEO:
2428 f->frame_rate = ost->frame_rate;
2429 f->width = ost->enc_ctx->width;
2430 f->height = ost->enc_ctx->height;
2431 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
2432 f->format = ost->enc_ctx->pix_fmt;
2433 } else if (ost->enc->pix_fmts) {
2435 while (ost->enc->pix_fmts[count] != AV_PIX_FMT_NONE)
2437 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2440 memcpy(f->formats, ost->enc->pix_fmts, (count + 1) * sizeof(*f->formats));
2443 case AVMEDIA_TYPE_AUDIO:
2444 if (ost->enc_ctx->sample_fmt != AV_SAMPLE_FMT_NONE) {
2445 f->format = ost->enc_ctx->sample_fmt;
2446 } else if (ost->enc->sample_fmts) {
2448 while (ost->enc->sample_fmts[count] != AV_SAMPLE_FMT_NONE)
2450 f->formats = av_mallocz_array(count + 1, sizeof(*f->formats));
2453 memcpy(f->formats, ost->enc->sample_fmts, (count + 1) * sizeof(*f->formats));
2455 if (ost->enc_ctx->sample_rate) {
2456 f->sample_rate = ost->enc_ctx->sample_rate;
2457 } else if (ost->enc->supported_samplerates) {
2459 while (ost->enc->supported_samplerates[count])
2461 f->sample_rates = av_mallocz_array(count + 1, sizeof(*f->sample_rates));
2462 if (!f->sample_rates)
2464 memcpy(f->sample_rates, ost->enc->supported_samplerates,
2465 (count + 1) * sizeof(*f->sample_rates));
2467 if (ost->enc_ctx->channels) {
2468 f->channel_layout = av_get_default_channel_layout(ost->enc_ctx->channels);
2469 } else if (ost->enc->channel_layouts) {
2471 while (ost->enc->channel_layouts[count])
2473 f->channel_layouts = av_mallocz_array(count + 1, sizeof(*f->channel_layouts));
2474 if (!f->channel_layouts)
2476 memcpy(f->channel_layouts, ost->enc->channel_layouts,
2477 (count + 1) * sizeof(*f->channel_layouts));
2484 /* check filename in case of an image number is expected */
2485 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2486 if (!av_filename_number_test(oc->filename)) {
2487 print_error(oc->filename, AVERROR(EINVAL));
2492 if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2493 av_log(NULL, AV_LOG_ERROR,
2494 "No input streams but output needs an input stream\n");
2498 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2499 /* test if it already exists to avoid losing precious files */
2500 assert_file_overwrite(filename);
2503 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2504 &oc->interrupt_callback,
2506 print_error(filename, err);
2509 } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2510 assert_file_overwrite(filename);
2512 if (o->mux_preload) {
2513 av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2515 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2518 for (i = 0; i < o->nb_metadata_map; i++) {
2520 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2522 if (in_file_index >= nb_input_files) {
2523 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
2526 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2527 in_file_index >= 0 ?
2528 input_files[in_file_index]->ctx : NULL, o);
2532 if (o->chapters_input_file >= nb_input_files) {
2533 if (o->chapters_input_file == INT_MAX) {
2534 /* copy chapters from the first input file that has them*/
2535 o->chapters_input_file = -1;
2536 for (i = 0; i < nb_input_files; i++)
2537 if (input_files[i]->ctx->nb_chapters) {
2538 o->chapters_input_file = i;
2542 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2543 o->chapters_input_file);
2547 if (o->chapters_input_file >= 0)
2548 copy_chapters(input_files[o->chapters_input_file], of,
2549 !o->metadata_chapters_manual);
2551 /* copy global metadata by default */
2552 if (!o->metadata_global_manual && nb_input_files){
2553 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2554 AV_DICT_DONT_OVERWRITE);
2555 if(o->recording_time != INT64_MAX)
2556 av_dict_set(&oc->metadata, "duration", NULL, 0);
2557 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2559 if (!o->metadata_streams_manual)
2560 for (i = of->ost_index; i < nb_output_streams; i++) {
2562 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2564 ist = input_streams[output_streams[i]->source_index];
2565 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2566 if (!output_streams[i]->stream_copy) {
2567 av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2568 if (ist->autorotate)
2569 av_dict_set(&output_streams[i]->st->metadata, "rotate", NULL, 0);
2573 /* process manually set programs */
2574 for (i = 0; i < o->nb_program; i++) {
2575 const char *p = o->program[i].u.str;
2580 const char *p2 = av_get_token(&p, ":");
2581 const char *to_dealloc = p2;
2588 key = av_get_token(&p2, "=");
2590 av_freep(&to_dealloc);
2596 if (!strcmp(key, "program_num"))
2597 progid = strtol(p2, NULL, 0);
2598 av_freep(&to_dealloc);
2602 program = av_new_program(oc, progid);
2604 p = o->program[i].u.str;
2606 const char *p2 = av_get_token(&p, ":");
2607 const char *to_dealloc = p2;
2613 key = av_get_token(&p2, "=");
2615 av_log(NULL, AV_LOG_FATAL,
2616 "No '=' character in program string %s.\n",
2624 if (!strcmp(key, "title")) {
2625 av_dict_set(&program->metadata, "title", p2, 0);
2626 } else if (!strcmp(key, "program_num")) {
2627 } else if (!strcmp(key, "st")) {
2628 int st_num = strtol(p2, NULL, 0);
2629 av_program_add_stream_index(oc, progid, st_num);
2631 av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2634 av_freep(&to_dealloc);
2639 /* process manually set metadata */
2640 for (i = 0; i < o->nb_metadata; i++) {
2643 const char *stream_spec;
2644 int index = 0, j, ret = 0;
2646 val = strchr(o->metadata[i].u.str, '=');
2648 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2649 o->metadata[i].u.str);
2654 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2656 for (j = 0; j < oc->nb_streams; j++) {
2657 ost = output_streams[nb_output_streams - oc->nb_streams + j];
2658 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2659 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2660 if (!strcmp(o->metadata[i].u.str, "rotate")) {
2661 ost->rotate_overridden = 1;
2673 if (index < 0 || index >= oc->nb_chapters) {
2674 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2677 m = &oc->chapters[index]->metadata;
2680 if (index < 0 || index >= oc->nb_programs) {
2681 av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2684 m = &oc->programs[index]->metadata;
2687 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2690 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2697 static int opt_target(void *optctx, const char *opt, const char *arg)
2699 OptionsContext *o = optctx;
2700 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2701 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2703 if (!strncmp(arg, "pal-", 4)) {
2706 } else if (!strncmp(arg, "ntsc-", 5)) {
2709 } else if (!strncmp(arg, "film-", 5)) {
2713 /* Try to determine PAL/NTSC by peeking in the input files */
2714 if (nb_input_files) {
2716 for (j = 0; j < nb_input_files; j++) {
2717 for (i = 0; i < input_files[j]->nb_streams; i++) {
2718 AVStream *st = input_files[j]->ctx->streams[i];
2719 if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO)
2721 fr = st->time_base.den * 1000 / st->time_base.num;
2725 } else if ((fr == 29970) || (fr == 23976)) {
2730 if (norm != UNKNOWN)
2734 if (norm != UNKNOWN)
2735 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2738 if (norm == UNKNOWN) {
2739 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2740 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2741 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2745 if (!strcmp(arg, "vcd")) {
2746 opt_video_codec(o, "c:v", "mpeg1video");
2747 opt_audio_codec(o, "c:a", "mp2");
2748 parse_option(o, "f", "vcd", options);
2750 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2751 parse_option(o, "r", frame_rates[norm], options);
2752 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2754 opt_default(NULL, "b:v", "1150000");
2755 opt_default(NULL, "maxrate:v", "1150000");
2756 opt_default(NULL, "minrate:v", "1150000");
2757 opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2759 opt_default(NULL, "b:a", "224000");
2760 parse_option(o, "ar", "44100", options);
2761 parse_option(o, "ac", "2", options);
2763 opt_default(NULL, "packetsize", "2324");
2764 opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2766 /* We have to offset the PTS, so that it is consistent with the SCR.
2767 SCR starts at 36000, but the first two packs contain only padding
2768 and the first pack from the other stream, respectively, may also have
2769 been written before.
2770 So the real data starts at SCR 36000+3*1200. */
2771 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2772 } else if (!strcmp(arg, "svcd")) {
2774 opt_video_codec(o, "c:v", "mpeg2video");
2775 opt_audio_codec(o, "c:a", "mp2");
2776 parse_option(o, "f", "svcd", options);
2778 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2779 parse_option(o, "r", frame_rates[norm], options);
2780 parse_option(o, "pix_fmt", "yuv420p", options);
2781 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2783 opt_default(NULL, "b:v", "2040000");
2784 opt_default(NULL, "maxrate:v", "2516000");
2785 opt_default(NULL, "minrate:v", "0"); // 1145000;
2786 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2787 opt_default(NULL, "scan_offset", "1");
2789 opt_default(NULL, "b:a", "224000");
2790 parse_option(o, "ar", "44100", options);
2792 opt_default(NULL, "packetsize", "2324");
2794 } else if (!strcmp(arg, "dvd")) {
2796 opt_video_codec(o, "c:v", "mpeg2video");
2797 opt_audio_codec(o, "c:a", "ac3");
2798 parse_option(o, "f", "dvd", options);
2800 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2801 parse_option(o, "r", frame_rates[norm], options);
2802 parse_option(o, "pix_fmt", "yuv420p", options);
2803 opt_default(NULL, "g", norm == PAL ? "15" : "18");
2805 opt_default(NULL, "b:v", "6000000");
2806 opt_default(NULL, "maxrate:v", "9000000");
2807 opt_default(NULL, "minrate:v", "0"); // 1500000;
2808 opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2810 opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2811 opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2813 opt_default(NULL, "b:a", "448000");
2814 parse_option(o, "ar", "48000", options);
2816 } else if (!strncmp(arg, "dv", 2)) {
2818 parse_option(o, "f", "dv", options);
2820 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2821 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2822 norm == PAL ? "yuv420p" : "yuv411p", options);
2823 parse_option(o, "r", frame_rates[norm], options);
2825 parse_option(o, "ar", "48000", options);
2826 parse_option(o, "ac", "2", options);
2829 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2830 return AVERROR(EINVAL);
2833 av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2834 av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2839 static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2841 av_free (vstats_filename);
2842 vstats_filename = av_strdup (arg);
2846 static int opt_vstats(void *optctx, const char *opt, const char *arg)
2849 time_t today2 = time(NULL);
2850 struct tm *today = localtime(&today2);
2852 if (!today) { // maybe tomorrow
2853 av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2857 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2859 return opt_vstats_file(NULL, opt, filename);
2862 static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2864 OptionsContext *o = optctx;
2865 return parse_option(o, "frames:v", arg, options);
2868 static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2870 OptionsContext *o = optctx;
2871 return parse_option(o, "frames:a", arg, options);
2874 static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2876 OptionsContext *o = optctx;
2877 return parse_option(o, "frames:d", arg, options);
2880 static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2883 AVDictionary *cbak = codec_opts;
2884 AVDictionary *fbak = format_opts;
2888 ret = opt_default(NULL, opt, arg);
2890 av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2891 av_dict_copy(&o->g->format_opts, format_opts, 0);
2892 av_dict_free(&codec_opts);
2893 av_dict_free(&format_opts);
2900 static int opt_preset(void *optctx, const char *opt, const char *arg)
2902 OptionsContext *o = optctx;
2904 char filename[1000], line[1000], tmp_line[1000];
2905 const char *codec_name = NULL;
2909 MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2911 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2912 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2913 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2915 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2919 while (fgets(line, sizeof(line), f)) {
2920 char *key = tmp_line, *value, *endptr;
2922 if (strcspn(line, "#\n\r") == 0)
2924 av_strlcpy(tmp_line, line, sizeof(tmp_line));
2925 if (!av_strtok(key, "=", &value) ||
2926 !av_strtok(value, "\r\n", &endptr)) {
2927 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2930 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2932 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2933 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2934 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2935 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2936 else if (opt_default_new(o, key, value) < 0) {
2937 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2938 filename, line, key, value);
2948 static int opt_old2new(void *optctx, const char *opt, const char *arg)
2950 OptionsContext *o = optctx;
2951 char *s = av_asprintf("%s:%c", opt + 1, *opt);
2952 int ret = parse_option(o, s, arg, options);
2957 static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2959 OptionsContext *o = optctx;
2961 if(!strcmp(opt, "ab")){
2962 av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
2964 } else if(!strcmp(opt, "b")){
2965 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2966 av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2969 av_dict_set(&o->g->codec_opts, opt, arg, 0);
2973 static int opt_qscale(void *optctx, const char *opt, const char *arg)
2975 OptionsContext *o = optctx;
2978 if(!strcmp(opt, "qscale")){
2979 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2980 return parse_option(o, "q:v", arg, options);
2982 s = av_asprintf("q%s", opt + 6);
2983 ret = parse_option(o, s, arg, options);
2988 static int opt_profile(void *optctx, const char *opt, const char *arg)
2990 OptionsContext *o = optctx;
2991 if(!strcmp(opt, "profile")){
2992 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2993 av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2996 av_dict_set(&o->g->codec_opts, opt, arg, 0);
3000 static int opt_video_filters(void *optctx, const char *opt, const char *arg)
3002 OptionsContext *o = optctx;
3003 return parse_option(o, "filter:v", arg, options);
3006 static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
3008 OptionsContext *o = optctx;
3009 return parse_option(o, "filter:a", arg, options);
3012 static int opt_vsync(void *optctx, const char *opt, const char *arg)
3014 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
3015 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
3016 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
3017 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
3019 if (video_sync_method == VSYNC_AUTO)
3020 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
3024 static int opt_timecode(void *optctx, const char *opt, const char *arg)
3026 OptionsContext *o = optctx;
3027 char *tcr = av_asprintf("timecode=%s", arg);
3028 int ret = parse_option(o, "metadata:g", tcr, options);
3030 ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
3035 static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
3037 OptionsContext *o = optctx;
3038 char layout_str[32];
3041 int ret, channels, ac_str_size;
3044 layout = av_get_channel_layout(arg);
3046 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
3047 return AVERROR(EINVAL);
3049 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
3050 ret = opt_default_new(o, opt, layout_str);
3054 /* set 'ac' option based on channel layout */
3055 channels = av_get_channel_layout_nb_channels(layout);
3056 snprintf(layout_str, sizeof(layout_str), "%d", channels);
3057 stream_str = strchr(opt, ':');
3058 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
3059 ac_str = av_mallocz(ac_str_size);
3061 return AVERROR(ENOMEM);
3062 av_strlcpy(ac_str, "ac", 3);
3064 av_strlcat(ac_str, stream_str, ac_str_size);
3065 ret = parse_option(o, ac_str, layout_str, options);
3071 static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
3073 OptionsContext *o = optctx;
3074 return parse_option(o, "q:a", arg, options);
3077 static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
3079 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3080 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3081 return AVERROR(ENOMEM);
3082 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3083 filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
3084 if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
3085 return AVERROR(ENOMEM);
3087 input_stream_potentially_available = 1;
3092 static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
3094 uint8_t *graph_desc = read_file(arg);
3096 return AVERROR(EINVAL);
3098 GROW_ARRAY(filtergraphs, nb_filtergraphs);
3099 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
3100 return AVERROR(ENOMEM);
3101 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
3102 filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
3104 input_stream_potentially_available = 1;
3109 void show_help_default(const char *opt, const char *arg)
3111 /* per-file options have at least one of those set */
3112 const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
3113 int show_advanced = 0, show_avoptions = 0;
3116 if (!strcmp(opt, "long"))
3118 else if (!strcmp(opt, "full"))
3119 show_advanced = show_avoptions = 1;
3121 av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
3126 printf("Getting help:\n"
3127 " -h -- print basic options\n"
3128 " -h long -- print more options\n"
3129 " -h full -- print all options (including all format and codec specific options, very long)\n"
3130 " -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
3131 " See man %s for detailed description of the options.\n"
3132 "\n", program_name);
3134 show_help_options(options, "Print help / information / capabilities:",
3137 show_help_options(options, "Global options (affect whole program "
3138 "instead of just one file:",
3139 0, per_file | OPT_EXIT | OPT_EXPERT, 0);
3141 show_help_options(options, "Advanced global options:", OPT_EXPERT,
3142 per_file | OPT_EXIT, 0);
3144 show_help_options(options, "Per-file main options:", 0,
3145 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
3146 OPT_EXIT, per_file);
3148 show_help_options(options, "Advanced per-file options:",
3149 OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
3151 show_help_options(options, "Video options:",
3152 OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
3154 show_help_options(options, "Advanced Video options:",
3155 OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
3157 show_help_options(options, "Audio options:",
3158 OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
3160 show_help_options(options, "Advanced Audio options:",
3161 OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
3162 show_help_options(options, "Subtitle options:",
3163 OPT_SUBTITLE, 0, 0);
3166 if (show_avoptions) {
3167 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3168 show_help_children(avcodec_get_class(), flags);
3169 show_help_children(avformat_get_class(), flags);
3171 show_help_children(sws_get_class(), flags);
3173 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
3174 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
3178 void show_usage(void)
3180 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
3181 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3182 av_log(NULL, AV_LOG_INFO, "\n");
3190 static const OptionGroupDef groups[] = {
3191 [GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
3192 [GROUP_INFILE] = { "input file", "i", OPT_INPUT },
3195 static int open_files(OptionGroupList *l, const char *inout,
3196 int (*open_file)(OptionsContext*, const char*))
3200 for (i = 0; i < l->nb_groups; i++) {
3201 OptionGroup *g = &l->groups[i];
3207 ret = parse_optgroup(&o, g);
3209 av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3210 "%s.\n", inout, g->arg);
3214 av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3215 ret = open_file(&o, g->arg);
3218 av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3222 av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3228 int ffmpeg_parse_options(int argc, char **argv)
3230 OptionParseContext octx;
3234 memset(&octx, 0, sizeof(octx));
3236 /* split the commandline into an internal representation */
3237 ret = split_commandline(&octx, argc, argv, options, groups,
3238 FF_ARRAY_ELEMS(groups));
3240 av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3244 /* apply global options */
3245 ret = parse_optgroup(NULL, &octx.global_opts);
3247 av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3251 /* configure terminal and setup signal handlers */
3254 /* open input files */
3255 ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3257 av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3261 /* create the complex filtergraphs */
3262 ret = init_complex_filters();
3264 av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3268 /* open output files */
3269 ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3271 av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3275 /* configure the complex filtergraphs */
3276 ret = configure_complex_filters();
3278 av_log(NULL, AV_LOG_FATAL, "Error configuring complex filters.\n");
3283 uninit_parse_context(&octx);
3285 av_strerror(ret, error, sizeof(error));
3286 av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3291 static int opt_progress(void *optctx, const char *opt, const char *arg)
3293 AVIOContext *avio = NULL;
3296 if (!strcmp(arg, "-"))
3298 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3300 av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3301 arg, av_err2str(ret));
3304 progress_avio = avio;
3308 #define OFFSET(x) offsetof(OptionsContext, x)
3309 const OptionDef options[] = {
3311 #include "cmdutils_common_opts.h"
3312 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3313 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3314 "force format", "fmt" },
3315 { "y", OPT_BOOL, { &file_overwrite },
3316 "overwrite output files" },
3317 { "n", OPT_BOOL, { &no_file_overwrite },
3318 "never overwrite output files" },
3319 { "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3320 "Ignore unknown stream types" },
3321 { "copy_unknown", OPT_BOOL | OPT_EXPERT, { ©_unknown_streams },
3322 "Copy unknown stream types" },
3323 { "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3324 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3325 "codec name", "codec" },
3326 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3327 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3328 "codec name", "codec" },
3329 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3330 OPT_OUTPUT, { .off = OFFSET(presets) },
3331 "preset name", "preset" },
3332 { "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3333 OPT_OUTPUT, { .func_arg = opt_map },
3334 "set input stream mapping",
3335 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3336 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3337 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3338 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3339 OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3340 "set metadata information of outfile from infile",
3341 "outfile[,metadata]:infile[,metadata]" },
3342 { "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3343 OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3344 "set chapters mapping", "input_file_index" },
3345 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3346 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3347 "record or transcode \"duration\" seconds of audio/video",
3349 { "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3350 "record or transcode stop time", "time_stop" },
3351 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3352 "set the limit file size in bytes", "limit_size" },
3353 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3354 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3355 "set the start time offset", "time_off" },
3356 { "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3357 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time_eof) },
3358 "set the start time offset relative to EOF", "time_off" },
3359 { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3360 OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3361 "enable/disable seeking by timestamp with -ss" },
3362 { "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3363 OPT_INPUT, { .off = OFFSET(accurate_seek) },
3364 "enable/disable accurate seeking with -ss" },
3365 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3366 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3367 "set the input ts offset", "time_off" },
3368 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3369 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3370 "set the input ts scale", "scale" },
3371 { "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3372 "set the recording timestamp ('now' to set the current time)", "time" },
3373 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3374 "add metadata", "string=string" },
3375 { "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3376 "add program with specified streams", "title=string:st=number..." },
3377 { "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3378 OPT_OUTPUT, { .func_arg = opt_data_frames },
3379 "set the number of data frames to output", "number" },
3380 { "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3381 "add timings for benchmarking" },
3382 { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3383 "add timings for each task" },
3384 { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3385 "write program-readable progress information", "url" },
3386 { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3387 "enable or disable interaction on standard input" },
3388 { "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3389 "set max runtime in seconds", "limit" },
3390 { "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3391 "dump each input packet" },
3392 { "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3393 "when dumping packets, also dump the payload" },
3394 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3395 OPT_INPUT, { .off = OFFSET(rate_emu) },
3396 "read input at native frame rate", "" },
3397 { "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3398 "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3399 "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3400 { "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3401 "video sync method", "" },
3402 { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3403 "frame drop threshold", "" },
3404 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3405 "audio sync method", "" },
3406 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3407 "audio drift threshold", "threshold" },
3408 { "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
3409 "copy timestamps" },
3410 { "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3411 "shift input timestamps to start at 0 when using copyts" },
3412 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
3413 "copy input stream time base when stream copying", "mode" },
3414 { "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3415 OPT_OUTPUT, { .off = OFFSET(shortest) },
3416 "finish encoding within shortest input" },
3417 { "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3418 OPT_OUTPUT, { .off = OFFSET(apad) },
3420 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3421 "timestamp discontinuity delta threshold", "threshold" },
3422 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3423 "timestamp error delta threshold", "threshold" },
3424 { "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3425 "exit on error", "error" },
3426 { "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3427 "abort on the specified condition flags", "flags" },
3428 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3429 OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3430 "copy initial non-keyframes" },
3431 { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3432 "copy or discard frames before start time" },
3433 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3434 "set the number of frames to output", "number" },
3435 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3436 OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3437 "force codec tag/fourcc", "fourcc/tag" },
3438 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3439 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3440 "use fixed quality scale (VBR)", "q" },
3441 { "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3442 OPT_OUTPUT, { .func_arg = opt_qscale },
3443 "use fixed quality scale (VBR)", "q" },
3444 { "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3445 "set profile", "profile" },
3446 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3447 "set stream filtergraph", "filter_graph" },
3448 { "filter_threads", HAS_ARG | OPT_INT, { &filter_nbthreads },
3449 "number of non-complex filter threads" },
3450 { "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3451 "read stream filtergraph description from a file", "filename" },
3452 { "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3453 "reinit filtergraph on input parameter changes", "" },
3454 { "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3455 "create a complex filtergraph", "graph_description" },
3456 { "filter_complex_threads", HAS_ARG | OPT_INT, { &filter_complex_nbthreads },
3457 "number of threads for -filter_complex" },
3458 { "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3459 "create a complex filtergraph", "graph_description" },
3460 { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3461 "read complex filtergraph description from a file", "filename" },
3462 { "stats", OPT_BOOL, { &print_stats },
3463 "print progress report during encoding", },
3464 { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3465 OPT_OUTPUT, { .func_arg = opt_attach },
3466 "add an attachment to the output file", "filename" },
3467 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3468 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3469 "extract an attachment into a file", "filename" },
3470 { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3471 OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3472 { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3473 "print timestamp debugging info" },
3474 { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3475 "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
3476 { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3477 OPT_INPUT, { .off = OFFSET(discard) },
3479 { "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3480 OPT_OUTPUT, { .off = OFFSET(disposition) },
3481 "disposition", "" },
3482 { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3483 { .off = OFFSET(thread_queue_size) },
3484 "set the maximum number of queued packets from the demuxer" },
3487 { "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3488 "set the number of video frames to output", "number" },
3489 { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3490 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3491 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3492 { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3493 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3494 "set frame size (WxH or abbreviation)", "size" },
3495 { "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3496 OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3497 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3498 { "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3499 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3500 "set pixel format", "format" },
3501 { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3502 "set the number of bits per raw sample", "number" },
3503 { "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3504 "deprecated use -g 1" },
3505 { "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3507 { "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3508 OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3509 "rate control override for specific intervals", "override" },
3510 { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3511 OPT_OUTPUT, { .func_arg = opt_video_codec },
3512 "force video codec ('copy' to copy stream)", "codec" },
3513 { "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3515 { "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3517 { "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3518 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3519 { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3520 "select the pass number (1 to 3)", "n" },
3521 { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3522 OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3523 "select two pass log file name prefix", "prefix" },
3524 { "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3525 "this option is deprecated, use the yadif filter instead" },
3526 { "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3527 "calculate PSNR of compressed frames" },
3528 { "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3529 "dump video coding statistics to file" },
3530 { "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3531 "dump video coding statistics to file", "file" },
3532 { "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3533 "set video filters", "filter_graph" },
3534 { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3535 OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3536 "specify intra matrix coeffs", "matrix" },
3537 { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3538 OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3539 "specify inter matrix coeffs", "matrix" },
3540 { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3541 OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3542 "specify intra matrix coeffs", "matrix" },
3543 { "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3544 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3545 "top=1/bottom=0/auto=-1 field first", "" },
3546 { "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3547 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3548 "force video tag/fourcc", "fourcc/tag" },
3549 { "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3550 "show QP histogram" },
3551 { "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3552 OPT_OUTPUT, { .off = OFFSET(force_fps) },
3553 "force the selected framerate, disable the best supported framerate selection" },
3554 { "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3555 OPT_OUTPUT, { .func_arg = opt_streamid },
3556 "set the value of an outfile streamid", "streamIndex:value" },
3557 { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3558 OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3559 "force key frames at specified timestamps", "timestamps" },
3560 { "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3561 "audio bitrate (please use -b:a)", "bitrate" },
3562 { "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3563 "video bitrate (please use -b:v)", "bitrate" },
3564 { "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3565 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3566 "use HW accelerated decoding", "hwaccel name" },
3567 { "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3568 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3569 "select a device for HW acceleration", "devicename" },
3570 { "hwaccel_output_format", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3571 OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_output_formats) },
3572 "select output format used with HW accelerated decoding", "format" },
3573 #if CONFIG_VDA || CONFIG_VIDEOTOOLBOX
3574 { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3576 { "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3577 "show available HW acceleration methods" },
3578 { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3579 OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3580 "automatically insert correct rotate filters" },
3581 { "hwaccel_lax_profile_check", OPT_BOOL | OPT_EXPERT, { &hwaccel_lax_profile_check},
3582 "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream" },
3585 { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3586 "set the number of audio frames to output", "number" },
3587 { "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3588 "set audio quality (codec-specific)", "quality", },
3589 { "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3590 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3591 "set audio sampling rate (in Hz)", "rate" },
3592 { "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3593 OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3594 "set number of audio channels", "channels" },
3595 { "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3597 { "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3598 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3599 "force audio codec ('copy' to copy stream)", "codec" },
3600 { "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3601 OPT_OUTPUT, { .func_arg = opt_old2new },
3602 "force audio tag/fourcc", "fourcc/tag" },
3603 { "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3604 "change audio volume (256=normal)" , "volume" },
3605 { "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3606 OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3607 "set sample format", "format" },
3608 { "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3609 OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3610 "set channel layout", "layout" },
3611 { "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3612 "set audio filters", "filter_graph" },
3613 { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3614 "set the maximum number of channels to try to guess the channel layout" },
3616 /* subtitle options */
3617 { "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3618 "disable subtitle" },
3619 { "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3620 "force subtitle codec ('copy' to copy stream)", "codec" },
3621 { "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3622 , "force subtitle tag/fourcc", "fourcc/tag" },
3623 { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3624 "fix subtitles duration" },
3625 { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3626 "set canvas size (WxH or abbreviation)", "size" },
3629 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3630 "deprecated, use -channel", "channel" },
3631 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3632 "deprecated, use -standard", "standard" },
3633 { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3636 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3637 "set the maximum demux-decode delay", "seconds" },
3638 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3639 "set the initial demux-decode delay", "seconds" },
3640 { "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
3641 "override the options from ffserver", "" },
3642 { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3643 "specify a file in which to print sdp information", "file" },
3645 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3646 "A comma-separated list of bitstream filters", "bitstream_filters" },
3647 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3648 "deprecated", "audio bitstream_filters" },
3649 { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3650 "deprecated", "video bitstream_filters" },
3652 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3653 "set the audio options to the indicated preset", "preset" },
3654 { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3655 "set the video options to the indicated preset", "preset" },
3656 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3657 "set the subtitle options to the indicated preset", "preset" },
3658 { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3659 "set options from indicated preset file", "filename" },
3661 { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
3662 "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
3664 /* data codec support */
3665 { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3666 "force data codec ('copy' to copy stream)", "codec" },
3667 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3671 { "vaapi_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vaapi_device },
3672 "set VAAPI hardware device (DRM path or X11 display name)", "device" },