Chromium Code Reviews| 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_ |