Merge "quantize: make 4x4, 8x8 common with larger transforms" into experimental
diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c
index 56fac12..b88a5d4 100644
--- a/vp9/common/vp9_alloccommon.c
+++ b/vp9/common/vp9_alloccommon.c
@@ -33,15 +33,18 @@
 
 void vp9_update_mode_info_in_image(VP9_COMMON *cpi, MODE_INFO *mi) {
   int i, j;
+  MODE_INFO *ptr;
 
   // For each in image mode_info element set the in image flag to 1
   for (i = 0; i < cpi->mb_rows; i++) {
+    ptr = mi;
     for (j = 0; j < cpi->mb_cols; j++) {
-      mi->mbmi.mb_in_image = 1;
-      mi++;  // Next element in the row
+      ptr->mbmi.mb_in_image = 1;
+      ptr++;  // Next element in the row
     }
 
-    mi++;  // Step over border element at start of next row
+    // Step over border element at start of next row
+    mi += cpi->mode_info_stride;
   }
 }
 
diff --git a/vp9/common/vp9_blockd.h b/vp9/common/vp9_blockd.h
index b635485..b4f7c93 100644
--- a/vp9/common/vp9_blockd.h
+++ b/vp9/common/vp9_blockd.h
@@ -283,7 +283,7 @@
   int dst;
   int dst_stride;
 
-  union b_mode_info bmi;
+//  union b_mode_info bmi;
 } BLOCKD;
 
 struct scale_factors {
@@ -574,34 +574,33 @@
   // is smaller than the prediction size
   TX_TYPE tx_type = DCT_DCT;
   const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-  const int wb = mb_width_log2(sb_type), hb = mb_height_log2(sb_type);
+  const int wb = b_width_log2(sb_type), hb = b_height_log2(sb_type);
 #if !USE_ADST_FOR_SB
   if (sb_type > BLOCK_SIZE_MB16X16)
     return tx_type;
 #endif
-  if (ib >= (16 << (wb + hb)))  // no chroma adst
+  if (ib >= (1 << (wb + hb)))  // no chroma adst
     return tx_type;
   if (xd->lossless)
     return DCT_DCT;
   if (xd->mode_info_context->mbmi.mode == I4X4_PRED &&
       xd->q_index < ACTIVE_HT) {
-    const BLOCKD *b = &xd->block[ib];
     tx_type = txfm_map(
 #if CONFIG_NEWBINTRAMODES
-        b->bmi.as_mode.first == B_CONTEXT_PRED ? b->bmi.as_mode.context :
+        xd->mode_info_context->bmi[ib].as_mode.first == B_CONTEXT_PRED ?
+          xd->mode_info_context->bmi[ib].as_mode.context :
 #endif
-        b->bmi.as_mode.first);
+        xd->mode_info_context->bmi[ib].as_mode.first);
   } else if (xd->mode_info_context->mbmi.mode == I8X8_PRED &&
              xd->q_index < ACTIVE_HT) {
-    const BLOCKD *b = &xd->block[ib];
     const int ic = (ib & 10);
 #if USE_ADST_FOR_I8X8_4X4
 #if USE_ADST_PERIPHERY_ONLY
     // Use ADST for periphery blocks only
     const int inner = ib & 5;
-    b += ic - ib;
     tx_type = txfm_map(pred_mode_conv(
-        (MB_PREDICTION_MODE)b->bmi.as_mode.first));
+        (MB_PREDICTION_MODE)xd->mode_info_context->bmi[ic].as_mode.first));
+
 #if USE_ADST_FOR_REMOTE_EDGE
     if (inner == 5)
       tx_type = DCT_DCT;
@@ -630,7 +629,7 @@
              xd->q_index < ACTIVE_HT) {
 #if USE_ADST_FOR_I16X16_4X4
 #if USE_ADST_PERIPHERY_ONLY
-    const int hmax = 4 << wb;
+    const int hmax = 1 << wb;
     tx_type = txfm_map(pred_mode_conv(xd->mode_info_context->mbmi.mode));
 #if USE_ADST_FOR_REMOTE_EDGE
     if ((ib & (hmax - 1)) != 0 && ib >= hmax)
@@ -663,25 +662,24 @@
   // is smaller than the prediction size
   TX_TYPE tx_type = DCT_DCT;
   const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-  const int wb = mb_width_log2(sb_type), hb = mb_height_log2(sb_type);
+  const int wb = b_width_log2(sb_type), hb = b_height_log2(sb_type);
 #if !USE_ADST_FOR_SB
   if (sb_type > BLOCK_SIZE_MB16X16)
     return tx_type;
 #endif
-  if (ib >= (16 << (wb + hb)))  // no chroma adst
+  if (ib >= (1 << (wb + hb)))  // no chroma adst
     return tx_type;
   if (xd->mode_info_context->mbmi.mode == I8X8_PRED &&
       xd->q_index < ACTIVE_HT8) {
-    const BLOCKD *b = &xd->block[ib];
     // TODO(rbultje): MB_PREDICTION_MODE / B_PREDICTION_MODE should be merged
     // or the relationship otherwise modified to address this type conversion.
     tx_type = txfm_map(pred_mode_conv(
-           (MB_PREDICTION_MODE)b->bmi.as_mode.first));
+           (MB_PREDICTION_MODE)xd->mode_info_context->bmi[ib].as_mode.first));
   } else if (xd->mode_info_context->mbmi.mode < I8X8_PRED &&
              xd->q_index < ACTIVE_HT8) {
 #if USE_ADST_FOR_I16X16_8X8
 #if USE_ADST_PERIPHERY_ONLY
-    const int hmax = 4 << wb;
+    const int hmax = 1 << wb;
     tx_type = txfm_map(pred_mode_conv(xd->mode_info_context->mbmi.mode));
 #if USE_ADST_FOR_REMOTE_EDGE
     if ((ib & (hmax - 1)) != 0 && ib >= hmax)
@@ -712,19 +710,19 @@
 static TX_TYPE get_tx_type_16x16(const MACROBLOCKD *xd, int ib) {
   TX_TYPE tx_type = DCT_DCT;
   const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-  const int wb = mb_width_log2(sb_type), hb = mb_height_log2(sb_type);
+  const int wb = b_width_log2(sb_type), hb = b_height_log2(sb_type);
 #if !USE_ADST_FOR_SB
   if (sb_type > BLOCK_SIZE_MB16X16)
     return tx_type;
 #endif
-  if (ib >= (16 << (wb + hb)))
+  if (ib >= (1 << (wb + hb)))
     return tx_type;
   if (xd->mode_info_context->mbmi.mode < I8X8_PRED &&
       xd->q_index < ACTIVE_HT16) {
     tx_type = txfm_map(pred_mode_conv(xd->mode_info_context->mbmi.mode));
 #if USE_ADST_PERIPHERY_ONLY
     if (sb_type > BLOCK_SIZE_MB16X16) {
-      const int hmax = 4 << wb;
+      const int hmax = 1 << wb;
 #if USE_ADST_FOR_REMOTE_EDGE
       if ((ib & (hmax - 1)) != 0 && ib >= hmax)
         tx_type = DCT_DCT;
@@ -748,16 +746,6 @@
 void vp9_build_block_doffsets(MACROBLOCKD *xd);
 void vp9_setup_block_dptrs(MACROBLOCKD *xd);
 
-static void update_blockd_bmi(MACROBLOCKD *xd) {
-  const MB_PREDICTION_MODE mode = xd->mode_info_context->mbmi.mode;
-
-  if (mode == SPLITMV || mode == I8X8_PRED || mode == I4X4_PRED) {
-    int i;
-    for (i = 0; i < 16; i++)
-      xd->block[i].bmi = xd->mode_info_context->bmi[i];
-  }
-}
-
 static TX_SIZE get_uv_tx_size(const MACROBLOCKD *xd) {
   MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi;
   const TX_SIZE size = mbmi->txfm_size;
diff --git a/vp9/common/vp9_entropymode.c b/vp9/common/vp9_entropymode.c
index 626c7d4..fbf4bdf 100644
--- a/vp9/common/vp9_entropymode.c
+++ b/vp9/common/vp9_entropymode.c
@@ -705,9 +705,9 @@
     vpx_memcpy(&cm->frame_contexts[i], &cm->fc, sizeof(cm->fc));
 
   vpx_memset(cm->prev_mip, 0,
-             (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));
+             cm->mode_info_stride * (cm->mb_rows + 1)* sizeof(MODE_INFO));
   vpx_memset(cm->mip, 0,
-             (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));
+             cm->mode_info_stride * (cm->mb_rows + 1)* sizeof(MODE_INFO));
 
   vp9_update_mode_info_border(cm, cm->mip);
   vp9_update_mode_info_in_image(cm, cm->mi);
diff --git a/vp9/common/vp9_invtrans.c b/vp9/common/vp9_invtrans.c
index 0673fd8..458f135 100644
--- a/vp9/common/vp9_invtrans.c
+++ b/vp9/common/vp9_invtrans.c
@@ -31,8 +31,8 @@
 }
 
 void vp9_inverse_transform_sby_32x32(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) - 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) - 1);
