Re-distribute hierarchical vector match pattern
authorJingning Han <jingning@google.com>
Mon, 23 Feb 2015 20:55:50 +0000 (12:55 -0800)
committerJingning Han <jingning@google.com>
Tue, 24 Feb 2015 19:48:38 +0000 (11:48 -0800)
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

index 39dedf6..6787faa 100644 (file)
@@ -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) {