shithub: libvpx

Download patch

ref: 056111c8228b7e3de6085a0897059d240b84eda1
parent: 0b1eba25b2574f25a5a125098e2620e40b878350
parent: 161c99565809a44db2ebad9a87be2b03c2670c2c
author: Ronald S. Bultje <rbultje@google.com>
date: Wed Jul 17 12:10:51 EDT 2013

Merge "Skip redundant nearest/near/zero encodes in splitmv."

--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -1861,6 +1861,30 @@
         const struct buf_2d orig_src = x->plane[0].src;
         struct buf_2d orig_pre[2];
 
+        // if we're near/nearest and mv == 0,0, compare to zeromv
+        if ((this_mode == NEARMV || this_mode == NEARESTMV ||
+             this_mode == ZEROMV) &&
+            frame_mv[this_mode][mbmi->ref_frame[0]].as_int == 0 &&
+            (mbmi->ref_frame[1] <= 0 ||
+             frame_mv[this_mode][mbmi->ref_frame[1]].as_int == 0)) {
+          int rfc = mbmi->mb_mode_context[mbmi->ref_frame[0]];
+          int c1 = cost_mv_ref(cpi, NEARMV, rfc);
+          int c2 = cost_mv_ref(cpi, NEARESTMV, rfc);
+          int c3 = cost_mv_ref(cpi, ZEROMV, rfc);
+
+          if (this_mode == NEARMV) {
+            if (c1 >= c2 || c1 > c3)
+              continue;
+          } else if (this_mode == NEARESTMV) {
+            if (c2 > c1 || c2 > c3)
+              continue;
+          } else {
+            assert(this_mode == ZEROMV);
+            if (c3 >= c2 || c3 >= c1)
+              continue;
+          }
+        }
+
         vpx_memcpy(orig_pre, x->e_mbd.plane[0].pre, sizeof(orig_pre));
 
         vpx_memcpy(t_above_s, t_above, sizeof(t_above_s));