summaryrefslogtreecommitdiff
path: root/video_engine/vie_capturer.cc
diff options
context:
space:
mode:
authormflodman@webrtc.org <mflodman@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2013-09-02 12:44:57 +0000
committermflodman@webrtc.org <mflodman@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2013-09-02 12:44:57 +0000
commita594db2bf300734ca90d480974362ad055bc5903 (patch)
treec39740fa6778647f6204356816b1c44907c7f78b /video_engine/vie_capturer.cc
parent88a2327d041b6865d34efa223f0be82c0472c70d (diff)
downloadwebrtc-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.cc18
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