]> granicus.if.org Git - libvpx/commitdiff
Run sub-pixel motion search for NEWMV mode test
authorJingning Han <jingning@google.com>
Wed, 26 Feb 2014 17:52:23 +0000 (09:52 -0800)
committerJingning Han <jingning@google.com>
Wed, 26 Feb 2014 19:17:51 +0000 (11:17 -0800)
As Yunqing suggested, this commit makes non-RD mode decision always run
sub-pixel motion search in NEWMV mode. The compression performance
gains becomes fairly significant after we enabled sub-pixel accuracy
motion compensated prediction to calculate SAD cost.

For test sequences pedestrian_area at 1080p and vidyo1 at 720p, the
runtime goes slower by 5%. For rtc test set, the compression performance
is improved by 21.20%.

Change-Id: I38cbfdd5c53d79423e1fafb3154f8ddeed63bbf0

vp9/encoder/vp9_pickmode.c

index 0d0dc0cc74cfcc2e3ebfe1c95199d1c0f4dc575d..82d5c92310d3531cd3508b42cb9582005cdbcf65 100644 (file)
@@ -249,22 +249,26 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
       int64_t dist;
 
       if (this_mode == NEWMV) {
+        if (this_rd < 500)
+          continue;
+
         x->mode_sad[ref_frame][INTER_OFFSET(NEWMV)] =
             full_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col,
                                      &frame_mv[NEWMV][ref_frame], &rate_mv);
 
         if (frame_mv[NEWMV][ref_frame].as_int == INVALID_MV)
           continue;
+
+        sub_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col,
+                                &frame_mv[NEWMV][ref_frame]);
       }
 
       mbmi->mode = this_mode;
       mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int;
-
       vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
 
       dist = cpi->fn_ptr[bsize].sdf(p->src.buf, p->src.stride,
                                     pd->dst.buf, pd->dst.stride, INT_MAX);
-
       this_rd = rate + dist;
 
       if (this_rd < best_rd) {
@@ -303,14 +307,5 @@ int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
     }
   }
 
-  // Perform sub-pixel motion search, if NEWMV is chosen
-  if (mbmi->mode == NEWMV) {
-    ref_frame = mbmi->ref_frame[0];
-    sub_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col,
-                            &frame_mv[NEWMV][ref_frame]);
-    mbmi->mv[0].as_int = frame_mv[NEWMV][ref_frame].as_int;
-    xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int;
-  }
-
   return INT64_MAX;
 }