1/* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#ifndef WEBRTC_MODULES_VIDEO_CODING_SOURCE_QM_SELECT_DATA_H_ 12#define WEBRTC_MODULES_VIDEO_CODING_SOURCE_QM_SELECT_DATA_H_ 13 14/*************************************************************** 15*QMSelectData.h 16* This file includes parameters for content-aware media optimization 17****************************************************************/ 18 19#include "webrtc/typedefs.h" 20 21namespace webrtc { 22// 23// PARAMETERS FOR RESOLUTION ADAPTATION 24// 25 26// Initial level of buffer in secs. 27const float kInitBufferLevel = 0.5f; 28 29// Threshold of (max) buffer size below which we consider too low (underflow). 30const float kPercBufferThr = 0.10f; 31 32// Threshold on the occurrences of low buffer levels. 33const float kMaxBufferLow = 0.30f; 34 35// Threshold on rate mismatch. 36const float kMaxRateMisMatch = 0.5f; 37 38// Threshold on amount of under/over encoder shooting. 39const float kRateOverShoot = 0.75f; 40const float kRateUnderShoot = 0.75f; 41 42// Factor to favor weighting the average rates with the current/last data. 43const float kWeightRate = 0.70f; 44 45// Factor for transitional rate for going back up in resolution. 46const float kTransRateScaleUpSpatial = 1.25f; 47const float kTransRateScaleUpTemp = 1.25f; 48const float kTransRateScaleUpSpatialTemp = 1.25f; 49 50// Threshold on packet loss rate, above which favor resolution reduction. 51const float kPacketLossThr = 0.1f; 52 53// Factor for reducing transitional bitrate under packet loss. 54const float kPacketLossRateFac = 1.0f; 55 56// Maximum possible transitional rate for down-sampling: 57// (units in kbps), for 30fps. 58const uint16_t kMaxRateQm[9] = { 59 0, // QCIF 60 50, // kHCIF 61 125, // kQVGA 62 200, // CIF 63 280, // HVGA 64 400, // VGA 65 700, // QFULLHD 66 1000, // WHD 67 1500 // FULLHD 68}; 69 70// Frame rate scale for maximum transition rate. 71const float kFrameRateFac[4] = { 72 0.5f, // Low 73 0.7f, // Middle level 1 74 0.85f, // Middle level 2 75 1.0f, // High 76}; 77 78// Scale for transitional rate: based on content class 79// motion=L/H/D,spatial==L/H/D: for low, high, middle levels 80const float kScaleTransRateQm[18] = { 81 // VGA and lower 82 0.40f, // L, L 83 0.50f, // L, H 84 0.40f, // L, D 85 0.60f, // H ,L 86 0.60f, // H, H 87 0.60f, // H, D 88 0.50f, // D, L 89 0.50f, // D, D 90 0.50f, // D, H 91 92 // over VGA 93 0.40f, // L, L 94 0.50f, // L, H 95 0.40f, // L, D 96 0.60f, // H ,L 97 0.60f, // H, H 98 0.60f, // H, D 99 0.50f, // D, L 100 0.50f, // D, D 101 0.50f, // D, H 102}; 103 104// Threshold on the target rate relative to transitional rate. 105const float kFacLowRate = 0.5f; 106 107// Action for down-sampling: 108// motion=L/H/D,spatial==L/H/D, for low, high, middle levels; 109// rate = 0/1/2, for target rate state relative to transition rate. 110const uint8_t kSpatialAction[27] = { 111// rateClass = 0: 112 1, // L, L 113 1, // L, H 114 1, // L, D 115 4, // H ,L 116 1, // H, H 117 4, // H, D 118 4, // D, L 119 1, // D, H 120 2, // D, D 121 122// rateClass = 1: 123 1, // L, L 124 1, // L, H 125 1, // L, D 126 2, // H ,L 127 1, // H, H 128 2, // H, D 129 2, // D, L 130 1, // D, H 131 2, // D, D 132 133// rateClass = 2: 134 1, // L, L 135 1, // L, H 136 1, // L, D 137 2, // H ,L 138 1, // H, H 139 2, // H, D 140 2, // D, L 141 1, // D, H 142 2, // D, D 143}; 144 145const uint8_t kTemporalAction[27] = { 146// rateClass = 0: 147 3, // L, L 148 2, // L, H 149 2, // L, D 150 1, // H ,L 151 3, // H, H 152 1, // H, D 153 1, // D, L 154 2, // D, H 155 1, // D, D 156 157// rateClass = 1: 158 3, // L, L 159 3, // L, H 160 3, // L, D 161 1, // H ,L 162 3, // H, H 163 1, // H, D 164 1, // D, L 165 3, // D, H 166 1, // D, D 167 168// rateClass = 2: 169 1, // L, L 170 3, // L, H 171 3, // L, D 172 1, // H ,L 173 3, // H, H 174 1, // H, D 175 1, // D, L 176 3, // D, H 177 1, // D, D 178}; 179 180// Control the total amount of down-sampling allowed. 181const float kMaxSpatialDown = 8.0f; 182const float kMaxTempDown = 3.0f; 183const float kMaxTotalDown = 9.0f; 184 185// Minimum image size for a spatial down-sampling. 186const int kMinImageSize = 176 * 144; 187 188// Minimum frame rate for temporal down-sampling: 189// no frame rate reduction if incomingFrameRate <= MIN_FRAME_RATE. 190const int kMinFrameRate = 8; 191 192// 193// PARAMETERS FOR FEC ADJUSTMENT: TODO (marpan) 194// 195 196// 197// PARAMETETS FOR SETTING LOW/HIGH STATES OF CONTENT METRICS: 198// 199 200// Thresholds for frame rate: 201const int kLowFrameRate = 10; 202const int kMiddleFrameRate = 15; 203const int kHighFrameRate = 25; 204 205// Thresholds for motion: motion level is from NFD. 206const float kHighMotionNfd = 0.075f; 207const float kLowMotionNfd = 0.03f; 208 209// Thresholds for spatial prediction error: 210// this is applied on the average of (2x2,1x2,2x1). 211const float kHighTexture = 0.035f; 212const float kLowTexture = 0.020f; 213 214// Used to reduce thresholds for larger/HD scenes: correction factor since 215// higher correlation in HD scenes means lower spatial prediction error. 216const float kScaleTexture = 0.9f; 217 218// Percentage reduction in transitional bitrate for 2x2 selected over 1x2/2x1. 219const float kRateRedSpatial2X2 = 0.6f; 220 221const float kSpatialErr2x2VsHoriz = 0.1f; // percentage to favor 2x2 over H 222const float kSpatialErr2X2VsVert = 0.1f; // percentage to favor 2x2 over V 223const float kSpatialErrVertVsHoriz = 0.1f; // percentage to favor H over V 224 225} // namespace webrtc 226 227#endif // WEBRTC_MODULES_VIDEO_CODING_SOURCE_QM_SELECT_DATA_H_ 228