summaryrefslogtreecommitdiff
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
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
-rw-r--r--video_engine/vie_capturer.cc18
-rw-r--r--video_engine/vie_capturer.h2
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_;