Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(687)

Unified Diff: content/browser/renderer_host/media/video_capture_controller.h

Issue 24133002: Make VideoCaptureController single-threaded and not ref counted. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: git pull Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
};

Powered by Google App Engine
This is Rietveld 408576698