2 * Various utilities for command line tools
3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 /* Include only the enabled headers since some compilers (namely, Sun
28 Studio) will not omit unused inline functions and create undefined
29 references to libraries that are not being built. */
32 #include "libavformat/avformat.h"
33 #include "libavfilter/avfilter.h"
34 #include "libavdevice/avdevice.h"
35 #include "libswscale/swscale.h"
36 #include "libpostproc/postprocess.h"
37 #include "libavutil/avstring.h"
38 #include "libavutil/pixdesc.h"
39 #include "libavutil/eval.h"
40 #include "libavcodec/opt.h"
41 #include "libavcore/avcore.h"
45 #include "libavformat/network.h"
47 #if HAVE_SYS_RESOURCE_H
48 #include <sys/resource.h>
51 const char **opt_names;
52 static int opt_name_count;
53 AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB];
54 AVFormatContext *avformat_opts;
55 struct SwsContext *sws_opts;
57 const int this_year = 2010;
59 double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max)
63 double d = av_strtod(numstr, &tail);
65 error= "Expected number for %s but found: %s\n";
66 else if (d < min || d > max)
67 error= "The value for %s was %s which is not within %f - %f\n";
68 else if(type == OPT_INT64 && (int64_t)d != d)
69 error= "Expected int64 for %s but found %s\n";
72 fprintf(stderr, error, context, numstr, min, max);
76 int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
78 int64_t us = parse_date(timestr, is_duration);
79 if (us == INT64_MIN) {
80 fprintf(stderr, "Invalid %s specification for %s: %s\n",
81 is_duration ? "duration" : "date", context, timestr);
87 void show_help_options(const OptionDef *options, const char *msg, int mask, int value)
93 for(po = options; po->name != NULL; po++) {
95 if ((po->flags & mask) == value) {
100 av_strlcpy(buf, po->name, sizeof(buf));
101 if (po->flags & HAS_ARG) {
102 av_strlcat(buf, " ", sizeof(buf));
103 av_strlcat(buf, po->argname, sizeof(buf));
105 printf("-%-17s %s\n", buf, po->help);
110 static const OptionDef* find_option(const OptionDef *po, const char *name){
111 while (po->name != NULL) {
112 if (!strcmp(name, po->name))
119 void parse_options(int argc, char **argv, const OptionDef *options,
120 void (* parse_arg_function)(const char*))
122 const char *opt, *arg;
123 int optindex, handleoptions=1;
128 while (optindex < argc) {
129 opt = argv[optindex++];
131 if (handleoptions && opt[0] == '-' && opt[1] != '\0') {
133 if (opt[1] == '-' && opt[2] == '\0') {
138 po= find_option(options, opt);
139 if (!po->name && opt[0] == 'n' && opt[1] == 'o') {
140 /* handle 'no' bool option */
141 po = find_option(options, opt + 2);
142 if (!(po->name && (po->flags & OPT_BOOL)))
147 po= find_option(options, "default");
150 fprintf(stderr, "%s: unrecognized option '%s'\n", argv[0], opt);
154 if (po->flags & HAS_ARG) {
155 arg = argv[optindex++];
157 fprintf(stderr, "%s: missing argument for option '%s'\n", argv[0], opt);
161 if (po->flags & OPT_STRING) {
163 str = av_strdup(arg);
164 *po->u.str_arg = str;
165 } else if (po->flags & OPT_BOOL) {
166 *po->u.int_arg = bool_val;
167 } else if (po->flags & OPT_INT) {
168 *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
169 } else if (po->flags & OPT_INT64) {
170 *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX);
171 } else if (po->flags & OPT_FLOAT) {
172 *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0);
173 } else if (po->flags & OPT_FUNC2) {
174 if (po->u.func2_arg(opt, arg) < 0) {
175 fprintf(stderr, "%s: failed to set value '%s' for option '%s'\n", argv[0], arg, opt);
181 if(po->flags & OPT_EXIT)
184 if (parse_arg_function)
185 parse_arg_function(opt);
190 int opt_default(const char *opt, const char *arg){
193 const AVOption *o= NULL;
194 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};
196 for(type=0; type<AVMEDIA_TYPE_NB && ret>= 0; type++){
197 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[type], opt_types[type]);
199 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o);
202 ret = av_set_string3(avformat_opts, opt, arg, 1, &o);
204 ret = av_set_string3(sws_opts, opt, arg, 1, &o);
207 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1, &o);
208 else if(opt[0] == 'v')
209 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1, &o);
210 else if(opt[0] == 's')
211 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg, 1, &o);
214 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt);
218 fprintf(stderr, "Unrecognized option '%s'\n", opt);
222 // av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avcodec_opts, opt, NULL), (int)av_get_int(avcodec_opts, opt, NULL));
224 //FIXME we should always use avcodec_opts, ... for storing options so there will not be any need to keep track of what i set over this
225 opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
226 opt_names[opt_name_count++]= o->name;
228 if(avcodec_opts[0]->debug || avformat_opts->debug)
229 av_log_set_level(AV_LOG_DEBUG);
233 int opt_loglevel(const char *opt, const char *arg)
235 const struct { const char *name; int level; } log_levels[] = {
236 { "quiet" , AV_LOG_QUIET },
237 { "panic" , AV_LOG_PANIC },
238 { "fatal" , AV_LOG_FATAL },
239 { "error" , AV_LOG_ERROR },
240 { "warning", AV_LOG_WARNING },
241 { "info" , AV_LOG_INFO },
242 { "verbose", AV_LOG_VERBOSE },
243 { "debug" , AV_LOG_DEBUG },
249 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++) {
250 if (!strcmp(log_levels[i].name, arg)) {
251 av_log_set_level(log_levels[i].level);
256 level = strtol(arg, &tail, 10);
258 fprintf(stderr, "Invalid loglevel \"%s\". "
259 "Possible levels are numbers or:\n", arg);
260 for (i = 0; i < FF_ARRAY_ELEMS(log_levels); i++)
261 fprintf(stderr, "\"%s\"\n", log_levels[i].name);
264 av_log_set_level(level);
268 int opt_timelimit(const char *opt, const char *arg)
271 int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
272 struct rlimit rl = { lim, lim + 1 };
273 if (setrlimit(RLIMIT_CPU, &rl))
276 fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt);
281 void set_context_opts(void *ctx, void *opts_ctx, int flags)
284 for(i=0; i<opt_name_count; i++){
287 const char *str= av_get_string(opts_ctx, opt_names[i], &opt, buf, sizeof(buf));
288 /* if an option with name opt_names[i] is present in opts_ctx then str is non-NULL */
289 if(str && ((opt->flags & flags) == flags))
290 av_set_string3(ctx, opt_names[i], str, 1, NULL);
294 void print_error(const char *filename, int err)
297 const char *errbuf_ptr = errbuf;
299 if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
300 errbuf_ptr = strerror(AVUNERROR(err));
301 fprintf(stderr, "%s: %s\n", filename, errbuf_ptr);
304 #define PRINT_LIB_VERSION(outstream,libname,LIBNAME,indent) \
305 if (CONFIG_##LIBNAME) { \
306 unsigned int version = libname##_version(); \
307 fprintf(outstream, "%slib%-10s %2d.%2d.%2d / %2d.%2d.%2d\n", \
308 indent? " " : "", #libname, \
309 LIB##LIBNAME##_VERSION_MAJOR, \
310 LIB##LIBNAME##_VERSION_MINOR, \
311 LIB##LIBNAME##_VERSION_MICRO, \
312 version >> 16, version >> 8 & 0xff, version & 0xff); \
315 static void print_all_lib_versions(FILE* outstream, int indent)
317 PRINT_LIB_VERSION(outstream, avutil, AVUTIL, indent);
318 PRINT_LIB_VERSION(outstream, avcore, AVCORE, indent);
319 PRINT_LIB_VERSION(outstream, avcodec, AVCODEC, indent);
320 PRINT_LIB_VERSION(outstream, avformat, AVFORMAT, indent);
321 PRINT_LIB_VERSION(outstream, avdevice, AVDEVICE, indent);
322 PRINT_LIB_VERSION(outstream, avfilter, AVFILTER, indent);
323 PRINT_LIB_VERSION(outstream, swscale, SWSCALE, indent);
324 PRINT_LIB_VERSION(outstream, postproc, POSTPROC, indent);
327 static void maybe_print_config(const char *lib, const char *cfg)
329 static int warned_cfg;
331 if (strcmp(FFMPEG_CONFIGURATION, cfg)) {
333 fprintf(stderr, " WARNING: library configuration mismatch\n");
336 fprintf(stderr, " %-11s configuration: %s\n", lib, cfg);
340 #define PRINT_LIB_CONFIG(lib, tag, cfg) do { \
342 maybe_print_config(tag, cfg); \
345 void show_banner(void)
347 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmpeg developers\n",
348 program_name, program_birth_year, this_year);
349 fprintf(stderr, " built on %s %s with %s %s\n",
350 __DATE__, __TIME__, CC_TYPE, CC_VERSION);
351 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n");
352 PRINT_LIB_CONFIG(AVUTIL, "libavutil", avutil_configuration());
353 PRINT_LIB_CONFIG(AVCORE, "libavcore", avcore_configuration());
354 PRINT_LIB_CONFIG(AVCODEC, "libavcodec", avcodec_configuration());
355 PRINT_LIB_CONFIG(AVFORMAT, "libavformat", avformat_configuration());
356 PRINT_LIB_CONFIG(AVDEVICE, "libavdevice", avdevice_configuration());
357 PRINT_LIB_CONFIG(AVFILTER, "libavfilter", avfilter_configuration());
358 PRINT_LIB_CONFIG(SWSCALE, "libswscale", swscale_configuration());
359 PRINT_LIB_CONFIG(POSTPROC, "libpostproc", postproc_configuration());
360 print_all_lib_versions(stderr, 1);
363 void show_version(void) {
364 printf("%s " FFMPEG_VERSION "\n", program_name);
365 print_all_lib_versions(stdout, 0);
368 void show_license(void)
372 "This version of %s has nonfree parts compiled in.\n"
373 "Therefore it is not legally redistributable.\n",
376 "%s is free software; you can redistribute it and/or modify\n"
377 "it under the terms of the GNU General Public License as published by\n"
378 "the Free Software Foundation; either version 3 of the License, or\n"
379 "(at your option) any later version.\n"
381 "%s is distributed in the hope that it will be useful,\n"
382 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
383 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
384 "GNU General Public License for more details.\n"
386 "You should have received a copy of the GNU General Public License\n"
387 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
388 program_name, program_name, program_name
390 "%s is free software; you can redistribute it and/or modify\n"
391 "it under the terms of the GNU General Public License as published by\n"
392 "the Free Software Foundation; either version 2 of the License, or\n"
393 "(at your option) any later version.\n"
395 "%s is distributed in the hope that it will be useful,\n"
396 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
397 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
398 "GNU General Public License for more details.\n"
400 "You should have received a copy of the GNU General Public License\n"
401 "along with %s; if not, write to the Free Software\n"
402 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
403 program_name, program_name, program_name
405 "%s is free software; you can redistribute it and/or modify\n"
406 "it under the terms of the GNU Lesser General Public License as published by\n"
407 "the Free Software Foundation; either version 3 of the License, or\n"
408 "(at your option) any later version.\n"
410 "%s is distributed in the hope that it will be useful,\n"
411 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
412 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
413 "GNU Lesser General Public License for more details.\n"
415 "You should have received a copy of the GNU Lesser General Public License\n"
416 "along with %s. If not, see <http://www.gnu.org/licenses/>.\n",
417 program_name, program_name, program_name
419 "%s is free software; you can redistribute it and/or\n"
420 "modify it under the terms of the GNU Lesser General Public\n"
421 "License as published by the Free Software Foundation; either\n"
422 "version 2.1 of the License, or (at your option) any later version.\n"
424 "%s is distributed in the hope that it will be useful,\n"
425 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
426 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n"
427 "Lesser General Public License for more details.\n"
429 "You should have received a copy of the GNU Lesser General Public\n"
430 "License along with %s; if not, write to the Free Software\n"
431 "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n",
432 program_name, program_name, program_name
437 void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
441 for (i=-1; i < nb_fmts; i++) {
442 get_fmt_string (fmt_str, sizeof(fmt_str), i);
443 fprintf(stdout, "%s\n", fmt_str);
447 void show_formats(void)
449 AVInputFormat *ifmt=NULL;
450 AVOutputFormat *ofmt=NULL;
451 const char *last_name;
455 " D. = Demuxing supported\n"
456 " .E = Muxing supported\n"
462 const char *name=NULL;
463 const char *long_name=NULL;
465 while((ofmt= av_oformat_next(ofmt))) {
466 if((name == NULL || strcmp(ofmt->name, name)<0) &&
467 strcmp(ofmt->name, last_name)>0){
469 long_name= ofmt->long_name;
473 while((ifmt= av_iformat_next(ifmt))) {
474 if((name == NULL || strcmp(ifmt->name, name)<0) &&
475 strcmp(ifmt->name, last_name)>0){
477 long_name= ifmt->long_name;
480 if(name && strcmp(ifmt->name, name)==0)
492 long_name ? long_name:" ");
496 void show_codecs(void)
498 AVCodec *p=NULL, *p2;
499 const char *last_name;
502 " D..... = Decoding supported\n"
503 " .E.... = Encoding supported\n"
504 " ..V... = Video codec\n"
505 " ..A... = Audio codec\n"
506 " ..S... = Subtitle codec\n"
507 " ...S.. = Supports draw_horiz_band\n"
508 " ....D. = Supports direct rendering method 1\n"
509 " .....T = Supports weird frame truncation\n"
516 const char *type_str;
519 while((p= av_codec_next(p))) {
520 if((p2==NULL || strcmp(p->name, p2->name)<0) &&
521 strcmp(p->name, last_name)>0){
523 decode= encode= cap=0;
525 if(p2 && strcmp(p->name, p2->name)==0){
526 if(p->decode) decode=1;
527 if(p->encode) encode=1;
528 cap |= p->capabilities;
536 case AVMEDIA_TYPE_VIDEO:
539 case AVMEDIA_TYPE_AUDIO:
542 case AVMEDIA_TYPE_SUBTITLE:
550 " %s%s%s%s%s%s %-15s %s",
551 decode ? "D": (/*p2->decoder ? "d":*/" "),
554 cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
555 cap & CODEC_CAP_DR1 ? "D":" ",
556 cap & CODEC_CAP_TRUNCATED ? "T":" ",
558 p2->long_name ? p2->long_name : "");
559 /* if(p2->decoder && decode==0)
560 printf(" use %s for decoding", p2->decoder->name);*/
565 "Note, the names of encoders and decoders do not always match, so there are\n"
566 "several cases where the above table shows encoder only or decoder only entries\n"
567 "even though both encoding and decoding are supported. For example, the h263\n"
568 "decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
574 AVBitStreamFilter *bsf=NULL;
576 printf("Bitstream filters:\n");
577 while((bsf = av_bitstream_filter_next(bsf)))
578 printf("%s\n", bsf->name);
582 void show_protocols(void)
584 URLProtocol *up=NULL;
586 printf("Supported file protocols:\n");
587 while((up = av_protocol_next(up)))
588 printf("%s\n", up->name);
591 void show_filters(void)
593 AVFilter av_unused(**filter) = NULL;
595 printf("Filters:\n");
597 while ((filter = av_filter_next(filter)) && *filter)
598 printf("%-16s %s\n", (*filter)->name, (*filter)->description);
602 void show_pix_fmts(void)
604 enum PixelFormat pix_fmt;
608 "I.... = Supported Input format for conversion\n"
609 ".O... = Supported Output format for conversion\n"
610 "..H.. = Hardware accelerated format\n"
611 "...P. = Paletted format\n"
612 "....B = Bitstream format\n"
613 "FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL\n"
617 # define sws_isSupportedInput(x) 0
618 # define sws_isSupportedOutput(x) 0
621 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) {
622 const AVPixFmtDescriptor *pix_desc = &av_pix_fmt_descriptors[pix_fmt];
623 printf("%c%c%c%c%c %-16s %d %2d\n",
624 sws_isSupportedInput (pix_fmt) ? 'I' : '.',
625 sws_isSupportedOutput(pix_fmt) ? 'O' : '.',
626 pix_desc->flags & PIX_FMT_HWACCEL ? 'H' : '.',
627 pix_desc->flags & PIX_FMT_PAL ? 'P' : '.',
628 pix_desc->flags & PIX_FMT_BITSTREAM ? 'B' : '.',
630 pix_desc->nb_components,
631 av_get_bits_per_pixel(pix_desc));
638 int yesno = (toupper(c) == 'Y');
640 while (c != '\n' && c != EOF)
646 int read_file(const char *filename, char **bufptr, size_t *size)
648 FILE *f = fopen(filename, "rb");
651 fprintf(stderr, "Cannot read file '%s': %s\n", filename, strerror(errno));
652 return AVERROR(errno);
654 fseek(f, 0, SEEK_END);
656 fseek(f, 0, SEEK_SET);
657 *bufptr = av_malloc(*size + 1);
659 fprintf(stderr, "Could not allocate file buffer\n");
661 return AVERROR(ENOMEM);
663 fread(*bufptr, 1, *size, f);
664 (*bufptr)[*size++] = '\0';