Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 7 Mar 2012 01:57:53 +0000 (02:57 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 7 Mar 2012 02:22:49 +0000 (03:22 +0100)
* qatar/master:
  SBR DSP: fix SSE code to not use SSE2 instructions.
  cpu: initialize mask to -1, so that by default, optimizations are used.
  error_resilience: initialize s->block_index[].
  svq3: protect against negative quantizers.
  Don't use ff_cropTbl[] for IDCT.
  swscale: make filterPos 32bit.
  FATE: add CPUFLAGS variable, mapping to -cpuflags avconv option.
  avconv: add -cpuflags option for setting supported cpuflags.
  cpu: add av_set_cpu_flags_mask().
  libx264: Allow overriding the sliced threads option
  avconv: fix counting encoded video size.

Conflicts:
doc/APIchanges
doc/fate.texi
doc/ffmpeg.texi
ffmpeg.c
libavcodec/h264idct_template.c
libavcodec/svq3.c
libavutil/avutil.h
libavutil/cpu.c
libavutil/cpu.h
libswscale/swscale.c
tests/Makefile
tests/fate-run.sh
tests/regression-funcs.sh

Merged-by: Michael Niedermayer <michaelni@gmx.at>
28 files changed:
1  2 
cmdutils.c
cmdutils.h
cmdutils_common_opts.h
doc/avtools-common-opts.texi
doc/fate.texi
ffmpeg.c
libavcodec/dsputil.c
libavcodec/error_resilience.c
libavcodec/h264idct_template.c
libavcodec/libx264.c
libavcodec/simple_idct.c
libavcodec/simple_idct_template.c
libavcodec/vc1dsp.c
libavcodec/vp3dsp.c
libavcodec/vp8dsp.c
libavutil/avutil.h
libavutil/cpu.c
libavutil/cpu.h
libswscale/ppc/swscale_altivec.c
libswscale/swscale.c
libswscale/swscale_internal.h
libswscale/utils.c
libswscale/x86/scale.asm
libswscale/x86/swscale_mmx.c
libswscale/x86/swscale_template.c
tests/Makefile
tests/fate-run.sh
tests/regression-funcs.sh

diff --cc cmdutils.c
@@@ -489,71 -426,6 +486,112 @@@ int opt_loglevel(const char *opt, cons
      return 0;
  }
  
-     char *tail;
-     long flags = strtol(arg, &tail, 10);
 +int opt_report(const char *opt)
 +{
 +    char filename[64];
 +    time_t now;
 +    struct tm *tm;
 +
 +    if (report_file) /* already opened */
 +        return 0;
 +    time(&now);
 +    tm = localtime(&now);
 +    snprintf(filename, sizeof(filename), "%s-%04d%02d%02d-%02d%02d%02d.log",
 +             program_name,
 +             tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
 +             tm->tm_hour, tm->tm_min, tm->tm_sec);
 +    report_file = fopen(filename, "w");
 +    if (!report_file) {
 +        av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
 +               filename, 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);
 +    av_log_set_level(FFMAX(av_log_get_level(), AV_LOG_VERBOSE));
 +    return 0;
 +}
 +
 +int opt_max_alloc(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_cpuflags(const char *opt, const char *arg)
 +{
-     if (*tail) {
-         av_log(NULL, AV_LOG_FATAL, "Invalid cpuflags \"%s\".\n", arg);
-         exit_program(1);
-     }
++#define CPUFLAG_MMX2     (AV_CPU_FLAG_MMX      | AV_CPU_FLAG_MMX2)
++#define CPUFLAG_3DNOW    (AV_CPU_FLAG_3DNOW    | AV_CPU_FLAG_MMX)
++#define CPUFLAG_3DNOWEXT (AV_CPU_FLAG_3DNOWEXT | CPUFLAG_3DNOW)
++#define CPUFLAG_SSE      (AV_CPU_FLAG_SSE      | CPUFLAG_MMX2)
++#define CPUFLAG_SSE2     (AV_CPU_FLAG_SSE2     | CPUFLAG_SSE)
++#define CPUFLAG_SSE2SLOW (AV_CPU_FLAG_SSE2SLOW | CPUFLAG_SSE2)
++#define CPUFLAG_SSE3     (AV_CPU_FLAG_SSE3     | CPUFLAG_SSE2)
++#define CPUFLAG_SSE3SLOW (AV_CPU_FLAG_SSE3SLOW | CPUFLAG_SSE3)
++#define CPUFLAG_SSSE3    (AV_CPU_FLAG_SSSE3    | CPUFLAG_SSE3)
++#define CPUFLAG_SSE4     (AV_CPU_FLAG_SSE4     | CPUFLAG_SSSE3)
++#define CPUFLAG_SSE42    (AV_CPU_FLAG_SSE42    | CPUFLAG_SSE4)
++#define CPUFLAG_AVX      (AV_CPU_FLAG_AVX      | CPUFLAG_SSE42)
++#define CPUFLAG_XOP      (AV_CPU_FLAG_XOP      | CPUFLAG_AVX)
++#define CPUFLAG_FMA4     (AV_CPU_FLAG_FMA4     | CPUFLAG_AVX)
++    static const AVOption cpuflags_opts[] = {
++        { "flags"   , NULL, 0, AV_OPT_TYPE_FLAGS, { 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
++        { "altivec" , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ALTIVEC  },    .unit = "flags" },
++        { "mmx"     , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_MMX      },    .unit = "flags" },
++        { "mmx2"    , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_MMX2         },    .unit = "flags" },
++        { "sse"     , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE          },    .unit = "flags" },
++        { "sse2"    , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE2         },    .unit = "flags" },
++        { "sse2slow", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE2SLOW     },    .unit = "flags" },
++        { "sse3"    , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE3         },    .unit = "flags" },
++        { "sse3slow", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE3SLOW     },    .unit = "flags" },
++        { "ssse3"   , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSSE3        },    .unit = "flags" },
++        { "atom"    , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ATOM     },    .unit = "flags" },
++        { "sse4.1"  , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE4         },    .unit = "flags" },
++        { "sse4.2"  , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE42        },    .unit = "flags" },
++        { "avx"     , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_AVX          },    .unit = "flags" },
++        { "xop"     , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_XOP          },    .unit = "flags" },
++        { "fma4"    , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_FMA4         },    .unit = "flags" },
++        { "3dnow"   , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_3DNOW        },    .unit = "flags" },
++        { "3dnowext", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_3DNOWEXT     },    .unit = "flags" },
++        { NULL },
++    };
++    static const AVClass class = {
++        .class_name = "cpuflags",
++        .item_name  = av_default_item_name,
++        .option     = cpuflags_opts,
++        .version    = LIBAVUTIL_VERSION_INT,
++    };
++    int flags = av_get_cpu_flags();
++    int ret;
++    const AVClass *pclass = &class;
++
++    if ((ret = av_opt_eval_flags(&pclass, &cpuflags_opts[0], arg, &flags)) < 0)
++        return ret;
 +
 +    av_force_cpu_flags(flags);
 +    return 0;
 +}
 +
 +int opt_codec_debug(const char *opt, const char *arg)
 +{
 +    av_log_set_level(AV_LOG_DEBUG);
 +    return opt_default(opt, arg);
 +}
 +
  int opt_timelimit(const char *opt, const char *arg)
  {
  #if HAVE_SETRLIMIT
diff --cc cmdutils.h
Simple merge
@@@ -13,7 -13,3 +13,7 @@@
      { "sample_fmts", OPT_EXIT, {.func_arg = show_sample_fmts }, "show available audio sample formats" },
      { "loglevel", HAS_ARG, {(void*)opt_loglevel}, "set libav* logging level", "loglevel" },
      { "v", HAS_ARG, {(void*)opt_loglevel}, "set libav* logging level", "loglevel" },
-     { "cpuflags", HAS_ARG, {(void*)opt_cpuflags}, "force specific cpu flags", "flags" },
 +    { "debug", HAS_ARG, {(void*)opt_codec_debug}, "set debug flags", "flags" },
 +    { "report", 0, {(void*)opt_report}, "generate a report" },
 +    { "max_alloc", HAS_ARG, {(void*)opt_max_alloc}, "set maximum size of a single allocated block", "bytes" },
++    { "cpuflags", HAS_ARG | OPT_EXPERT, {(void*)opt_cpuflags}, "force specific cpu flags", "flags" },
@@@ -122,18 -122,8 +122,22 @@@ can be disabled setting the environmen
  @env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
  the environment variable @env{AV_LOG_FORCE_COLOR}.
  The use of the environment variable @env{NO_COLOR} is deprecated and
 -will be dropped in a following Libav version.
 +will be dropped in a following FFmpeg version.
 +
 +@item -report
 +Dump full command line and console output to a file named
 +@code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current
 +directory.
 +This file can be useful for bug reports.
 +It also implies @code{-loglevel verbose}.
 +
 +Note: setting the environment variable @code{FFREPORT} to any value has the
 +same effect.
 +
++@item -cpuflags flags (@emph{global})
++Allows setting and clearing cpu flags. This option is intended
++for testing. Do not use it unless you know what you're doing.
  @end table
  
  @section AVOptions
diff --cc doc/fate.texi
  
  @chapter Introduction
  
 -FATE provides a regression testsuite embedded within the Libav build system.
 -It can be run locally and optionally configured to send reports to a web
 -aggregator and viewer @url{http://fate.libav.org}.
 +  FATE is an extended regression suite on the client-side and a means
 +for results aggregation and presentation on the server-side.
  
 -It is advised to run FATE before submitting patches to the current codebase
 -and provide new tests when submitting patches to add additional features.
 +  The first part of this document explains how you can use FATE from
 +your FFmpeg source directory to test your ffmpeg binary. The second
 +part describes how you can run FATE to submit the results to FFmpeg's
 +FATE server.
  
 -@chapter Running FATE
 +  In any way you can have a look at the publicly viewable FATE results
 +by visiting this website:
  
 -@section Samples and References
 -In order to run, FATE needs a large amount of data (samples and references)
 -that is provided separately from the actual source distribution.
 +  @url{http://fate.ffmpeg.org/}
  
 -To inform the build system about the testsuite location, pass
 -@option{--samples=<path to the samples>} to @command{configure} or set the
 -@var{SAMPLES} Make variable or the @var{FATE_SAMPLES} environment variable
 -to a suitable value.
 +  This is especially recommended for all people contributing source
 +code to FFmpeg, as it can be seen if some test on some platform broke
 +with there recent contribution. This usually happens on the platforms
 +the developers could not test on.
  
 -The dataset is available through @command{rsync}, is possible to fetch
 -the current sample using the straight rsync command or through a specific
 -@ref{Makefile target}.
 +  The second part of this document describes how you can run FATE to
 +submit your results to FFmpeg's FATE server. If you want to submit your
 +results be sure to check that your combination of CPU, OS and compiler
 +is not already listed on the above mentioned website.
 +
 +  In the third part you can find a comprehensive listing of FATE makefile
 +targets and variables.
 +
 +
 +@chapter Using FATE from your FFmpeg source directory
 +
 +  If you want to run FATE on your machine you need to have the samples
 +in place. You can get the samples via the build target fate-rsync.
 +Use this command from the top-level source directory:
 +
 +@example
 +make fate-rsync SAMPLES=fate-suite/
 +make fate       SAMPLES=fate-suite/
 +@end example
 +
 +  The above commands set the samples location by passing a makefile
 +variable via command line. It is also possible to set the samples
 +location at source configuration time by invoking configure with
 +`--samples=<path to the samples directory>'. Afterwards you can
 +invoke the makefile targets without setting the SAMPLES makefile
 +variable. This is illustrated by the following commands:
 +
 +@example
 +./configure --samples=fate-suite/
 +make fate-rsync
 +make fate
 +@end example
 +
 +  Yet another way to tell FATE about the location of the sample
 +directory is by making sure the environment variable FATE_SAMPLES
 +contains the path to your samples directory. This can be achieved
 +by e.g. putting that variable in your shell profile or by setting
 +it in your interactive session.
  
  @example
 -# rsync -aL rsync://fate-suite.libav.org/fate-suite/ fate-suite
 +FATE_SAMPLES=fate-suite/ make fate
  @end example
  
 +@float NOTE
 +Do not put a '~' character in the samples path to indicate a home
 +directory. Because of shell nuances, this will cause FATE to fail.
 +@end float
 +
 +
 +@chapter Submitting the results to the FFmpeg result aggregation server
 +
 +  To submit your results to the server you should run fate through the
 +shell script tests/fate.sh from the FFmpeg sources. This script needs
 +to be invoked with a configuration file as its first argument.
 +
  @example
 -# make fate-rsync SAMPLES=fate-suite
 +tests/fate.sh /path/to/fate_config
  @end example
  
 +  A configuration file template with comments describing the individual
 +configuration variables can be found at @file{tests/fate_config.sh.template}.
 +
 +@ifhtml
 +  The mentioned configuration template is also available here:
 +@verbatiminclude ../tests/fate_config.sh.template
 +@end ifhtml
 +
 +  Create a configuration that suits your needs, based on the configuration
 +template. The `slot' configuration variable can be any string that is not
 +yet used, but it is suggested that you name it adhering to the following
 +pattern <arch>-<os>-<compiler>-<compiler version>. The configuration file
 +itself will be sourced in a shell script, therefore all shell features may
 +be used. This enables you to setup the environment as you need it for your
 +build.
 +
 +  For your first test runs the `fate_recv' variable should be empty or
 +commented out. This will run everything as normal except that it will omit
 +the submission of the results to the server. The following files should be
 +present in $workdir as specified in the configuration file:
 +
 +@itemize
 +    @item configure.log
 +    @item compile.log
 +    @item test.log
 +    @item report
 +    @item version
 +@end itemize
 +
 +  When you have everything working properly you can create an SSH key and
 +send its public part to the FATE server administrator.
 +
 +  Configure your SSH client to use public key authentication with that key
 +when connecting to the FATE server. Also do not forget to check the identity
 +of the server and to accept its host key. This can usually be achieved by
 +running your SSH client manually and killing it after you accepted the key.
 +The FATE server's fingerprint is:
  
 -@chapter Manual Run
 -FATE regression test can be run through @command{make}.
 -Specific Makefile targets and Makefile variables are available:
 +  b1:31:c8:79:3f:04:1d:f8:f2:23:26:5a:fd:55:fa:92
 +
 +  The only thing left is to automate the execution of the fate.sh script and
 +the synchronisation of the samples directory.
 +
 +
 +@chapter FATE makefile targets and variables
 +
 +@section Makefile targets
  
 -@anchor{Makefile target}
 -@section FATE Makefile targets
  @table @option
 -@item fate-list
 -List all fate/regression test targets.
  @item fate-rsync
 -Shortcut to download the fate test samples to the specified testsuite location.
 +    Download/synchronize sample files to the configured samples directory.
 +
 +@item fate-list
 +    Will list all fate/regression test targets.
 +
  @item fate
 -Run the FATE test suite (requires the fate-suite dataset).
 +    Run the FATE test suite (requires the fate-suite dataset).
  @end table
  
 -@section Fate Makefile variables
 +@section Makefile variables
 +
  @table @option
  @item V
 -Verbosity level, can be set to 0, 1 or 2.
 -@table @option
 -    @item 0
 -    show just the test arguments
 -    @item 1
 -    show just the command used in the test
 -    @item 2
 -    show everything
 -@end table
 +    Verbosity level, can be set to 0, 1 or 2.
 +    @itemize
 +        @item 0: show just the test arguments
 +        @item 1: show just the command used in the test
 +        @item 2: show everything
 +    @end itemize
 +
  @item SAMPLES
 -Specify or override the path to the FATE samples at make time, it has a
 -meaning only while running the regression tests.
 +    Specify or override the path to the FATE samples at make time, it has a
 +    meaning only while running the regression tests.
 +
  @item THREADS
 -Specify how many threads to use while running regression tests, it is
 -quite useful to detect thread-related regressions.
 +    Specify how many threads to use while running regression tests, it is
 +    quite useful to detect thread-related regressions.
+ @item CPUFLAGS
 -Specify a mask to be applied to autodetected CPU flags.
++    Specify CPU flags.
  @end table
  
 +Example:
  @example
- make V=1 SAMPLES=/var/fate/samples THREADS=2 fate
- @end example
 -    make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
++make V=1 SAMPLES=/var/fate/samples THREADS=2 CPUFLAGS=mmx fate
+ @end example
 -
 -@chapter Automated Tests
 -In order to automatically testing specific configurations, e.g. multiple
 -compilers, @command{tests/fate.sh} is provided.
 -
 -This shell script builds Libav, runs the regression tests and prepares a
 -report that can be sent to @url{fate.libav.org} or directly examined locally.
 -
 -@section Testing Profiles
 -The configuration file passed to @command{fate.sh} is shell scripts as well.
 -
 -It must provide at least a @var{slot} identifier, the @var{repo} from
 -which fetch the sources, the @var{samples} directory, a @var{workdir} with
 -enough space to build and run all the tests.
 -Optional submit command @var{fate_recv} and a @var{comment} to describe
 -the testing profile are available.
 -
 -Additional optional parameter to tune the Libav building and reporting process
 -can be passed.
 -
 -@example
 -slot=                                   # some unique identifier
 -repo=git://git.libav.org/libav.git      # the source repository
 -samples=/path/to/fate/samples
 -workdir=                                # directory in which to do all the work
 -fate_recv="ssh -T fate@@fate.libav.org"  # command to submit report
 -comment=                                # optional description
 -
 -# the following are optional and map to configure options
 -arch=
 -cpu=
 -cross_prefix=
 -cc=
 -target_os=
 -sysroot=
 -target_exec=
 -target_path=
 -extra_cflags=
 -extra_ldflags=
 -extra_libs=
 -extra_conf=     # extra configure options not covered above
 -
 -#make=          # name of GNU make if not 'make'
 -makeopts=       # extra options passed to 'make'
 -#tar=           # command to create a tar archive from its arguments on
 -                # stdout, defaults to 'tar c'
 -@end example
 -
 -@section Submitting Reports
 -In order to send reports you need to create an @command{ssh} key and send it
 -to @email{root@@libav.org}.
 -The current server fingerprint is @var{a4:99:d7:d3:1c:92:0d:56:d6:d5:61:be:01:ae:7d:e6}
diff --cc ffmpeg.c
+++ b/ffmpeg.c
@@@ -4963,6 -4397,67 +4963,13 @@@ static int opt_deinterlace(const char *
      return 0;
  }
  
 -static int opt_cpuflags(const char *opt, const char *arg)
 -{
 -#define CPUFLAG_MMX2     (AV_CPU_FLAG_MMX      | AV_CPU_FLAG_MMX2)
 -#define CPUFLAG_3DNOW    (AV_CPU_FLAG_3DNOW    | AV_CPU_FLAG_MMX)
 -#define CPUFLAG_3DNOWEXT (AV_CPU_FLAG_3DNOWEXT | CPUFLAG_3DNOW)
 -#define CPUFLAG_SSE      (AV_CPU_FLAG_SSE      | CPUFLAG_MMX2)
 -#define CPUFLAG_SSE2     (AV_CPU_FLAG_SSE2     | CPUFLAG_SSE)
 -#define CPUFLAG_SSE2SLOW (AV_CPU_FLAG_SSE2SLOW | CPUFLAG_SSE2)
 -#define CPUFLAG_SSE3     (AV_CPU_FLAG_SSE3     | CPUFLAG_SSE2)
 -#define CPUFLAG_SSE3SLOW (AV_CPU_FLAG_SSE3SLOW | CPUFLAG_SSE3)
 -#define CPUFLAG_SSSE3    (AV_CPU_FLAG_SSSE3    | CPUFLAG_SSE3)
 -#define CPUFLAG_SSE4     (AV_CPU_FLAG_SSE4     | CPUFLAG_SSSE3)
 -#define CPUFLAG_SSE42    (AV_CPU_FLAG_SSE42    | CPUFLAG_SSE4)
 -#define CPUFLAG_AVX      (AV_CPU_FLAG_AVX      | CPUFLAG_SSE42)
 -#define CPUFLAG_XOP      (AV_CPU_FLAG_XOP      | CPUFLAG_AVX)
 -#define CPUFLAG_FMA4     (AV_CPU_FLAG_FMA4     | CPUFLAG_AVX)
 -    static const AVOption cpuflags_opts[] = {
 -        { "flags"   , NULL, 0, AV_OPT_TYPE_FLAGS, { 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
 -        { "altivec" , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ALTIVEC  },    .unit = "flags" },
 -        { "mmx"     , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_MMX      },    .unit = "flags" },
 -        { "mmx2"    , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_MMX2         },    .unit = "flags" },
 -        { "sse"     , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE          },    .unit = "flags" },
 -        { "sse2"    , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE2         },    .unit = "flags" },
 -        { "sse2slow", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE2SLOW     },    .unit = "flags" },
 -        { "sse3"    , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE3         },    .unit = "flags" },
 -        { "sse3slow", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE3SLOW     },    .unit = "flags" },
 -        { "ssse3"   , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSSE3        },    .unit = "flags" },
 -        { "atom"    , NULL, 0, AV_OPT_TYPE_CONST, { AV_CPU_FLAG_ATOM     },    .unit = "flags" },
 -        { "sse4.1"  , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE4         },    .unit = "flags" },
 -        { "sse4.2"  , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_SSE42        },    .unit = "flags" },
 -        { "avx"     , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_AVX          },    .unit = "flags" },
 -        { "xop"     , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_XOP          },    .unit = "flags" },
 -        { "fma4"    , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_FMA4         },    .unit = "flags" },
 -        { "3dnow"   , NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_3DNOW        },    .unit = "flags" },
 -        { "3dnowext", NULL, 0, AV_OPT_TYPE_CONST, { CPUFLAG_3DNOWEXT     },    .unit = "flags" },
 -        { NULL },
 -    };
 -    static const AVClass class = {
 -        .class_name = "cpuflags",
 -        .item_name  = av_default_item_name,
 -        .option     = cpuflags_opts,
 -        .version    = LIBAVUTIL_VERSION_INT,
 -    };
 -
 -    int flags = 0, ret;
 -    const AVClass *pclass = &class;
 -
 -    if ((ret = av_opt_eval_flags(&pclass, &cpuflags_opts[0], arg, &flags)) < 0)
 -        return ret;
 -
 -    av_set_cpu_flags_mask(flags);
 -    return 0;
 -}
 -
+ static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
+ {
+     int idx = locate_option(argc, argv, options, "cpuflags");
+     if (idx && argv[idx + 1])
+         opt_cpuflags("cpuflags", argv[idx + 1]);
+ }
  #define OFFSET(x) offsetof(OptionsContext, x)
  static const OptionDef options[] = {
      /* main options */
@@@ -5132,10 -4592,10 +5139,12 @@@ int main(int argc, char **argv
      av_register_all();
      avformat_network_init();
  
 -    show_banner();
 +    show_banner(argc, argv, options);
 +
 +    term_init();
  
+     parse_cpuflags(argc, argv, options);
      /* parse options */
      parse_options(&o, argc, argv, options, opt_output_file);
  
Simple merge
Simple merge
@@@ -49,10 -49,9 +49,9 @@@ static const uint8_t scan8[16*3]=
  void FUNCC(ff_h264_idct_add)(uint8_t *_dst, DCTELEM *_block, int stride)
  {
      int i;
-     INIT_CLIP
      pixel *dst = (pixel*)_dst;
      dctcoef *block = (dctcoef*)_block;
 -    stride /= sizeof(pixel);
 +    stride >>= sizeof(pixel)-1;
  
      block[0] += 1 << 5;
  
  
  void FUNCC(ff_h264_idct8_add)(uint8_t *_dst, DCTELEM *_block, int stride){
      int i;
-     INIT_CLIP
      pixel *dst = (pixel*)_dst;
      dctcoef *block = (dctcoef*)_block;
 -    stride /= sizeof(pixel);
 +    stride >>= sizeof(pixel)-1;
  
      block[0] += 32;
  
  }
  
  // assumes all AC coefs are 0
 -void FUNCC(ff_h264_idct_dc_add)(uint8_t *_dst, DCTELEM *block, int stride){
 +void FUNCC(ff_h264_idct_dc_add)(uint8_t *p_dst, DCTELEM *block, int stride){
      int i, j;
      int dc = (((dctcoef*)block)[0] + 32) >> 6;
-     INIT_CLIP
 -    pixel *dst = (pixel*)_dst;
 -    stride /= sizeof(pixel);
 +    pixel *dst = (pixel*)p_dst;
 +    stride >>= sizeof(pixel)-1;
      for( j = 0; j < 4; j++ )
      {
          for( i = 0; i < 4; i++ )
      }
  }
  
 -void FUNCC(ff_h264_idct8_dc_add)(uint8_t *_dst, DCTELEM *block, int stride){
 +void FUNCC(ff_h264_idct8_dc_add)(uint8_t *p_dst, DCTELEM *block, int stride){
      int i, j;
      int dc = (((dctcoef*)block)[0] + 32) >> 6;
-     INIT_CLIP
 -    pixel *dst = (pixel*)_dst;
 -    stride /= sizeof(pixel);
 +    pixel *dst = (pixel*)p_dst;
 +    stride >>= sizeof(pixel)-1;
      for( j = 0; j < 8; j++ )
      {
          for( i = 0; i < 8; i++ )
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
   */
  
  #define LIBAVUTIL_VERSION_MAJOR 51
- #define LIBAVUTIL_VERSION_MINOR 41
 -#define LIBAVUTIL_VERSION_MINOR 25
 -#define LIBAVUTIL_VERSION_MICRO  0
++#define LIBAVUTIL_VERSION_MINOR 42
 +#define LIBAVUTIL_VERSION_MICRO 100
  
  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                 LIBAVUTIL_VERSION_MINOR, \
diff --cc libavutil/cpu.c
  #include "cpu.h"
  #include "config.h"
  
 -static int cpuflags_mask = -1, checked;
 +static int flags, checked;
 +
 +void av_force_cpu_flags(int arg){
 +    flags   = arg;
-     checked = 1;
++    checked = arg != -1;
 +}
  
  int av_get_cpu_flags(void)
  {
      return flags;
  }
  
 -    cpuflags_mask = mask;
+ void av_set_cpu_flags_mask(int mask)
+ {
+     checked       = 0;
++    flags         = av_get_cpu_flags() & mask;
++    checked       = 1;
+ }
  #ifdef TEST
  
  #undef printf
diff --cc libavutil/cpu.h
@@@ -21,6 -21,6 +21,8 @@@
  #ifndef AVUTIL_CPU_H
  #define AVUTIL_CPU_H
  
++#include "attributes.h"
++
  #define AV_CPU_FLAG_FORCE    0x80000000 /* force usage of selected flags (OR) */
  
      /* lower 16 bits - CPU features */
   */
  int av_get_cpu_flags(void);
  
  /**
 -void av_set_cpu_flags_mask(int mask);
 + * Disables cpu detection and forces the specified flags.
 + */
 +void av_force_cpu_flags(int flags);
 +
++/**
+  * Set a mask on flags returned by av_get_cpu_flags().
+  * This function is mainly useful for testing.
++ * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible
+  *
+  * @warning this function is not thread safe.
+  */
++attribute_deprecated void av_set_cpu_flags_mask(int mask);
  
  /* The following CPU-specific functions shall not be called directly. */
  int ff_get_cpu_flags_arm(void);
Simple merge
@@@ -326,10 -312,12 +326,10 @@@ static int swScale(SwsContext *c, cons
      const int chrXInc= c->chrXInc;
      const enum PixelFormat dstFormat= c->dstFormat;
      const int flags= c->flags;
-     int16_t *vLumFilterPos= c->vLumFilterPos;
-     int16_t *vChrFilterPos= c->vChrFilterPos;
-     int16_t *hLumFilterPos= c->hLumFilterPos;
-     int16_t *hChrFilterPos= c->hChrFilterPos;
+     int32_t *vLumFilterPos= c->vLumFilterPos;
+     int32_t *vChrFilterPos= c->vChrFilterPos;
+     int32_t *hLumFilterPos= c->hLumFilterPos;
+     int32_t *hChrFilterPos= c->hChrFilterPos;
 -    int16_t *vLumFilter= c->vLumFilter;
 -    int16_t *vChrFilter= c->vChrFilter;
      int16_t *hLumFilter= c->hLumFilter;
      int16_t *hChrFilter= c->hChrFilter;
      int32_t *lumMmxFilter= c->lumMmxFilter;
Simple merge
@@@ -191,9 -180,9 +191,9 @@@ static double getSplineCoeff(double a, 
                                           dist-1.0);
  }
  
- static int initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSize, int xInc,
+ static int initFilter(int16_t **outFilter, int32_t **filterPos, int *outFilterSize, int xInc,
                        int srcW, int dstW, int filterAlign, int one, int flags, int cpu_flags,
 -                      SwsVector *srcFilter, SwsVector *dstFilter, double param[2], int is_horizontal)
 +                      SwsVector *srcFilter, SwsVector *dstFilter, double param[2])
  {
      int i;
      int filterSize;
Simple merge
Simple merge
Simple merge
diff --cc tests/Makefile
@@@ -136,13 -112,11 +136,13 @@@ endi
  
  FATE_UTILS = base64 tiny_psnr
  
 -fate: $(FATE)
 +TOOL = ffmpeg
 +
 +fate:: $(FATE)
  
 -$(FATE): avconv$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF))
 +$(FATE): $(TOOL)$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF))
        @echo "TEST    $(@:fate-%=%)"
-       $(Q)$(SRC_PATH)/tests/fate-run.sh $@ "$(SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" '$(CMD)' '$(CMP)' '$(REF)' '$(FUZZ)' '$(THREADS)' '$(THREAD_TYPE)' '$(TOOL)'
+       $(Q)$(SRC_PATH)/tests/fate-run.sh $@ "$(SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" '$(CMD)' '$(CMP)' '$(REF)' '$(FUZZ)' '$(THREADS)' '$(THREAD_TYPE)' '$(CPUFLAGS)'
  
  fate-list:
        @printf '%s\n' $(sort $(FATE))
@@@ -51,7 -51,7 +51,7 @@@ run()
  }
  
  avconv(){
-     run $tool -nostats -threads $threads -thread_type $thread_type "$@"
 -    run avconv -nostats -threads $threads -thread_type $thread_type -cpuflags $cpuflags "$@"
++    run ffmpeg -nostats -threads $threads -thread_type $thread_type -cpuflags $cpuflags "$@"
  }
  
  framecrc(){
@@@ -77,7 -77,7 +77,7 @@@ pcm()
  regtest(){
      t="${test#$2-}"
      ref=${base}/ref/$2/$t
-     ${base}/${1}-regression.sh $t $2 $3 "$target_exec" "$target_path" "$threads" "$thread_type" "$tool" "$samples"
 -    ${base}/${1}-regression.sh $t $2 $3 "$target_exec" "$target_path" "$threads" "$thread_type" "$cpuflags"
++    ${base}/${1}-regression.sh $t $2 $3 "$target_exec" "$target_path" "$threads" "$thread_type" "$cpuflags" "$samples"
  }
  
  codectest(){
@@@ -10,8 -10,7 +10,8 @@@ raw_src_dir=$
  target_exec=$4
  target_path=$5
  threads=${6:-1}
- tool=$8
+ cpuflags=${8:-all}
 +samples=$9
  
  datadir="./tests/data"
  target_datadir="${target_path}/${datadir}"
@@@ -20,7 -19,7 +20,7 @@@ this="$test.$test_ref
  outfile="$datadir/$test_ref/"
  
  # various files
- avconv="$target_exec ${target_path}/${tool}"
 -avconv="$target_exec ${target_path}/avconv"
++avconv="$target_exec ${target_path}/ffmpeg"
  tiny_psnr="tests/tiny_psnr"
  raw_src="${target_path}/$raw_src_dir/%02d.pgm"
  raw_dst="$datadir/$this.out.yuv"