From f87e315e1e34de158581cbf7bc96248542d4b3fb Mon Sep 17 00:00:00 2001 From: Jingning Han Date: Mon, 23 Feb 2015 12:55:50 -0800 Subject: [PATCH] Re-distribute hierarchical vector match pattern This commit modifies the hierarchical vector match patter. It avoids repeated SAD computation at same points. The function vp9_vector_sad_sse2 is called 12 times per 64x64 block, instead of 15 times as before. The effective coverage remains the same. Change-Id: I91ad9d27d40db8963c907d02af84e10702136994 --- vp9/encoder/vp9_encodeframe.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 39dedf6..6787faa 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -528,10 +528,10 @@ static int vector_match(int16_t *ref, int16_t *src) { } center = offset; - for (d = -8; d <= 8; d += 4) { + for (d = -8; d <= 8; d += 16) { int this_pos = offset + d; // check limit - if (this_pos < 0 || this_pos > 64 || this_pos == 32) + if (this_pos < 0 || this_pos > 64) continue; this_sad = vp9_vector_sad(&ref[this_pos], src, 64); if (this_sad < best_sad) { @@ -541,10 +541,10 @@ static int vector_match(int16_t *ref, int16_t *src) { } offset = center; - for (d = -4; d <= 4; d += 2) { + for (d = -4; d <= 4; d += 8) { int this_pos = offset + d; // check limit - if (this_pos < 0 || this_pos > 64 || this_pos == 32) + if (this_pos < 0 || this_pos > 64) continue; this_sad = vp9_vector_sad(&ref[this_pos], src, 64); if (this_sad < best_sad) { @@ -554,10 +554,23 @@ static int vector_match(int16_t *ref, int16_t *src) { } offset = center; - for (d = -2; d <= 2; d += 1) { + for (d = -2; d <= 2; d += 4) { int this_pos = offset + d; // check limit - if (this_pos < 0 || this_pos > 64 || this_pos == 32) + if (this_pos < 0 || this_pos > 64) + continue; + this_sad = vp9_vector_sad(&ref[this_pos], src, 64); + if (this_sad < best_sad) { + best_sad = this_sad; + center = this_pos; + } + } + offset = center; + + for (d = -1; d <= 1; d += 2) { + int this_pos = offset + d; + // check limit + if (this_pos < 0 || this_pos > 64) continue; this_sad = vp9_vector_sad(&ref[this_pos], src, 64); if (this_sad < best_sad) { -- 2.7.4