Index: webrtc/video/vie_encoder.h |
diff --git a/webrtc/video/vie_encoder.h b/webrtc/video/vie_encoder.h |
index 8373a3f51d587c3bfba9ac804233a36c5d828599..12669622d12ebf89f9f7616fa88cf15905e4a96b 100644 |
--- a/webrtc/video/vie_encoder.h |
+++ b/webrtc/video/vie_encoder.h |
@@ -25,6 +25,7 @@ |
#include "webrtc/common_video/rotation.h" |
#include "webrtc/media/base/videosinkinterface.h" |
#include "webrtc/modules/video_coding/include/video_coding_defines.h" |
+#include "webrtc/modules/video_coding/utility/quality_scaler.h" |
#include "webrtc/modules/video_coding/video_coding_impl.h" |
#include "webrtc/modules/video_processing/include/video_processing.h" |
#include "webrtc/system_wrappers/include/atomic32.h" |
@@ -49,7 +50,7 @@ class SendStatisticsProxy; |
class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
public EncodedImageCallback, |
public VCMSendStatisticsCallback, |
- public CpuOveruseObserver { |
+ public ScalingObserverInterface { |
public: |
// Interface for receiving encoded video frames and notifications about |
// configuration changes. |
@@ -60,8 +61,10 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
int min_transmit_bitrate_bps) = 0; |
}; |
- // Down grade resolution at most 2 times for CPU reasons. |
+ // Downscale resolution at most 2 times for CPU reasons. |
static const int kMaxCpuDowngrades = 2; |
+ // Downscale resolution at most 2 times for low-quality reasons. |
+ static const int kMaxQualityDowngrades = 2; |
ViEEncoder(uint32_t number_of_cores, |
SendStatisticsProxy* stats_proxy, |
@@ -111,14 +114,14 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
int64_t round_trip_time_ms); |
protected: |
- // Used for testing. For example the |CpuOveruseObserver| methods must be |
- // called on |encoder_queue_|. |
+ // Used for testing. For example the |ScalingObserverInterface| methods must |
+ // be called on |encoder_queue_|. |
rtc::TaskQueue* encoder_queue() { return &encoder_queue_; } |
- // webrtc::CpuOveruseObserver implementation. |
+ // webrtc::ScalingObserverInterface implementation. |
// These methods are protected for easier testing. |
- void OveruseDetected() override; |
- void NormalUsage() override; |
+ void ScaleUp(ScaleReason reason) override; |
+ void ScaleDown(ScaleReason reason) override; |
private: |
class ConfigureEncoderTask; |
@@ -161,6 +164,8 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
const CodecSpecificInfo* codec_specific_info, |
const RTPFragmentationHeader* fragmentation) override; |
+ void OnDroppedFrame() override; |
+ |
bool EncoderPaused() const; |
void TraceFrameDropStart(); |
void TraceFrameDropEnd(); |
@@ -176,6 +181,7 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
vcm::VideoSender video_sender_ ACCESS_ON(&encoder_queue_); |
OveruseFrameDetector overuse_detector_ ACCESS_ON(&encoder_queue_); |
+ std::unique_ptr<QualityScaler> quality_scaler_ ACCESS_ON(&encoder_queue_); |
SendStatisticsProxy* const stats_proxy_; |
rtc::VideoSinkInterface<VideoFrame>* const pre_encode_callback_; |
@@ -203,12 +209,11 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
bool has_received_rpsi_ ACCESS_ON(&encoder_queue_); |
uint64_t picture_id_rpsi_ ACCESS_ON(&encoder_queue_); |
Clock* const clock_; |
- |
- VideoSendStream::DegradationPreference degradation_preference_ |
- ACCESS_ON(&encoder_queue_); |
- // Counter used for deciding if the video resolution is currently |
- // restricted by CPU usage. |
- int cpu_restricted_counter_ ACCESS_ON(&encoder_queue_); |
+ // Counters used for deciding if the video resolution is currently |
+ // restricted, and if so, why. |
+ int scale_counter_[kScaleReasonSize] ACCESS_ON(&encoder_queue_) = {0}; |
+ // Set depending on degradation preferences |
+ bool scaling_enabled_ ACCESS_ON(&encoder_queue_) = false; |
int last_frame_width_ ACCESS_ON(&encoder_queue_); |
int last_frame_height_ ACCESS_ON(&encoder_queue_); |