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_
+