]> granicus.if.org Git - libvpx/commitdiff
vp9_reconintra: simplify d45_predictor
authorJames Zern <jzern@google.com>
Sat, 30 May 2015 17:21:15 +0000 (10:21 -0700)
committerJames Zern <jzern@google.com>
Sat, 30 May 2015 20:30:59 +0000 (13:30 -0700)
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

index bb94c2cfe43a773e2660eef8c506bf7593c73e06..bb6e9d3892b864c25867da7a49df97518de2d437 100644 (file)
@@ -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;
   }
 }