+  const int bwl = b_width_log2(bsize) - 3, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 3);
   const int stride = 32 << bwl;
   int n;
 
@@ -46,8 +46,8 @@
 }
 
 void vp9_inverse_transform_sby_16x16(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bw = 1 << bwl;
-  const int bh = 1 << mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 2);
   const int stride = 16 << bwl, bstride = 4 << bwl;
   int n;
 
@@ -68,8 +68,8 @@
 }
 
 void vp9_inverse_transform_sby_8x8(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 1);
+  const int bwl = b_width_log2(bsize) - 1, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 1);
   const int stride = 8 << bwl, bstride = 2 << bwl;
   int n;
 
@@ -89,8 +89,8 @@
 }
 
 void vp9_inverse_transform_sby_4x4(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 2);
+  const int bwl = b_width_log2(bsize), bw = 1 << bwl;
+  const int bh = 1 << b_height_log2(bsize);
   const int stride = 4 << bwl, bstride = 1 << bwl;
   int n;
 
@@ -118,7 +118,7 @@
 }
 
 void vp9_inverse_transform_sbuv_16x16(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bhl = mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bhl = b_height_log2(bsize) - 2;
   const int bw = 1 << (bwl - 1), bh = 1 << (bhl - 1);
   const int stride = 16 << (bwl - 1);
   int n;
@@ -135,7 +135,7 @@
 }
 
 void vp9_inverse_transform_sbuv_8x8(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bhl = mb_height_log2(bsize) + 1;
+  const int bwl = b_width_log2(bsize) - 1, bhl = b_height_log2(bsize) - 1;
   const int bw = 1 << (bwl - 1), bh = 1 << (bhl - 1);
   const int stride = 8 << (bwl - 1);
   int n;
@@ -152,7 +152,7 @@
 }
 
 void vp9_inverse_transform_sbuv_4x4(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bhl = mb_height_log2(bsize) + 2;
+  const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
   const int bw = 1 << (bwl - 1), bh = 1 << (bhl - 1);
   const int stride = 4 << (bwl - 1);
   int n;
diff --git a/vp9/common/vp9_reconinter.c b/vp9/common/vp9_reconinter.c
index 42cb1f4..483db07 100644
--- a/vp9/common/vp9_reconinter.c
+++ b/vp9/common/vp9_reconinter.c
@@ -307,18 +307,6 @@
   return clamped_mv;
 }
 
-// TODO(jkoleszar): In principle, nothing has to depend on this, but it's
-// currently required. Some users look at the mi->bmi, some look at the
-// xd->bmi.
-static void duplicate_splitmv_bmi(MACROBLOCKD *xd) {
-  int i;
-
-  for (i = 0; i < 16; i += 2) {
-    xd->block[i + 0].bmi = xd->mode_info_context->bmi[i + 0];
-    xd->block[i + 1].bmi = xd->mode_info_context->bmi[i + 1];
-  }
-}
-
 struct build_inter_predictors_args {
   MACROBLOCKD *xd;
   int x;
@@ -366,7 +354,7 @@
 
     if (xd->mode_info_context->mbmi.mode == SPLITMV) {
       if (plane == 0) {
-        mv = &xd->block[block].bmi.as_mv[which_mv].as_mv;
+        mv = &xd->mode_info_context->bmi[block].as_mv[which_mv].as_mv;
       } else {
         const int y_block = (block & 2) * 4 + (block & 1) * 2;
         split_chroma_mv.row = mi_mv_pred_row_q4(xd, y_block, which_mv);
@@ -410,11 +398,6 @@
     {{xd->plane[0].pre[0].stride, 0, 0}, {xd->plane[0].pre[1].stride, 0, 0}},
   };
 
-  // TODO(jkoleszar): This is a hack no matter where you put it, but does it
-  // belong here?
-  if (xd->mode_info_context->mbmi.mode == SPLITMV)
-    duplicate_splitmv_bmi(xd);
-
   foreach_predicted_block_in_plane(xd, bsize, 0, build_inter_predictors, &args);
 }
 void vp9_build_inter_predictors_sbuv(MACROBLOCKD *xd,
diff --git a/vp9/common/vp9_reconintra4x4.c b/vp9/common/vp9_reconintra4x4.c
index 7f81b05..7794220 100644
--- a/vp9/common/vp9_reconintra4x4.c
+++ b/vp9/common/vp9_reconintra4x4.c
@@ -253,7 +253,7 @@
 
 #if CONFIG_NEWBINTRAMODES
   if (b_mode == B_CONTEXT_PRED)
-    b_mode = x->bmi.as_mode.context;
+    b_mode = xd->mode_info_context->bmi[block_idx].as_mode.context;
 #endif
 
   switch (b_mode) {
diff --git a/vp9/common/vp9_rtcd_defs.sh b/vp9/common/vp9_rtcd_defs.sh
index 2460788..ec0b291 100644
--- a/vp9/common/vp9_rtcd_defs.sh
+++ b/vp9/common/vp9_rtcd_defs.sh
@@ -591,7 +591,7 @@
 #
 # Motion search
 #
-prototype int vp9_full_search_sad "struct macroblock *x, struct blockd *d, union int_mv *ref_mv, int sad_per_bit, int distance, struct vp9_variance_vtable *fn_ptr, DEC_MVCOSTS, union int_mv *center_mv"
+prototype int vp9_full_search_sad "struct macroblock *x, struct blockd *d, union int_mv *ref_mv, int sad_per_bit, int distance, struct vp9_variance_vtable *fn_ptr, DEC_MVCOSTS, union int_mv *center_mv, int n"
 specialize vp9_full_search_sad sse3 sse4_1
 vp9_full_search_sad_sse3=vp9_full_search_sadx3
 vp9_full_search_sad_sse4_1=vp9_full_search_sadx8
diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c
index e00e951..246484c 100644
--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -1044,7 +1044,5 @@
     for (y = 0; y < y_mbs; y++)
       for (x = !y; x < x_mbs; x++)
         mi[y * mis + x] = *mi;
-  } else {
-    update_blockd_bmi(xd);
   }
 }
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index 7958a3e..26f341a 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -254,7 +254,7 @@
       int stride = xd->plane[0].dst.stride;
       if (mode == I8X8_PRED) {
         BLOCKD *b = &xd->block[ib];
-        int i8x8mode = b->bmi.as_mode.first;
+        int i8x8mode = xd->mode_info_context->bmi[ib].as_mode.first;
         vp9_intra8x8_predict(xd, b, i8x8mode, dst, stride);
       }
       tx_type = get_tx_type_8x8(xd, ib);
@@ -271,7 +271,7 @@
     for (i = 0; i < 4; i++) {
       int ib = vp9_i8x8_block[i];
       BLOCKD *b = &xd->block[ib];
-      int i8x8mode = b->bmi.as_mode.first;
+      int i8x8mode = xd->mode_info_context->bmi[ib].as_mode.first;
 
       b = &xd->block[16 + i];
       vp9_intra_uv4x4_predict(xd, b, i8x8mode, *(b->base_dst) + b->dst,
@@ -324,7 +324,7 @@
       const int iblock[4] = {0, 1, 4, 5};
       int j;
       BLOCKD *b = &xd->block[ib];
-      int i8x8mode = b->bmi.as_mode.first;
+      int i8x8mode = xd->mode_info_context->bmi[ib].as_mode.first;
       vp9_intra8x8_predict(xd, b, i8x8mode, *(b->base_dst) + b->dst,
                            b->dst_stride);
       for (j = 0; j < 4; j++) {
@@ -349,7 +349,7 @@
       BLOCKD *b = &xd->block[i];
       int b_mode = xd->mode_info_context->bmi[i].as_mode.first;
 #if CONFIG_NEWBINTRAMODES
-      xd->mode_info_context->bmi[i].as_mode.context = b->bmi.as_mode.context =
+      xd->mode_info_context->bmi[i].as_mode.context =
           vp9_find_bpred_context(xd, b);
       if (!xd->mode_info_context->mbmi.mb_skip_coeff)
         vp9_decode_coefs_4x4(pbi, xd, r, PLANE_TYPE_Y_WITH_DC, i);
@@ -388,8 +388,8 @@
 }
 
 static INLINE void decode_sby_32x32(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) - 1, bw = 1 << bwl;
-  const int bhl = mb_height_log2(bsize) - 1, bh = 1 << bhl;
+  const int bwl = b_width_log2(bsize) - 3, bw = 1 << bwl;
+  const int bhl = b_height_log2(bsize) - 3, bh = 1 << bhl;
   const int y_count = bw * bh;
   int n;
 
@@ -405,8 +405,8 @@
 }
 
 static INLINE void decode_sbuv_32x32(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) - 1, bw = (1 << bwl) / 2;
-  const int bhl = mb_height_log2(bsize) - 1, bh = (1 << bhl) / 2;
+  const int bwl = b_width_log2(bsize) - 3, bw = (1 << bwl) / 2;
+  const int bhl = b_height_log2(bsize) - 3, bh = (1 << bhl) / 2;
   const int uv_count = bw * bh;
   int n;
   for (n = 0; n < uv_count; n++) {
@@ -426,8 +426,8 @@
 }
 
 static INLINE void decode_sby_16x16(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bw = 1 << bwl;
-  const int bhl = mb_height_log2(bsize), bh = 1 << bhl;
+  const int bwl = b_width_log2(bsize) - 2, bw = 1 << bwl;
+  const int bhl = b_height_log2(bsize) - 2, bh = 1 << bhl;
   const int y_count = bw * bh;
   int n;
 
@@ -444,8 +444,8 @@
 }
 
 static INLINE void decode_sbuv_16x16(MACROBLOCKD *mb, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bw = (1 << bwl) / 2;
-  const int bhl = mb_height_log2(bsize), bh = (1 << bhl) / 2;
+  const int bwl = b_width_log2(bsize) - 2, bw = (1 << bwl) / 2;
+  const int bhl = b_height_log2(bsize) - 2, bh = (1 << bhl) / 2;
   const int uv_count = bw * bh;
   int n;
 
@@ -465,8 +465,8 @@
 }
 
 static INLINE void decode_sby_8x8(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize)  + 1, bw = 1 << bwl;
-  const int bhl = mb_height_log2(bsize) + 1, bh = 1 << bhl;
+  const int bwl = b_width_log2(bsize)  - 1, bw = 1 << bwl;
+  const int bhl = b_height_log2(bsize) - 1, bh = 1 << bhl;
   const int y_count = bw * bh;
   int n;
 
@@ -485,8 +485,8 @@
 }
 
 static INLINE void decode_sbuv_8x8(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize)  + 1, bw = 1 << (bwl - 1);
-  const int bhl = mb_height_log2(bsize) + 1, bh = 1 << (bhl - 1);
+  const int bwl = b_width_log2(bsize)  - 1, bw = 1 << (bwl - 1);
+  const int bhl = b_height_log2(bsize) - 1, bh = 1 << (bhl - 1);
   const int uv_count = bw * bh;
   int n;
 
@@ -505,8 +505,8 @@
 }
 
 static INLINE void decode_sby_4x4(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize)  + 2, bw = 1 << bwl;
