From 3949e8666e5920a5b90c4f585485fc0be81ed046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Bostr=C3=B6m?= Date: Fri, 10 Apr 2015 15:36:33 +0200 Subject: [PATCH] Prevent decoder busy loop for send-only channels. ViEChannels without default encoders doesn't register a receive codec by default. This makes VideoReceiver::Decode return early, causing a high-priority thread to effectively be busy looping. This would be expected to wreck more havoc in a more cross-platform manner than it has visibly done. On Windows XP however it manages to bring the whole machine to a grinding halt forcing a reboot if CPU usage hits 100%. BUG=chromium:470013 R=stefan@webrtc.org Review URL: https://webrtc-codereview.appspot.com/48049004 Cr-Commit-Position: refs/heads/master@{#8976} --- .../modules/video_coding/main/source/video_coding_impl.h | 1 - webrtc/modules/video_coding/main/source/video_receiver.cc | 8 -------- webrtc/video_engine/vie_channel.cc | 2 ++ 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/webrtc/modules/video_coding/main/source/video_coding_impl.h b/webrtc/modules/video_coding/main/source/video_coding_impl.h index bb643bf20..48287a22e 100644 --- a/webrtc/modules/video_coding/main/source/video_coding_impl.h +++ b/webrtc/modules/video_coding/main/source/video_coding_impl.h @@ -218,7 +218,6 @@ class VideoReceiver { Clock* const clock_; rtc::scoped_ptr process_crit_sect_; CriticalSectionWrapper* _receiveCritSect; - bool _receiverInited GUARDED_BY(_receiveCritSect); VCMTiming _timing; VCMReceiver _receiver; VCMDecodedFrameCallback _decodedFrameCallback; diff --git a/webrtc/modules/video_coding/main/source/video_receiver.cc b/webrtc/modules/video_coding/main/source/video_receiver.cc index 6336e0e80..9ecd926ab 100644 --- a/webrtc/modules/video_coding/main/source/video_receiver.cc +++ b/webrtc/modules/video_coding/main/source/video_receiver.cc @@ -28,7 +28,6 @@ VideoReceiver::VideoReceiver(Clock* clock, EventFactory* event_factory) : clock_(clock), process_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()), _receiveCritSect(CriticalSectionWrapper::CreateCriticalSection()), - _receiverInited(false), _timing(clock_), _receiver(&_timing, clock_, event_factory, true), _decodedFrameCallback(_timing, clock_), @@ -257,7 +256,6 @@ int32_t VideoReceiver::InitializeReceiver() { CriticalSectionScoped receive_cs(_receiveCritSect); _codecDataBase.ResetReceiver(); _timing.Reset(); - _receiverInited = true; } { @@ -349,12 +347,6 @@ int32_t VideoReceiver::Decode(uint16_t maxWaitTimeMs) { bool supports_render_scheduling; { CriticalSectionScoped cs(_receiveCritSect); - if (!_receiverInited) { - return VCM_UNINITIALIZED; - } - if (!_codecDataBase.DecoderRegistered()) { - return VCM_NO_CODEC_REGISTERED; - } supports_render_scheduling = _codecDataBase.SupportsRenderScheduling(); } diff --git a/webrtc/video_engine/vie_channel.cc b/webrtc/video_engine/vie_channel.cc index 48a6299ab..b08f2e95e 100644 --- a/webrtc/video_engine/vie_channel.cc +++ b/webrtc/video_engine/vie_channel.cc @@ -1752,6 +1752,8 @@ bool ViEChannel::ChannelDecodeThreadFunction(void* obj) { } bool ViEChannel::ChannelDecodeProcess() { + // TODO(pbos): Make sure the decoder thread doesn't run for send-only + // channels. vcm_->Decode(kMaxDecodeWaitTimeMs); return true; }