Index: content/browser/renderer_host/media/video_capture_controller.h |
diff --git a/content/browser/renderer_host/media/video_capture_controller.h b/content/browser/renderer_host/media/video_capture_controller.h |
index 2c294505ca34f8d7bdbe2d148ca1f35819966e66..eda4ce31e0172862defd1af789c9e11d1ccc7d06 100644 |
--- a/content/browser/renderer_host/media/video_capture_controller.h |
+++ b/content/browser/renderer_host/media/video_capture_controller.h |
@@ -13,21 +13,25 @@ |
// with I420 video frames for IPC communication between VideoCaptureHost (in |
// the browser process) and VideoCaptureMessageFilter (in the renderer |
// process). |
-// * Conveying events from the device thread (where capture devices live) to |
-// the IO thread (where the clients can be reached). |
// * Broadcasting the events from a single VideoCaptureDevice, fanning them |
// out to multiple clients. |
// * Keeping track of the clients on behalf of the VideoCaptureManager, making |
// it possible for the Manager to delete the Controller and its Device when |
// there are no clients left. |
+// |
+// A helper class, VCC::VideoCaptureDeviceClient, is responsible for: |
+// |
+// * Conveying events from the device thread (where VideoCaptureDevices live) |
+// the IO thread (where the VideoCaptureController lives). |
// * Performing some image transformations on the output of the Device; |
// specifically, colorspace conversion and rotation. |
// |
// Interactions between VideoCaptureController and other classes: |
// |
-// * VideoCaptureController receives events from its VideoCaptureDevice |
-// entirely through the VideoCaptureDevice::EventHandler interface, which |
-// VCC implements. |
+// * VideoCaptureController indirectly observes a VideoCaptureDevice |
+// by means of its proxy, VideoCaptureDeviceClient, which implements |
+// the VideoCaptureDevice::EventHandler interface. The proxy forwards |
+// observed events to the VideoCaptureController on the IO thread. |
// * A VideoCaptureController interacts with its clients (VideoCaptureHosts) |
// via the VideoCaptureControllerEventHandler interface. |
// * Conversely, a VideoCaptureControllerEventHandler (typically, |
@@ -38,12 +42,7 @@ |
// VideoCaptureController through its public methods, to add and remove |
// clients. |
// |
-// Thread safety: |
-// |
-// The public methods implementing the VCD::EventHandler interface are safe to |
-// call from any thread -- in practice, this is the thread on which the Device |
-// is running. For this reason, it is RefCountedThreadSafe. ALL OTHER METHODS |
-// are only safe to run on the IO browser thread. |
+// VideoCaptureController is not thread safe and operates on the IO thread only. |
#ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_CONTROLLER_H_ |
#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_VIDEO_CAPTURE_CONTROLLER_H_ |
@@ -53,6 +52,8 @@ |
#include "base/compiler_specific.h" |
#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
#include "base/process/process.h" |
#include "base/synchronization/lock.h" |
#include "content/browser/renderer_host/media/video_capture_buffer_pool.h" |
@@ -66,11 +67,16 @@ |
namespace content { |
class VideoCaptureBufferPool; |
-class CONTENT_EXPORT VideoCaptureController |
- : public base::RefCountedThreadSafe<VideoCaptureController>, |
- public media::VideoCaptureDevice::EventHandler { |
+class CONTENT_EXPORT VideoCaptureController { |
public: |
VideoCaptureController(); |
+ virtual ~VideoCaptureController(); |
+ |
+ base::WeakPtr<VideoCaptureController> GetWeakPtr(); |
+ |
+ // Return a new VideoCaptureDeviceClient to forward capture events to this |
+ // instance. |
+ scoped_ptr<media::VideoCaptureDevice::EventHandler> NewDeviceClient(); |
// Start video capturing and try to use the resolution specified in |
// |params|. |
@@ -100,36 +106,19 @@ class CONTENT_EXPORT VideoCaptureController |
VideoCaptureControllerEventHandler* event_handler, |
int buffer_id); |
- // Implement media::VideoCaptureDevice::EventHandler. |
- virtual scoped_refptr<media::VideoFrame> ReserveOutputBuffer() OVERRIDE; |
- virtual void OnIncomingCapturedFrame(const uint8* data, |
- int length, |
- base::Time timestamp, |
- int rotation, |
- bool flip_vert, |
- bool flip_horiz) OVERRIDE; |
- virtual void OnIncomingCapturedVideoFrame( |
- const scoped_refptr<media::VideoFrame>& frame, |
- base::Time timestamp) OVERRIDE; |
- virtual void OnError() OVERRIDE; |
- virtual void OnFrameInfo(const media::VideoCaptureCapability& info) OVERRIDE; |
- virtual void OnFrameInfoChanged( |
- const media::VideoCaptureCapability& info) OVERRIDE; |
- |
- protected: |
- virtual ~VideoCaptureController(); |
- |
private: |
- friend class base::RefCountedThreadSafe<VideoCaptureController>; |
+ class VideoCaptureDeviceClient; |
struct ControllerClient; |
typedef std::list<ControllerClient*> ControllerClients; |
- // Worker functions on IO thread. |
+ // Worker functions on IO thread. Called by the VideoCaptureDeviceClient. |
void DoIncomingCapturedFrameOnIOThread( |
const scoped_refptr<media::VideoFrame>& captured_frame, |
base::Time timestamp); |
- void DoFrameInfoOnIOThread(); |
+ void DoFrameInfoOnIOThread( |
+ const media::VideoCaptureCapability& frame_info, |
+ const scoped_refptr<VideoCaptureBufferPool>& buffer_pool); |
void DoFrameInfoChangedOnIOThread(const media::VideoCaptureCapability& info); |
void DoErrorOnIOThread(); |
void DoDeviceStoppedOnIOThread(); |
@@ -148,11 +137,6 @@ class CONTENT_EXPORT VideoCaptureController |
int session_id, |
const ControllerClients& clients); |
- // Protects access to the |buffer_pool_| pointer on non-IO threads. IO thread |
- // must hold this lock when modifying the |buffer_pool_| pointer itself. |
- // TODO(nick): Make it so that this lock isn't required. |
- base::Lock buffer_pool_lock_; |
- |
// The pool of shared-memory buffers used for capturing. |
scoped_refptr<VideoCaptureBufferPool> buffer_pool_; |
@@ -162,22 +146,15 @@ class CONTENT_EXPORT VideoCaptureController |
// The parameter that currently used for the capturing. |
media::VideoCaptureParams current_params_; |
- // It's modified on caller thread, assuming there is only one OnFrameInfo() |
- // call per StartCapture(). |
+ // Tracks the current frame format. |
media::VideoCaptureCapability frame_info_; |
- // Chopped pixels in width/height in case video capture device has odd numbers |
- // for width/height. Accessed only on the device thread. |
- int chopped_width_; |
- int chopped_height_; |
- |
- // It's accessed only on IO thread. |
- bool frame_info_available_; |
- |
// Takes on only the states 'STARTED' and 'ERROR'. 'ERROR' is an absorbing |
- // state which stops the flow of data to clients. Accessed only on IO thread. |
+ // state which stops the flow of data to clients. |
VideoCaptureState state_; |
+ base::WeakPtrFactory<VideoCaptureController> weak_ptr_factory_; |
+ |
DISALLOW_COPY_AND_ASSIGN(VideoCaptureController); |
}; |