make DC_PRED for i4x4 to use real pixels only
authorYaowu Xu <yaowu@google.com>
Fri, 19 Apr 2013 16:33:07 +0000 (09:33 -0700)
committerYaowu Xu <yaowu@google.com>
Fri, 19 Apr 2013 23:22:07 +0000 (16:22 -0700)
Wherever there are real pixels available before falling back to use
assumed values 127 and 129.

This also make DC_PRED for i4x4 consistent with DC_PRED for larger
blocks.

Change-Id: I54372924826118da023f402c802ac6ce0caa70c3

vp9/common/vp9_reconintra4x4.c

index a070001..7f81b05 100644 (file)
@@ -258,15 +258,22 @@ void vp9_intra4x4_predict(MACROBLOCKD *xd,
 
   switch (b_mode) {
     case B_DC_PRED: {
-      int expected_dc = 0;
-
-      for (i = 0; i < 4; i++) {
-        expected_dc += above[i];
-        expected_dc += left[i];
+      int expected_dc = 128;
+      if (have_top || have_left) {
+        int average = 0;
+        int count = 0;
+        if (have_top) {
+          for (i = 0; i < 4; i++)
+            average += above[i];
+          count += 4;
+        }
+        if (have_left) {
+          for (i = 0; i < 4; i++)
+            average += left[i];
+          count += 4;
+        }
+        expected_dc = (average + (count >> 1)) / count;
       }
-
-      expected_dc = ROUND_POWER_OF_TWO(expected_dc, 3);
-
       for (r = 0; r < 4; r++) {
         for (c = 0; c < 4; c++)
           predictor[c] = expected_dc;