Index: webrtc/video/vie_encoder.h |
diff --git a/webrtc/video/vie_encoder.h b/webrtc/video/vie_encoder.h |
index 33caec42f49c3db85f36bc2498c274ddb851b279..b89f66e9d9707a2ee8484368aefd1abf978c0c07 100644 |
--- a/webrtc/video/vie_encoder.h |
+++ b/webrtc/video/vie_encoder.h |
@@ -60,11 +60,13 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
int min_transmit_bitrate_bps) = 0; |
}; |
+ // Down grade resolution at most 2 times for CPU reasons. |
+ static const int kMaxCpuDowngrades = 2; |
+ |
ViEEncoder(uint32_t number_of_cores, |
SendStatisticsProxy* stats_proxy, |
- const webrtc::VideoSendStream::Config::EncoderSettings& settings, |
+ const VideoSendStream::Config::EncoderSettings& settings, |
rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback, |
- LoadObserver* overuse_callback, |
EncodedFrameObserver* encoder_timing); |
~ViEEncoder(); |
// RegisterProcessThread register |module_process_thread| with those objects |
@@ -74,8 +76,17 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
void RegisterProcessThread(ProcessThread* module_process_thread); |
void DeRegisterProcessThread(); |
- void SetSource(rtc::VideoSourceInterface<VideoFrame>* source); |
- void SetSink(EncoderSink* sink); |
+ // Sets the source that will provide I420 video frames. |
+ // |degradation_preference| control whether or not resolution or frame rate |
+ // may be reduced. |
+ void SetSource( |
+ rtc::VideoSourceInterface<VideoFrame>* source, |
+ const VideoSendStream::DegradationPreference& degradation_preference); |
+ |
+ // Sets the |sink| that gets the encoded frames. |rotation_applied| means |
+ // that the source must support rotation. Only set |rotation_applied| if the |
+ // remote side does not support the rotation extension. |
+ void SetSink(EncoderSink* sink, bool rotation_applied); |
// TODO(perkj): Can we remove VideoCodec.startBitrate ? |
void SetStartBitrate(int start_bitrate_bps); |
@@ -98,6 +109,16 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
uint8_t fraction_lost, |
int64_t round_trip_time_ms); |
+ protected: |
+ // Used for testing. For example the |CpuOveruseObserver| methods must be |
+ // called on |encoder_queue_|. |
+ rtc::TaskQueue* encoder_queue() { return &encoder_queue_; } |
+ |
+ // webrtc::CpuOveruseObserver implementation. |
+ // These methods are protected for easier testing. |
+ void OveruseDetected() override; |
+ void NormalUsage() override; |
+ |
private: |
class ConfigureEncoderTask; |
class EncodeTask; |
@@ -138,10 +159,6 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
const CodecSpecificInfo* codec_specific_info, |
const RTPFragmentationHeader* fragmentation) override; |
- // webrtc::CpuOveruseObserver implementation. |
- void OveruseDetected() override; |
- void NormalUsage() override; |
- |
bool EncoderPaused() const; |
void TraceFrameDropStart(); |
void TraceFrameDropEnd(); |
@@ -156,9 +173,7 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
const VideoCodecType codec_type_; |
vcm::VideoSender video_sender_ ACCESS_ON(&encoder_queue_); |
- |
OveruseFrameDetector overuse_detector_ ACCESS_ON(&encoder_queue_); |
- LoadObserver* const load_observer_ ACCESS_ON(&encoder_queue_); |
SendStatisticsProxy* const stats_proxy_; |
rtc::VideoSinkInterface<VideoFrame>* const pre_encode_callback_; |
@@ -189,12 +204,26 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>, |
uint64_t picture_id_rpsi_ ACCESS_ON(&encoder_queue_); |
Clock* const clock_; |
- rtc::RaceChecker incoming_frame_race_checker_; |
+ 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_); |
+ |
+ int last_frame_width_ ACCESS_ON(&encoder_queue_); |
+ int last_frame_height_ ACCESS_ON(&encoder_queue_); |
+ // Pixel count last time the resolution was requested to be changed down. |
+ rtc::Optional<int> max_pixel_count_ ACCESS_ON(&encoder_queue_); |
+ // Pixel count last time the resolution was requested to be changed up. |
+ rtc::Optional<int> max_pixel_count_step_up_ ACCESS_ON(&encoder_queue_); |
+ |
+ rtc::RaceChecker incoming_frame_race_checker_ |
+ GUARDED_BY(incoming_frame_race_checker_); |
Atomic32 posted_frames_waiting_for_encode_; |
// Used to make sure incoming time stamp is increasing for every frame. |
int64_t last_captured_timestamp_ GUARDED_BY(incoming_frame_race_checker_); |
// Delta used for translating between NTP and internal timestamps. |
- const int64_t delta_ntp_internal_ms_; |
+ const int64_t delta_ntp_internal_ms_ GUARDED_BY(incoming_frame_race_checker_); |
int64_t last_frame_log_ms_ GUARDED_BY(incoming_frame_race_checker_); |
int captured_frame_count_ ACCESS_ON(&encoder_queue_); |