From 1f7c8d8b6a832b553e34eb4a224e24d4943ce021 Mon Sep 17 00:00:00 2001 From: "pbos@webrtc.org" Date: Thu, 28 Nov 2013 13:26:33 +0000 Subject: [PATCH] Lock frame in ViECapturer::IncomingFrameI420. r5160 explicitly assumed that IncomingFrameI420 was never called sequentially. This assumption was found to be incorrect when some users were changing beween existing capturers. BUG=2657 R=mflodman@webrtc.org Review URL: https://webrtc-codereview.appspot.com/4619004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5189 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/video_engine/include/vie_capture.h | 1 - webrtc/video_engine/vie_capturer.cc | 6 ++++-- webrtc/video_engine/vie_capturer.h | 6 ++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/webrtc/video_engine/include/vie_capture.h b/webrtc/video_engine/include/vie_capture.h index bcae930bf4..2174d5dc6f 100644 --- a/webrtc/video_engine/include/vie_capture.h +++ b/webrtc/video_engine/include/vie_capture.h @@ -114,7 +114,6 @@ class WEBRTC_DLLEXPORT ViEExternalCapture { // This method is specifically for delivering a new captured I420 frame to // VideoEngine. // |capture_time| must be specified in the NTP time format in milliseconds. - // This method uses an internal buffer and must be called sequentially. virtual int IncomingFrameI420( const ViEVideoFrameI420& video_frame, unsigned long long capture_time = 0) = 0; diff --git a/webrtc/video_engine/vie_capturer.cc b/webrtc/video_engine/vie_capturer.cc index c5844e2293..d7e33e77db 100644 --- a/webrtc/video_engine/vie_capturer.cc +++ b/webrtc/video_engine/vie_capturer.cc @@ -43,6 +43,7 @@ ViECapturer::ViECapturer(int capture_id, external_capture_module_(NULL), module_process_thread_(module_process_thread), capture_id_(capture_id), + incoming_frame_cs_(CriticalSectionWrapper::CreateCriticalSection()), capture_thread_(*ThreadWrapper::CreateThread(ViECaptureThreadFunction, this, kHighPriority, "ViECaptureThread")), @@ -332,7 +333,8 @@ int ViECapturer::IncomingFrameI420(const ViEVideoFrameI420& video_frame, int size_y = video_frame.height * video_frame.y_pitch; int size_u = video_frame.u_pitch * ((video_frame.height + 1) / 2); int size_v = video_frame.v_pitch * ((video_frame.height + 1) / 2); - int ret = capture_frame_.CreateFrame(size_y, + CriticalSectionScoped cs(incoming_frame_cs_.get()); + int ret = incoming_frame_.CreateFrame(size_y, video_frame.y_plane, size_u, video_frame.u_plane, @@ -352,7 +354,7 @@ int ViECapturer::IncomingFrameI420(const ViEVideoFrameI420& video_frame, return -1; } - return external_capture_module_->IncomingI420VideoFrame(&capture_frame_, + return external_capture_module_->IncomingI420VideoFrame(&incoming_frame_, capture_time); } diff --git a/webrtc/video_engine/vie_capturer.h b/webrtc/video_engine/vie_capturer.h index 7900e55cf7..e47700f82f 100644 --- a/webrtc/video_engine/vie_capturer.h +++ b/webrtc/video_engine/vie_capturer.h @@ -157,6 +157,10 @@ class ViECapturer ProcessThread& module_process_thread_; const int capture_id_; + // Frame used in IncomingFrameI420. + scoped_ptr incoming_frame_cs_; + I420VideoFrame incoming_frame_; + // Capture thread. ThreadWrapper& capture_thread_; EventWrapper& capture_event_; @@ -181,8 +185,6 @@ class ViECapturer CaptureCapability requested_capability_; - I420VideoFrame capture_frame_; - scoped_ptr overuse_detector_; };