]> granicus.if.org Git - libvpx/commitdiff
Account for zero-forcing operation in selective ref mv mode
authorJingning Han <jingning@google.com>
Fri, 15 Jan 2016 19:33:40 +0000 (11:33 -0800)
committerJingning Han <jingning@google.com>
Wed, 3 Feb 2016 17:26:35 +0000 (09:26 -0800)
It makes the encoder accounts for the block zero-forcing operation
when optimizing the mode decisions.

Change-Id: I2c8e243756080b446b8a53a9679f75c4c47148cf

vp10/encoder/rdopt.c

index eb0a1bc2e65a0905ce93b342e71d84b7f869847f..32031ec92719a5e7420874a9c4712b6f6a564f13 100644 (file)
@@ -6285,7 +6285,7 @@ void vp10_rd_pick_inter_mode_sb(VP10_COMP *cpi,
         int_mv cur_mv = mbmi_ext->ref_mv_stack[ref_frame][2].this_mv;
         MB_MODE_INFO backup_mbmi = *mbmi;
 
-        int64_t tmp_alt_rd = INT64_MAX;
+        int64_t tmp_alt_rd = INT64_MAX, tmp_ref_rd = this_rd;
         int tmp_rate = 0, tmp_rate_y = 0, tmp_rate_uv = 0;
         int tmp_skip = 1;
         int64_t tmp_dist = 0, tmp_sse = 0;
@@ -6325,9 +6325,33 @@ void vp10_rd_pick_inter_mode_sb(VP10_COMP *cpi,
                                          dummy_filter_cache);
         }
 
-        if (RDCOST(x->rdmult, x->rddiv, rate2, distortion2) >
-            RDCOST(x->rdmult, x->rddiv, tmp_rate, tmp_dist) &&
-            tmp_alt_rd != INT64_MAX) {
+        if (this_rd < INT64_MAX) {
+          if (RDCOST(x->rdmult, x->rddiv, rate_y + rate_uv, distortion2) <
+              RDCOST(x->rdmult, x->rddiv, 0, total_sse))
+            tmp_ref_rd = RDCOST(x->rdmult, x->rddiv,
+                rate2 + vp10_cost_bit(vp10_get_skip_prob(cm, xd), 0),
+                distortion2);
+          else
+            tmp_ref_rd = RDCOST(x->rdmult, x->rddiv,
+                rate2 + vp10_cost_bit(vp10_get_skip_prob(cm, xd), 1) -
+                rate_y - rate_uv,
+                total_sse);
+        }
+
+        if (tmp_alt_rd < INT64_MAX) {
+          if (RDCOST(x->rdmult, x->rddiv, tmp_rate_y + tmp_rate_uv, tmp_dist) <
+              RDCOST(x->rdmult, x->rddiv, 0, tmp_sse))
+            tmp_alt_rd = RDCOST(x->rdmult, x->rddiv,
+                tmp_rate + vp10_cost_bit(vp10_get_skip_prob(cm, xd), 0),
+                tmp_dist);
+          else
+            tmp_alt_rd = RDCOST(x->rdmult, x->rddiv,
+                tmp_rate + vp10_cost_bit(vp10_get_skip_prob(cm, xd), 1) -
+                tmp_rate_y - tmp_rate_uv,
+                tmp_sse);
+        }
+
+        if (tmp_ref_rd > tmp_alt_rd) {
           rate2 = tmp_rate;
           distortion2 = tmp_dist;
           skippable = tmp_skip;
@@ -6344,7 +6368,7 @@ void vp10_rd_pick_inter_mode_sb(VP10_COMP *cpi,
 
         frame_mv[NEARMV][ref_frame] = backup_mv;
 
-        rate2 += 256;
+        rate2 += vp10_cost_bit(128, mbmi->ref_mv_idx);
       }
 #endif