| /* |
| * 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: Resolution and Robustness settings */ |
| /******************************************************/ |
| |
| namespace webrtc |
| { |
| |
| struct VideoContentMetrics; |
| |
| struct VCMResolutionScale |
| { |
| VCMResolutionScale(): 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; |
| }; |
| |
| // QmMethod class: main class for resolution and robustness settings |
| |
| class VCMQmMethod |
| { |
| public: |
| VCMQmMethod(); |
| virtual ~VCMQmMethod(); |
| |
| // Reset values |
| void ResetQM(); |
| virtual void Reset() = 0; |
| |
| // Update with the content metrics |
| void UpdateContent(const VideoContentMetrics* contentMetrics); |
| |
| // 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(); |
| |
| // Get the imageType (CIF, VGA, HD, etc) for the system width/height |
| WebRtc_Word8 GetImageType(WebRtc_UWord32 width, WebRtc_UWord32 height); |
| |
| // Content Data |
| const VideoContentMetrics* _contentMetrics; |
| |
| // Encoder and native frame sizes, frame rate, aspect ratio, imageType |
| WebRtc_UWord32 _width; |
| WebRtc_UWord32 _height; |
| WebRtc_UWord32 _nativeWidth; |
| WebRtc_UWord32 _nativeHeight; |
| WebRtc_UWord32 _nativeFrameRate; |
| float _aspectRatio; |
| // Image type for the current encoder system size. |
| WebRtc_UWord8 _imageType; |
| |
| // Content L/M/H values. stationary flag |
| VCMContFeature _motion; |
| VCMContFeature _spatial; |
| VCMContFeature _coherence; |
| bool _stationaryMotion; |
| bool _init; |
| |
| }; |
| |
| // Resolution settings class |
| |
| class VCMQmResolution : public VCMQmMethod |
| { |
| public: |
| VCMQmResolution(); |
| ~VCMQmResolution(); |
| |
| // Reset all quantities |
| virtual void Reset(); |
| |
| // Reset rate quantities and counter values after every Select Quality call |
| void ResetRates(); |
| |
| // Initialize rate control quantities after re-init of encoder. |
| WebRtc_Word32 Initialize(float bitRate, float userFrameRate, |
| WebRtc_UWord32 width, WebRtc_UWord32 height); |
| |
| // Update QM with actual bit rate (size of the latest encoded frame) |
| // and frame type, after every encoded frame. |
| void UpdateEncodedSize(WebRtc_Word64 encodedSize, |
| FrameType encodedFrameType); |
| |
| // Update QM with new bit/frame/loss rates every ~1 sec from SetTargetRates |
| void UpdateRates(float targetBitRate, float avgSentRate, |
| float incomingFrameRate, WebRtc_UWord8 packetLoss); |
| |
| // Extract ST (spatio-temporal) QM behavior and make decision |
| // Inputs: qm: Reference to the quality modes pointer |
| // Output: the spatial and/or temporal scale change |
| WebRtc_Word32 SelectResolution(VCMResolutionScale** qm); |
| |
| // Select 1x2,2x2,2x2 spatial sampling mode |
| WebRtc_Word32 SelectSpatialDirectionMode(float transRate); |
| |
| private: |
| // Encoder rate control parameter |
| float _targetBitRate; |
| float _userFrameRate; |
| float _incomingFrameRate; |
| float _perFrameBandwidth; |
| float _bufferLevel; |
| |
| // Data accumulated every ~1sec from MediaOpt |
| float _sumTargetRate; |
| float _sumIncomingFrameRate; |
| float _sumSeqRateMM; |
| float _sumFrameRateMM; |
| float _sumPacketLoss; |
| WebRtc_Word64 _sumEncodedBytes; |
| |
| // Resolution state parameters |
| WebRtc_UWord8 _stateDecFactorSpatial; |
| WebRtc_UWord8 _stateDecFactorTemp; |
| |
| // Counters |
| WebRtc_UWord32 _frameCnt; |
| WebRtc_UWord32 _frameCntDelta; |
| WebRtc_UWord32 _updateRateCnt; |
| WebRtc_UWord32 _lowBufferCnt; |
| |
| VCMResolutionScale* _qm; |
| }; |
| |
| // Robustness settings class |
| |
| class VCMQmRobustness : public VCMQmMethod |
| { |
| public: |
| VCMQmRobustness(); |
| ~VCMQmRobustness(); |
| |
| virtual void Reset(); |
| |
| // Adjust FEC rate based on content: every ~1 sec from SetTargetRates. |
| // Returns an adjustment factor. |
| float AdjustFecFactor(WebRtc_UWord8 codeRateDelta, float totalRate, |
| float frameRate, WebRtc_UWord32 rttTime, |
| WebRtc_UWord8 packetLoss); |
| |
| // Set the UEP protection on/off |
| bool SetUepProtection(WebRtc_UWord8 codeRateDelta, float totalRate, |
| WebRtc_UWord8 packetLoss, bool frameType); |
| |
| private: |
| // Previous state of network parameters |
| float _prevTotalRate; |
| WebRtc_UWord32 _prevRttTime; |
| WebRtc_UWord8 _prevPacketLoss; |
| |
| // Previous FEC rate |
| WebRtc_UWord8 _prevCodeRateDelta; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // WEBRTC_MODULES_VIDEO_CODING_QM_SELECT_H_ |