X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=cmdutils.c;h=90dfccf44577c4065cdc54ddb1452824e421481d;hb=ca76a11948eaffd2667efa247cff0eb13889c043;hp=d4afc02f6ae97fc30395b81b66ec8373173e5d72;hpb=c5dc6026008110adee05555fcf2f235850cb506d;p=ffmpeg diff --git a/cmdutils.c b/cmdutils.c index d4afc02f6ae..90dfccf4457 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -41,6 +41,9 @@ #if CONFIG_NETWORK #include "libavformat/network.h" #endif +#if HAVE_SYS_RESOURCE_H +#include +#endif #undef exit @@ -50,7 +53,7 @@ AVCodecContext *avcodec_opts[CODEC_TYPE_NB]; AVFormatContext *avformat_opts; struct SwsContext *sws_opts; -const int this_year = 2009; +const int this_year = 2010; double parse_number_or_die(const char *context, const char *numstr, int type, double min, double max) { @@ -130,10 +133,11 @@ void parse_options(int argc, char **argv, const OptionDef *options, handleoptions = 0; continue; } - po= find_option(options, opt + 1); - if (!po->name && opt[1] == 'n' && opt[2] == 'o') { + opt++; + po= find_option(options, opt); + if (!po->name && opt[0] == 'n' && opt[1] == 'o') { /* handle 'no' bool option */ - po = find_option(options, opt + 3); + po = find_option(options, opt + 2); if (!(po->name && (po->flags & OPT_BOOL))) goto unknown_opt; bool_val = 0; @@ -160,13 +164,13 @@ unknown_opt: } else if (po->flags & OPT_BOOL) { *po->u.int_arg = bool_val; } else if (po->flags & OPT_INT) { - *po->u.int_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT_MIN, INT_MAX); + *po->u.int_arg = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX); } else if (po->flags & OPT_INT64) { - *po->u.int64_arg = parse_number_or_die(opt+1, arg, OPT_INT64, INT64_MIN, INT64_MAX); + *po->u.int64_arg = parse_number_or_die(opt, arg, OPT_INT64, INT64_MIN, INT64_MAX); } else if (po->flags & OPT_FLOAT) { - *po->u.float_arg = parse_number_or_die(opt+1, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0); + *po->u.float_arg = parse_number_or_die(opt, arg, OPT_FLOAT, -1.0/0.0, 1.0/0.0); } else if (po->flags & OPT_FUNC2) { - if(po->u.func2_arg(opt+1, arg)<0) + if(po->u.func2_arg(opt, arg)<0) goto unknown_opt; } else { po->u.func_arg(arg); @@ -256,6 +260,19 @@ int opt_loglevel(const char *opt, const char *arg) return 0; } +int opt_timelimit(const char *opt, const char *arg) +{ +#if HAVE_SYS_RESOURCE_H + int lim = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX); + struct rlimit rl = { lim, lim + 1 }; + if (setrlimit(RLIMIT_CPU, &rl)) + perror("setrlimit"); +#else + fprintf(stderr, "Warning: -%s not implemented on this OS\n", opt); +#endif + return 0; +} + void set_context_opts(void *ctx, void *opts_ctx, int flags) { int i; @@ -307,28 +324,46 @@ void print_error(const char *filename, int err) } } -#define PRINT_LIB_VERSION(outstream,libname,LIBNAME,indent) \ - version= libname##_version(); \ - fprintf(outstream, "%slib%-10s %2d.%2d.%2d / %2d.%2d.%2d\n", indent? " " : "", #libname, \ - LIB##LIBNAME##_VERSION_MAJOR, LIB##LIBNAME##_VERSION_MINOR, LIB##LIBNAME##_VERSION_MICRO, \ - version >> 16, version >> 8 & 0xff, version & 0xff); +#define PRINT_LIB_VERSION(outstream,libname,LIBNAME,indent) \ + if (CONFIG_##LIBNAME) { \ + unsigned int version = libname##_version(); \ + fprintf(outstream, "%slib%-10s %2d.%2d.%2d / %2d.%2d.%2d\n", \ + indent? " " : "", #libname, \ + LIB##LIBNAME##_VERSION_MAJOR, \ + LIB##LIBNAME##_VERSION_MINOR, \ + LIB##LIBNAME##_VERSION_MICRO, \ + version >> 16, version >> 8 & 0xff, version & 0xff); \ + } static void print_all_lib_versions(FILE* outstream, int indent) { - unsigned int version; PRINT_LIB_VERSION(outstream, avutil, AVUTIL, indent); PRINT_LIB_VERSION(outstream, avcodec, AVCODEC, indent); PRINT_LIB_VERSION(outstream, avformat, AVFORMAT, indent); PRINT_LIB_VERSION(outstream, avdevice, AVDEVICE, indent); -#if CONFIG_AVFILTER PRINT_LIB_VERSION(outstream, avfilter, AVFILTER, indent); -#endif PRINT_LIB_VERSION(outstream, swscale, SWSCALE, indent); -#if CONFIG_POSTPROC PRINT_LIB_VERSION(outstream, postproc, POSTPROC, indent); -#endif } +static void maybe_print_config(const char *lib, const char *cfg) +{ + static int warned_cfg; + + if (strcmp(FFMPEG_CONFIGURATION, cfg)) { + if (!warned_cfg) { + fprintf(stderr, " WARNING: library configuration mismatch\n"); + warned_cfg = 1; + } + fprintf(stderr, " %-11s configuration: %s\n", lib, cfg); + } +} + +#define PRINT_LIB_CONFIG(lib, tag, cfg) do { \ + if (CONFIG_##lib) \ + maybe_print_config(tag, cfg); \ + } while (0) + void show_banner(void) { fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d Fabrice Bellard, et al.\n", @@ -336,6 +371,13 @@ void show_banner(void) fprintf(stderr, " built on %s %s with %s %s\n", __DATE__, __TIME__, CC_TYPE, CC_VERSION); fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n"); + PRINT_LIB_CONFIG(AVUTIL, "libavutil", avutil_configuration()); + PRINT_LIB_CONFIG(AVCODEC, "libavcodec", avcodec_configuration()); + PRINT_LIB_CONFIG(AVFORMAT, "libavformat", avformat_configuration()); + PRINT_LIB_CONFIG(AVDEVICE, "libavdevice", avdevice_configuration()); + PRINT_LIB_CONFIG(AVFILTER, "libavfilter", avfilter_configuration()); + PRINT_LIB_CONFIG(SWSCALE, "libswscale", swscale_configuration()); + PRINT_LIB_CONFIG(POSTPROC, "libpostproc", postproc_configuration()); print_all_lib_versions(stderr, 1); } @@ -572,11 +614,18 @@ void show_protocols(void) void show_filters(void) { - AVFilter **filter = NULL; + AVFilter av_unused(**filter) = NULL; printf("Filters:\n"); +#if CONFIG_AVFILTER while ((filter = av_filter_next(filter)) && *filter) printf("%-16s %s\n", (*filter)->name, (*filter)->description); +#endif +} + +void show_pix_fmts(void) +{ + list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB); } int read_yesno(void)