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