diff --git a/vp9/common/vp9_alloccommon.c b/vp9/common/vp9_alloccommon.c
index f44ada1b9c1449df6d5e81141e216bd6bc140b2c..e56a0b7a8c9021b6a3166224232f800515a68ecd 100644
--- a/vp9/common/vp9_alloccommon.c
+++ b/vp9/common/vp9_alloccommon.c
@@ -53,32 +53,41 @@ static void setup_mi(VP9_COMMON *cm) {
 }
 
 static int alloc_mi(VP9_COMMON *cm, int mi_size) {
-  cm->mip = (MODE_INFO *)vpx_calloc(mi_size, sizeof(*cm->mip));
-  if (cm->mip == NULL)
-    return 1;
+  int i;
+
+  for (i = 0; i < 2; ++i) {
+    cm->mip_array[i] =
+        (MODE_INFO *)vpx_calloc(mi_size, sizeof(*cm->mip));
+    if (cm->mip_array[i] == NULL)
+      return 1;
 
-  cm->prev_mip = (MODE_INFO *)vpx_calloc(mi_size, sizeof(*cm->prev_mip));
-  if (cm->prev_mip == NULL)
-    return 1;
+    cm->mi_grid_base_array[i] =
+        (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
+    if (cm->mi_grid_base_array[i] == NULL)
+      return 1;
+  }
 
-  cm->mi_grid_base =
-      (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
-  if (cm->mi_grid_base == NULL)
-    return 1;
+  // Init the index.
+  cm->mi_idx = 0;
+  cm->prev_mi_idx = 1;
 
-  cm->prev_mi_grid_base =
-      (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base));
-  if (cm->prev_mi_grid_base == NULL)
-    return 1;
+  cm->mip = cm->mip_array[cm->mi_idx];
+  cm->prev_mip = cm->mip_array[cm->prev_mi_idx];
+  cm->mi_grid_base = cm->mi_grid_base_array[cm->mi_idx];
+  cm->prev_mi_grid_base = cm->mi_grid_base_array[cm->prev_mi_idx];
 
   return 0;
 }
 
 static void free_mi(VP9_COMMON *cm) {
-  vpx_free(cm->mip);
-  vpx_free(cm->prev_mip);
-  vpx_free(cm->mi_grid_base);
-  vpx_free(cm->prev_mi_grid_base);
+  int i;
+
+  for (i = 0; i < 2; ++i) {
+    vpx_free(cm->mip_array[i]);
+    cm->mip_array[i] = NULL;
+    vpx_free(cm->mi_grid_base_array[i]);
+    cm->mi_grid_base_array[i] = NULL;
+  }
 
   cm->mip = NULL;
   cm->prev_mip = NULL;
@@ -237,13 +246,16 @@ void vp9_update_frame_size(VP9_COMMON *cm) {
 }
 
 void vp9_swap_mi_and_prev_mi(VP9_COMMON *cm) {
+  // Swap indices.
+  const int tmp = cm->mi_idx;
+  cm->mi_idx = cm->prev_mi_idx;
+  cm->prev_mi_idx = tmp;
+
   // Current mip will be the prev_mip for the next frame.
-  MODE_INFO *temp = cm->prev_mip;
-  MODE_INFO **temp2 = cm->prev_mi_grid_base;
-  cm->prev_mip = cm->mip;
-  cm->mip = temp;
-  cm->prev_mi_grid_base = cm->mi_grid_base;
-  cm->mi_grid_base = temp2;
+  cm->mip = cm->mip_array[cm->mi_idx];
+  cm->prev_mip = cm->mip_array[cm->prev_mi_idx];
+  cm->mi_grid_base = cm->mi_grid_base_array[cm->mi_idx];
+  cm->prev_mi_grid_base = cm->mi_grid_base_array[cm->prev_mi_idx];
 
   // Update the upper left visible macroblock ptrs.
   cm->mi = cm->mip + cm->mi_stride + 1;
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h
index 20de434148e1aecaf1881b81f28ee74941c20c83..e1753a11b9c2c454322fe47430fd26046824ae0a 100644
--- a/vp9/common/vp9_onyxc_int.h
+++ b/vp9/common/vp9_onyxc_int.h
@@ -142,6 +142,11 @@ typedef struct VP9Common {
   /* We allocate a MODE_INFO struct for each macroblock, together with
      an extra row on top and column on the left to simplify prediction. */
 
+  int mi_idx;
+  int prev_mi_idx;
+  MODE_INFO *mip_array[2];
+  MODE_INFO **mi_grid_base_array[2];
+
   MODE_INFO *mip; /* Base of allocated array */
   MODE_INFO *mi;  /* Corresponds to upper left visible macroblock */
   MODE_INFO *prev_mip; /* MODE_INFO array 'mip' from last decoded frame */