Index: webrtc/video/vie_encoder.cc |
diff --git a/webrtc/video/vie_encoder.cc b/webrtc/video/vie_encoder.cc |
index f6545431291b517235dfcc77c0e3261e44fa7d3d..118959ebecd89a40e42f6f6cd914b52b571b40b4 100644 |
--- a/webrtc/video/vie_encoder.cc |
+++ b/webrtc/video/vie_encoder.cc |
@@ -199,8 +199,11 @@ CpuOveruseOptions GetCpuOveruseOptions(bool full_overuse_time) { |
class ViEEncoder::EncodeTask : public rtc::QueuedTask { |
public: |
- EncodeTask(const VideoFrame& frame, ViEEncoder* vie_encoder) |
- : vie_encoder_(vie_encoder) { |
+ EncodeTask(const VideoFrame& frame, |
+ ViEEncoder* vie_encoder, |
+ int64_t time_when_posted_in_ms) |
+ : vie_encoder_(vie_encoder), |
+ time_when_posted_ms_(time_when_posted_in_ms) { |
frame_.ShallowCopy(frame); |
++vie_encoder_->posted_frames_waiting_for_encode_; |
} |
@@ -209,7 +212,7 @@ class ViEEncoder::EncodeTask : public rtc::QueuedTask { |
bool Run() override { |
RTC_DCHECK_GT(vie_encoder_->posted_frames_waiting_for_encode_.Value(), 0); |
if (--vie_encoder_->posted_frames_waiting_for_encode_ == 0) { |
- vie_encoder_->EncodeVideoFrame(frame_); |
+ vie_encoder_->EncodeVideoFrame(frame_, time_when_posted_ms_); |
} else { |
// There is a newer frame in flight. Do not encode this frame. |
LOG(LS_VERBOSE) |
@@ -218,7 +221,8 @@ class ViEEncoder::EncodeTask : public rtc::QueuedTask { |
return true; |
} |
VideoFrame frame_; |
- ViEEncoder* vie_encoder_; |
+ ViEEncoder* const vie_encoder_; |
+ const int64_t time_when_posted_ms_; |
}; |
ViEEncoder::ViEEncoder(uint32_t number_of_cores, |
@@ -256,10 +260,11 @@ ViEEncoder::ViEEncoder(uint32_t number_of_cores, |
encoder_queue_("EncoderQueue") { |
vp_->EnableTemporalDecimation(false); |
- encoder_queue_.PostTask([this] { |
+ encoder_queue_.PostTask([this, encoder_timing] { |
RTC_DCHECK_RUN_ON(&encoder_queue_); |
video_sender_.RegisterExternalEncoder( |
settings_.encoder, settings_.payload_type, settings_.internal_source); |
+ overuse_detector_.StartCheckForOveruse(); |
}); |
} |
@@ -276,19 +281,18 @@ void ViEEncoder::Stop() { |
} |
RTC_DCHECK_RUN_ON(&encoder_queue_); |
video_sender_.RegisterExternalEncoder(nullptr, settings_.payload_type, false); |
+ overuse_detector_.StopCheckForOveruse(); |
shutdown_event_.Set(); |
} |
void ViEEncoder::RegisterProcessThread(ProcessThread* module_process_thread) { |
RTC_DCHECK(!module_process_thread_); |
module_process_thread_ = module_process_thread; |
- module_process_thread_->RegisterModule(&overuse_detector_); |
module_process_thread_->RegisterModule(&video_sender_); |
module_process_thread_checker_.DetachFromThread(); |
} |
void ViEEncoder::DeRegisterProcessThread() { |
- module_process_thread_->DeRegisterModule(&overuse_detector_); |
module_process_thread_->DeRegisterModule(&video_sender_); |
} |
@@ -397,9 +401,8 @@ void ViEEncoder::IncomingCapturedFrame(const VideoFrame& video_frame) { |
} |
last_captured_timestamp_ = incoming_frame.ntp_time_ms(); |
- overuse_detector_.FrameCaptured(incoming_frame); |
- encoder_queue_.PostTask( |
- std::unique_ptr<rtc::QueuedTask>(new EncodeTask(incoming_frame, this))); |
+ encoder_queue_.PostTask(std::unique_ptr<rtc::QueuedTask>( |
+ new EncodeTask(incoming_frame, this, clock_->TimeInMilliseconds()))); |
} |
bool ViEEncoder::EncoderPaused() const { |
@@ -430,7 +433,8 @@ void ViEEncoder::TraceFrameDropEnd() { |
encoder_paused_and_dropped_frame_ = false; |
} |
-void ViEEncoder::EncodeVideoFrame(const VideoFrame& video_frame) { |
+void ViEEncoder::EncodeVideoFrame(const VideoFrame& video_frame, |
+ int64_t time_when_posted_in_ms) { |
RTC_DCHECK_RUN_ON(&encoder_queue_); |
if (pre_encode_callback_) |
pre_encode_callback_->OnFrame(video_frame); |
@@ -454,6 +458,8 @@ void ViEEncoder::EncodeVideoFrame(const VideoFrame& video_frame) { |
} |
} |
+ overuse_detector_.FrameCaptured(video_frame, time_when_posted_in_ms); |
+ |
if (encoder_config_.codecType == webrtc::kVideoCodecVP8) { |
webrtc::CodecSpecificInfo codec_specific_info; |
codec_specific_info.codecType = webrtc::kVideoCodecVP8; |
@@ -498,7 +504,12 @@ EncodedImageCallback::Result ViEEncoder::OnEncodedImage( |
EncodedImageCallback::Result result = |
sink_->OnEncodedImage(encoded_image, codec_specific_info, fragmentation); |
- overuse_detector_.FrameSent(encoded_image._timeStamp); |
+ int64_t time_sent = clock_->TimeInMilliseconds(); |
+ uint32_t timestamp = encoded_image._timeStamp; |
+ encoder_queue_.PostTask([this, timestamp, time_sent] { |
+ RTC_DCHECK_RUN_ON(&encoder_queue_); |
+ overuse_detector_.FrameSent(timestamp, time_sent); |
+ }); |
return result; |
} |
@@ -575,7 +586,7 @@ void ViEEncoder::OnBitrateUpdated(uint32_t bitrate_bps, |
} |
void ViEEncoder::OveruseDetected() { |
- RTC_DCHECK_RUN_ON(&module_process_thread_checker_); |
+ RTC_DCHECK_RUN_ON(&encoder_queue_); |
// TODO(perkj): When ViEEncoder inherit rtc::VideoSink instead of |
// VideoCaptureInput |load_observer_| should be removed and overuse be |
// expressed as rtc::VideoSinkWants instead. |
@@ -584,7 +595,7 @@ void ViEEncoder::OveruseDetected() { |
} |
void ViEEncoder::NormalUsage() { |
- RTC_DCHECK_RUN_ON(&module_process_thread_checker_); |
+ RTC_DCHECK_RUN_ON(&encoder_queue_); |
if (load_observer_) |
load_observer_->OnLoadUpdate(LoadObserver::kUnderuse); |
} |