-  const int bhl = mb_height_log2(bsize) + 2, bh = 1 << bhl;
+  const int bwl = b_width_log2(bsize), bw = 1 << bwl;
+  const int bhl = b_height_log2(bsize), bh = 1 << bhl;
   const int y_count = bw * bh;
   int n;
 
@@ -528,8 +528,8 @@
 }
 
 static INLINE void decode_sbuv_4x4(MACROBLOCKD *xd, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize)  + 2, bw = 1 << (bwl - 1);
-  const int bhl = mb_height_log2(bsize) + 2, bh = 1 << (bhl - 1);
+  const int bwl = b_width_log2(bsize), bw = 1 << (bwl - 1);
+  const int bhl = b_height_log2(bsize), bh = 1 << (bhl - 1);
   const int uv_count = bw * bh;
   int n;
 
@@ -1051,7 +1051,7 @@
   cm->MBs = cm->mb_rows * cm->mb_cols;
   cm->mode_info_stride = cm->mb_cols + 1;
   memset(cm->mip, 0,
-        (cm->mb_cols + 1) * (cm->mb_rows + 1) * sizeof(MODE_INFO));
+         cm->mode_info_stride * (cm->mb_rows + 1) * sizeof(MODE_INFO));
   vp9_update_mode_info_border(cm, cm->mip);
   vp9_update_mode_info_border(cm, cm->prev_mip);
 
diff --git a/vp9/decoder/vp9_detokenize.c b/vp9/decoder/vp9_detokenize.c
index 4e931a1..0a68265 100644
--- a/vp9/decoder/vp9_detokenize.c
+++ b/vp9/decoder/vp9_detokenize.c
@@ -175,7 +175,7 @@
     }
     case TX_8X8: {
       const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-      const int sz = 3 + mb_width_log2(sb_type);
+      const int sz = 1 + b_width_log2(sb_type);
       const int x = block_idx & ((1 << sz) - 1);
       const int y = block_idx - x;
       tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
@@ -194,7 +194,7 @@
     }
     case TX_16X16: {
       const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-      const int sz = 4 + mb_width_log2(sb_type);
+      const int sz = 2 + b_width_log2(sb_type);
       const int x = block_idx & ((1 << sz) - 1);
       const int y = block_idx - x;
       tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index dbadcfc..ca2579e 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -383,16 +383,7 @@
     ctx->txfm_rd_diff[ALLOW_32X32] = ctx->txfm_rd_diff[ALLOW_16X16];
   }
 
-  if (mb_mode == I4X4_PRED) {
-    for (i = 0; i < 16; i++) {
-      xd->block[i].bmi.as_mode = xd->mode_info_context->bmi[i].as_mode;
-      assert(xd->block[i].bmi.as_mode.first < B_MODE_COUNT);
-    }
-  } else if (mb_mode == I8X8_PRED) {
-    for (i = 0; i < 16; i++) {
-      xd->block[i].bmi = xd->mode_info_context->bmi[i];
-    }
-  } else if (mb_mode == SPLITMV) {
+  if (mb_mode == SPLITMV) {
     vpx_memcpy(x->partition_info, &ctx->partition_info,
                sizeof(PARTITION_INFO));
 
@@ -1828,15 +1819,15 @@
   if (m != I8X8_PRED)
     ++cpi->y_uv_mode_count[m][uvm];
   else {
-    cpi->i8x8_mode_count[xd->block[0].bmi.as_mode.first]++;
-    cpi->i8x8_mode_count[xd->block[2].bmi.as_mode.first]++;
-    cpi->i8x8_mode_count[xd->block[8].bmi.as_mode.first]++;
-    cpi->i8x8_mode_count[xd->block[10].bmi.as_mode.first]++;
+    cpi->i8x8_mode_count[xd->mode_info_context->bmi[0].as_mode.first]++;
+    cpi->i8x8_mode_count[xd->mode_info_context->bmi[2].as_mode.first]++;
+    cpi->i8x8_mode_count[xd->mode_info_context->bmi[8].as_mode.first]++;
+    cpi->i8x8_mode_count[xd->mode_info_context->bmi[10].as_mode.first]++;
   }
   if (m == I4X4_PRED) {
     int b = 0;
     do {
-      int m = xd->block[b].bmi.as_mode.first;
+      int m = xd->mode_info_context->bmi[b].as_mode.first;
 #if CONFIG_NEWBINTRAMODES
       if (m == B_CONTEXT_PRED) m -= CONTEXT_PRED_REPLACEMENTS;
 #endif
diff --git a/vp9/encoder/vp9_encodeintra.c b/vp9/encoder/vp9_encodeintra.c
index b50bc90..6c17e48 100644
--- a/vp9/encoder/vp9_encodeintra.c
+++ b/vp9/encoder/vp9_encodeintra.c
@@ -32,7 +32,7 @@
     int i;
 
     for (i = 0; i < 16; i++) {
-      x->e_mbd.block[i].bmi.as_mode.first = B_DC_PRED;
+      x->e_mbd.mode_info_context->bmi[i].as_mode.first = B_DC_PRED;
       encode_intra4x4block(x, i);
     }
   }
@@ -58,10 +58,12 @@
   assert(ib < 16);
 
 #if CONFIG_NEWBINTRAMODES
-  b->bmi.as_mode.context = vp9_find_bpred_context(&x->e_mbd, b);
+  xd->mode_info_context->bmi[ib].as_mode.context =
+    vp9_find_bpred_context(&x->e_mbd, b);
 #endif
 
-  vp9_intra4x4_predict(&x->e_mbd, b, b->bmi.as_mode.first,
+  vp9_intra4x4_predict(&x->e_mbd, b,
+                       xd->mode_info_context->bmi[ib].as_mode.first,
                        *(b->base_dst) + b->dst, b->dst_stride);
   vp9_subtract_block(4, 4, src_diff, 16,
                      src, x->plane[0].src.stride,
@@ -169,7 +171,7 @@
   int i;
   TX_TYPE tx_type;
 
-  vp9_intra8x8_predict(xd, b, b->bmi.as_mode.first,
+  vp9_intra8x8_predict(xd, b, xd->mode_info_context->bmi[ib].as_mode.first,
                        *(b->base_dst) + b->dst, b->dst_stride);
   // generate residual blocks
   vp9_subtract_block(8, 8, src_diff, 16,
@@ -287,8 +289,7 @@
   int i;
 
   for (i = 0; i < 4; i++) {
-    BLOCKD *b = &x->e_mbd.block[vp9_i8x8_block[i]];
-    int mode = b->bmi.as_mode.first;
+    int mode = x->e_mbd.mode_info_context->bmi[vp9_i8x8_block[i]].as_mode.first;
 
     encode_intra_uv4x4(x, i + 16, mode);  // u
     encode_intra_uv4x4(x, i + 20, mode);  // v
diff --git a/vp9/encoder/vp9_encodemb.c b/vp9/encoder/vp9_encodemb.c
index 823e92d..a11bb3e 100644
--- a/vp9/encoder/vp9_encodemb.c
+++ b/vp9/encoder/vp9_encodemb.c
@@ -68,8 +68,8 @@
 
 
 void vp9_transform_sby_32x32(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) - 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) - 1);
+  const int bwl = b_width_log2(bsize) - 3, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 3);
   const int stride = 32 << bwl;
   int n;
 
@@ -82,8 +82,8 @@
 }
 
 void vp9_transform_sby_16x16(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bw = 1 << bwl;
-  const int bh = 1 << mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 2);
   const int stride = 16 << bwl, bstride = 4 << bwl;
   MACROBLOCKD *const xd = &x->e_mbd;
   int n;
@@ -105,8 +105,8 @@
 }
 
 void vp9_transform_sby_8x8(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 1);
+  const int bwl = b_width_log2(bsize) - 1, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 1);
   const int stride = 8 << bwl, bstride = 2 << bwl;
   MACROBLOCKD *const xd = &x->e_mbd;
   int n;
@@ -126,8 +126,8 @@
 }
 
 void vp9_transform_sby_4x4(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 2);
+  const int bwl = b_width_log2(bsize), bw = 1 << bwl;
+  const int bh = 1 << b_height_log2(bsize);
   const int stride = 4 << bwl;
   MACROBLOCKD *const xd = &x->e_mbd;
   int n;
@@ -154,7 +154,7 @@
 }
 
 void vp9_transform_sbuv_16x16(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bhl = mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bhl = b_height_log2(bsize) - 2;
   const int bw = 1 << (bwl - 1), bh = 1 << (bhl - 1);
   const int stride = 16 << (bwl - 1);
   int n;
@@ -171,7 +171,7 @@
 }
 
 void vp9_transform_sbuv_8x8(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bhl = mb_height_log2(bsize) + 1;
+  const int bwl = b_width_log2(bsize) - 1, bhl = b_height_log2(bsize) - 1;
   const int bw = 1 << (bwl - 1), bh = 1 << (bhl - 1);
   const int stride = 8 << (bwl - 1);
   int n;
@@ -188,7 +188,7 @@
 }
 
 void vp9_transform_sbuv_4x4(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bhl = mb_height_log2(bsize) + 2;
+  const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
   const int bw = 1 << (bwl - 1), bh = 1 << (bhl - 1);
   const int stride = 4 << (bwl - 1);
   int n;
@@ -288,7 +288,7 @@
     }
     case TX_8X8: {
       const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-      const int sz = 3 + mb_width_log2(sb_type);
+      const int sz = 1 + b_width_log2(sb_type);
       const int x = ib & ((1 << sz) - 1), y = ib - x;
       const TX_TYPE tx_type = get_tx_type_8x8(xd, y + (x >> 1));
       scan = get_scan_8x8(tx_type);
@@ -297,7 +297,7 @@
     }
     case TX_16X16: {
       const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-      const int sz = 4 + mb_width_log2(sb_type);
+      const int sz = 2 + b_width_log2(sb_type);
       const int x = ib & ((1 << sz) - 1), y = ib - x;
       const TX_TYPE tx_type = get_tx_type_16x16(xd, y + (x >> 2));
       scan = get_scan_16x16(tx_type);
@@ -486,8 +486,8 @@
 
 void vp9_optimize_sby_32x32(VP9_COMMON *const cm, MACROBLOCK *x,
                             BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) - 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) - 1);
