From dfbf52baac1a270dd18ae18c9f9bd729a780659b Mon Sep 17 00:00:00 2001 From: "mflodman@webrtc.org" Date: Mon, 2 Sep 2013 12:44:57 +0000 Subject: [PATCH] Fixing capture frame race in ViECapturer. git-svn-id: http://webrtc.googlecode.com/svn/trunk@4654 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/video_engine/vie_capturer.cc | 18 +++++++++++------- webrtc/video_engine/vie_capturer.h | 2 ++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/webrtc/video_engine/vie_capturer.cc b/webrtc/video_engine/vie_capturer.cc index cc08ffaae1..8629a1cd86 100644 --- a/webrtc/video_engine/vie_capturer.cc +++ b/webrtc/video_engine/vie_capturer.cc @@ -511,13 +511,7 @@ bool ViECapturer::ViECaptureThreadFunction(void* obj) { bool ViECapturer::ViECaptureProcess() { if (capture_event_.Wait(kThreadWaitTimeMs) == kEventSignaled) { deliver_cs_->Enter(); - if (!captured_frame_.IsZeroSize()) { - // New I420 frame. - capture_cs_->Enter(); - deliver_frame_.SwapFrame(&captured_frame_); - captured_frame_.ResetSize(); - capture_cs_->Leave(); - + if (MaybeSwapCapturedToDeliverFrame()) { DeliverI420Frame(&deliver_frame_); } deliver_cs_->Leave(); @@ -652,4 +646,14 @@ void ViECapturer::OnNoPictureAlarm(const int32_t id, observer_->NoPictureAlarm(id, vie_alarm); } +bool ViECapturer::MaybeSwapCapturedToDeliverFrame() { + CriticalSectionScoped cs(capture_cs_.get()); + if (captured_frame_.IsZeroSize()) + return false; + + deliver_frame_.SwapFrame(&captured_frame_); + captured_frame_.ResetSize(); + return true; +} + } // namespace webrtc diff --git a/webrtc/video_engine/vie_capturer.h b/webrtc/video_engine/vie_capturer.h index ff656ffde3..db12a59a84 100644 --- a/webrtc/video_engine/vie_capturer.h +++ b/webrtc/video_engine/vie_capturer.h @@ -144,6 +144,8 @@ class ViECapturer void DeliverCodedFrame(VideoFrame* video_frame); private: + bool MaybeSwapCapturedToDeliverFrame(); + // Never take capture_cs_ before deliver_cs_! scoped_ptr capture_cs_; scoped_ptr deliver_cs_;