shithub: libvpx

Download patch

ref: 3b8d00449c4c226dd820ba8314fb7a9b81d64a2c
parent: 79ec9a26d1840229284d0cb61e733ff656950fd6
parent: 0d78687583e767c709e4deea1abeab081226b3b8
author: Jingning Han <jingning@google.com>
date: Wed Mar 26 05:28:55 EDT 2014

Merge "Apply early termination in non-RD partition search"

--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -2615,7 +2615,8 @@
 }
 
 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];
@@ -2622,6 +2623,9 @@
 
   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 @@
     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 @@
       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,9 +2906,11 @@
     }
   }
 
-  (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,