| 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_
|
|
|