Add av1_predict_intra_block_facade

A simpler interface for intra block prediction

Change-Id: I97e3f385746928d87999e6862b1d71a197df0302
diff --git a/av1/common/reconintra.c b/av1/common/reconintra.c
index 7cd48b6..c08e9fb 100644
--- a/av1/common/reconintra.c
+++ b/av1/common/reconintra.c
@@ -2249,6 +2249,21 @@
                          plane);
 }
 
+void av1_predict_intra_block_facade(MACROBLOCKD *xd, int plane,
+                                    int block_raster_idx, int blk_col,
+                                    int blk_row, TX_SIZE tx_size) {
+  struct macroblockd_plane *const pd = &xd->plane[plane];
+  const int dst_stride = pd->dst.stride;
+  uint8_t *dst =
+      &pd->dst.buf[(blk_row * dst_stride + blk_col) << tx_size_wide_log2[0]];
+  MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
+  PREDICTION_MODE mode =
+      (plane == 0) ? get_y_mode(xd->mi[0], block_raster_idx) : mbmi->uv_mode;
+  av1_predict_intra_block(xd, pd->width, pd->height, txsize_to_bsize[tx_size],
+                          mode, dst, dst_stride, dst, dst_stride, blk_col,
+                          blk_row, plane);
+}
+
 void av1_predict_intra_block(const MACROBLOCKD *xd, int wpx, int hpx,
                              BLOCK_SIZE bsize, PREDICTION_MODE mode,
                              const uint8_t *ref, int ref_stride, uint8_t *dst,
diff --git a/av1/common/reconintra.h b/av1/common/reconintra.h
index e1ef27d..4d3ab6b 100644
--- a/av1/common/reconintra.h
+++ b/av1/common/reconintra.h
@@ -20,7 +20,9 @@
 #endif
 
 void av1_init_intra_predictors(void);
-
+void av1_predict_intra_block_facade(MACROBLOCKD *xd, int plane,
+                                    int block_raster_idx, int blk_col,
+                                    int blk_row, TX_SIZE tx_size);
 void av1_predict_intra_block(const MACROBLOCKD *xd, int bw, int bh,
                              BLOCK_SIZE bsize, PREDICTION_MODE mode,
                              const uint8_t *ref, int ref_stride, uint8_t *dst,
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index c2f4f11..12dd9f9 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -538,27 +538,17 @@
 static void predict_and_reconstruct_intra_block(
     AV1_COMMON *cm, MACROBLOCKD *const xd, aom_reader *const r,
     MB_MODE_INFO *const mbmi, int plane, int row, int col, TX_SIZE tx_size) {
-  struct macroblockd_plane *const pd = &xd->plane[plane];
-  PREDICTION_MODE mode = (plane == 0) ? mbmi->mode : mbmi->uv_mode;
   PLANE_TYPE plane_type = get_plane_type(plane);
-  uint8_t *dst;
   const int block_idx = (row << 1) + col;
 #if CONFIG_PVQ
   (void)r;
 #endif
-  dst = &pd->dst.buf[(row * pd->dst.stride + col) << tx_size_wide_log2[0]];
-
-#if !CONFIG_CB4X4
-  if (mbmi->sb_type < BLOCK_8X8)
-    if (plane == 0) mode = xd->mi[0]->bmi[block_idx].as_mode;
-#endif
-  av1_predict_intra_block(xd, pd->width, pd->height, txsize_to_bsize[tx_size],
-                          mode, dst, pd->dst.stride, dst, pd->dst.stride, col,
-                          row, plane);
+  av1_predict_intra_block_facade(xd, plane, block_idx, col, row, tx_size);
 
   if (!mbmi->skip) {
     TX_TYPE tx_type = get_tx_type(plane_type, xd, block_idx, tx_size);
 #if !CONFIG_PVQ
+    struct macroblockd_plane *const pd = &xd->plane[plane];
 #if CONFIG_LV_MAP
     int16_t max_scan_line = 0;
     int eob;
@@ -571,9 +561,12 @@
         av1_decode_block_tokens(cm, xd, plane, scan_order, col, row, tx_size,
                                 tx_type, &max_scan_line, r, mbmi->segment_id);
 #endif  // CONFIG_LV_MAP
-    if (eob)
+    if (eob) {
+      uint8_t *dst =
+          &pd->dst.buf[(row * pd->dst.stride + col) << tx_size_wide_log2[0]];
       inverse_transform_block(xd, plane, tx_type, tx_size, dst, pd->dst.stride,
                               max_scan_line, eob);
+    }
 #else
     av1_pvq_decode_helper2(cm, xd, mbmi, plane, row, col, tx_size, tx_type);
 #endif
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c
index b378674..d5859d4 100644
--- a/av1/encoder/encodemb.c
+++ b/av1/encoder/encodemb.c
@@ -1082,7 +1082,6 @@
   const int block_raster_idx = av1_block_index_to_raster_order(tx_size, block);
   const TX_TYPE tx_type =
       get_tx_type(plane_type, xd, block_raster_idx, tx_size);
-  PREDICTION_MODE mode;
   const int diff_stride = block_size_wide[plane_bsize];
   uint8_t *src, *dst;
   int16_t *src_diff;
@@ -1098,15 +1097,13 @@
   int i, j;
 #endif
 
+  av1_predict_intra_block_facade(xd, plane, block_raster_idx, blk_col, blk_row,
+                                 tx_size);
+
   dst = &pd->dst.buf[(blk_row * dst_stride + blk_col) << tx_size_wide_log2[0]];
   src = &p->src.buf[(blk_row * src_stride + blk_col) << tx_size_wide_log2[0]];
   src_diff =
       &p->src_diff[(blk_row * diff_stride + blk_col) << tx_size_wide_log2[0]];
-  mode = (plane == 0) ? get_y_mode(xd->mi[0], block_raster_idx) : mbmi->uv_mode;
-  av1_predict_intra_block(xd, pd->width, pd->height, txsize_to_bsize[tx_size],
-                          mode, dst, dst_stride, dst, dst_stride, blk_col,
-                          blk_row, plane);
-
   subtract_block(xd, tx1d_height, tx1d_width, src_diff, diff_stride, src,
                  src_stride, dst, dst_stride);
 
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 76857af..72575c3 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2401,14 +2401,15 @@
   const int max_blocks_high = max_block_high(xd, bsize, 0);
   mbmi->tx_size = tx_size;
   // Prediction.
+  const int step = stepr * stepc;
+  int block = 0;
   for (row = 0; row < max_blocks_high; row += stepr) {
     for (col = 0; col < max_blocks_wide; col += stepc) {
-      struct macroblockd_plane *const pd = &xd->plane[0];
-      uint8_t *dst =
-          &pd->dst.buf[(row * pd->dst.stride + col) << tx_size_wide_log2[0]];
-      av1_predict_intra_block(xd, pd->width, pd->height,
-                              txsize_to_bsize[tx_size], mbmi->mode, dst,
-                              pd->dst.stride, dst, pd->dst.stride, col, row, 0);
+      const int block_raster_idx =
+          av1_block_index_to_raster_order(tx_size, block);
+      av1_predict_intra_block_facade(xd, 0, block_raster_idx, col, row,
+                                     tx_size);
+      block += step;
     }
   }
   // RD estimation.