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..0f1cec0ac51740c321801c1e03aaa63ac56de361 100644 |
--- a/webrtc/modules/video_coding/utility/quality_scaler.h |
+++ b/webrtc/modules/video_coding/utility/quality_scaler.h |
@@ -11,59 +11,88 @@ |
#ifndef WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_ |
#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_ |
+#include <memory> |
+#include <utility> |
+ |
#include "webrtc/common_types.h" |
+#include "webrtc/video_frame.h" |
+#include "webrtc/base/sequenced_task_checker.h" |
#include "webrtc/common_video/include/i420_buffer_pool.h" |
#include "webrtc/modules/video_coding/utility/moving_average.h" |
namespace webrtc { |
+ |
+// An interface for a class that receives scale up/down requests. |
+class ScalingObserverInterface { |
+ public: |
+ // Called to signal that we can handle larger frames. |
+ virtual void ScaleUp() = 0; |
+ // Called to signal that encoder to scale down. |
+ virtual void ScaleDown() = 0; |
+ |
+ 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: |
- struct Resolution { |
- int width; |
- int height; |
+ typedef std::pair<int, int> QPThresholds; |
+ struct Settings { |
+ Settings(bool on, int low, int high) : enabled(on) { |
+ thresholds = std::unique_ptr<QPThresholds>(new QPThresholds(low, high)); |
+ } |
+ explicit Settings(bool on) : enabled(on) { |
+ thresholds = std::unique_ptr<QPThresholds>(); |
magjed_webrtc
2016/10/19 13:00:12
Remove this line, it's unnecessary.
kthelgason
2016/10/19 13:07:27
Acknowledged.
|
+ } |
+ bool enabled; |
magjed_webrtc
2016/10/19 13:00:12
Make this const.
kthelgason
2016/10/19 13:07:27
Acknowledged.
|
+ std::unique_ptr<QPThresholds> thresholds; |
magjed_webrtc
2016/10/19 13:00:12
Use rtc::Optional instead to avoid an extra heap a
magjed_webrtc
2016/10/19 13:00:12
Make this const.
kthelgason
2016/10/19 13:07:27
Good point, thanks.
|
}; |
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); |
+ virtual ~QualityScaler(); |
+ // Init starts the quality scaler periodically checking what the average QP |
+ // has been recently. |
+ // arguments: |
+ // observer_: an implementation of webrtc::ScalingObserverInterface. |
+ // codec_type: either H264 or VP8, used to determine default thresholds. |
+ void Init(ScalingObserverInterface* obeserver_, VideoCodecType codec_type); |
+ // If specific thresholds are desired these can be supplied instead of |
+ // codec_type_. |
+ void Init(ScalingObserverInterface* obeserver_, |
+ int low_qp_threshold, |
+ int high_qp_threshold); |
+ // Stop must be called to stop the periodic task before QualityScaler is |
+ // destroyed. |
+ void Stop(); |
+ // 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); |
+ |
+ // This method declared virtual to help with testing. |
+ virtual int64_t GetTimeoutMs(); |
private: |
+ class CheckQPTask; |
+ void CheckQP(); |
void ClearSamples(); |
- void ScaleUp(); |
- void ScaleDown(); |
- void UpdateTargetResolution(int width, int height); |
- |
- I420BufferPool pool_; |
+ void ReportQPLow(); |
+ void ReportQPHigh(); |
- size_t num_samples_downscale_; |
- size_t num_samples_upscale_; |
- bool fast_rampup_; |
- MovingAverage average_qp_; |
- MovingAverage framedrop_percent_; |
+ ScalingObserverInterface* observer_ GUARDED_BY(&task_checker_); |
+ CheckQPTask* check_qp_task_ GUARDED_BY(&task_checker_); |
+ rtc::SequencedTaskChecker task_checker_; |
- int low_qp_threshold_; |
- int high_qp_threshold_; |
- Resolution target_res_; |
+ bool fast_rampup_ GUARDED_BY(&task_checker_); |
+ int64_t measure_interval_ GUARDED_BY(&task_checker_); |
+ MovingAverage average_qp_ GUARDED_BY(&task_checker_); |
+ MovingAverage framedrop_percent_ GUARDED_BY(&task_checker_); |
- int downscale_shift_; |
- int maximum_shift_; |
+ int low_qp_threshold_ GUARDED_BY(&task_checker_); |
+ int high_qp_threshold_ GUARDED_BY(&task_checker_); |
}; |
} // namespace webrtc |