+  const int bwl = b_width_log2(bsize) - 3, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 3);
   ENTROPY_CONTEXT ta[2], tl[2];
   int n;
 
@@ -516,8 +516,8 @@
 
 void vp9_optimize_sby_16x16(VP9_COMMON *const cm, MACROBLOCK *x,
                             BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bw = 1 << bwl;
-  const int bh = 1 << mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 2);
   ENTROPY_CONTEXT ta[4], tl[4];
   int n;
 
@@ -539,8 +539,8 @@
 
 void vp9_optimize_sby_8x8(VP9_COMMON *const cm, MACROBLOCK *x,
                           BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bw = 1 << bwl;
-  const int bh = 2 << mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 1, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 1);
   ENTROPY_CONTEXT ta[8], tl[8];
   int n;
 
@@ -567,20 +567,17 @@
 
 void vp9_optimize_sby_4x4(VP9_COMMON *const cm, MACROBLOCK *x,
                           BLOCK_SIZE_TYPE bsize) {
-  int bwl = mb_width_log2(bsize), bw = 1 << bwl;
-  int bh = 1 << mb_height_log2(bsize);
+  int bwl = b_width_log2(bsize), bw = 1 << bwl;
+  int bh = 1 << b_height_log2(bsize);
   ENTROPY_CONTEXT ta[16], tl[16];
   int n;
 
-  for (n = 0; n < bw; n++)
-    vpx_memcpy(&ta[n * 4], x->e_mbd.above_context + n,
+  for (n = 0; n < bw; n += 4)
+    vpx_memcpy(&ta[n], x->e_mbd.above_context + (n >> 2),
                sizeof(ENTROPY_CONTEXT) * 4);
-  for (n = 0; n < bh; n++)
-    vpx_memcpy(&tl[n * 4], x->e_mbd.left_context + n,
+  for (n = 0; n < bh; n += 4)
+    vpx_memcpy(&tl[n], x->e_mbd.left_context + (n >> 2),
                sizeof(ENTROPY_CONTEXT) * 4);
-  bw *= 4;
-  bh *= 4;
-  bwl += 2;
 
   for (n = 0; n < bw * bh; n++) {
     const int x_idx = n & (bw - 1), y_idx = n >> bwl;
@@ -617,7 +614,7 @@
 
 void vp9_optimize_sbuv_16x16(VP9_COMMON *const cm, MACROBLOCK *x,
                              BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bhl = mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bhl = b_height_log2(bsize) - 2;
   const int bw = 1 << (bwl - 1);
   const int bh = 1 << (bhl - 1);
   int uvoff = 16 << (bwl + bhl);
@@ -651,7 +648,7 @@
 
 void vp9_optimize_sbuv_8x8(VP9_COMMON *const cm, MACROBLOCK *x,
                            BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bhl = mb_height_log2(bsize) + 1;
+  const int bwl = b_width_log2(bsize) - 1, bhl = b_height_log2(bsize) - 1;
   const int bw = 1 << (bwl - 1);
   const int bh = 1 << (bhl - 1);
   int uvoff = 4 << (bwl + bhl);
@@ -683,7 +680,7 @@
 
 void vp9_optimize_sbuv_4x4(VP9_COMMON *const cm, MACROBLOCK *x,
                            BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bhl = mb_height_log2(bsize) + 2;
+  const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
   const int bw = 1 << (bwl - 1);
   const int bh = 1 << (bhl - 1);
   int uvoff = 1 << (bwl + bhl);
diff --git a/vp9/encoder/vp9_mcomp.c b/vp9/encoder/vp9_mcomp.c
index 607e456..447a338 100644
--- a/vp9/encoder/vp9_mcomp.c
+++ b/vp9/encoder/vp9_mcomp.c
@@ -1574,7 +1574,7 @@
                           int sad_per_bit, int distance,
                           vp9_variance_fn_ptr_t *fn_ptr, int *mvjcost,
                           int *mvcost[2],
-                          int_mv *center_mv) {
+                          int_mv *center_mv, int n) {
   const MACROBLOCKD* const xd = &x->e_mbd;
   uint8_t *what = x->plane[0].src.buf;
   int what_stride = x->plane[0].src.stride;
@@ -1582,7 +1582,7 @@
   int in_what_stride = xd->plane[0].pre[0].stride;
   int mv_stride = xd->plane[0].pre[0].stride;
   uint8_t *bestaddress;
-  int_mv *best_mv = &d->bmi.as_mv[0];
+  int_mv *best_mv = &x->e_mbd.mode_info_context->bmi[n].as_mv[0];
   int_mv this_mv;
   int bestsad = INT_MAX;
   int r, c;
@@ -1669,7 +1669,7 @@
 int vp9_full_search_sadx3(MACROBLOCK *x, BLOCKD *d, int_mv *ref_mv,
                           int sad_per_bit, int distance,
                           vp9_variance_fn_ptr_t *fn_ptr, int *mvjcost,
-                          int *mvcost[2], int_mv *center_mv) {
+                          int *mvcost[2], int_mv *center_mv, int n) {
   const MACROBLOCKD* const xd = &x->e_mbd;
   uint8_t *what = x->plane[0].src.buf;
   int what_stride = x->plane[0].src.stride;
@@ -1677,7 +1677,7 @@
   int in_what_stride = xd->plane[0].pre[0].stride;
   int mv_stride = xd->plane[0].pre[0].stride;
   uint8_t *bestaddress;
-  int_mv *best_mv = &d->bmi.as_mv[0];
+  int_mv *best_mv = &x->e_mbd.mode_info_context->bmi[n].as_mv[0];
   int_mv this_mv;
   unsigned int bestsad = INT_MAX;
   int r, c;
@@ -1798,7 +1798,7 @@
                           int sad_per_bit, int distance,
                           vp9_variance_fn_ptr_t *fn_ptr,
                           int *mvjcost, int *mvcost[2],
-                          int_mv *center_mv) {
+                          int_mv *center_mv, int n) {
   const MACROBLOCKD* const xd = &x->e_mbd;
   uint8_t *what = x->plane[0].src.buf;
   int what_stride = x->plane[0].src.stride;
@@ -1806,7 +1806,7 @@
   int in_what_stride = xd->plane[0].pre[0].stride;
   int mv_stride = xd->plane[0].pre[0].stride;
   uint8_t *bestaddress;
-  int_mv *best_mv = &d->bmi.as_mv[0];
+  int_mv *best_mv = &x->e_mbd.mode_info_context->bmi[n].as_mv[0];
   int_mv this_mv;
   unsigned int bestsad = INT_MAX;
   int r, c;
diff --git a/vp9/encoder/vp9_mcomp.h b/vp9/encoder/vp9_mcomp.h
index 8125814..558663c 100644
--- a/vp9/encoder/vp9_mcomp.h
+++ b/vp9/encoder/vp9_mcomp.h
@@ -62,7 +62,7 @@
                                     int_mv *ref_mv, int sad_per_bit,
                                     int distance, vp9_variance_fn_ptr_t *fn_ptr,
                                     int *mvjcost, int *mvcost[2],
-                                    int_mv *center_mv);
+                                    int_mv *center_mv, int n);
 
 typedef int (*vp9_refining_search_fn_t)(MACROBLOCK *x, BLOCKD *d,
                                         int_mv *ref_mv, int sad_per_bit,
diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c
index 9d693a0..0b64fe1 100644
--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -304,16 +304,6 @@
 
 
 static void dealloc_compressor_data(VP9_COMP *cpi) {
-  // Delete last frame MV storage buffers
-  vpx_free(cpi->lfmv);
-  cpi->lfmv = 0;
-
-  vpx_free(cpi->lf_ref_frame_sign_bias);
-  cpi->lf_ref_frame_sign_bias = 0;
-
-  vpx_free(cpi->lf_ref_frame);
-  cpi->lf_ref_frame = 0;
-
   // Delete sementation map
   vpx_free(cpi->segmentation_map);
   cpi->segmentation_map = 0;
@@ -916,7 +906,7 @@
 static int alloc_partition_data(VP9_COMP *cpi) {
   vpx_free(cpi->mb.pip);
 
-  cpi->mb.pip = vpx_calloc((cpi->common.mb_cols + 1) *
+  cpi->mb.pip = vpx_calloc((cpi->common.mode_info_stride) *
                            (cpi->common.mb_rows + 1),
                            sizeof(PARTITION_INFO));
   if (!cpi->mb.pip)
@@ -1001,7 +991,7 @@
   cm->MBs = cm->mb_rows * cm->mb_cols;
   cm->mode_info_stride = cm->mb_cols + 1;
   memset(cm->mip, 0,
-        (cm->mb_cols + 1) * (cm->mb_rows + 1) * sizeof(MODE_INFO));
+        cm->mode_info_stride * (cm->mb_rows + 1) * sizeof(MODE_INFO));
   vp9_update_mode_info_border(cm, cm->mip);
 
   cm->mi = cm->mip + cm->mode_info_stride + 1;
@@ -1443,11 +1433,6 @@
   cpi->alt_is_last  = 0;
   cpi->gold_is_alt  = 0;
 
-  // allocate memory for storing last frame's MVs for MV prediction.
-  CHECK_MEM_ERROR(cpi->lfmv, vpx_calloc((cpi->common.mb_rows + 2) * (cpi->common.mb_cols + 2), sizeof(int_mv)));
-  CHECK_MEM_ERROR(cpi->lf_ref_frame_sign_bias, vpx_calloc((cpi->common.mb_rows + 2) * (cpi->common.mb_cols + 2), sizeof(int)));
-  CHECK_MEM_ERROR(cpi->lf_ref_frame, vpx_calloc((cpi->common.mb_rows + 2) * (cpi->common.mb_cols + 2), sizeof(int)));
-
   // Create the encoder segmentation map and set all entries to 0
   CHECK_MEM_ERROR(cpi->segmentation_map, vpx_calloc((cpi->common.mb_rows * cpi->common.mb_cols), 1));
 
@@ -3305,29 +3290,6 @@
                                        &cm->yv12_fb[cm->new_fb_idx]);
   }
 
-  // This frame's MVs are saved and will be used in next frame's MV
-  // prediction. Last frame has one more line(add to bottom) and one
-  // more column(add to right) than cm->mip. The edge elements are
-  // initialized to 0.
-  if (cm->show_frame) { // do not save for altref frame
-    int mb_row;
-    int mb_col;
-    MODE_INFO *tmp = cm->mip;
-
-    if (cm->frame_type != KEY_FRAME) {
-      for (mb_row = 0; mb_row < cm->mb_rows + 1; mb_row ++) {
-        for (mb_col = 0; mb_col < cm->mb_cols + 1; mb_col ++) {
-          if (tmp->mbmi.ref_frame != INTRA_FRAME)
-            cpi->lfmv[mb_col + mb_row * (cm->mode_info_stride + 1)].as_int = tmp->mbmi.mv[0].as_int;
-
-          cpi->lf_ref_frame_sign_bias[mb_col + mb_row * (cm->mode_info_stride + 1)] = cm->ref_frame_sign_bias[tmp->mbmi.ref_frame];
-          cpi->lf_ref_frame[mb_col + mb_row * (cm->mode_info_stride + 1)] = tmp->mbmi.ref_frame;
-          tmp++;
-        }
-      }
-    }
-  }
-
   if (cm->frame_type == KEY_FRAME)
     cpi->refresh_last_frame = 1;
 
@@ -3706,10 +3668,10 @@
 
   if (cm->show_frame) {
     vpx_memcpy(cm->prev_mip, cm->mip,
-               (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));
+               cm->mode_info_stride * (cm->mb_rows + 1) * sizeof(MODE_INFO));
   } else {
     vpx_memset(cm->prev_mip, 0,
-               (cm->mb_cols + 1) * (cm->mb_rows + 1)* sizeof(MODE_INFO));
+               cm->mode_info_stride * (cm->mb_rows + 1) * sizeof(MODE_INFO));
   }
 }
 
diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h
index a01c7d1..aeaf1bd 100644
--- a/vp9/encoder/vp9_onyx_int.h
+++ b/vp9/encoder/vp9_onyx_int.h
@@ -633,11 +633,6 @@
   int *mb_norm_activity_map;
   int output_partition;
 
-  // Store last frame's MV info for next frame MV prediction
-  int_mv *lfmv;
-  int *lf_ref_frame_sign_bias;
-  int *lf_ref_frame;
-
   /* force next frame to intra when kf_auto says so */
   int force_next_frame_intra;
 
diff --git a/vp9/encoder/vp9_quantize.c b/vp9/encoder/vp9_quantize.c
index 51ecd87..ece1318 100644
--- a/vp9/encoder/vp9_quantize.c
+++ b/vp9/encoder/vp9_quantize.c
@@ -158,8 +158,8 @@
 }
 
 void vp9_quantize_sby_32x32(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bw = 1 << (mb_width_log2(bsize) - 1);
-  const int bh = 1 << (mb_height_log2(bsize) - 1);
+  const int bw = 1 << (b_width_log2(bsize) - 3);
+  const int bh = 1 << (b_height_log2(bsize) - 3);
   int n;
 
   for (n = 0; n < bw * bh; n++)
@@ -167,8 +167,8 @@
 }
 
 void vp9_quantize_sby_16x16(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bw = 1 << bwl;
-  const int bh = 1 << mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 2);
   const int bstride = 16 << bwl;
   int n;
 
@@ -181,8 +181,8 @@
 }
 
 void vp9_quantize_sby_8x8(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 1);
+  const int bwl = b_width_log2(bsize) - 1, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 1);
   const int bstride = 4 << bwl;
   int n;
 
@@ -195,8 +195,8 @@
 }
 
 void vp9_quantize_sby_4x4(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 2);
