1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/common_types.h"
15a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/typedefs.h"
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/******************************************************/
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* Quality Modes: Resolution and Robustness settings  */
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/******************************************************/
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct VideoContentMetrics;
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct VCMResolutionScale {
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMResolutionScale()
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      : codec_width(640),
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        codec_height(480),
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        frame_rate(30.0f),
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        spatial_width_fact(1.0f),
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        spatial_height_fact(1.0f),
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        temporal_fact(1.0f),
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        change_resolution_spatial(false),
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        change_resolution_temporal(false) {
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint16_t codec_width;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint16_t codec_height;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float frame_rate;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float spatial_width_fact;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float spatial_height_fact;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float temporal_fact;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool change_resolution_spatial;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool change_resolution_temporal;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum ImageType {
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kQCIF = 0,            // 176x144
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kHCIF,                // 264x216 = half(~3/4x3/4) CIF.
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kQVGA,                // 320x240 = quarter VGA.
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kCIF,                 // 352x288
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kHVGA,                // 480x360 = half(~3/4x3/4) VGA.
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kVGA,                 // 640x480
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kQFULLHD,             // 960x540 = quarter FULLHD, and half(~3/4x3/4) WHD.
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kWHD,                 // 1280x720
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kFULLHD,              // 1920x1080
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kNumImageTypes
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst uint32_t kSizeOfImageType[kNumImageTypes] =
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 25344, 57024, 76800, 101376, 172800, 307200, 518400, 921600, 2073600 };
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum FrameRateLevelClass {
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kFrameRateLow,
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kFrameRateMiddle1,
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kFrameRateMiddle2,
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kFrameRateHigh
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum ContentLevelClass {
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kLow,
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kHigh,
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kDefault
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct VCMContFeature {
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMContFeature()
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      : value(0.0f),
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        level(kDefault) {
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void Reset() {
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    value = 0.0f;
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    level = kDefault;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float value;
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ContentLevelClass level;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum UpDownAction {
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kUpResolution,
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kDownResolution
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum SpatialAction {
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kNoChangeSpatial,
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kOneHalfSpatialUniform,        // 3/4 x 3/4: 9/6 ~1/2 pixel reduction.
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kOneQuarterSpatialUniform,     // 1/2 x 1/2: 1/4 pixel reduction.
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kNumModesSpatial
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum TemporalAction {
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kNoChangeTemporal,
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kTwoThirdsTemporal,     // 2/3 frame rate reduction
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kOneHalfTemporal,       // 1/2 frame rate reduction
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kNumModesTemporal
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct ResolutionAction {
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ResolutionAction()
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      : spatial(kNoChangeSpatial),
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        temporal(kNoChangeTemporal) {
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  SpatialAction spatial;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TemporalAction temporal;
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Down-sampling factors for spatial (width and height), and temporal.
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst float kFactorWidthSpatial[kNumModesSpatial] =
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    { 1.0f, 4.0f / 3.0f, 2.0f };
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst float kFactorHeightSpatial[kNumModesSpatial] =
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    { 1.0f, 4.0f / 3.0f, 2.0f };
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst float kFactorTemporal[kNumModesTemporal] =
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    { 1.0f, 1.5f, 2.0f };
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum EncoderState {
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kStableEncoding,    // Low rate mis-match, stable buffer levels.
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kStressedEncoding,  // Significant over-shooting of target rate,
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                      // Buffer under-flow, etc.
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kEasyEncoding       // Significant under-shooting of target rate.
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// QmMethod class: main class for resolution and robustness settings
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMQmMethod {
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMQmMethod();
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ~VCMQmMethod();
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Reset values
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ResetQM();
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void Reset() = 0;
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Compute content class.
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint8_t ComputeContentClass();
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Update with the content metrics.
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateContent(const VideoContentMetrics* content_metrics);
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Compute spatial texture magnitude and level.
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Spatial texture is a spatial prediction error measure.
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ComputeSpatial();
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Compute motion magnitude and level for NFD metric.
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // NFD is normalized frame difference (normalized by spatial variance).
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ComputeMotionNFD();
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Get the imageType (CIF, VGA, HD, etc) for the system width/height.
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ImageType GetImageType(uint16_t width, uint16_t height);
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Return the closest image type.
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ImageType FindClosestImageType(uint16_t width, uint16_t height);
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Get the frame rate level.
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FrameRateLevelClass FrameRateLevel(float frame_rate);
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected:
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Content Data.
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const VideoContentMetrics* content_metrics_;
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Encoder frame sizes and native frame sizes.
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint16_t width_;
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint16_t height_;
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float user_frame_rate_;
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint16_t native_width_;
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint16_t native_height_;
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float native_frame_rate_;
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float aspect_ratio_;
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Image type and frame rate leve, for the current encoder resolution.
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ImageType image_type_;
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  FrameRateLevelClass framerate_level_;
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Content class data.
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMContFeature motion_;
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMContFeature spatial_;
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint8_t content_class_;
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool init_;
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Resolution settings class
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMQmResolution : public VCMQmMethod {
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMQmResolution();
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ~VCMQmResolution();
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Reset all quantities.
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void Reset();
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Reset rate quantities and counters after every SelectResolution() call.
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ResetRates();
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Reset down-sampling state.
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ResetDownSamplingState();
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Get the encoder state.
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EncoderState GetEncoderState();
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Initialize after SetEncodingData in media_opt.
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int Initialize(float bitrate,
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 float user_framerate,
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 uint16_t width,
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 uint16_t height,
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 int num_layers);
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Update the encoder frame size.
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateCodecParameters(float frame_rate, uint16_t width, uint16_t height);
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Update with actual bit rate (size of the latest encoded frame)
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // and frame type, after every encoded frame.
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateEncodedSize(int encoded_size,
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         FrameType encoded_frame_type);
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Update with new target bitrate, actual encoder sent rate, frame_rate,
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // loss rate: every ~1 sec from SetTargetRates in media_opt.
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateRates(float target_bitrate,
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   float encoder_sent_rate,
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   float incoming_framerate,
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   uint8_t packet_loss);
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Extract ST (spatio-temporal) resolution action.
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Inputs: qm: Reference to the quality modes pointer.
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Output: the spatial and/or temporal scale change.
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int SelectResolution(VCMResolutionScale** qm);
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set the default resolution action.
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void SetDefaultAction();
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Compute rates for the selection of down-sampling action.
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ComputeRatesForSelection();
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Compute the encoder state.
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ComputeEncoderState();
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Return true if the action is to go back up in resolution.
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool GoingUpResolution();
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Return true if the action is to go down in resolution.
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool GoingDownResolution();
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Check the condition for going up in resolution by the scale factors:
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // |facWidth|, |facHeight|, |facTemp|.
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // |scaleFac| is a scale factor for the transition rate.
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool ConditionForGoingUp(float fac_width,
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                           float fac_height,
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                           float fac_temp,
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                           float scale_fac);
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Get the bitrate threshold for the resolution action.
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // The case |facWidth|=|facHeight|=|facTemp|==1 is for down-sampling action.
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // |scaleFac| is a scale factor for the transition rate.
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float GetTransitionRate(float fac_width,
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          float fac_height,
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          float fac_temp,
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          float scale_fac);
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Update the down-sampling state.
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateDownsamplingState(UpDownAction up_down);
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Update the codec frame size and frame rate.
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void UpdateCodecResolution();
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Return a state based on average target rate relative transition rate.
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint8_t RateClass(float transition_rate);
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Adjust the action selected from the table.
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void AdjustAction();
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Covert 2 stages of 3/4 (=9/16) spatial decimation to 1/2.
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ConvertSpatialFractionalToWhole();
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns true if the new frame sizes, under the selected spatial action,
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // are of even size.
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool EvenFrameSize();
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Insert latest down-sampling action into the history list.
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void InsertLatestDownAction();
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Remove the last (first element) down-sampling action from the list.
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void RemoveLastDownAction();
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Check constraints on the amount of down-sampling allowed.
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ConstrainAmountOfDownSampling();
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // For going up in resolution: pick spatial or temporal action,
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // if both actions were separately selected.
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void PickSpatialOrTemporal();
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Select the directional (1x2 or 2x1) spatial down-sampling action.
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void SelectSpatialDirectionMode(float transition_rate);
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enum { kDownActionHistorySize = 10};
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMResolutionScale* qm_;
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Encoder rate control parameters.
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float target_bitrate_;
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float incoming_framerate_;
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float per_frame_bandwidth_;
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float buffer_level_;
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Data accumulated every ~1sec from MediaOpt.
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float sum_target_rate_;
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float sum_incoming_framerate_;
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float sum_rate_MM_;
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float sum_rate_MM_sgn_;
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float sum_packet_loss_;
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Counters.
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t frame_cnt_;
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t frame_cnt_delta_;
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t update_rate_cnt_;
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t low_buffer_cnt_;
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Resolution state parameters.
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float state_dec_factor_spatial_;
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float state_dec_factor_temporal_;
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Quantities used for selection.
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float avg_target_rate_;
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float avg_incoming_framerate_;
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float avg_ratio_buffer_low_;
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float avg_rate_mismatch_;
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float avg_rate_mismatch_sgn_;
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float avg_packet_loss_;
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EncoderState encoder_state_;
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ResolutionAction action_;
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Short history of the down-sampling actions from the Initialize() state.
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // This is needed for going up in resolution. Since the total amount of
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // down-sampling actions are constrained, the length of the list need not be
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // large: i.e., (4/3) ^{kDownActionHistorySize} <= kMaxDownSample.
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ResolutionAction down_action_history_[kDownActionHistorySize];
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int num_layers_;
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Robustness settings class.
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMQmRobustness : public VCMQmMethod {
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VCMQmRobustness();
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~VCMQmRobustness();
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual void Reset();
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Adjust FEC rate based on content: every ~1 sec from SetTargetRates.
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Returns an adjustment factor.
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float AdjustFecFactor(uint8_t code_rate_delta,
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        float total_rate,
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        float framerate,
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        uint32_t rtt_time,
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        uint8_t packet_loss);
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set the UEP protection on/off.
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool SetUepProtection(uint8_t code_rate_delta,
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        float total_rate,
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        uint8_t packet_loss,
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        bool frame_type);
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org private:
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Previous state of network parameters.
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  float prev_total_rate_;
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint32_t prev_rtt_time_;
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint8_t prev_packet_loss_;
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  uint8_t prev_code_rate_delta_;
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
3733b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_H_
375