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}
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 bb643bf..48287a2 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 @@
Clock* const clock_;
rtc::scoped_ptr<CriticalSectionWrapper> 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 6336e0e..9ecd926 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 @@
: 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 @@
CriticalSectionScoped receive_cs(_receiveCritSect);
_codecDataBase.ResetReceiver();
_timing.Reset();
- _receiverInited = true;
}
{
@@ -349,12 +347,6 @@
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 48a6299..b08f2e9 100644
--- a/webrtc/video_engine/vie_channel.cc
+++ b/webrtc/video_engine/vie_channel.cc
@@ -1752,6 +1752,8 @@
}
bool ViEChannel::ChannelDecodeProcess() {
+ // TODO(pbos): Make sure the decoder thread doesn't run for send-only
+ // channels.
vcm_->Decode(kMaxDecodeWaitTimeMs);
return true;
}