summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_encodeframe.c
diff options
context:
space:
mode:
authorJingning Han <jingning@google.com>2014-03-26 09:28:55 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2014-03-26 09:28:55 -0700
commit3b8d00449c4c226dd820ba8314fb7a9b81d64a2c (patch)
treeb031240c596def0f6bec01299214fe5de4ef0009 /vp9/encoder/vp9_encodeframe.c
parent79ec9a26d1840229284d0cb61e733ff656950fd6 (diff)
parent0d78687583e767c709e4deea1abeab081226b3b8 (diff)
downloadlibvpx-3b8d00449c4c226dd820ba8314fb7a9b81d64a2c.tar
libvpx-3b8d00449c4c226dd820ba8314fb7a9b81d64a2c.tar.gz
libvpx-3b8d00449c4c226dd820ba8314fb7a9b81d64a2c.tar.bz2
libvpx-3b8d00449c4c226dd820ba8314fb7a9b81d64a2c.zip
Merge "Apply early termination in non-RD partition search"
Diffstat (limited to 'vp9/encoder/vp9_encodeframe.c')
-rw-r--r--vp9/encoder/vp9_encodeframe.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index c8b94e922..d93261d5c 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -2615,13 +2615,17 @@ static void nonrd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
}
static void fill_mode_info_sb(VP9_COMMON *cm, MACROBLOCK *x,
- int mi_row, int mi_col, int bsize, int subsize) {
+ int mi_row, int mi_col,
+ BLOCK_SIZE bsize, BLOCK_SIZE subsize) {
MACROBLOCKD *xd = &x->e_mbd;
int bsl = b_width_log2(bsize), hbs = (1 << bsl) / 4;
PARTITION_TYPE partition = partition_lookup[bsl][subsize];
assert(bsize >= BLOCK_8X8);
+ if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols)
+ return;
+
switch (partition) {
case PARTITION_NONE:
set_modeinfo_offsets(cm, xd, mi_row, mi_col);
@@ -2784,7 +2788,7 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
int pl = partition_plane_context(xd, mi_row, mi_col, bsize);
sum_rate += x->partition_cost[pl][PARTITION_SPLIT];
subsize = get_subsize(bsize, PARTITION_SPLIT);
- for (i = 0; i < 4; ++i) {
+ for (i = 0; i < 4 && sum_rd < best_rd; ++i) {
const int x_idx = (i & 1) * ms;
const int y_idx = (i >> 1) * ms;
@@ -2795,7 +2799,8 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
load_pred_mv(x, ctx);
nonrd_pick_partition(cpi, tile, tp, mi_row + y_idx, mi_col + x_idx,
- subsize, &this_rate, &this_dist, 0, INT64_MAX);
+ subsize, &this_rate, &this_dist, 0,
+ best_rd - sum_rd);
if (this_rate == INT_MAX) {
sum_rd = INT64_MAX;
@@ -2901,10 +2906,12 @@ static void nonrd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
}
}
- (void) best_rd;
*rate = best_rate;
*dist = best_dist;
+ if (best_rate == INT_MAX)
+ return;
+
// update mode info array
fill_mode_info_sb(cm, x, mi_row, mi_col, bsize,
*(get_sb_partitioning(x, bsize)));