From 84ac2f93ca112769f6f0892e5deaed5a48706dcc Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 6 Aug 2014 01:27:38 +0200 Subject: [PATCH] avutil/pixelutils: avoid on stack arrays The arrays are fairly large and could cause problems on some embedded systems also they are not endian safe as they mix 32 and 8bit Signed-off-by: Michael Niedermayer --- libavutil/pixelutils.c | 32 ++++++++++++++++++-------------- tests/ref/fate/pixelutils | 24 ++++++++++++------------ 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/libavutil/pixelutils.c b/libavutil/pixelutils.c index cfdd35afc2..ca424d89e4 100644 --- a/libavutil/pixelutils.c +++ b/libavutil/pixelutils.c @@ -92,13 +92,13 @@ av_pixelutils_sad_fn av_pixelutils_get_sad_fn(int w_bits, int h_bits, int aligne #define H2 480 static int run_test(const char *test, - const uint32_t *b1, const uint32_t *b2) + const uint8_t *b1, const uint8_t *b2) { int i, a, ret = 0; for (a = 0; a < 3; a++) { - const uint8_t *block1 = (const uint8_t *)b1; - const uint8_t *block2 = (const uint8_t *)b2; + const uint8_t *block1 = b1; + const uint8_t *block2 = b2; switch (a) { case 0: block1++; block2++; break; @@ -124,30 +124,34 @@ static int run_test(const char *test, int main(void) { int i, ret; - DECLARE_ALIGNED(32, uint32_t, buf1)[W1*H1]; - DECLARE_ALIGNED(32, uint32_t, buf2)[W2*H2]; + uint8_t *buf1 = av_malloc(W1*H1); + uint8_t *buf2 = av_malloc(W2*H2); uint32_t state = 0; for (i = 0; i < W1*H1; i++) { state = state * 1664525 + 1013904223; - buf1[i] = state; + buf1[i] = state>>24; } for (i = 0; i < W2*H2; i++) { state = state * 1664525 + 1013904223; - buf2[i] = state; + buf2[i] = state>>24; } ret = run_test("random", buf1, buf2); if (ret < 0) - return ret; + goto end; - memset(buf1, 0xff, sizeof(buf1)); - memset(buf2, 0x00, sizeof(buf2)); + memset(buf1, 0xff, W1*H1); + memset(buf2, 0x00, W2*H2); ret = run_test("max", buf1, buf2); if (ret < 0) - return ret; + goto end; - memset(buf1, 0x90, sizeof(buf1)); - memset(buf2, 0x90, sizeof(buf2)); - return run_test("min", buf1, buf2); + memset(buf1, 0x90, W1*H1); + memset(buf2, 0x90, W2*H2); + ret = run_test("min", buf1, buf2); +end: + av_free(buf1); + av_free(buf2); + return ret; } #endif /* TEST */ diff --git a/tests/ref/fate/pixelutils b/tests/ref/fate/pixelutils index f7f507a5c0..fba44a6a17 100644 --- a/tests/ref/fate/pixelutils +++ b/tests/ref/fate/pixelutils @@ -1,15 +1,15 @@ -[OK] [UU] SAD [random] 2x2=314 ref=314 -[OK] [UU] SAD [random] 4x4=1129 ref=1129 -[OK] [UU] SAD [random] 8x8=4936 ref=4936 -[OK] [UU] SAD [random] 16x16=20704 ref=20704 -[OK] [AU] SAD [random] 2x2=440 ref=440 -[OK] [AU] SAD [random] 4x4=1317 ref=1317 -[OK] [AU] SAD [random] 8x8=5262 ref=5262 -[OK] [AU] SAD [random] 16x16=21040 ref=21040 -[OK] [AA] SAD [random] 2x2=196 ref=196 -[OK] [AA] SAD [random] 4x4=1225 ref=1225 -[OK] [AA] SAD [random] 8x8=4712 ref=4712 -[OK] [AA] SAD [random] 16x16=21184 ref=21184 +[OK] [UU] SAD [random] 2x2=409 ref=409 +[OK] [UU] SAD [random] 4x4=1370 ref=1370 +[OK] [UU] SAD [random] 8x8=5178 ref=5178 +[OK] [UU] SAD [random] 16x16=20946 ref=20946 +[OK] [AU] SAD [random] 2x2=320 ref=320 +[OK] [AU] SAD [random] 4x4=1522 ref=1522 +[OK] [AU] SAD [random] 8x8=5821 ref=5821 +[OK] [AU] SAD [random] 16x16=21951 ref=21951 +[OK] [AA] SAD [random] 2x2=276 ref=276 +[OK] [AA] SAD [random] 4x4=1521 ref=1521 +[OK] [AA] SAD [random] 8x8=5130 ref=5130 +[OK] [AA] SAD [random] 16x16=20775 ref=20775 [OK] [UU] SAD [max] 2x2=1020 ref=1020 [OK] [UU] SAD [max] 4x4=4080 ref=4080 [OK] [UU] SAD [max] 8x8=16320 ref=16320