Merge commit 'f825d42bccdb9f89669a586951de7f66a81e80a5'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 22 Oct 2013 17:01:36 +0000 (19:01 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 22 Oct 2013 17:07:28 +0000 (19:07 +0200)
* commit 'f825d42bccdb9f89669a586951de7f66a81e80a5':
  avplay: Accept cpuflags option

Conflicts:
cmdutils_common_opts.h
doc/ffmpeg.texi
doc/fftools-common-opts.texi
ffmpeg_opt.c

See: 1060e9ce5454e7ac009969ab2cf8f7cd83a69ac3
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
cmdutils.c
cmdutils.h
cmdutils_common_opts.h

diff --cc cmdutils.c
@@@ -808,6 -695,17 +809,18 @@@ do 
      return 0;
  }
  
 -    int flags = av_parse_cpu_flags(arg);
+ int opt_cpuflags(void *optctx, const char *opt, const char *arg)
+ {
 -    if (flags < 0)
 -        return flags;
++    int ret;
++    unsigned flags = av_get_cpu_flags();
 -    av_set_cpu_flags_mask(flags);
++    if ((ret = av_parse_cpu_caps(&flags, arg)) < 0)
++        return ret;
++    av_force_cpu_flags(flags);
+     return 0;
+ }
  int opt_loglevel(void *optctx, const char *opt, const char *arg)
  {
      const struct { const char *name; int level; } log_levels[] = {
      return 0;
  }
  
- int opt_cpuflags(void *optctx, const char *opt, const char *arg)
- {
-     int ret;
-     unsigned flags = av_get_cpu_flags();
-     if ((ret = av_parse_cpu_caps(&flags, arg)) < 0)
-         return ret;
-     av_force_cpu_flags(flags);
-     return 0;
- }
 +static void expand_filename_template(AVBPrint *bp, const char *template,
 +                                     struct tm *tm)
 +{
 +    int c;
 +
 +    while ((c = *(template++))) {
 +        if (c == '%') {
 +            if (!(c = *(template++)))
 +                break;
 +            switch (c) {
 +            case 'p':
 +                av_bprintf(bp, "%s", program_name);
 +                break;
 +            case 't':
 +                av_bprintf(bp, "%04d%02d%02d-%02d%02d%02d",
 +                           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
 +                           tm->tm_hour, tm->tm_min, tm->tm_sec);
 +                break;
 +            case '%':
 +                av_bprint_chars(bp, c, 1);
 +                break;
 +            }
 +        } else {
 +            av_bprint_chars(bp, c, 1);
 +        }
 +    }
 +}
 +
 +static int init_report(const char *env)
 +{
 +    char *filename_template = NULL;
 +    char *key, *val;
 +    int ret, count = 0;
 +    time_t now;
 +    struct tm *tm;
 +    AVBPrint filename;
 +
 +    if (report_file) /* already opened */
 +        return 0;
 +    time(&now);
 +    tm = localtime(&now);
 +
 +    while (env && *env) {
 +        if ((ret = av_opt_get_key_value(&env, "=", ":", 0, &key, &val)) < 0) {
 +            if (count)
 +                av_log(NULL, AV_LOG_ERROR,
 +                       "Failed to parse FFREPORT environment variable: %s\n",
 +                       av_err2str(ret));
 +            break;
 +        }
 +        if (*env)
 +            env++;
 +        count++;
 +        if (!strcmp(key, "file")) {
 +            av_free(filename_template);
 +            filename_template = val;
 +            val = NULL;
 +        } else {
 +            av_log(NULL, AV_LOG_ERROR, "Unknown key '%s' in FFREPORT\n", key);
 +        }
 +        av_free(val);
 +        av_free(key);
 +    }
 +
 +    av_bprint_init(&filename, 0, 1);
 +    expand_filename_template(&filename,
 +                             av_x_if_null(filename_template, "%p-%t.log"), tm);
 +    av_free(filename_template);
 +    if (!av_bprint_is_complete(&filename)) {
 +        av_log(NULL, AV_LOG_ERROR, "Out of memory building report file name\n");
 +        return AVERROR(ENOMEM);
 +    }
 +
 +    report_file = fopen(filename.str, "w");
 +    if (!report_file) {
 +        av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
 +               filename.str, strerror(errno));
 +        return AVERROR(errno);
 +    }
 +    av_log_set_callback(log_callback_report);
 +    av_log(NULL, AV_LOG_INFO,
 +           "%s started on %04d-%02d-%02d at %02d:%02d:%02d\n"
 +           "Report written to \"%s\"\n",
 +           program_name,
 +           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
 +           tm->tm_hour, tm->tm_min, tm->tm_sec,
 +           filename.str);
 +    av_bprint_finalize(&filename, NULL);
 +    return 0;
 +}
 +
 +int opt_report(const char *opt)
 +{
 +    return init_report(NULL);
 +}
 +
 +int opt_max_alloc(void *optctx, const char *opt, const char *arg)
 +{
 +    char *tail;
 +    size_t max;
 +
 +    max = strtol(arg, &tail, 10);
 +    if (*tail) {
 +        av_log(NULL, AV_LOG_FATAL, "Invalid max_alloc \"%s\".\n", arg);
 +        exit_program(1);
 +    }
 +    av_max_alloc(max);
 +    return 0;
 +}
 +
  int opt_timelimit(void *optctx, const char *opt, const char *arg)
  {
  #if HAVE_SETRLIMIT
diff --cc cmdutils.h
@@@ -82,6 -72,11 +82,11 @@@ void uninit_opts(void)
  void log_callback_help(void* ptr, int level, const char* fmt, va_list vl);
  
  /**
 - * Override the cpuflags mask.
++ * Override the cpuflags.
+  */
+ int opt_cpuflags(void *optctx, const char *opt, const char *arg);
+ /**
   * Fallback for options that are not explicitly handled, these will be
   * parsed through AVOptions.
   */
@@@ -92,16 -87,6 +97,14 @@@ int opt_default(void *optctx, const cha
   */
  int opt_loglevel(void *optctx, const char *opt, const char *arg);
  
- int opt_cpuflags(void *optctx, const char *opt, const char *arg);
 +int opt_report(const char *opt);
 +
 +int opt_max_alloc(void *optctx, const char *opt, const char *arg);
 +
 +int opt_codec_debug(void *optctx, const char *opt, const char *arg);
 +
 +int opt_opencl(void *optctx, const char *opt, const char *arg);
 +
  /**
   * Limit the execution time.
   */
      { "protocols"  , OPT_EXIT, {.func_arg = show_protocols},    "show available protocols" },
      { "filters"    , OPT_EXIT, {.func_arg = show_filters  },    "show available filters" },
      { "pix_fmts"   , OPT_EXIT, {.func_arg = show_pix_fmts },    "show available pixel formats" },
 +    { "layouts"    , OPT_EXIT, {.func_arg = show_layouts  },    "show standard channel layouts" },
      { "sample_fmts", OPT_EXIT, {.func_arg = show_sample_fmts }, "show available audio sample formats" },
 -    { "loglevel"   , HAS_ARG,  {.func_arg = opt_loglevel},      "set libav* logging level", "loglevel" },
 -    { "v",           HAS_ARG,  {.func_arg = opt_loglevel},      "set libav* logging level", "loglevel" },
 -    { "cpuflags",    HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags },  "set CPU flags mask", "mask" },
 +    { "loglevel"   , HAS_ARG,  {.func_arg = opt_loglevel},      "set logging level", "loglevel" },
 +    { "v",           HAS_ARG,  {.func_arg = opt_loglevel},      "set logging level", "loglevel" },
 +    { "report"     , 0,        {(void*)opt_report}, "generate a report" },
 +    { "max_alloc"  , HAS_ARG,  {.func_arg = opt_max_alloc},     "set maximum size of a single allocated block", "bytes" },
-     { "cpuflags"   , HAS_ARG | OPT_EXPERT, {.func_arg = opt_cpuflags}, "force specific cpu flags", "flags" },
++    { "cpuflags"   , HAS_ARG | OPT_EXPERT, { .func_arg = opt_cpuflags }, "force specific cpu flags", "flags" },
 +#if CONFIG_OPENCL
 +    { "opencl_options", HAS_ARG, {.func_arg = opt_opencl},      "set OpenCL environment options" },
 +#endif