Index: webrtc/modules/video_coding/utility/quality_scaler.h |
diff --git a/webrtc/modules/video_coding/utility/quality_scaler.h b/webrtc/modules/video_coding/utility/quality_scaler.h |
index c0f94409ce30ee0d5b46260857bc42f696f72c01..5734e6647e653dd4c99a74145b047e1d48aa4e1e 100644 |
--- a/webrtc/modules/video_coding/utility/quality_scaler.h |
+++ b/webrtc/modules/video_coding/utility/quality_scaler.h |
@@ -11,61 +11,73 @@ |
#ifndef WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_ |
#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_ |
+#include <utility> |
+ |
#include "webrtc/common_types.h" |
-#include "webrtc/common_video/include/i420_buffer_pool.h" |
+#include "webrtc/video_encoder.h" |
+#include "webrtc/base/optional.h" |
+#include "webrtc/base/sequenced_task_checker.h" |
#include "webrtc/modules/video_coding/utility/moving_average.h" |
namespace webrtc { |
-class QualityScaler { |
+ |
+// An interface for a class that receives scale up/down requests. |
+class ScalingObserverInterface { |
public: |
- struct Resolution { |
- int width; |
- int height; |
- }; |
+ enum ScaleReason : size_t { kQuality = 0, kCpu = 1 }; |
+ static const size_t kScaleReasonSize = 2; |
+ // Called to signal that we can handle larger frames. |
+ virtual void ScaleUp(ScaleReason reason) = 0; |
+ // Called to signal that encoder to scale down. |
+ virtual void ScaleDown(ScaleReason reason) = 0; |
- QualityScaler(); |
- void Init(VideoCodecType codec_type, |
- int initial_bitrate_kbps, |
- int width, |
- int height, |
- int fps); |
- void Init(int low_qp_threshold, |
- int high_qp_threshold, |
- int initial_bitrate_kbps, |
- int width, |
- int height, |
- int fps); |
- void ReportFramerate(int framerate); |
- void ReportQP(int qp); |
+ protected: |
+ virtual ~ScalingObserverInterface() {} |
+}; |
+ |
+// QualityScaler runs asynchronously and monitors QP values of encoded frames. |
+// It holds a reference to a ScalingObserverInterface implementation to signal |
+// an intent to scale up or down. |
+class QualityScaler { |
+ public: |
+ // Construct a QualityScaler with a given |observer|. |
+ // This starts the quality scaler periodically checking what the average QP |
+ // has been recently. |
+ QualityScaler(ScalingObserverInterface* observer, VideoCodecType codec_type); |
+ // If specific thresholds are desired these can be supplied as |thresholds|. |
+ QualityScaler(ScalingObserverInterface* observer, |
+ VideoEncoder::QpThresholds thresholds); |
+ virtual ~QualityScaler(); |
+ // Should be called each time the encoder drops a frame |
void ReportDroppedFrame(); |
- void OnEncodeFrame(int width, int height); |
- Resolution GetScaledResolution() const; |
- rtc::scoped_refptr<VideoFrameBuffer> GetScaledBuffer( |
- const rtc::scoped_refptr<VideoFrameBuffer>& frame); |
- int downscale_shift() const { return downscale_shift_; } |
+ // Inform the QualityScaler of the last seen QP. |
+ void ReportQP(int qp); |
+ |
+ // The following members declared protected for testing purposes |
+ protected: |
+ QualityScaler(ScalingObserverInterface* observer, |
+ VideoEncoder::QpThresholds thresholds, |
+ int64_t sampling_period); |
private: |
+ class CheckQPTask; |
+ void CheckQP(); |
void ClearSamples(); |
- void ScaleUp(); |
- void ScaleDown(); |
- void UpdateTargetResolution(int width, int height); |
- |
- I420BufferPool pool_; |
+ void ReportQPLow(); |
+ void ReportQPHigh(); |
+ int64_t GetSamplingPeriodMs() const; |
- size_t num_samples_downscale_; |
- size_t num_samples_upscale_; |
- bool fast_rampup_; |
- MovingAverage average_qp_; |
- MovingAverage framedrop_percent_; |
+ CheckQPTask* check_qp_task_ GUARDED_BY(&task_checker_); |
+ ScalingObserverInterface* const observer_ GUARDED_BY(&task_checker_); |
+ rtc::SequencedTaskChecker task_checker_; |
- int low_qp_threshold_; |
- int high_qp_threshold_; |
- Resolution target_res_; |
+ const int64_t sampling_period_ms_; |
+ bool fast_rampup_ GUARDED_BY(&task_checker_); |
+ MovingAverage average_qp_ GUARDED_BY(&task_checker_); |
+ MovingAverage framedrop_percent_ GUARDED_BY(&task_checker_); |
- int downscale_shift_; |
- int maximum_shift_; |
+ VideoEncoder::QpThresholds thresholds_ GUARDED_BY(&task_checker_); |
}; |
- |
} // namespace webrtc |
#endif // WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_ |