aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/video_coding/main/source/qm_select_data.h
blob: dc6bce4811c9b199f23d350dc15e8280e1f5991a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/*
 *  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
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_VIDEO_CODING_SOURCE_QM_SELECT_DATA_H_
#define WEBRTC_MODULES_VIDEO_CODING_SOURCE_QM_SELECT_DATA_H_

/***************************************************************
*QMSelectData.h
* This file includes parameters for content-aware media optimization
****************************************************************/

#include "webrtc/typedefs.h"

namespace webrtc {
//
// PARAMETERS FOR RESOLUTION ADAPTATION
//

// Initial level of buffer in secs.
const float kInitBufferLevel = 0.5f;

// 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.30f;

// Threshold on rate mismatch.
const float kMaxRateMisMatch = 0.5f;

// Threshold on amount of under/over encoder shooting.
const float kRateOverShoot = 0.75f;
const float kRateUnderShoot = 0.75f;

// Factor to favor weighting the average rates with the current/last data.
const float kWeightRate = 0.70f;

// 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;

// Threshold on packet loss rate, above which favor resolution reduction.
const float kPacketLossThr = 0.1f;

// Factor for reducing transitional bitrate under packet loss.
const float kPacketLossRateFac = 1.0f;

// Maximum possible transitional rate for down-sampling:
// (units in kbps), for 30fps.
const uint16_t kMaxRateQm[9] = {
    0,     // QCIF
    50,    // kHCIF
    125,   // kQVGA
    200,   // CIF
    280,   // HVGA
    400,   // VGA
    700,   // QFULLHD
    1000,  // WHD
    1500   // FULLHD
};

// Frame rate scale for maximum transition rate.
const float kFrameRateFac[4] = {
    0.5f,    // Low
    0.7f,    // Middle level 1
    0.85f,   // Middle level 2
    1.0f,    // High
};

// 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] = {
    // VGA and lower
    0.40f,       // L, L
    0.50f,       // L, H
    0.40f,       // L, D
    0.60f,       // H ,L
    0.60f,       // H, H
    0.60f,       // H, D
    0.50f,       // D, L
    0.50f,       // D, D
    0.50f,       // D, H

    // over VGA
    0.40f,       // L, L
    0.50f,       // L, H
    0.40f,       // L, D
    0.60f,       // H ,L
    0.60f,       // H, H
    0.60f,       // H, D
    0.50f,       // D, L
    0.50f,       // D, D
    0.50f,       // D, H
};

// Threshold on the target rate relative to transitional rate.
const float kFacLowRate = 0.5f;

// Action for down-sampling:
// motion=L/H/D,spatial==L/H/D, for low, high, middle levels;
// rate = 0/1/2, for target rate state relative to transition rate.
const uint8_t kSpatialAction[27] = {
// rateClass = 0:
    1,       // L, L
    1,       // L, H
    1,       // L, D
    4,       // H ,L
    1,       // H, H
    4,       // H, D
    4,       // D, L
    1,       // D, H
    2,       // D, D

// rateClass = 1:
    1,       // L, L
    1,       // L, H
    1,       // L, D
    2,       // H ,L
    1,       // H, H
    2,       // H, D
    2,       // D, L
    1,       // D, H
    2,       // D, D

// rateClass = 2:
    1,       // L, L
    1,       // L, H
    1,       // L, D
    2,       // H ,L
    1,       // H, H
    2,       // H, D
    2,       // D, L
    1,       // D, H
    2,       // D, D
};

const uint8_t kTemporalAction[27] = {
// rateClass = 0:
    3,       // L, L
    2,       // L, H
    2,       // L, D
    1,       // H ,L
    3,       // H, H
    1,       // H, D
    1,       // D, L
    2,       // D, H
    1,       // D, D

// rateClass = 1:
    3,       // L, L
    3,       // L, H
    3,       // L, D
    1,       // H ,L
    3,       // H, H
    1,       // H, D
    1,       // D, L
    3,       // D, H
    1,       // D, D

// rateClass = 2:
    1,       // L, L
    3,       // L, H
    3,       // L, D
    1,       // H ,L
    3,       // H, H
    1,       // H, D
    1,       // D, L
    3,       // D, H
    1,       // D, D
};

// Control the total amount of down-sampling allowed.
const float kMaxSpatialDown = 8.0f;
const float kMaxTempDown = 3.0f;
const float kMaxTotalDown = 9.0f;

// 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.
const int kMinFrameRate = 8;

//
// PARAMETERS FOR FEC ADJUSTMENT: TODO (marpan)
//

//
// PARAMETETS FOR SETTING LOW/HIGH STATES OF CONTENT METRICS:
//

// Thresholds for frame rate:
const int kLowFrameRate = 10;
const int kMiddleFrameRate = 15;
const int kHighFrameRate = 25;

// Thresholds for motion: motion level is from NFD.
const float kHighMotionNfd = 0.075f;
const float kLowMotionNfd = 0.03f;

// Thresholds for spatial prediction error:
// this is applied on the average of (2x2,1x2,2x1).
const float kHighTexture = 0.035f;
const float kLowTexture = 0.020f;

// 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.
const float kRateRedSpatial2X2 = 0.6f;

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

#endif  // WEBRTC_MODULES_VIDEO_CODING_SOURCE_QM_SELECT_DATA_H_