Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(238)

Unified Diff: webrtc/modules/video_coding/utility/quality_scaler.h

Issue 2398963003: Move usage of QualityScaler to ViEEncoder. (Closed)
Patch Set: rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_
« no previous file with comments | « webrtc/modules/video_coding/generic_encoder.cc ('k') | webrtc/modules/video_coding/utility/quality_scaler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698