Commit 84786e92 authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/tests/dct: Add Mean square error test

based on quotes of IEEE 1180 / ISO/IEC 23002-1
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 86cbffdc
...@@ -182,6 +182,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c ...@@ -182,6 +182,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c
int err_inf, v; int err_inf, v;
int64_t err2, ti, ti1, it1, err_sum = 0; int64_t err2, ti, ti1, it1, err_sum = 0;
int64_t sysErr[64], sysErrMax = 0; int64_t sysErr[64], sysErrMax = 0;
int64_t err2_matrix[64], err2_max = 0;
int maxout = 0; int maxout = 0;
int blockSumErrMax = 0, blockSumErr; int blockSumErrMax = 0, blockSumErr;
AVLFG prng; AVLFG prng;
...@@ -194,7 +195,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c ...@@ -194,7 +195,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c
err_inf = 0; err_inf = 0;
err2 = 0; err2 = 0;
for (i = 0; i < 64; i++) for (i = 0; i < 64; i++)
sysErr[i] = 0; err2_matrix[i] = sysErr[i] = 0;
for (it = 0; it < NB_ITS; it++) { for (it = 0; it < NB_ITS; it++) {
init_block(block1, test, is_idct, &prng, vals); init_block(block1, test, is_idct, &prng, vals);
permute(block, block1, dct->perm_type); permute(block, block1, dct->perm_type);
...@@ -221,6 +222,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c ...@@ -221,6 +222,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c
v = abs(err); v = abs(err);
if (v > err_inf) if (v > err_inf)
err_inf = v; err_inf = v;
err2_matrix[i] += v * v;
err2 += v * v; err2 += v * v;
sysErr[i] += block[i] - block1[i]; sysErr[i] += block[i] - block1[i];
blockSumErr += v; blockSumErr += v;
...@@ -230,8 +232,10 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c ...@@ -230,8 +232,10 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c
if (blockSumErrMax < blockSumErr) if (blockSumErrMax < blockSumErr)
blockSumErrMax = blockSumErr; blockSumErrMax = blockSumErr;
} }
for (i = 0; i < 64; i++) for (i = 0; i < 64; i++) {
sysErrMax = FFMAX(sysErrMax, FFABS(sysErr[i])); sysErrMax = FFMAX(sysErrMax, FFABS(sysErr[i]));
err2_max = FFMAX(err2_max , FFABS(err2_matrix[i]));
}
for (i = 0; i < 64; i++) { for (i = 0; i < 64; i++) {
if (i % 8 == 0) if (i % 8 == 0)
...@@ -245,7 +249,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c ...@@ -245,7 +249,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed, c
spec_err = is_idct && (err_inf > 1 || omse > 0.02 || fabs(ome) > 0.0015); spec_err = is_idct && (err_inf > 1 || omse > 0.02 || fabs(ome) > 0.0015);
if (test < 2) if (test < 2)
spec_err = is_idct && ((double) sysErrMax / NB_ITS > 0.015); spec_err = is_idct && ((double) err2_max / NB_ITS > 0.06 || (double) sysErrMax / NB_ITS > 0.015);
printf("%s %s: max_err=%d omse=%0.8f ome=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", printf("%s %s: max_err=%d omse=%0.8f ome=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
is_idct ? "IDCT" : "DCT", dct->name, err_inf, is_idct ? "IDCT" : "DCT", dct->name, err_inf,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment