From e1d63c010e66190c926bcc1e9e718d04fcb316a5 Mon Sep 17 00:00:00 2001
From: Jingning Han <jingning@google.com>
Date: Fri, 7 Jun 2013 23:33:33 -0700
Subject: [PATCH] Fix the rd loop over partition types

This commit enables boundary blocks properly tested over allowable
partition types.

Change-Id: I405a9a46ddcfa0c7af2b63e3644cabfa3b6a951d
---
 vp9/encoder/vp9_encodeframe.c | 18 +++++-------------
 1 file changed, 5 insertions(+), 13 deletions(-)

diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index d46a08faf4..435562bfa7 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1264,7 +1264,7 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp,
       int y_idx = (i >> 1) * (ms >> 1);
       int r = 0, d = 0;
 
-      if ((mi_row + y_idx >= cm->mi_rows) || (mi_col + x_idx >= cm->mi_cols))
+      if ((mi_row >= cm->mi_rows) || (mi_col >= cm->mi_cols))
         continue;
 
       *(get_sb_index(xd, subsize)) = i;
@@ -1288,7 +1288,6 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp,
   // PARTITION_HORZ
     if ((bsize >= BLOCK_SIZE_SB8X8) && (mi_col + ms <= cm->mi_cols)) {
     int r2, d2;
-    int mb_skip = 0;
     subsize = get_subsize(bsize, PARTITION_HORZ);
     *(get_sb_index(xd, subsize)) = 0;
     pick_sb_modes(cpi, mi_row, mi_col, tp, &r2, &d2, subsize,
@@ -1303,16 +1302,13 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp,
                     get_block_context(x, subsize));
       r2 += r;
       d2 += d;
-    } else {
-      if (mi_row + (ms >> 1) != cm->mi_rows)
-        mb_skip = 1;
     }
     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 ((RDCOST(x->rdmult, x->rddiv, r2, d2) <
-         RDCOST(x->rdmult, x->rddiv, srate, sdist)) && !mb_skip) {
+    if (RDCOST(x->rdmult, x->rddiv, r2, d2) <
+        RDCOST(x->rdmult, x->rddiv, srate, sdist)) {
       srate = r2;
       sdist = d2;
       *(get_sb_partitioning(x, bsize)) = subsize;
@@ -1323,7 +1319,6 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp,
   // PARTITION_VERT
   if ((bsize >= BLOCK_SIZE_SB8X8) && (mi_row + ms <= cm->mi_rows)) {
     int r2, d2;
-    int mb_skip = 0;
     subsize = get_subsize(bsize, PARTITION_VERT);
     *(get_sb_index(xd, subsize)) = 0;
     pick_sb_modes(cpi, mi_row, mi_col, tp, &r2, &d2, subsize,
@@ -1337,16 +1332,13 @@ static void rd_pick_partition(VP9_COMP *cpi, TOKENEXTRA **tp,
                     get_block_context(x, subsize));
       r2 += r;
       d2 += d;
-    } else {
-      if (mi_col + (ms >> 1) != cm->mi_cols)
-        mb_skip = 1;
     }
     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 ((RDCOST(x->rdmult, x->rddiv, r2, d2) <
-         RDCOST(x->rdmult, x->rddiv, srate, sdist)) && !mb_skip) {
+    if (RDCOST(x->rdmult, x->rddiv, r2, d2) <
+        RDCOST(x->rdmult, x->rddiv, srate, sdist)) {
       srate = r2;
       sdist = d2;
       *(get_sb_partitioning(x, bsize)) = subsize;
-- 
GitLab