+  const int bwl = b_width_log2(bsize), bw = 1 << bwl;
+  const int bh = 1 << b_height_log2(bsize);
   MACROBLOCKD *const xd = &x->e_mbd;
   int n;
 
@@ -213,8 +213,8 @@
 }
 
 void vp9_quantize_sbuv_16x16(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize);
-  const int bhl = mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2;
+  const int bhl = b_height_log2(bsize) - 2;
   const int uoff = 16 << (bhl + bwl);
   int i;
 
@@ -223,8 +223,8 @@
 }
 
 void vp9_quantize_sbuv_8x8(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize);
-  const int bhl = mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2;
+  const int bhl = b_height_log2(bsize) - 2;
   const int uoff = 16 << (bhl + bwl);
   int i;
 
@@ -233,8 +233,8 @@
 }
 
 void vp9_quantize_sbuv_4x4(MACROBLOCK *x, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize);
-  const int bhl = mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2;
+  const int bhl = b_height_log2(bsize) - 2;
   const int uoff = 16 << (bhl + bwl);
   int i;
 
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index f54a51a..7643e21 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -360,7 +360,7 @@
     }
     case TX_8X8: {
       const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-      const int sz = 3 + mb_width_log2(sb_type);
+      const int sz = 1 + b_width_log2(sb_type);
       const int x = ib & ((1 << sz) - 1), y = ib - x;
       TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
           get_tx_type_8x8(xd, y + (x >> 1)) : DCT_DCT;
@@ -376,7 +376,7 @@
     }
     case TX_16X16: {
       const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
-      const int sz = 4 + mb_width_log2(sb_type);
+      const int sz = 2 + b_width_log2(sb_type);
       const int x = ib & ((1 << sz) - 1), y = ib - x;
       TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
           get_tx_type_16x16(xd, y + (x >> 2)) : DCT_DCT;
@@ -666,8 +666,8 @@
 
 static int rdcost_sby_4x4(VP9_COMMON *const cm, MACROBLOCK *x,
                           BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 2);
+  const int bwl = b_width_log2(bsize), bw = 1 << bwl;
+  const int bh = 1 << b_height_log2(bsize);
   int cost = 0, b;
   MACROBLOCKD *const xd = &x->e_mbd;
   ENTROPY_CONTEXT_PLANES t_above[4], t_left[4];
@@ -691,7 +691,7 @@
 static void super_block_yrd_4x4(VP9_COMMON *const cm, MACROBLOCK *x,
                                 int *rate, int *distortion, int *skippable,
                                 BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bhl = mb_height_log2(bsize) + 2;
+  const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
   MACROBLOCKD *const xd = &x->e_mbd;
 
   xd->mode_info_context->mbmi.txfm_size = TX_4X4;
@@ -705,8 +705,8 @@
 
 static int rdcost_sby_8x8(VP9_COMMON *const cm, MACROBLOCK *x,
                           BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 1);
+  const int bwl = b_width_log2(bsize) - 1, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 1);
   int cost = 0, b;
   MACROBLOCKD *const xd = &x->e_mbd;
   ENTROPY_CONTEXT_PLANES t_above[4], t_left[4];
@@ -744,8 +744,8 @@
 
 static int rdcost_sby_16x16(VP9_COMMON *const cm, MACROBLOCK *x,
                             BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bw = 1 << bwl;
-  const int bh = 1 << mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 2);
   int cost = 0, b;
   MACROBLOCKD *const xd = &x->e_mbd;
   ENTROPY_CONTEXT_PLANES t_above[4], t_left[4];
@@ -781,8 +781,8 @@
 
 static int rdcost_sby_32x32(VP9_COMMON *const cm, MACROBLOCK *x,
                             BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) - 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) - 1);
