]> granicus.if.org Git - libvpx/commitdiff
Elevate NEWMV mode checking threshold in real time
authorYunqing Wang <yunqingwang@google.com>
Tue, 1 Jul 2014 19:18:27 +0000 (12:18 -0700)
committerYunqing Wang <yunqingwang@google.com>
Tue, 1 Jul 2014 21:50:39 +0000 (14:50 -0700)
The current threshold is knid of low, and in many cases NEWMV
mode is checked but not picked as the best mode. This patch
added a speed feature to increase NEWMV threshold, so that
less partition mode checking goes to check NEWMV. This feature
is enabled for speed 6 and 7.

Rtc set borg tests showed:
1. Speed 6, overall psnr: -0.088%, ssim: -1.339%;
   Average speedup on rtc set is 11.1%.
2. Speed 7, overall psnr: -0.505%, ssim: -2.320%
   Average speedup on rtc set is 12.9%.

Change-Id: I953b849eeb6e0d5a1f13eacba30c14204472c5be

vp9/encoder/vp9_rdopt.c
vp9/encoder/vp9_speed_features.c
vp9/encoder/vp9_speed_features.h

index 0107dcdbcb2bf29bfd07a0b5cd6ea3fc2846ea2b..e1a03a62fad2926537b4e5a6cc60991f696052b2 100644 (file)
@@ -4273,6 +4273,7 @@ int64_t vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi, MACROBLOCK *x,
 void vp9_set_rd_speed_thresholds(VP9_COMP *cpi) {
   int i;
   RD_OPT *const rd = &cpi->rd;
+  SPEED_FEATURES *const sf = &cpi->sf;
 
   // Set baseline threshold values
   for (i = 0; i < MAX_MODES; ++i)
@@ -4350,6 +4351,10 @@ void vp9_set_rd_speed_thresholds(VP9_COMP *cpi) {
     rd->thresh_mult[THR_COMP_NEARGA   ] = INT_MAX;
     rd->thresh_mult[THR_COMP_NEWGA    ] = INT_MAX;
   }
+
+  // Adjust threshold only in real time mode, which only use last reference
+  // frame.
+  rd->thresh_mult[THR_NEWMV] += sf->elevate_newmv_thresh;
 }
 
 void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
index 88a750276c0c8f3723cb84f5592c409525d23249..811187057aae5998f756d52238e70df61d451d71 100644 (file)
@@ -277,11 +277,15 @@ static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf,
 
     // This feature is only enabled when partition search is disabled.
     sf->reuse_inter_pred_sby = 1;
+
+    // Increase mode checking threshold for NEWMV.
+    sf->elevate_newmv_thresh = 2000;
   }
   if (speed >= 7) {
     sf->lpf_pick = LPF_PICK_MINIMAL_LPF;
     sf->encode_breakout_thresh = (MIN(cm->width, cm->height) >= 720) ?
         800 : 300;
+    sf->elevate_newmv_thresh = 2500;
   }
   if (speed >= 8) {
     int i;
@@ -352,6 +356,7 @@ void vp9_set_speed_features(VP9_COMP *cpi) {
   sf->always_this_block_size = BLOCK_16X16;
   sf->search_type_check_frequency = 50;
   sf->encode_breakout_thresh = 0;
+  sf->elevate_newmv_thresh = 0;
 
   // Recode loop tolerence %.
   sf->recode_tolerance = 25;
index e14eb404c8704b619927b16b23ccf0da3c7ace31..f6d631184f64233139989e14ba5d2e0b841bcf57 100644 (file)
@@ -361,6 +361,9 @@ typedef struct SPEED_FEATURES {
   // This variable sets the encode_breakout threshold. Currently, it is only
   // enabled in real time mode.
   int encode_breakout_thresh;
+
+  // In real time encoding, increase the threshold for NEWMV.
+  int elevate_newmv_thresh;
 } SPEED_FEATURES;
 
 struct VP9_COMP;