| Index: webrtc/video/video_send_stream.cc
|
| diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
|
| index 7ae55dcf72af857985f368602967764f3735ae82..c98e5187dbbaae1443b33bff14be403788742357 100644
|
| --- a/webrtc/video/video_send_stream.cc
|
| +++ b/webrtc/video/video_send_stream.cc
|
| @@ -171,6 +171,9 @@ VideoSendStream::VideoSendStream(
|
| call_stats_(call_stats),
|
| congestion_controller_(congestion_controller),
|
| remb_(remb),
|
| + encoder_thread_(EncoderThreadFunction, this, "EncoderThread"),
|
| + encoder_wakeup_event_(false, false),
|
| + stop_encoder_thread_(0),
|
| overuse_detector_(
|
| Clock::GetRealTimeClock(),
|
| GetCpuOveruseOptions(config.encoder_settings.full_overuse_time),
|
| @@ -203,7 +206,7 @@ VideoSendStream::VideoSendStream(
|
| bitrate_allocator),
|
| vcm_(vie_encoder_.vcm()),
|
| rtp_rtcp_modules_(vie_channel_.rtp_rtcp()),
|
| - input_(&vie_encoder_,
|
| + input_(&encoder_wakeup_event_,
|
| config_.local_renderer,
|
| &stats_proxy_,
|
| &overuse_detector_) {
|
| @@ -303,12 +306,20 @@ VideoSendStream::VideoSendStream(
|
| vie_channel_.RegisterSendFrameCountObserver(&stats_proxy_);
|
|
|
| module_process_thread_->RegisterModule(&overuse_detector_);
|
| +
|
| + encoder_thread_.Start();
|
| + encoder_thread_.SetPriority(rtc::kHighPriority);
|
| }
|
|
|
| VideoSendStream::~VideoSendStream() {
|
| LOG(LS_INFO) << "~VideoSendStream: " << config_.ToString();
|
| Stop();
|
|
|
| + // Stop the encoder thread permanently.
|
| + rtc::AtomicOps::ReleaseStore(&stop_encoder_thread_, 1);
|
| + encoder_wakeup_event_.Set();
|
| + encoder_thread_.Stop();
|
| +
|
| module_process_thread_->DeRegisterModule(&overuse_detector_);
|
| vie_channel_.RegisterSendFrameCountObserver(nullptr);
|
| vie_channel_.RegisterSendBitrateObserver(nullptr);
|
| @@ -351,6 +362,24 @@ void VideoSendStream::Stop() {
|
| vie_receiver_->StopReceive();
|
| }
|
|
|
| +bool VideoSendStream::EncoderThreadFunction(void* obj) {
|
| + static_cast<VideoSendStream*>(obj)->EncoderProcess();
|
| + // We're done, return false to abort.
|
| + return false;
|
| +}
|
| +
|
| +void VideoSendStream::EncoderProcess() {
|
| + while (true) {
|
| + encoder_wakeup_event_.Wait(rtc::Event::kForever);
|
| + if (rtc::AtomicOps::AcquireLoad(&stop_encoder_thread_))
|
| + return;
|
| +
|
| + VideoFrame frame;
|
| + if (input_.GetVideoFrame(&frame))
|
| + vie_encoder_.EncodeVideoFrame(frame);
|
| + }
|
| +}
|
| +
|
| void VideoSendStream::ReconfigureVideoEncoder(
|
| const VideoEncoderConfig& config) {
|
| TRACE_EVENT0("webrtc", "VideoSendStream::(Re)configureVideoEncoder");
|
|
|