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

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

Issue 2398963003: Move usage of QualityScaler to ViEEncoder. (Closed)
Patch Set: Code review 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..ec6de00fca7d08a5c600dceccd6998cc46369420 100644
--- a/webrtc/modules/video_coding/utility/quality_scaler.h
+++ b/webrtc/modules/video_coding/utility/quality_scaler.h
@@ -11,59 +11,85 @@
#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/video_frame.h"
magjed_webrtc 2016/10/27 11:45:57 Remove this unused include as well as the i420_buf
kthelgason 2016/10/28 13:20:15 Done.
+#include "webrtc/base/optional.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 ScalingObserverInterface {
+ public:
+ enum ScaleReason { kQuality, kCpu };
sprang_webrtc 2016/10/27 13:43:48 prefer enum class
kthelgason 2016/10/28 13:20:15 I get that strongly-typed enums have several benef
sprang_webrtc 2016/10/31 10:24:31 I'd still go with an enum class, and be more expli
sprang_webrtc 2016/11/14 10:25:38 No?
+ static const size_t ScaleReasonSize = 2;
sprang_webrtc 2016/10/27 13:43:48 nit: kScaleReasonSize or SCALE_REASON_SIZE
kthelgason 2016/10/28 13:20:15 Done.
+ // 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;
+ typedef std::pair<int, int> QPThresholds;
sprang_webrtc 2016/10/27 13:43:48 I'd prefer a simple struct, just because threshold
kthelgason 2016/10/28 13:20:15 Done.
+ 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;
};
- 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);
+ // Construct a QualityScaler with a given |observer|
+ explicit QualityScaler(ScalingObserverInterface* observer);
+ virtual ~QualityScaler();
+ // Init starts the quality scaler periodically checking what the average QP
+ // has been recently.
+ void Init(VideoCodecType codec_type);
+ // If specific thresholds are desired these can be supplied as |thresholds|.
+ void Init(QPThresholds thresholds);
+ // 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();
magjed_webrtc 2016/10/27 11:45:57 nit: I don't think the name 'Timeout' is appropria
kthelgason 2016/10/28 13:20:15 I agree that is a better approach. I didn't see a
private:
+ class CheckQPTask;
+ void CheckQP();
void ClearSamples();
- void ScaleUp();
- void ScaleDown();
- void UpdateTargetResolution(int width, int height);
+ void ReportQPLow();
+ void ReportQPHigh();
- I420BufferPool pool_;
+ ScalingObserverInterface* observer_ GUARDED_BY(&task_checker_);
sprang_webrtc 2016/10/27 13:43:48 ScalingObserverInterface* const observer_
kthelgason 2016/10/28 13:20:15 Done.
+ CheckQPTask* check_qp_task_ 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_;
+ bool fast_rampup_ GUARDED_BY(&task_checker_);
+ int64_t measure_interval_ GUARDED_BY(&task_checker_);
magjed_webrtc 2016/10/27 11:45:57 nit: I would like to add a 'sec' suffix to the var
kthelgason 2016/10/28 13:20:15 Done.
+ MovingAverage average_qp_ GUARDED_BY(&task_checker_);
+ MovingAverage framedrop_percent_ GUARDED_BY(&task_checker_);
- int low_qp_threshold_;
- int high_qp_threshold_;
- Resolution target_res_;
+ int low_qp_threshold_ GUARDED_BY(&task_checker_);
+ int high_qp_threshold_ GUARDED_BY(&task_checker_);
sprang_webrtc 2016/10/27 13:43:48 Maybe a single QPThresholds member?
kthelgason 2016/10/28 13:20:15 Done.
- int downscale_shift_;
- int maximum_shift_;
+ static const auto scale_reason_ = ScalingObserverInterface::kQuality;
sprang_webrtc 2016/10/27 13:43:48 Prefer not to use auto here.
kthelgason 2016/10/28 13:20:15 Why? the type should be completely obvious from th
sprang_webrtc 2016/10/31 10:24:31 If you change to an enum class, maybe. Otherwise s
magjed_webrtc 2016/11/10 13:06:59 It's not allowed to use auto for non-local variabl
};
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698