diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index 39ca5efc4e06ad72bc6ddbcd6f040ff8dc5a37a0..fe7d99614cf502927aa69272d562842551d23f7d 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -570,8 +570,11 @@ static void pick_sb_modes(VP9_COMP *cpi, int mi_row, int mi_col,
   if (bsize < BLOCK_8X8) {
     // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0
     // there is nothing to be done.
-    if (xd->ab_index != 0)
+    if (xd->ab_index != 0) {
+      *totalrate = 0;
+      *totaldist = 0;
       return;
+    }
   }
 
   set_offsets(cpi, mi_row, mi_col, bsize);
@@ -1518,8 +1521,9 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row,
   TOKENEXTRA *tp_orig = *tp;
   int i, pl;
   BLOCK_SIZE_TYPE subsize;
-  int srate = INT_MAX;
-  int64_t sdist = INT_MAX;
+  int this_rate, sum_rate = 0, best_rate = INT_MAX;
+  int64_t this_dist, sum_dist = 0, best_dist = INT_MAX;
+  int64_t sum_rd = 0;
 
   (void) *tp_orig;
 
@@ -1540,42 +1544,38 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row,
   if (!cpi->sf.auto_min_max_partition_size ||
       bsize >= cpi->sf.min_partition_size) {
     if (bsize > BLOCK_8X8) {
-      int r4 = 0;
-      int64_t d4 = 0, sum_rd = 0;
       subsize = get_subsize(bsize, PARTITION_SPLIT);
 
       for (i = 0; i < 4 && sum_rd < best_rd; ++i) {
         int x_idx = (i & 1) * (ms >> 1);
         int y_idx = (i >> 1) * (ms >> 1);
-        int r = 0;
-        int64_t d = 0;
 
         if ((mi_row + y_idx >= cm->mi_rows) || (mi_col + x_idx >= cm->mi_cols))
           continue;
 
         *(get_sb_index(xd, subsize)) = i;
-        rd_pick_partition(cpi, tp, mi_row + y_idx, mi_col + x_idx, subsize, &r,
-                          &d, i != 3, best_rd - sum_rd);
+        rd_pick_partition(cpi, tp, mi_row + y_idx, mi_col + x_idx, subsize,
+                          &this_rate, &this_dist, i != 3, best_rd - sum_rd);
 
-        if (r == INT_MAX) {
-          r4 = INT_MAX;
+        if (this_rate == INT_MAX) {
           sum_rd = INT64_MAX;
         } else {
-          r4 += r;
-          d4 += d;
-          sum_rd = RDCOST(x->rdmult, x->rddiv, r4, d4);
+          sum_rate += this_rate;
+          sum_dist += this_dist;
+          sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
         }
       }
-      set_partition_seg_context(cm, xd, mi_row, mi_col);
-      pl = partition_plane_context(xd, bsize);
-      if (r4 != INT_MAX && i == 4) {
-        r4 += x->partition_cost[pl][PARTITION_SPLIT];
-        *(get_sb_partitioning(x, bsize)) = subsize;
-        assert(r4 >= 0);
-        assert(d4 >= 0);
-        srate = r4;
-        sdist = d4;
-        best_rd = MIN(best_rd, RDCOST(x->rdmult, x->rddiv, r4, d4));
+      if (sum_rd < best_rd && i == 4) {
+        set_partition_seg_context(cm, xd, mi_row, mi_col);
+        pl = partition_plane_context(xd, bsize);
+        sum_rate += x->partition_cost[pl][PARTITION_SPLIT];
+        sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
+        if (sum_rd < best_rd) {
+          best_rate = sum_rate;
+          best_dist = sum_dist;
+          best_rd = sum_rd;
+          *(get_sb_partitioning(x, bsize)) = subsize;
+        }
       }
       restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
     }
@@ -1685,169 +1685,162 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp, int mi_row,
   if (!cpi->sf.auto_min_max_partition_size ||
       bsize <= cpi->sf.max_partition_size) {
     int larger_is_better = 0;
+
     // PARTITION_NONE
     if ((mi_row + (ms >> 1) < cm->mi_rows) &&
         (mi_col + (ms >> 1) < cm->mi_cols)) {
-      int r;
-      int64_t d;
-      pick_sb_modes(cpi, mi_row, mi_col, &r, &d, bsize,
+      pick_sb_modes(cpi, mi_row, mi_col, &this_rate, &this_dist, bsize,
                     get_block_context(x, bsize), best_rd);
-      if (r != INT_MAX && bsize >= BLOCK_8X8) {
-        set_partition_seg_context(cm, xd, mi_row, mi_col);
-        pl = partition_plane_context(xd, bsize);
-        r += x->partition_cost[pl][PARTITION_NONE];
-      }
-
-      if (r != INT_MAX &&
-          (bsize == BLOCK_8X8 ||
-           RDCOST(x->rdmult, x->rddiv, r, d) <
-               RDCOST(x->rdmult, x->rddiv, srate, sdist))) {
-        best_rd = MIN(best_rd, RDCOST(x->rdmult, x->rddiv, r, d));
-        srate = r;
-        sdist = d;
-        larger_is_better = 1;
-        if (bsize >= BLOCK_8X8)
-          *(get_sb_partitioning(x, bsize)) = bsize;
+      if (this_rate != INT_MAX) {
+        if (bsize >= BLOCK_8X8) {
+          set_partition_seg_context(cm, xd, mi_row, mi_col);
+          pl = partition_plane_context(xd, bsize);
+          this_rate += x->partition_cost[pl][PARTITION_NONE];
+        }
+        sum_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_dist);
+        if (sum_rd < best_rd || bsize == BLOCK_8X8) {
+          best_rate = this_rate;
+          best_dist = this_dist;
+          best_rd = sum_rd;
+          larger_is_better = 1;
+          if (bsize >= BLOCK_8X8)
+            *(get_sb_partitioning(x, bsize)) = bsize;
+        }
       }
     }
 
     if (bsize == BLOCK_8X8) {
-      int r4 = 0;
-      int64_t d4 = 0, sum_rd = 0;
+      sum_rate = 0; sum_dist = 0; sum_rd = 0;
+
       subsize = get_subsize(bsize, PARTITION_SPLIT);
 
       for (i = 0; i < 4 && sum_rd < best_rd; ++i) {
         int x_idx = (i & 1) * (ms >> 1);
         int y_idx = (i >> 1) * (ms >> 1);
-        int r = 0;
-        int64_t d = 0;
 
         if ((mi_row + y_idx >= cm->mi_rows) || (mi_col + x_idx >= cm->mi_cols))
           continue;
 
         *(get_sb_index(xd, subsize)) = i;
-        rd_pick_partition(cpi, tp, mi_row + y_idx, mi_col + x_idx, subsize, &r,
-                          &d, i != 3, best_rd - sum_rd);
+        rd_pick_partition(cpi, tp, mi_row + y_idx, mi_col + x_idx, subsize,
+                          &this_rate, &this_dist, i != 3, best_rd - sum_rd);
 
-        if (r == INT_MAX) {
-          r4 = INT_MAX;
+        if (this_rate == INT_MAX) {
           sum_rd = INT64_MAX;
         } else {
-          r4 += r;
-          d4 += d;
-          sum_rd = RDCOST(x->rdmult, x->rddiv, r4, d4);
+          sum_rate += this_rate;
+          sum_dist += this_dist;
+          sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
         }
       }
-      set_partition_seg_context(cm, xd, mi_row, mi_col);
-      pl = partition_plane_context(xd, bsize);
-      if (r4 != INT_MAX && i == 4) {
-        r4 += x->partition_cost[pl][PARTITION_SPLIT];
-        if (RDCOST(x->rdmult, x->rddiv, r4, d4) <
-            RDCOST(x->rdmult, x->rddiv, srate, sdist)) {
-          srate = r4;
-          sdist = d4;
+      if (sum_rd < best_rd && i == 4) {
+        set_partition_seg_context(cm, xd, mi_row, mi_col);
+        pl = partition_plane_context(xd, bsize);
+        sum_rate += x->partition_cost[pl][PARTITION_SPLIT];
+        sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
+        if (sum_rd < best_rd) {
+          best_rate = sum_rate;
+          best_dist = sum_dist;
+          best_rd = sum_rd;
           larger_is_better = 0;
           *(get_sb_partitioning(x, bsize)) = subsize;
-          best_rd = MIN(best_rd, RDCOST(x->rdmult, x->rddiv, r4, d4));
         }
       }
       restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
     }
 
     if (!cpi->sf.use_square_partition_only &&
-        (!cpi->sf.less_rectangular_check ||!larger_is_better)) {
+        (!cpi->sf.less_rectangular_check || !larger_is_better)) {
       // PARTITION_HORZ
       if (bsize >= BLOCK_8X8 && mi_col + (ms >> 1) < cm->mi_cols) {
-        int r2, r = 0;
-        int64_t d2, d = 0, h_rd;
         subsize = get_subsize(bsize, PARTITION_HORZ);
         *(get_sb_index(xd, subsize)) = 0;
-        pick_sb_modes(cpi, mi_row, mi_col, &r2, &d2, subsize,
+        pick_sb_modes(cpi, mi_row, mi_col, &sum_rate, &sum_dist, subsize,
                       get_block_context(x, subsize), best_rd);
-        h_rd = RDCOST(x->rdmult, x->rddiv, r2, d2);
+        sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
 
-        if (r2 != INT_MAX && h_rd < best_rd &&
-            mi_row + (ms >> 1) < cm->mi_rows) {
+        if (sum_rd < best_rd && mi_row + (ms >> 1) < cm->mi_rows) {
           update_state(cpi, get_block_context(x, subsize), subsize, 0);
           encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize);
 
           *(get_sb_index(xd, subsize)) = 1;
-          pick_sb_modes(cpi, mi_row + (ms >> 1), mi_col, &r, &d, subsize,
-                        get_block_context(x, subsize), best_rd - h_rd);
-          if (r == INT_MAX) {
-            r2 = INT_MAX;
+          pick_sb_modes(cpi, mi_row + (ms >> 1), mi_col, &this_rate,
+                        &this_dist, subsize, get_block_context(x, subsize),
+                        best_rd - sum_rd);
+          if (this_rate == INT_MAX) {
+            sum_rd = INT64_MAX;
           } else {
-            r2 += r;
-            d2 += d;
+            sum_rate += this_rate;
+            sum_dist += this_dist;
+            sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
           }
         }
-        set_partition_seg_context(cm, xd, mi_row, mi_col);
-        pl = partition_plane_context(xd, bsize);
-        if (r2 < INT_MAX)
-          r2 += x->partition_cost[pl][PARTITION_HORZ];
-        if (r2 != INT_MAX && RDCOST(x->rdmult, x->rddiv, r2, d2)
-            < RDCOST(x->rdmult, x->rddiv, srate, sdist)) {
-          best_rd = MIN(best_rd, RDCOST(x->rdmult, x->rddiv, r2, d2));
-          srate = r2;
-          sdist = d2;
-          *(get_sb_partitioning(x, bsize)) = subsize;
+        if (sum_rd < best_rd) {
+          set_partition_seg_context(cm, xd, mi_row, mi_col);
+          pl = partition_plane_context(xd, bsize);
+          sum_rate += x->partition_cost[pl][PARTITION_HORZ];
+          sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
+          if (sum_rd < best_rd) {
+            best_rd = sum_rd;
+            best_rate = sum_rate;
+            best_dist = sum_dist;
+            *(get_sb_partitioning(x, bsize)) = subsize;
+          }
         }
         restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
       }
 
       // PARTITION_VERT
       if (bsize >= BLOCK_8X8 && mi_row + (ms >> 1) < cm->mi_rows) {
-        int r2;
-        int64_t d2, v_rd;
         subsize = get_subsize(bsize, PARTITION_VERT);
         *(get_sb_index(xd, subsize)) = 0;
-        pick_sb_modes(cpi, mi_row, mi_col, &r2, &d2, subsize,
+        pick_sb_modes(cpi, mi_row, mi_col, &sum_rate, &sum_dist, subsize,
                       get_block_context(x, subsize), best_rd);
-        v_rd = RDCOST(x->rdmult, x->rddiv, r2, d2);
-        if (r2 != INT_MAX && v_rd < best_rd &&
-            mi_col + (ms >> 1) < cm->mi_cols) {
-          int r = 0;
-          int64_t d = 0;
+        sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
+        if (sum_rd < best_rd && mi_col + (ms >> 1) < cm->mi_cols) {
           update_state(cpi, get_block_context(x, subsize), subsize, 0);
           encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize);
 
           *(get_sb_index(xd, subsize)) = 1;
-          pick_sb_modes(cpi, mi_row, mi_col + (ms >> 1), &r, &d, subsize,
-                        get_block_context(x, subsize), best_rd - v_rd);
-          if (r == INT_MAX) {
-            r2 = INT_MAX;
+          pick_sb_modes(cpi, mi_row, mi_col + (ms >> 1), &this_rate, &this_dist,
+                        subsize, get_block_context(x, subsize),
+                        best_rd - sum_rd);
+          if (this_rate == INT_MAX) {
+            sum_rd = INT64_MAX;
           } else {
-            r2 += r;
-            d2 += d;
+            sum_rate += this_rate;
+            sum_dist += this_dist;
+            sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
           }
         }
-        set_partition_seg_context(cm, xd, mi_row, mi_col);
-        pl = partition_plane_context(xd, bsize);
-        if (r2 < INT_MAX)
-          r2 += x->partition_cost[pl][PARTITION_VERT];
-        if (r2 != INT_MAX &&
-            RDCOST(x->rdmult, x->rddiv, r2, d2)
-            < RDCOST(x->rdmult, x->rddiv, srate, sdist)) {
-          srate = r2;
-          sdist = d2;
-          *(get_sb_partitioning(x, bsize)) = subsize;
+        if (sum_rd < best_rd) {
+          set_partition_seg_context(cm, xd, mi_row, mi_col);
+          pl = partition_plane_context(xd, bsize);
+          sum_rate += x->partition_cost[pl][PARTITION_VERT];
+          sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
+          if (sum_rd < best_rd) {
+            best_rate = sum_rate;
+            best_dist = sum_dist;
+            best_rd = sum_rd;
+            *(get_sb_partitioning(x, bsize)) = subsize;
+          }
         }
         restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
       }
     }
   }
-  *rate = srate;
-  *dist = sdist;
+  *rate = best_rate;
+  *dist = best_dist;
 
   restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
 
-  if (srate < INT_MAX && sdist < INT_MAX && do_recon)
+  if (best_rate < INT_MAX && best_dist < INT_MAX && do_recon)
     encode_sb(cpi, tp, mi_row, mi_col, bsize == BLOCK_64X64, bsize);
 
   if (bsize == BLOCK_64X64) {
     assert(tp_orig < *tp);
-    assert(srate < INT_MAX);
-    assert(sdist < INT_MAX);
+    assert(best_rate < INT_MAX);
+    assert(best_dist < INT_MAX);
   } else {
     assert(tp_orig == *tp);
   }