shithub: libvpx

Download patch

ref: 13772781807ebff8b5c7d100e90d0eac6c61cbd4
parent: 993942ce0c2a3323e2652580cca5a50558537ea6
author: Paul Wilkins <paulwilkins@google.com>
date: Thu Jun 27 09:16:33 EDT 2013

New motion threshold factor - speed feature.

Added a speed feature that focuses only on thresholds
for new motion modes.

Moved sf->comp_inter_joint_search_thresh into speed
1.  This has ~+0.4% impact on quality at speed 0 as
our quality reference baseline.

Slight adjustment to baseline thresholds.

Change-Id: I7ebf104f1fe29af77ed4837b2e84be065621bbe5

--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -536,7 +536,9 @@
 
 static void set_rd_speed_thresholds(VP9_COMP *cpi, int mode, int speed) {
   SPEED_FEATURES *sf = &cpi->sf;
-  int speed_multiplier = speed + 1;
+  int speed_multiplier = (cpi->sf.adjust_thresholds_by_speed) ? speed + 1 : 1;
+  int new_motion_multiplier = speed_multiplier *
+                              (sf->new_motion_thresh_factor + 1);
   int i;
 
   // Set baseline threshold values
@@ -555,27 +557,21 @@
   sf->thresh_mult[THR_NEARG    ] += speed_multiplier * 1000;
   sf->thresh_mult[THR_NEARA    ] += speed_multiplier * 1000;
 
-  sf->thresh_mult[THR_DC       ] = 0;
+  sf->thresh_mult[THR_DC       ] += speed_multiplier * 1000;
   sf->thresh_mult[THR_TM       ] += speed_multiplier * 1000;
-  sf->thresh_mult[THR_V_PRED   ] += speed_multiplier * 1000;
-  sf->thresh_mult[THR_H_PRED   ] += speed_multiplier * 1000;
-  sf->thresh_mult[THR_D45_PRED ] += speed_multiplier * 1500;
-  sf->thresh_mult[THR_D135_PRED] += speed_multiplier * 1500;
-  sf->thresh_mult[THR_D117_PRED] += speed_multiplier * 1500;
-  sf->thresh_mult[THR_D153_PRED] += speed_multiplier * 1500;
-  sf->thresh_mult[THR_D27_PRED ] += speed_multiplier * 1500;
-  sf->thresh_mult[THR_D63_PRED ] += speed_multiplier * 1500;
+  sf->thresh_mult[THR_V_PRED   ] += speed_multiplier * 1500;
+  sf->thresh_mult[THR_H_PRED   ] += speed_multiplier * 1500;
+  sf->thresh_mult[THR_D45_PRED ] += speed_multiplier * 2000;
+  sf->thresh_mult[THR_D135_PRED] += speed_multiplier * 2000;
+  sf->thresh_mult[THR_D117_PRED] += speed_multiplier * 2000;
+  sf->thresh_mult[THR_D153_PRED] += speed_multiplier * 2000;
+  sf->thresh_mult[THR_D27_PRED ] += speed_multiplier * 2000;
+  sf->thresh_mult[THR_D63_PRED ] += speed_multiplier * 2000;
 
-  sf->thresh_mult[THR_B_PRED   ] += speed_multiplier * 2500;
+  sf->thresh_mult[THR_NEWMV    ] += new_motion_multiplier * 1000;
+  sf->thresh_mult[THR_NEWG     ] += new_motion_multiplier * 1000;
+  sf->thresh_mult[THR_NEWA     ] += new_motion_multiplier * 1000;
 
-  sf->thresh_mult[THR_NEWMV    ] += speed_multiplier * 1000;
-  sf->thresh_mult[THR_NEWG     ] += speed_multiplier * 1000;
-  sf->thresh_mult[THR_NEWA     ] += speed_multiplier * 1000;
-
-  sf->thresh_mult[THR_SPLITMV  ] += speed_multiplier * 2500;
-  sf->thresh_mult[THR_SPLITG   ] += speed_multiplier * 2500;
-  sf->thresh_mult[THR_SPLITA   ] += speed_multiplier * 2500;
-
   sf->thresh_mult[THR_COMP_ZEROLA   ] += speed_multiplier * 1500;
   sf->thresh_mult[THR_COMP_ZEROGA   ] += speed_multiplier * 1500;
 
@@ -585,12 +581,17 @@
   sf->thresh_mult[THR_COMP_NEARLA   ] += speed_multiplier * 1500;
   sf->thresh_mult[THR_COMP_NEARGA   ] += speed_multiplier * 1500;
 
-  sf->thresh_mult[THR_COMP_NEWLA    ] += speed_multiplier * 2000;
-  sf->thresh_mult[THR_COMP_NEWGA    ] += speed_multiplier * 2000;
+  sf->thresh_mult[THR_COMP_NEWLA    ] += new_motion_multiplier * 2000;
+  sf->thresh_mult[THR_COMP_NEWGA    ] += new_motion_multiplier * 2000;
 
-  sf->thresh_mult[THR_COMP_SPLITLA  ] += speed_multiplier * 4500;
-  sf->thresh_mult[THR_COMP_SPLITGA  ] += speed_multiplier * 4500;
+  sf->thresh_mult[THR_B_PRED   ] += speed_multiplier * 2500;
 
+  sf->thresh_mult[THR_SPLITMV  ] += new_motion_multiplier * 2500;
+  sf->thresh_mult[THR_SPLITG   ] += new_motion_multiplier * 2500;
+  sf->thresh_mult[THR_SPLITA   ] += new_motion_multiplier * 2500;
+  sf->thresh_mult[THR_COMP_SPLITLA  ] += new_motion_multiplier * 4500;
+  sf->thresh_mult[THR_COMP_SPLITGA  ] += new_motion_multiplier * 4500;
+
   if (cpi->sf.skip_lots_of_modes) {
     for (i = 0; i < MAX_MODES; ++i)
       sf->thresh_mult[i] = INT_MAX;
@@ -690,12 +691,13 @@
   sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
   sf->comp_inter_joint_search_thresh = BLOCK_SIZE_AB4X4;
   sf->adpative_rd_thresh = 0;
+  sf->adjust_thresholds_by_speed = 0;
+  sf->new_motion_thresh_factor = 0;
   sf->use_lastframe_partitioning = 0;
   sf->use_largest_txform = 0;
   sf->use_8tap_always = 0;
   sf->use_avoid_tested_higherror = 0;
   sf->skip_lots_of_modes = 0;
-  sf->adjust_thresholds_by_speed = 0;
   sf->partition_by_variance = 0;
   sf->use_one_partition_size_always = 0;
   sf->less_rectangular_check = 0;
@@ -723,13 +725,12 @@
 #else
       sf->static_segmentation = 0;
 #endif
-      sf->comp_inter_joint_search_thresh = BLOCK_SIZE_MB16X16;
-      sf->auto_mv_step_size = 1;
       sf->use_avoid_tested_higherror = 1;
+      sf->auto_mv_step_size = 1;
       sf->adpative_rd_thresh = 1;
-
       if (speed == 1) {
         sf->comp_inter_joint_search_thresh = BLOCK_SIZE_TYPES;
+        sf->new_motion_thresh_factor = 1;
         sf->less_rectangular_check  = 1;
         sf->use_largest_txform        = !(cpi->common.frame_type == KEY_FRAME ||
                                           cpi->common.intra_only ||
@@ -775,10 +776,7 @@
   }; /* switch */
 
   // Set rd thresholds based on mode and speed setting
-  if(cpi->sf.adjust_thresholds_by_speed)
-    set_rd_speed_thresholds(cpi, mode, speed);
-  else
-    set_rd_speed_thresholds(cpi, mode, 0);
+  set_rd_speed_thresholds(cpi, mode, speed);
 
   // Slow quant, dct and trellis not worthwhile for first pass
   // so make sure they are always turned off.
--- a/vp9/encoder/vp9_onyx_int.h
+++ b/vp9/encoder/vp9_onyx_int.h
@@ -216,7 +216,6 @@
   int search_best_filter;
   int static_segmentation;
   int comp_inter_joint_search_thresh;
-  int adpative_rd_thresh;
   int skip_encode_sb;
   int use_lastframe_partitioning;
   int use_largest_txform;
@@ -223,7 +222,9 @@
   int use_8tap_always;
   int use_avoid_tested_higherror;
   int skip_lots_of_modes;
+  int adpative_rd_thresh;
   int adjust_thresholds_by_speed;
+  int new_motion_thresh_factor;
   int partition_by_variance;
   int use_one_partition_size_always;
   int less_rectangular_check;
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -54,20 +54,20 @@
 
 const MODE_DEFINITION vp9_mode_order[MAX_MODES] = {
   {ZEROMV,    LAST_FRAME,   NONE},
-  {DC_PRED,   INTRA_FRAME,  NONE},
-
   {NEARESTMV, LAST_FRAME,   NONE},
   {NEARMV,    LAST_FRAME,   NONE},
 
-  {ZEROMV,    GOLDEN_FRAME, NONE},
-  {NEARESTMV, GOLDEN_FRAME, NONE},
-
   {ZEROMV,    ALTREF_FRAME, NONE},
   {NEARESTMV, ALTREF_FRAME, NONE},
 
+  {ZEROMV,    GOLDEN_FRAME, NONE},
+  {NEARESTMV, GOLDEN_FRAME, NONE},
+
   {NEARMV,    GOLDEN_FRAME, NONE},
   {NEARMV,    ALTREF_FRAME, NONE},
 
+  {DC_PRED,   INTRA_FRAME,  NONE},
+  {TM_PRED,   INTRA_FRAME,  NONE},
   {V_PRED,    INTRA_FRAME,  NONE},
   {H_PRED,    INTRA_FRAME,  NONE},
   {D45_PRED,  INTRA_FRAME,  NONE},
@@ -77,18 +77,10 @@
   {D27_PRED,  INTRA_FRAME,  NONE},
   {D63_PRED,  INTRA_FRAME,  NONE},
 
-  {TM_PRED,   INTRA_FRAME,  NONE},
-
   {NEWMV,     LAST_FRAME,   NONE},
   {NEWMV,     GOLDEN_FRAME, NONE},
   {NEWMV,     ALTREF_FRAME, NONE},
 
-  {SPLITMV,   LAST_FRAME,   NONE},
-  {SPLITMV,   GOLDEN_FRAME, NONE},
-  {SPLITMV,   ALTREF_FRAME, NONE},
-
-  {I4X4_PRED, INTRA_FRAME,  NONE},
-
   /* compound prediction modes */
   {ZEROMV,    LAST_FRAME,   ALTREF_FRAME},
   {NEARESTMV, LAST_FRAME,   ALTREF_FRAME},
@@ -101,8 +93,12 @@
   {NEWMV,     LAST_FRAME,   ALTREF_FRAME},
   {NEWMV,     GOLDEN_FRAME, ALTREF_FRAME},
 
+  {SPLITMV,   LAST_FRAME,   NONE},
+  {SPLITMV,   GOLDEN_FRAME, NONE},
+  {SPLITMV,   ALTREF_FRAME, NONE},
   {SPLITMV,   LAST_FRAME,   ALTREF_FRAME},
   {SPLITMV,   GOLDEN_FRAME, ALTREF_FRAME},
+  {I4X4_PRED, INTRA_FRAME,  NONE},
 };
 
 // The baseline rd thresholds for breaking out of the rd loop for