Updates for resolution adaptation:
1) code cleanup and some updates to selection logic for qm_select.
2) added unit test for the QmResolution class.
3) update codec frame size and reset/update frame rate in media-opt:
4) removed unused motion vector metrics and some related code of content metrics processing.
Review URL: https://webrtc-codereview.appspot.com/405008

git-svn-id: http://webrtc.googlecode.com/svn/trunk@1791 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/src/modules/video_coding/main/source/qm_select_data.h b/src/modules/video_coding/main/source/qm_select_data.h
index 64870ea..d4af642 100644
--- a/src/modules/video_coding/main/source/qm_select_data.h
+++ b/src/modules/video_coding/main/source/qm_select_data.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -18,171 +18,167 @@
 
 #include "typedefs.h"
 
-namespace webrtc
-{
-
+namespace webrtc {
 //
 // PARAMETERS FOR RESOLUTION ADAPTATION
 //
 
-// Initial level of buffer in secs: should corresponds to wrapper settings
-#define INIT_BUFFER_LEVEL 0.5
+// Initial level of buffer in secs: should corresponds to wrapper settings.
+const float kInitBufferLevel = 0.5f;
 
-// Optimal level of buffer in secs: should corresponds to wrapper settings
-#define OPT_BUFFER_LEVEL 0.6
+// Optimal level of buffer in secs: should corresponds to wrapper settings.
+const float kOptBufferLevel = 0.6f;
 
-// Threshold of (max) buffer size below which we consider too low (underflow)
-#define PERC_BUFFER_THR  0.10
+// Threshold of (max) buffer size below which we consider too low (underflow).
+const float kPercBufferThr = 0.10f;
+
+// Threshold on the occurrences of low buffer levels.
+const float kMaxBufferLow = 0.5f;
 
 // Threshold on rate mismatch
-#define MAX_RATE_MM  0.5
+const float kMaxRateMisMatch = 0.5f;
 
-// Avoid outliers in seq-rate MM
-#define THRESH_SUM_MM 1000
+// Threshold on amount of under/over encoder shooting.
+const float kRateOverShoot = 0.75f;
+const float kRateUnderShoot = 0.75f;
 
-// Threshold on the occurrences of low buffer levels
-#define MAX_BUFFER_LOW 0.5
+// Factor for transitional rate for going back up in resolution.
+const float kTransRateScaleUpSpatial = 1.25f;
+const float kTransRateScaleUpTemp = 1.25f;
+const float kTransRateScaleUpSpatialTemp = 1.25f;
 
-// Factor for transitional rate for going back up in resolution
-#define TRANS_RATE_SCALE_UP_SPATIAL     1.25
-#define TRANS_RATE_SCALE_UP_TEMP        1.25
+// Threshold on packet loss rate, above which favor resolution reduction.
+const float kPacketLossThr = 0.1f;
 
-// Threshold on packet loss rate, above which favor resolution reduction
-#define LOSS_THR 0.1
-
-// Factor for reducing transitonal bitrate under packet loss
-#define LOSS_RATE_FAC 1.0
+// Factor for reducing transitonal bitrate under packet loss.
+const float kPacketLossRateFac = 1.0f;
 
 // Maximum possible transitional rate for down-sampling:
-// (units in kbps), for 30fps
-const WebRtc_UWord16 kMaxRateQm[7] = {
-    100,  //QCIF
-    500,  //CIF
-    800,  //VGA
-    1500, //4CIF
-    2000, //720 HD 4:3,
-    2500, //720 HD 16:9
-    3000  //1080HD
+// (units in kbps), for 30fps.
+const uint16_t kMaxRateQm[7] = {
+    100,   // QCIF
+    250,   // CIF
+    500,   // VGA
+    800,   // 4CIF
+    1000,  // 720 HD 4:3,
+    1500,  // 720 HD 16:9
+    2000   // 1080HD
+};
+
+// Frame rate scale for maximum transition rate.
+const float kFrameRateFac[3] = {
+    0.7f,  // L
+    1.0f,  // H
+    0.8f   // D
 };
 
 // Scale for transitional rate: based on content class
 // motion=L/H/D,spatial==L/H/D: for low, high, middle levels
 const float kScaleTransRateQm[18] = {
-    //4CIF and lower
-    0.25f,       // L, L
-    0.75f,       // L, H
-    0.75f,       // L, D
-    0.75f,       // H ,L
-    0.50f,       // H, H
-    0.50f,       // H, D
+    // 4CIF and lower
+    0.50f,       // L, L
+    0.50f,       // L, H
+    0.50f,       // L, D
+    0.50f,       // H ,L
+    0.25f,       // H, H
+    0.25f,       // H, D
     0.50f,       // D, L
-    0.63f,       // D, D
+    0.50f,       // D, D
     0.25f,       // D, H
 
-    //over 4CIF: WHD, HD
-    0.25f,       // L, L
-    0.75f,       // L, H
-    0.75f,       // L, D
-    0.75f,       // H ,L
-    0.50f,       // H, H
-    0.50f,       // H, D
+    // over 4CIF: WHD, HD
+    0.50f,       // L, L
+    0.50f,       // L, H
+    0.50f,       // L, D
+    0.50f,       // H ,L
+    0.25f,       // H, H
+    0.25f,       // H, D
     0.50f,       // D, L
-    0.63f,       // D, D
-    0.25f        // D, H
+    0.50f,       // D, D
+    0.25f,       // D, H
 };
 
 // Action for down-sampling:
 // motion=L/H/D,spatial==L/H/D: for low, high, middle levels
-const WebRtc_UWord8 kSpatialAction[9] = {
-      1,       // L, L
-      1,       // L, H
-      1,       // L, D
-      4,       // H ,L
-      1,       // H, H
-      4,       // H, D
-      4,       // D, L
-      1,       // D, D
-      1,       // D, H
+const uint8_t kSpatialAction[9] = {
+    1,       // L, L
+    1,       // L, H
+    1,       // L, D
+    4,       // H ,L
+    1,       // H, H
+    4,       // H, D
+    4,       // D, L
+    1,       // D, H
+    1,       // D, D
 };
 
-const WebRtc_UWord8 kTemporalAction[9] = {
-      1,       // L, L
-      2,       // L, H
-      2,       // L, D
-      1,       // H ,L
-      2,       // H, H
-      1,       // H, D
-      1,       // D, L
-      2,       // D, D
-      1,       // D, H
+const uint8_t kTemporalAction[9] = {
+    1,       // L, L
+    2,       // L, H
+    2,       // L, D
+    1,       // H ,L
+    2,       // H, H
+    1,       // H, D
+    1,       // D, L
+    2,       // D, H
+    1,       // D, D
 };
 
-// Control the total amount of down-sampling allowed
-#define MAX_SPATIAL_DOWN_FACT       4
-#define MAX_TEMP_DOWN_FACT          4
-#define MAX_SPATIAL_TEMP_DOWN_FACT  8
+// Control the total amount of down-sampling allowed.
+const int kMaxSpatialDown = 16;
+const int kMaxTempDown = 4;
+const int kMaxDownSample = 16;
 
-// Minimum image size for a spatial down-sampling:
-// no spatial down-sampling if input size <= MIN_IMAGE_SIZE
-#define MIN_IMAGE_SIZE  25344 //176*144
+// Minimum image size for a spatial down-sampling.
+const int kMinImageSize= 176 * 144;
 
 // Minimum frame rate for temporal down-sampling:
 // no frame rate reduction if incomingFrameRate <= MIN_FRAME_RATE
-#define MIN_FRAME_RATE_QM  8
+const int kMinFrameRate = 8;
 
 // Boundaries for the closest standard frame size
-const WebRtc_UWord32 kFrameSizeTh[6] = {
-    63360,    //between 176*144 and 352*288
-    204288,   //between 352*288 and 640*480
-    356352,   //between 640*480 and 704*576
-    548352,   //between 704*576 and 960*720
-    806400,   //between 960*720 and 1280*720
+const uint32_t kFrameSizeTh[6] = {
+    63360,    // between 176*144 and 352*288
+    204288,   // between 352*288 and 640*480
+    356352,   // between 640*480 and 704*576
+    548352,   // between 704*576 and 960*720
+    806400,   // between 960*720 and 1280*720
     1497600,  // between 1280*720 and 1920*1080
 };
 
-
 //
 // PARAMETERS FOR FEC ADJUSTMENT: TODO (marpan)
 //
 
-
 //
 // PARAMETETS FOR SETTING LOW/HIGH STATES OF CONTENT METRICS:
 //
 
-// Threshold to determine if high amount of zero_motion
-#define HIGH_ZERO_MOTION_SIZE 0.95
-
-// Thresholds for motion:
-// motion level is derived from motion vectors: motion = size_nz*magn_nz
-#define HIGH_MOTION 0.7
-#define LOW_MOTION  0.4
+// Thresholds for frame rate:
+const int kLowFrameRate = 10;
+const int kHighFrameRate = 25;
 
 // Thresholds for motion: motion level is from NFD
-#define HIGH_MOTION_NFD 0.075
-#define LOW_MOTION_NFD  0.04
+const float kHighMotionNfd = 0.075f;
+const float kLowMotionNfd = 0.04f;
 
 // Thresholds for spatial prediction error:
-// this is appLied on the min(2x2,1x2,2x1)
-#define HIGH_TEXTURE 0.035
-#define LOW_TEXTURE  0.025
+// this is applied on the min(2x2,1x2,2x1)
+const float kHighTexture = 0.035f;
+const float kLowTexture = 0.025f;
 
-// Used to reduce thresholds for HD scenes: correction factor since higher
-// correlation in HD scenes means lower spatial prediction error
-#define SCALE_TEXTURE_HD 0.9;
-
-// Thresholds for distortion and horizontalness:
-// applied on product: horiz_nz/dist_nz
-#define COHERENCE_THR   1.0
-#define COH_MAX 10
+// Used to reduce thresholds for larger/HD scenes: correction factor since
+// higher correlation in HD scenes means lower spatial prediction error.
+const float kScaleTexture = 0.9f;
 
 // percentage reduction in transitional bitrate for 2x2 selected over 1x2/2x1
-#define RATE_RED_SPATIAL_2X2    0.6
+const float kRateRedSpatial2X2 = 0.6f;
 
-#define SPATIAL_ERR_2X2_VS_H    0.1  //percentage to favor 2x2
-#define SPATIAL_ERR_2X2_VS_V    0.1  //percentage to favor 2x2 over V
-#define SPATIAL_ERR_V_VS_H      0.1  //percentage to favor H over V
+const float kSpatialErr2x2VsHoriz = 0.1f;   // percentage to favor 2x2 over H
+const float kSpatialErr2X2VsVert = 0.1f;    // percentage to favor 2x2 over V
+const float kSpatialErrVertVsHoriz = 0.1f;  // percentage to favor H over V
 
-} // namespace webrtc
+}  //  namespace webrtc
 
-#endif // WEBRTC_MODULES_VIDEO_CODING_SOURCE_QM_SELECT_DATA_H_
+#endif  // WEBRTC_MODULES_VIDEO_CODING_SOURCE_QM_SELECT_DATA_H_
+