]> git.sesse.net Git - ffmpeg/blobdiff - tests/checkasm/checkasm.c
mov: Wrap stsc index and count compare in a separate function
[ffmpeg] / tests / checkasm / checkasm.c
index 37bc13983d4367eed908b07c0b43f6a13ae958c0..739da6103650ce945beb13509234ff4041702c5a 100644 (file)
@@ -27,6 +27,7 @@
 #include "checkasm.h"
 #include "libavutil/common.h"
 #include "libavutil/cpu.h"
+#include "libavutil/intfloat.h"
 #include "libavutil/random_seed.h"
 
 #if HAVE_IO_H
 #define isatty(fd) 1
 #endif
 
+#if ARCH_ARM && HAVE_ARMV5TE_EXTERNAL
+#include "libavutil/arm/cpu.h"
+
+void (*checkasm_checked_call)(void *func, int dummy, ...) = checkasm_checked_call_novfp;
+#endif
+
 /* List of tests to invoke */
 static const struct {
     const char *name;
@@ -60,6 +67,16 @@ static const struct {
 #if CONFIG_BSWAPDSP
     { "bswapdsp", checkasm_check_bswapdsp },
 #endif
+#if CONFIG_DCA_DECODER
+    { "dcadsp", checkasm_check_dcadsp },
+    { "synth_filter", checkasm_check_synth_filter },
+#endif
+#if CONFIG_FMTCONVERT
+    { "fmtconvert", checkasm_check_fmtconvert },
+#endif
+#if CONFIG_H264DSP
+    { "h264dsp", checkasm_check_h264dsp },
+#endif
 #if CONFIG_H264PRED
     { "h264pred", checkasm_check_h264pred },
 #endif
@@ -71,6 +88,9 @@ static const struct {
 #endif
 #if CONFIG_V210_ENCODER
     { "v210enc", checkasm_check_v210enc },
+#endif
+#if CONFIG_VP8DSP
+    { "vp8dsp", checkasm_check_vp8dsp },
 #endif
     { NULL }
 };
@@ -151,6 +171,78 @@ static struct {
 /* PRNG state */
 AVLFG checkasm_lfg;
 
+/* float compare support code */
+static int is_negative(union av_intfloat32 u)
+{
+    return u.i >> 31;
+}
+
+int float_near_ulp(float a, float b, unsigned max_ulp)
+{
+    union av_intfloat32 x, y;
+
+    x.f = a;
+    y.f = b;
+
+    if (is_negative(x) != is_negative(y)) {
+        // handle -0.0 == +0.0
+        return a == b;
+    }
+
+    if (abs(x.i - y.i) <= max_ulp)
+        return 1;
+
+    return 0;
+}
+
+int float_near_ulp_array(const float *a, const float *b, unsigned max_ulp,
+                         unsigned len)
+{
+    unsigned i;
+
+    for (i = 0; i < len; i++) {
+        if (!float_near_ulp(a[i], b[i], max_ulp))
+            return 0;
+    }
+    return 1;
+}
+
+int float_near_abs_eps(float a, float b, float eps)
+{
+    float abs_diff = fabsf(a - b);
+
+    return abs_diff < eps;
+}
+
+int float_near_abs_eps_array(const float *a, const float *b, float eps,
+                         unsigned len)
+{
+    unsigned i;
+
+    for (i = 0; i < len; i++) {
+        if (!float_near_abs_eps(a[i], b[i], eps))
+            return 0;
+    }
+    return 1;
+}
+
+int float_near_abs_eps_ulp(float a, float b, float eps, unsigned max_ulp)
+{
+    return float_near_ulp(a, b, max_ulp) || float_near_abs_eps(a, b, eps);
+}
+
+int float_near_abs_eps_array_ulp(const float *a, const float *b, float eps,
+                         unsigned max_ulp, unsigned len)
+{
+    unsigned i;
+
+    for (i = 0; i < len; i++) {
+        if (!float_near_abs_eps_ulp(a[i], b[i], eps, max_ulp))
+            return 0;
+    }
+    return 1;
+}
+
 /* Print colored text to stderr if the terminal supports it */
 static void color_printf(int color, const char *fmt, ...)
 {
@@ -383,6 +475,11 @@ int main(int argc, char *argv[])
 {
     int i, seed, ret = 0;
 
+#if ARCH_ARM && HAVE_ARMV5TE_EXTERNAL
+    if (have_vfp(av_get_cpu_flags()) || have_neon(av_get_cpu_flags()))
+        checkasm_checked_call = checkasm_checked_call_vfp;
+#endif
+
     if (!tests[0].func || !cpus[0].flag) {
         fprintf(stderr, "checkasm: no tests to perform\n");
         return 0;