+  const int bwl = b_width_log2(bsize) - 3, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 3);
   int cost = 0, b;
   MACROBLOCKD * const xd = &x->e_mbd;
   ENTROPY_CONTEXT_PLANES t_above[4], t_left[4];
@@ -875,7 +875,8 @@
 
   assert(ib < 16);
 #if CONFIG_NEWBINTRAMODES
-  b->bmi.as_mode.context = vp9_find_bpred_context(xd, b);
+  xd->mode_info_context->bmi[ib].as_mode.context =
+    vp9_find_bpred_context(xd, b);
 #endif
   xd->mode_info_context->mbmi.txfm_size = TX_4X4;
   for (mode = B_DC_PRED; mode < LEFT4X4; mode++) {
@@ -892,7 +893,7 @@
     }
 #endif
 
-    b->bmi.as_mode.first = mode;
+    xd->mode_info_context->bmi[ib].as_mode.first = mode;
 #if CONFIG_NEWBINTRAMODES
     rate = bmode_costs[
         mode == B_CONTEXT_PRED ? mode - CONTEXT_PRED_REPLACEMENTS : mode];
@@ -905,7 +906,7 @@
                        src, src_stride,
                        *(b->base_dst) + b->dst, b->dst_stride);
 
-    b->bmi.as_mode.first = mode;
+    xd->mode_info_context->bmi[ib].as_mode.first = mode;
     tx_type = get_tx_type_4x4(xd, ib);
     if (tx_type != DCT_DCT) {
       vp9_short_fht4x4(src_diff, coeff, 16, tx_type);
@@ -939,7 +940,8 @@
       vpx_memcpy(best_dqcoeff, BLOCK_OFFSET(xd->plane[0].dqcoeff, ib, 16), 32);
     }
   }
-  b->bmi.as_mode.first = (B_PREDICTION_MODE)(*best_mode);
+  xd->mode_info_context->bmi[ib].as_mode.first =
+    (B_PREDICTION_MODE)(*best_mode);
 
   // inverse transform
   if (best_tx_type != DCT_DCT)
@@ -1111,7 +1113,7 @@
 
     // FIXME rate for compound mode and second intrapred mode
     rate = mode_costs[mode];
-    b->bmi.as_mode.first = mode;
+    xd->mode_info_context->bmi[ib].as_mode.first = mode;
 
     vp9_intra8x8_predict(xd, b, mode, *(b->base_dst) + b->dst, b->dst_stride);
 
@@ -1208,7 +1210,7 @@
       *best_mode = mode;
     }
   }
-  b->bmi.as_mode.first = (*best_mode);
+  xd->mode_info_context->bmi[ib].as_mode.first = (*best_mode);
   vp9_encode_intra8x8(x, ib);
 
   if (xd->mode_info_context->mbmi.txfm_size == TX_8X8) {
@@ -1345,8 +1347,8 @@
 #define UVCTX(c, p) ((p) ? (c).v : (c).u)
 static int rd_cost_sbuv_4x4(VP9_COMMON *const cm, MACROBLOCK *x,
                             BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) + 1);
+  const int bwl = b_width_log2(bsize) - 1, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 1);
   int yoff = 4 * bw * bh;
   int p, b, cost = 0;
   MACROBLOCKD *const xd = &x->e_mbd;
@@ -1386,8 +1388,8 @@
 
 static int rd_cost_sbuv_8x8(VP9_COMMON *const cm, MACROBLOCK *x,
                             BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize), bw = 1 << bwl;
-  const int bh = 1 << mb_height_log2(bsize);
+  const int bwl = b_width_log2(bsize) - 2, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 2);
   int yoff = 16 * bw * bh;
   int p, b, cost = 0;
   MACROBLOCKD *const xd = &x->e_mbd;
@@ -1427,8 +1429,8 @@
 
 static int rd_cost_sbuv_16x16(VP9_COMMON *const cm, MACROBLOCK *x,
                               BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) - 1, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) - 1);
+  const int bwl = b_width_log2(bsize) - 3, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 3);
   int yoff = 64 * bw * bh;
   int p, b, cost = 0;
   MACROBLOCKD *const xd = &x->e_mbd;
@@ -1468,8 +1470,8 @@
 
 static int rd_cost_sbuv_32x32(VP9_COMMON *const cm, MACROBLOCK *x,
                               BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) - 2, bw = 1 << bwl;
-  const int bh = 1 << (mb_height_log2(bsize) - 2);
+  const int bwl = b_width_log2(bsize) - 4, bw = 1 << bwl;
+  const int bh = 1 << (b_height_log2(bsize) - 4);
   int yoff = 256 * bh * bw;
   int p, b, cost = 0;
   MACROBLOCKD *const xd = &x->e_mbd;
@@ -1607,7 +1609,6 @@
      Ones from this macroblock have to be pulled from the BLOCKD array
      as they have not yet made it to the bmi array in our MB_MODE_INFO. */
   for (i = 0; i < 16; ++i) {
-    BLOCKD *const d = xd->block + i;
     const int row = i >> 2,  col = i & 3;
 
     B_PREDICTION_MODE m;
@@ -1639,17 +1640,17 @@
           }
           break;
         case LEFT4X4:
-          this_mv->as_int = col ? d[-1].bmi.as_mv[0].as_int :
+          this_mv->as_int = col ? mic->bmi[i - 1].as_mv[0].as_int :
                                   left_block_mv(xd, mic, i);
           if (mbmi->second_ref_frame > 0)
-            this_second_mv->as_int = col ? d[-1].bmi.as_mv[1].as_int :
+            this_second_mv->as_int = col ? mic->bmi[i - 1].as_mv[1].as_int :
                                            left_block_second_mv(xd, mic, i);
           break;
         case ABOVE4X4:
-          this_mv->as_int = row ? d[-4].bmi.as_mv[0].as_int :
+          this_mv->as_int = row ? mic->bmi[i - 4].as_mv[0].as_int :
                                   above_block_mv(mic, i, mis);
           if (mbmi->second_ref_frame > 0)
-            this_second_mv->as_int = row ? d[-4].bmi.as_mv[1].as_int :
+            this_second_mv->as_int = row ? mic->bmi[i - 4].as_mv[1].as_int :
                                            above_block_second_mv(mic, i, mis);
           break;
         case ZERO4X4:
