/* * Copyright (c) 2011 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_QM_SELECT_H_ #define WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_H_ #include "typedefs.h" #include "common_types.h" /************************/ /* Quality Modes */ /**********************/ namespace webrtc { struct VideoContentMetrics; struct VCMQualityMode { VCMQualityMode():spatialWidthFact(1), spatialHeightFact(1), temporalFact(1){} void Reset() { spatialWidthFact = 1; spatialHeightFact = 1; temporalFact = 1; } WebRtc_UWord16 spatialWidthFact; WebRtc_UWord16 spatialHeightFact; WebRtc_UWord16 temporalFact; }; enum VCMMagValues { kLow, kHigh, kDefault //default do nothing mode }; struct VCMContFeature { VCMContFeature(): value(0.0f), level(kDefault){} void Reset() { value = 0.0f; level = kDefault; } float value; VCMMagValues level; }; class VCMQmSelect { public: VCMQmSelect(); ~VCMQmSelect(); // Initialize: WebRtc_Word32 Initialize(float bitRate, float userFrameRate, WebRtc_UWord32 width, WebRtc_UWord32 height); // Allow the user to set preferences: favor frame rate/resolution WebRtc_Word32 SetPreferences(WebRtc_Word8 resolPref); // Extract ST QM behavior and make decision // Inputs: Content Metrics per frame (averaged over time) // qm: Reference to the quality modes pointer WebRtc_Word32 SelectQuality(const VideoContentMetrics* contentMetrics, VCMQualityMode** qm); // Update QMselect with actual bit rate (size of the latest encoded frame) and frame type // -> update buffer level and frame-mismatch void UpdateEncodedSize(WebRtc_Word64 encodedSize, FrameType encodedFrameType); // Update QM with new rates from SetTargetRates void UpdateRates(float targetBitRate, float avgSentRate, float incomingFrameRate); // Select 1x2,2x2,2x2 spatial sampling mode WebRtc_Word32 SelectSpatialDirectionMode(float transRate); // Reset values prior to QMSelect void ResetQM(); // Reset rate quantities and counter values after every QMSelect call void ResetRates(); // Reset all void Reset(); private: // Compute spatial texture magnitude and level void Spatial(); // Compute motion magnitude and level void Motion(); // Compute motion magnitude and level for NFD metric void MotionNFD(); // Compute coherence magnitude and level void Coherence(); // Set the max rate for QM selection WebRtc_Word32 SetMaxRateForQM(WebRtc_UWord32 width, WebRtc_UWord32 height); // Content Data const VideoContentMetrics* _contentMetrics; // Encoder stats/rate-control metrics float _targetBitRate; float _userFrameRate; float _incomingFrameRate; float _perFrameBandwidth; float _bufferLevel; float _sumTargetRate; float _sumIncomingFrameRate; float _sumSeqRateMM; float _sumFrameRateMM; WebRtc_Word64 _sumEncodedBytes; //Encoder and native frame sizes WebRtc_UWord32 _width; WebRtc_UWord32 _height; WebRtc_UWord32 _nativeWidth; WebRtc_UWord32 _nativeHeight; WebRtc_UWord8 _stateDecFactorSpatial; WebRtc_UWord32 _nativeFrameRate; WebRtc_UWord8 _stateDecFactorTemp; //Counters WebRtc_UWord32 _frameCnt; WebRtc_UWord32 _frameCntDelta; WebRtc_UWord32 _updateRateCnt; WebRtc_UWord32 _lowBufferCnt; //Content L/M/H values VCMContFeature _motion; VCMContFeature _spatial; VCMContFeature _coherence; bool _stationaryMotion; //aspect ratio float _aspectRatio; //Max rate to saturate the transitionalRate WebRtc_UWord32 _maxRateQM; WebRtc_UWord8 _imageType; //User preference for resolution or qmax change WebRtc_UWord8 _userResolutionPref; bool _init; VCMQualityMode* _qm; }; } // namespace webrtc #endif // WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_H_