diff options
author | mflodman@webrtc.org <mflodman@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-09-02 12:44:57 +0000 |
---|---|---|
committer | mflodman@webrtc.org <mflodman@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-09-02 12:44:57 +0000 |
commit | a594db2bf300734ca90d480974362ad055bc5903 (patch) | |
tree | c39740fa6778647f6204356816b1c44907c7f78b /video_engine/vie_capturer.cc | |
parent | 88a2327d041b6865d34efa223f0be82c0472c70d (diff) | |
download | webrtc-a594db2bf300734ca90d480974362ad055bc5903.tar.gz |
Fixing capture frame race in ViECapturer.
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@4654 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'video_engine/vie_capturer.cc')
-rw-r--r-- | video_engine/vie_capturer.cc | 18 |
1 files changed, 11 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 |