@@ -1665,10 +1666,10 @@
         int_mv left_mv, left_second_mv;
 
         left_second_mv.as_int = 0;
-        left_mv.as_int = col ? d[-1].bmi.as_mv[0].as_int :
+        left_mv.as_int = col ? mic->bmi[i - 1].as_mv[0].as_int :
                          left_block_mv(xd, mic, i);
         if (mbmi->second_ref_frame > 0)
-          left_second_mv.as_int = col ? d[-1].bmi.as_mv[1].as_int :
+          left_second_mv.as_int = col ? mic->bmi[i - 1].as_mv[1].as_int :
                                   left_block_second_mv(xd, mic, i);
 
         if (left_mv.as_int == this_mv->as_int &&
@@ -1685,9 +1686,9 @@
 #endif
     }
 
-    d->bmi.as_mv[0].as_int = this_mv->as_int;
+    mic->bmi[i].as_mv[0].as_int = this_mv->as_int;
     if (mbmi->second_ref_frame > 0)
-      d->bmi.as_mv[1].as_int = this_second_mv->as_int;
+      mic->bmi[i].as_mv[1].as_int = this_second_mv->as_int;
 
     x->partition_info->bmi[i].mode = m;
     x->partition_info->bmi[i].mv.as_int = this_mv->as_int;
@@ -1733,7 +1734,7 @@
                                 xd->plane[0].pre[0].stride,
                                 *(bd->base_dst) + bd->dst,
                                 bd->dst_stride,
-                                &bd->bmi.as_mv[0],
+                                &xd->mode_info_context->bmi[i].as_mv[0],
                                 &xd->scale_factor[0],
                                 4, 4, 0 /* no avg */, &xd->subpix);
 
@@ -1748,7 +1749,8 @@
         vp9_build_inter_predictor(
             second_pre, xd->plane[0].pre[1].stride,
             *(bd->base_dst) + bd->dst, bd->dst_stride,
-            &bd->bmi.as_mv[1], &xd->scale_factor[1], 4, 4, 1,
+            &xd->mode_info_context->bmi[i].as_mv[1],
+            &xd->scale_factor[1], 4, 4, 1,
             &xd->subpix);
       }
 
@@ -1825,7 +1827,8 @@
         vp9_build_inter_predictor(
             pre, xd->plane[0].pre[which_mv].stride,
             *(bd->base_dst) + bd->dst, bd->dst_stride,
-            &bd->bmi.as_mv[which_mv], &xd->scale_factor[which_mv], 8, 8,
+            &xd->mode_info_context->bmi[ib].as_mv[which_mv],
+            &xd->scale_factor[which_mv], 8, 8,
             which_mv, &xd->subpix);
       }
 
@@ -2060,9 +2063,11 @@
 
           // use previous block's result as next block's MV predictor.
           if (segmentation == PARTITIONING_4X4 && i > 0) {
-            bsi->mvp.as_int = x->e_mbd.block[i - 1].bmi.as_mv[0].as_int;
+            bsi->mvp.as_int =
+              x->e_mbd.mode_info_context->bmi[i - 1].as_mv[0].as_int;
             if (i == 4 || i == 8 || i == 12)
-              bsi->mvp.as_int = x->e_mbd.block[i - 4].bmi.as_mv[0].as_int;
+              bsi->mvp.as_int =
+                x->e_mbd.mode_info_context->bmi[i - 4].as_mv[0].as_int;
             step_param = 2;
           }
         }
@@ -2106,15 +2111,18 @@
             thissme = cpi->full_search_sad(x, e, &mvp_full,
                                            sadpb, 16, v_fn_ptr,
                                            x->nmvjointcost, x->mvcost,
-                                           bsi->ref_mv);
+                                           bsi->ref_mv,
+                                           n);
 
             if (thissme < bestsme) {
               bestsme = thissme;
-              mode_mv[NEW4X4].as_int = e->bmi.as_mv[0].as_int;
+              mode_mv[NEW4X4].as_int =
+                x->e_mbd.mode_info_context->bmi[n].as_mv[0].as_int;
             } else {
               /* The full search result is actually worse so re-instate the
                * previous best vector */
-              e->bmi.as_mv[0].as_int = mode_mv[NEW4X4].as_int;
+              x->e_mbd.mode_info_context->bmi[n].as_mv[0].as_int =
+                mode_mv[NEW4X4].as_int;
             }
           }
         }
@@ -2459,11 +2467,10 @@
 
   /* set it to the best */
   for (i = 0; i < 16; i++) {
-    BLOCKD *bd = &x->e_mbd.block[i];
-
-    bd->bmi.as_mv[0].as_int = bsi.mvs[i].as_int;
+    x->e_mbd.mode_info_context->bmi[i].as_mv[0].as_int = bsi.mvs[i].as_int;
     if (mbmi->second_ref_frame > 0)
-      bd->bmi.as_mv[1].as_int = bsi.second_mvs[i].as_int;
+      x->e_mbd.mode_info_context->bmi[i].as_mv[1].as_int =
+        bsi.second_mvs[i].as_int;
     x->e_mbd.plane[0].eobs[i] = bsi.eobs[i];
   }
 
@@ -2554,10 +2561,6 @@
     // printf("%d,%d,%d,%d\n",
     //       modes[0], modes[1], modes[2], modes[3]);
   }
-
-  for (i = 0; i < 16; i++) {
-    xd->block[i].bmi = xd->mode_info_context->bmi[i];
-  }
 }
 
 extern void vp9_calc_ref_probs(int *count, vp9_prob *probs);
@@ -2966,8 +2969,8 @@
                                        x->nmvjointcost, x->mvcost,
                                        &dis, &sse);
         }
-        d->bmi.as_mv[0].as_int = tmp_mv.as_int;
-        frame_mv[NEWMV][refs[0]].as_int = d->bmi.as_mv[0].as_int;
+        frame_mv[NEWMV][refs[0]].as_int =
+          xd->mode_info_context->bmi[0].as_mv[0].as_int = tmp_mv.as_int;
 
         // Add the new motion vector cost to our rolling cost variable
         *rate2 += vp9_mv_bit_cost(&tmp_mv, &ref_mv[0],
@@ -3036,7 +3039,7 @@
                  (mbmi->mv[1].as_mv.col & 15) == 0;
   // Search for best switchable filter by checking the variance of
   // pred error irrespective of whether the filter will be used
-  if (bsize != BLOCK_SIZE_MB16X16) {
+  if (1) {
     int switchable_filter_index, newbest;
     int tmp_rate_y_i = 0, tmp_rate_u_i = 0, tmp_rate_v_i = 0;
     int tmp_dist_y_i = 0, tmp_dist_u_i = 0, tmp_dist_v_i = 0;
@@ -3128,88 +3131,6 @@
       interpolating_intpel_seen |=
         intpel_mv && vp9_is_interpolating_filter[mbmi->interp_filter];
     }
-  } else {
-    int switchable_filter_index, newbest;
-    int tmp_rate_y_i = 0, tmp_rate_u_i = 0, tmp_rate_v_i = 0;
-    int tmp_dist_y_i = 0, tmp_dist_u_i = 0, tmp_dist_v_i = 0;
-    for (switchable_filter_index = 0;
-       switchable_filter_index < VP9_SWITCHABLE_FILTERS;
-       ++switchable_filter_index) {
-      int rs = 0;
-      mbmi->interp_filter = vp9_switchable_interp[switchable_filter_index];
-      vp9_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common);
-      if (cpi->common.mcomp_filter_type == SWITCHABLE) {
-        const int c = vp9_get_pred_context(cm, xd, PRED_SWITCHABLE_INTERP);
-        const int m = vp9_switchable_interp_map[mbmi->interp_filter];
-        rs = SWITCHABLE_INTERP_RATE_FACTOR * x->switchable_interp_costs[c][m];
-      }
-      if (interpolating_intpel_seen && intpel_mv &&
-          vp9_is_interpolating_filter[mbmi->interp_filter]) {
-        rd = RDCOST(x->rdmult, x->rddiv,
-                    rs + tmp_rate_y_i + tmp_rate_u_i + tmp_rate_v_i,
-                    tmp_dist_y_i + tmp_dist_u_i + tmp_dist_v_i);
-      } else {
-        unsigned int sse, var;
-        int tmp_rate_y, tmp_rate_u, tmp_rate_v;
-        int tmp_dist_y, tmp_dist_u, tmp_dist_v;
-        vp9_build_inter_predictors_sb(xd, mb_row, mb_col, BLOCK_SIZE_MB16X16);
-        var = vp9_variance16x16(x->plane[0].src.buf, x->plane[0].src.stride,
-                                xd->plane[0].dst.buf, xd->plane[0].dst.stride,
-                                &sse);
-        // Note our transform coeffs are 8 times an orthogonal transform.
-        // Hence quantizer step is also 8 times. To get effective quantizer
-        // we need to divide by 8 before sending to modeling function.
-        model_rd_from_var_lapndz(var, 16 * 16, xd->plane[0].dequant[1] >> 3,
-                                 &tmp_rate_y, &tmp_dist_y);
-        var = vp9_variance8x8(x->plane[1].src.buf, x->plane[1].src.stride,
-                              xd->plane[1].dst.buf, xd->plane[1].dst.stride,
-                              &sse);
-        model_rd_from_var_lapndz(var, 8 * 8, xd->plane[1].dequant[1] >> 3,
-                                 &tmp_rate_u, &tmp_dist_u);
-        var = vp9_variance8x8(x->plane[2].src.buf, x->plane[1].src.stride,
-                              xd->plane[2].dst.buf, xd->plane[1].dst.stride,
-                              &sse);
-        model_rd_from_var_lapndz(var, 8 * 8, xd->plane[2].dequant[1] >> 3,
-                                 &tmp_rate_v, &tmp_dist_v);
-        rd = RDCOST(x->rdmult, x->rddiv,
-                    rs + tmp_rate_y + tmp_rate_u + tmp_rate_v,
-                    tmp_dist_y + tmp_dist_u + tmp_dist_v);
-        if (!interpolating_intpel_seen && intpel_mv &&
-            vp9_is_interpolating_filter[mbmi->interp_filter]) {
-          tmp_rate_y_i = tmp_rate_y;
-          tmp_rate_u_i = tmp_rate_u;
-          tmp_rate_v_i = tmp_rate_v;
-          tmp_dist_y_i = tmp_dist_y;
-          tmp_dist_u_i = tmp_dist_u;
-          tmp_dist_v_i = tmp_dist_v;
-        }
-      }
-      newbest = (switchable_filter_index == 0 || rd < best_rd);
-      if (newbest) {
-        best_rd = rd;
-        *best_filter = mbmi->interp_filter;
-      }
-      if ((cm->mcomp_filter_type == SWITCHABLE && newbest) ||
-          (cm->mcomp_filter_type != SWITCHABLE &&
-           cm->mcomp_filter_type == mbmi->interp_filter)) {
-        int i;
-        for (i = 0; i < 16 * bh; ++i)
-          vpx_memcpy(tmp_ybuf + i * 16 * bw,
-                     xd->plane[0].dst.buf + i * xd->plane[0].dst.stride,
-                     sizeof(unsigned char) * 16 * bw);
-        for (i = 0; i < 8 * bh; ++i)
-          vpx_memcpy(tmp_ubuf + i * 8 * bw,
-                     xd->plane[1].dst.buf + i * xd->plane[1].dst.stride,
-                     sizeof(unsigned char) * 8 * bw);
-        for (i = 0; i < 8 * bh; ++i)
-          vpx_memcpy(tmp_vbuf + i * 8 * bw,
-                     xd->plane[2].dst.buf + i * xd->plane[1].dst.stride,
-                     sizeof(unsigned char) * 8 * bw);
-        pred_exists = 1;
-      }
-      interpolating_intpel_seen |=
-        intpel_mv && vp9_is_interpolating_filter[mbmi->interp_filter];
-    }
   }
 
   // Set the appripriate filter
