diff options
author | Martin Storsjö <martin@martin.st> | 2019-06-20 23:38:06 +0300 |
---|---|---|
committer | Josh de Kock <josh@itanimul.li> | 2020-05-15 10:29:30 +0100 |
commit | 3ce1b2bf8d75708ea041f6bbad86b2b249643b9a (patch) | |
tree | e5d22d062f28f92f3406ce75497521ba6842c012 | |
parent | 718c8f9aa59751bb490e2688acf2b5cb68fd5ad1 (diff) | |
download | ffmpeg-3ce1b2bf8d75708ea041f6bbad86b2b249643b9a.tar.gz |
checkasm: add function to check and diff memory
This was ported from dav1d (c950e7101bdf5f7117bfca816984a21e550509f0).
Signed-off-by: Josh de Kock <josh@itanimul.li>
-rw-r--r-- | tests/checkasm/checkasm.c | 42 | ||||
-rw-r--r-- | tests/checkasm/checkasm.h | 16 |
2 files changed, 58 insertions, 0 deletions
diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index d67147ae6f..27dff4c72a 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -268,6 +268,7 @@ static struct { int cpu_flag; const char *cpu_flag_name; const char *test_name; + int verbose; } state; /* PRNG state */ @@ -686,6 +687,8 @@ int main(int argc, char *argv[]) state.bench_pattern = ""; } else if (!strncmp(argv[1], "--test=", 7)) { state.test_name = argv[1] + 7; + } else if (!strcmp(argv[1], "--verbose") || !strcmp(argv[1], "-v")) { + state.verbose = 1; } else { seed = strtoul(argv[1], NULL, 10); } @@ -836,3 +839,42 @@ void checkasm_report(const char *name, ...) max_length = length; } } + +#define DEF_CHECKASM_CHECK_FUNC(type, fmt) \ +int checkasm_check_##type(const char *const file, const int line, \ + const type *buf1, ptrdiff_t stride1, \ + const type *buf2, ptrdiff_t stride2, \ + const int w, int h, const char *const name) \ +{ \ + int y = 0; \ + stride1 /= sizeof(*buf1); \ + stride2 /= sizeof(*buf2); \ + for (y = 0; y < h; y++) \ + if (memcmp(&buf1[y*stride1], &buf2[y*stride2], w*sizeof(*buf1))) \ + break; \ + if (y == h) \ + return 0; \ + checkasm_fail_func("%s:%d", file, line); \ + if (!state.verbose) \ + return 1; \ + fprintf(stderr, "%s:\n", name); \ + while (h--) { \ + for (int x = 0; x < w; x++) \ + fprintf(stderr, " " fmt, buf1[x]); \ + fprintf(stderr, " "); \ + for (int x = 0; x < w; x++) \ + fprintf(stderr, " " fmt, buf2[x]); \ + fprintf(stderr, " "); \ + for (int x = 0; x < w; x++) \ + fprintf(stderr, "%c", buf1[x] != buf2[x] ? 'x' : '.'); \ + buf1 += stride1; \ + buf2 += stride2; \ + fprintf(stderr, "\n"); \ + } \ + return 1; \ +} + +DEF_CHECKASM_CHECK_FUNC(uint8_t, "%02x") +DEF_CHECKASM_CHECK_FUNC(uint16_t, "%04x") +DEF_CHECKASM_CHECK_FUNC(int16_t, "%6d") +DEF_CHECKASM_CHECK_FUNC(int32_t, "%9d") diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h index 0a7f9f25c4..5807d32e14 100644 --- a/tests/checkasm/checkasm.h +++ b/tests/checkasm/checkasm.h @@ -257,4 +257,20 @@ typedef struct CheckasmPerf { #define PERF_STOP(t) while(0) #endif +#define DECL_CHECKASM_CHECK_FUNC(type) \ +int checkasm_check_##type(const char *const file, const int line, \ + const type *const buf1, const ptrdiff_t stride1, \ + const type *const buf2, const ptrdiff_t stride2, \ + const int w, const int h, const char *const name) + +DECL_CHECKASM_CHECK_FUNC(uint8_t); +DECL_CHECKASM_CHECK_FUNC(uint16_t); +DECL_CHECKASM_CHECK_FUNC(int16_t); +DECL_CHECKASM_CHECK_FUNC(int32_t); + +#define PASTE(a,b) a ## b +#define CONCAT(a,b) PASTE(a,b) + +#define checkasm_check(prefix, ...) CONCAT(checkasm_check_, prefix)(__FILE__, __LINE__, __VA_ARGS__) + #endif /* TESTS_CHECKASM_CHECKASM_H */ |