shithub: libvpx

Download patch

ref: 94996b9d267b20a72a746763146cfe65ac87eb97
parent: 07cde4fdc81dd8e601ae9e5025d5a110b69f316e
author: Ronald S. Bultje <rbultje@google.com>
date: Sun Apr 14 06:37:49 EDT 2013

Slightly hackish workaround to support rectangles in directional intra predictors.

Change-Id: I8a4da6925f2d58a426c4d122df8b97bb69452e49

--- a/vp9/common/vp9_reconintra.c
+++ b/vp9/common/vp9_reconintra.c
@@ -373,24 +373,95 @@
         ypred_ptr += y_stride;
       }
       break;
+#if CONFIG_SBSEGMENT
     case D45_PRED:
-      d45_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
-      break;
     case D135_PRED:
-      d135_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
-      break;
     case D117_PRED:
-      d117_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
-      break;
     case D153_PRED:
-      d153_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
-      break;
     case D27_PRED:
-      d27_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
-      break;
     case D63_PRED:
-      d63_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
+      if (bw == bh) {
+        switch (mode) {
+#endif
+          case D45_PRED:
+            d45_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
+            break;
+          case D135_PRED:
+            d135_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
+            break;
+          case D117_PRED:
+            d117_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
+            break;
+          case D153_PRED:
+            d153_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
+            break;
+          case D27_PRED:
+            d27_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
+            break;
+          case D63_PRED:
+            d63_predictor(ypred_ptr, y_stride, bw, bh,  yabove_row, yleft_col);
+            break;
+#if CONFIG_SBSEGMENT
+          default:
+            assert(0);
+        }
+      } else if (bw > bh) {
+        uint8_t pred[64*64];
+        memset(yleft_col + bh, yleft_col[bh - 1], bw - bh);
+        switch (mode) {
+          case D45_PRED:
+            d45_predictor(pred, 64, bw, bw,  yabove_row, yleft_col);
+            break;
+          case D135_PRED:
+            d135_predictor(pred, 64, bw, bw,  yabove_row, yleft_col);
+            break;
+          case D117_PRED:
+            d117_predictor(pred, 64, bw, bw,  yabove_row, yleft_col);
+            break;
+          case D153_PRED:
+            d153_predictor(pred, 64, bw, bw,  yabove_row, yleft_col);
+            break;
+          case D27_PRED:
+            d27_predictor(pred, 64, bw, bw,  yabove_row, yleft_col);
+            break;
+          case D63_PRED:
+            d63_predictor(pred, 64, bw, bw,  yabove_row, yleft_col);
+            break;
+          default:
+            assert(0);
+        }
+        for (i = 0; i < bh; i++)
+          memcpy(ypred_ptr + y_stride * i, pred + i * 64, bw);
+      } else {
+        uint8_t pred[64 * 64];
+        memset(yabove_row + bw, yabove_row[bw - 1], bh - bw);
+        switch (mode) {
+          case D45_PRED:
+            d45_predictor(pred, 64, bh, bh,  yabove_row, yleft_col);
+            break;
+          case D135_PRED:
+            d135_predictor(pred, 64, bh, bh,  yabove_row, yleft_col);
+            break;
+          case D117_PRED:
+            d117_predictor(pred, 64, bh, bh,  yabove_row, yleft_col);
+            break;
+          case D153_PRED:
+            d153_predictor(pred, 64, bh, bh,  yabove_row, yleft_col);
+            break;
+          case D27_PRED:
+            d27_predictor(pred, 64, bh, bh,  yabove_row, yleft_col);
+            break;
+          case D63_PRED:
+            d63_predictor(pred, 64, bh, bh,  yabove_row, yleft_col);
+            break;
+          default:
+            assert(0);
+        }
+        for (i = 0; i < bh; i++)
+          memcpy(ypred_ptr + y_stride * i, pred + i * 64, bw);
+      }
       break;
+#endif
     default:
       break;
   }