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..31cf858d7b8e0be2e4330ff2816863458cec8b65 100644 |
--- a/webrtc/modules/video_coding/utility/quality_scaler.h |
+++ b/webrtc/modules/video_coding/utility/quality_scaler.h |
@@ -11,61 +11,88 @@ |
#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/base/optional.h" |
+#include "webrtc/base/sequenced_task_checker.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: |
+ enum ScaleReason { kQuality, kCpu }; |
+ 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; |
+ |
+ 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; |
+ struct QPThresholds { |
+ QPThresholds(int l, int h) : low(l), high(h) {} |
+ QPThresholds() : low(-1), high(-1) {} |
+ int low; |
+ int high; |
}; |
+ struct Settings { |
+ Settings(bool on, int low, int high) |
+ : enabled(on), |
+ thresholds(rtc::Optional<QPThresholds>(QPThresholds(low, high))) {} |
+ explicit Settings(bool on) : enabled(on) {} |
+ const bool enabled; |
+ const rtc::Optional<QPThresholds> thresholds; |
+ }; |
+ |
+ // 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, QPThresholds thresholds); |
+ virtual ~QualityScaler(); |
+ // Should be called each time the encoder drops a frame |
+ void ReportDroppedFrame() const; |
magjed_webrtc
2016/11/10 13:07:00
I don't think this function or ReportQP should be
kthelgason
2016/11/10 15:38:27
Acknowledged.
|
+ // Inform the QualityScaler of the last seen QP. |
+ void ReportQP(int qp) const; |
+ |
+ // This method declared virtual to help with testing. |
magjed_webrtc
2016/11/10 13:07:00
It's not virtual anymore and not used for testing,
kthelgason
2016/11/10 15:38:27
Done.
|
+ int64_t GetSamplingPeriodMs() const; |
- 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); |
- 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_; } |
+ // The following members declared protected for testing purposes |
+ protected: |
+ QualityScaler(ScalingObserverInterface* observer, |
+ QPThresholds thresholds, |
+ int64_t sampling_period); |
private: |
+ class CheckQPTask; |
+ void CheckQP(); |
void ClearSamples(); |
- void ScaleUp(); |
- void ScaleDown(); |
- void UpdateTargetResolution(int width, int height); |
+ void ReportQPLow(); |
+ void ReportQPHigh(); |
- I420BufferPool pool_; |
+ CheckQPTask* check_qp_task_ GUARDED_BY(&task_checker_); |
+ ScalingObserverInterface* const observer_ GUARDED_BY(&task_checker_); |
+ rtc::SequencedTaskChecker task_checker_; |
- size_t num_samples_downscale_; |
- size_t num_samples_upscale_; |
- bool fast_rampup_; |
- MovingAverage average_qp_; |
- MovingAverage framedrop_percent_; |
+ int64_t sampling_period_ms_; |
+ bool fast_rampup_ GUARDED_BY(&task_checker_); |
+ mutable MovingAverage average_qp_ GUARDED_BY(&task_checker_); |
magjed_webrtc
2016/11/10 13:07:00
I don't think these should be mutable unless you h
kthelgason
2016/11/10 15:38:27
I made these mutable and the report{QP, DroppedFra
|
+ mutable MovingAverage framedrop_percent_ GUARDED_BY(&task_checker_); |
- int low_qp_threshold_; |
- int high_qp_threshold_; |
- Resolution target_res_; |
- |
- int downscale_shift_; |
- int maximum_shift_; |
+ QPThresholds thresholds_ GUARDED_BY(&task_checker_); |
}; |
- |
} // namespace webrtc |
#endif // WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_ |