From acc481eaaefa62bbbd4d5d159a733eaa84bb6331 Mon Sep 17 00:00:00 2001 From: James Zern Date: Sat, 30 May 2015 10:21:15 -0700 Subject: [PATCH] vp9_reconintra: simplify d45_predictor only the immediate above right pixel is needed; this removes a conditional from the inner loop the final average calculated currently relies on above[] being extended, it could be reduced to use above[block_size - 2] + 3 * above_right Change-Id: Ica4f2b8d25eec3ca1d6fa52ef0d4adc228eeea3f --- vp9/common/vp9_reconintra.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/vp9/common/vp9_reconintra.c b/vp9/common/vp9_reconintra.c index bb94c2cfe..bb6e9d389 100644 --- a/vp9/common/vp9_reconintra.c +++ b/vp9/common/vp9_reconintra.c @@ -430,14 +430,17 @@ void vp9_d45_predictor_4x4_c(uint8_t *dst, ptrdiff_t stride, static INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs, const uint8_t *above, const uint8_t *left) { - int r, c; - (void) left; - for (r = 0; r < bs; ++r) { - for (c = 0; c < bs; ++c) - dst[c] = r + c + 2 < bs * 2 ? ROUND_POWER_OF_TWO(above[r + c] + - above[r + c + 1] * 2 + - above[r + c + 2], 2) - : above[bs * 2 - 1]; + const uint8_t above_right = above[bs - 1]; + int x, size; + uint8_t avg[31]; // TODO(jzern): this could be block size specific + (void)left; + + for (x = 0; x < bs - 1; ++x) { + avg[x] = AVG3(above[x], above[x + 1], above[x + 2]); + } + for (x = 0, size = bs - 1; x < bs; ++x, --size) { + memcpy(dst, avg + x, size); + memset(dst + size, above_right, x + 1); dst += stride; } } -- 2.40.0