@@ -3758,7 +3679,7 @@
           vpx_memcpy(&tmp_best_partition, x->partition_info,
                      sizeof(PARTITION_INFO));
           for (i = 0; i < 16; i++) {
-            tmp_best_bmodes[i] = xd->block[i].bmi;
+            tmp_best_bmodes[i] = xd->mode_info_context->bmi[i];
           }
           pred_exists = 1;
         }
@@ -3793,7 +3714,7 @@
         vpx_memcpy(x->partition_info, &tmp_best_partition,
                    sizeof(PARTITION_INFO));
         for (i = 0; i < 16; i++) {
-          xd->block[i].bmi = xd->mode_info_context->bmi[i] = tmp_best_bmodes[i];
+          xd->mode_info_context->bmi[i] = tmp_best_bmodes[i];
         }
       }
 
@@ -4002,7 +3923,7 @@
             || (this_mode == I8X8_PRED)
             || (this_mode == SPLITMV))
           for (i = 0; i < 16; i++) {
-            best_bmodes[i] = xd->block[i].bmi;
+            best_bmodes[i] = xd->mode_info_context->bmi[i];
           }
       }
 
@@ -4131,7 +4052,6 @@
   if (best_mbmode.mode == I4X4_PRED) {
     for (i = 0; i < 16; i++) {
       xd->mode_info_context->bmi[i].as_mode = best_bmodes[i].as_mode;
-      xd->block[i].bmi.as_mode = xd->mode_info_context->bmi[i].as_mode;
     }
   }
 
diff --git a/vp9/encoder/vp9_temporal_filter.c b/vp9/encoder/vp9_temporal_filter.c
index 1774d9b..ef868fc 100644
--- a/vp9/encoder/vp9_temporal_filter.c
+++ b/vp9/encoder/vp9_temporal_filter.c
@@ -132,6 +132,7 @@
   BLOCKD *d = &x->e_mbd.block[0];
   int_mv best_ref_mv1;
   int_mv best_ref_mv1_full; /* full-pixel value of best_ref_mv1 */
+  int_mv *ref_mv;
 
   // Save input state
   struct buf_2d src = x->plane[0].src;
@@ -158,7 +159,8 @@
   /*cpi->sf.search_method == HEX*/
   // TODO Check that the 16x16 vf & sdf are selected here
   // Ignore mv costing by sending NULL pointer instead of cost arrays
-  bestsme = vp9_hex_search(x, d, &best_ref_mv1_full, &d->bmi.as_mv[0],
+  ref_mv = &x->e_mbd.mode_info_context->bmi[0].as_mv[0];
+  bestsme = vp9_hex_search(x, d, &best_ref_mv1_full, ref_mv,
                            step_param, sadpb, &cpi->fn_ptr[BLOCK_16X16],
                            NULL, NULL, NULL, NULL,
                            &best_ref_mv1);
@@ -170,7 +172,7 @@
     int distortion;
     unsigned int sse;
     // Ignore mv costing by sending NULL pointer instead of cost array
-    bestsme = cpi->find_fractional_mv_step(x, d, &d->bmi.as_mv[0],
+    bestsme = cpi->find_fractional_mv_step(x, d, ref_mv,
                                            &best_ref_mv1,
                                            x->errorperbit,
                                            &cpi->fn_ptr[BLOCK_16X16],
@@ -246,8 +248,8 @@
         if (cpi->frames[frame] == NULL)
           continue;
 
-        mbd->block[0].bmi.as_mv[0].as_mv.row = 0;
-        mbd->block[0].bmi.as_mv[0].as_mv.col = 0;
+        mbd->mode_info_context->bmi[0].as_mv[0].as_mv.row = 0;
+        mbd->mode_info_context->bmi[0].as_mv[0].as_mv.col = 0;
 
         if (frame == alt_ref_index) {
           filter_weight = 2;
@@ -280,8 +282,8 @@
            cpi->frames[frame]->u_buffer + mb_uv_offset,
            cpi->frames[frame]->v_buffer + mb_uv_offset,
            cpi->frames[frame]->y_stride,
-           mbd->block[0].bmi.as_mv[0].as_mv.row,
-           mbd->block[0].bmi.as_mv[0].as_mv.col,
+           mbd->mode_info_context->bmi[0].as_mv[0].as_mv.row,
+           mbd->mode_info_context->bmi[0].as_mv[0].as_mv.col,
            predictor);
 
           // Apply the filter (YUV)
diff --git a/vp9/encoder/vp9_tokenize.c b/vp9/encoder/vp9_tokenize.c
index 0edf126..67e1390 100644
--- a/vp9/encoder/vp9_tokenize.c
+++ b/vp9/encoder/vp9_tokenize.c
@@ -210,7 +210,7 @@
       break;
     }
     case TX_8X8: {
-      const int sz = 3 + mb_width_log2(sb_type);
+      const int sz = 1 + b_width_log2(sb_type);
       const int x = ib & ((1 << sz) - 1), y = ib - x;
       tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
           get_tx_type_8x8(xd, y + (x >> 1)) : DCT_DCT;
@@ -227,7 +227,7 @@
       break;
     }
     case TX_16X16: {
-      const int sz = 4 + mb_width_log2(sb_type);
+      const int sz = 2 + b_width_log2(sb_type);
       const int x = ib & ((1 << sz) - 1), y = ib - x;
       tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
           get_tx_type_16x16(xd, y + (x >> 2)) : DCT_DCT;
@@ -468,7 +468,7 @@
                      MACROBLOCKD *xd,
                      TOKENEXTRA **t,
                      int dry_run, BLOCK_SIZE_TYPE bsize) {
-  const int bwl = mb_width_log2(bsize) + 2, bhl = mb_height_log2(bsize) + 2;
+  const int bwl = b_width_log2(bsize), bhl = b_height_log2(bsize);
   VP9_COMMON * const cm = &cpi->common;
   MB_MODE_INFO * const mbmi = &xd->mode_info_context->mbmi;
   TOKENEXTRA *t_backup = *t;