diff options
-rw-r--r-- | video_engine/vie_capturer.cc | 18 | ||||
-rw-r--r-- | video_engine/vie_capturer.h | 2 |
2 files changed, 13 insertions, 7 deletions
diff --git a/video_engine/vie_capturer.cc b/video_engine/vie_capturer.cc index cc08ffaa..8629a1cd 100644 --- a/video_engine/vie_capturer.cc +++ b/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/video_engine/vie_capturer.h b/video_engine/vie_capturer.h index ff656ffd..db12a59a 100644 --- a/video_engine/vie_capturer.h +++ b/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<CriticalSectionWrapper> capture_cs_; scoped_ptr<CriticalSectionWrapper> deliver_cs_; |