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

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

Issue 2398963003: Move usage of QualityScaler to ViEEncoder. (Closed)
Patch Set: Code review comments Created 4 years, 2 months 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..c8fc3dc7d05d7d4cc9e8eb6308305b9bb27776a1 100644
--- a/webrtc/modules/video_coding/utility/quality_scaler.h
+++ b/webrtc/modules/video_coding/utility/quality_scaler.h
@@ -12,10 +12,28 @@
#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_
#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 ScalingInterface {
magjed_webrtc 2016/10/07 12:02:54 Put 'observer' somewhere in the name, e.g. Scaling
kthelgason 2016/10/07 13:54:48 Done.
+ 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 ~ScalingInterface() {}
+};
+
+// QualityScaler runs asynchronously and monitors QP values of encoded frames.
+// It holds a reference to a ScalingInterface implementation to signal
+// an intent to scale up or down.
class QualityScaler {
public:
struct Resolution {
@@ -24,46 +42,47 @@ class QualityScaler {
};
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::ScalingInterface.
+ // codec_type: either H264 or VP8, used to determine default thresholds.
+ void Init(ScalingInterface* obeserver_, VideoCodecType codec_type);
+ // If specific thresholds are desired these can be supplied instead of
+ // codec_type_.
+ void Init(ScalingInterface* 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_;
+ ScalingInterface* 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

Powered by Google App Engine
This is Rietveld 408576698