aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMans Rullgard <mans@mansr.com>2011-07-04 00:53:39 +0100
committerMans Rullgard <mans@mansr.com>2011-07-04 10:38:14 +0100
commitdbf396d497e6d6f14b838092ed4ba4283a9505a0 (patch)
tree7211968c8032251eef798f8a6de96cc8e9a0777e
parent883fd9e393cea378bda99ddc6ee5d5ef2141a9f8 (diff)
downloadffmpeg-dbf396d497e6d6f14b838092ed4ba4283a9505a0.tar.gz
dct-test: exit with non-zero status if an IDCT fails
IDCTs are partially evaluated according to IEEE 1180-1990 (more or less). An override is added to the table for implementations known to not meet the spec requirements. These variants are run but not checked for accuracy. Signed-off-by: Mans Rullgard <mans@mansr.com>
-rw-r--r--libavcodec/dct-test.c43
1 files changed, 30 insertions, 13 deletions
diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c
index 054d0f378d..cd68d48ebc 100644
--- a/libavcodec/dct-test.c
+++ b/libavcodec/dct-test.c
@@ -74,6 +74,7 @@ struct algo {
enum formattag { NO_PERM, MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM,
SSE2_PERM, PARTTRANS_PERM } format;
int mm_support;
+ int nonspec;
};
#ifndef FAAN_POSTSCALE
@@ -115,13 +116,13 @@ static const struct algo idct_tab[] = {
#if HAVE_MMX
#if CONFIG_GPL
- {"LIBMPEG2-MMX", ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX},
- {"LIBMPEG2-MMX2", ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2},
+ {"LIBMPEG2-MMX", ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX, 1},
+ {"LIBMPEG2-MMX2", ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2, 1},
#endif
{"SIMPLE-MMX", ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX},
- {"XVID-MMX", ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX},
- {"XVID-MMX2", ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2},
- {"XVID-SSE2", ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2},
+ {"XVID-MMX", ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX, 1},
+ {"XVID-MMX2", ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2, 1},
+ {"XVID-SSE2", ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2, 1},
#endif
#if ARCH_BFIN
@@ -200,15 +201,17 @@ static inline void mmx_emms(void)
#endif
}
-static void dct_error(const struct algo *dct, int test, int is_idct, int speed)
+static int dct_error(const struct algo *dct, int test, int is_idct, int speed)
{
int it, i, scale;
int err_inf, v;
- int64_t err2, ti, ti1, it1;
+ int64_t err2, ti, ti1, it1, err_sum = 0;
int64_t sysErr[64], sysErrMax = 0;
int maxout = 0;
int blockSumErrMax = 0, blockSumErr;
AVLFG prng;
+ double omse, ome;
+ int spec_err;
av_lfg_init(&prng, 1);
@@ -276,7 +279,9 @@ static void dct_error(const struct algo *dct, int test, int is_idct, int speed)
blockSumErr = 0;
for (i = 0; i < 64; i++) {
- v = abs(block[i] - block1[i]);
+ int err = block[i] - block1[i];
+ err_sum += err;
+ v = abs(err);
if (v > err_inf)
err_inf = v;
err2 += v * v;
@@ -298,13 +303,21 @@ static void dct_error(const struct algo *dct, int test, int is_idct, int speed)
}
printf("\n");
- printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
+ omse = (double) err2 / NB_ITS / 64;
+ ome = (double) err_sum / NB_ITS / 64;
+
+ spec_err = is_idct && (err_inf > 1 || omse > 0.02 || fabs(ome) > 0.0015);
+
+ printf("%s %s: ppe=%d omse=%0.8f ome=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
is_idct ? "IDCT" : "DCT", dct->name, err_inf,
- (double) err2 / NB_ITS / 64.0, (double) sysErrMax / NB_ITS,
+ omse, ome, (double) sysErrMax / NB_ITS,
maxout, blockSumErrMax);
+ if (spec_err && !dct->nonspec)
+ return 1;
+
if (!speed)
- return;
+ return 0;
/* speed test */
for (i = 0; i < 64; i++)
@@ -355,6 +368,8 @@ static void dct_error(const struct algo *dct, int test, int is_idct, int speed)
printf("%s %s: %0.1f kdct/s\n", is_idct ? "IDCT" : "DCT", dct->name,
(double) it1 * 1000.0 / (double) ti1);
+
+ return 0;
}
DECLARE_ALIGNED(8, static uint8_t, img_dest)[64];
@@ -514,6 +529,7 @@ int main(int argc, char **argv)
int c, i;
int test = 1;
int speed = 0;
+ int err = 0;
cpu_flags = av_get_cpu_flags();
@@ -559,8 +575,9 @@ int main(int argc, char **argv)
const struct algo *algos = test_idct ? idct_tab : fdct_tab;
for (i = 0; algos[i].name; i++)
if (!(~cpu_flags & algos[i].mm_support)) {
- dct_error(&algos[i], test, test_idct, speed);
+ err |= dct_error(&algos[i], test, test_idct, speed);
}
}
- return 0;
+
+ return err;
}