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

Unified Diff: media/video/capture/video_capture_device.h

Issue 24133002: Make VideoCaptureController single-threaded and not ref counted. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix a memory leak 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: media/video/capture/video_capture_device.h
diff --git a/media/video/capture/video_capture_device.h b/media/video/capture/video_capture_device.h
index 0eaf39ed7cc404941952ba4a8b9ce2639c99b9ee..9e01ca32ac3f5ea3f2f44bf468ae2d4ec7d8811f 100644
--- a/media/video/capture/video_capture_device.h
+++ b/media/video/capture/video_capture_device.h
@@ -120,6 +120,7 @@ class MEDIA_EXPORT VideoCaptureDevice {
class MEDIA_EXPORT EventHandler {
public:
+ virtual ~EventHandler() {}
// Reserve an output buffer into which a video frame can be captured
// directly. If all buffers are currently busy, returns NULL.
@@ -187,14 +188,11 @@ class MEDIA_EXPORT VideoCaptureDevice {
// Called when the native resolution of VideoCaptureDevice has been changed
// and it needs to inform its client of the new frame size.
virtual void OnFrameInfoChanged(const VideoCaptureCapability& info) {};
-
- protected:
- virtual ~EventHandler() {}
};
// Creates a VideoCaptureDevice object.
// Return NULL if the hardware is not available.
static VideoCaptureDevice* Create(const Name& device_name);
- virtual ~VideoCaptureDevice() {}
+ virtual ~VideoCaptureDevice();
// Gets the names of all video capture devices connected to this computer.
static void GetDeviceNames(Names* device_names);
@@ -202,10 +200,51 @@ class MEDIA_EXPORT VideoCaptureDevice {
// Prepare the camera for use. After this function has been called no other
// applications can use the camera. On completion EventHandler::OnFrameInfo()
// is called informing of the resulting resolution and frame rate.
+ // StopAndDeAllocate() must be called before the object is deleted.
+ virtual void AllocateAndStart(
+ const VideoCaptureCapability& capture_format,
+ scoped_ptr<EventHandler> observer) = 0;
+
+ // Deallocates the camera. This means other applications can use it, and that
+ // the camera could be re-acquired by another VideoCaptureDevice instance if
+ // one were to be created immediately after this call. After this call the
+ // device should free the |observer| passed into AllocateAndStart as soon as
+ // possible, but may do so asynchronously.
+ virtual void StopAndDeAllocate() = 0;
+};
+
+// VideoCaptureDevice1 is a bridge to an older API against which
+// VideoCaptureDevices were implemented. Differences between VideoCaptureDevice
+// (new style) and VideoCaptureDevice1 (old style) are as follows:
+//
+// [1] The Stop+DeAllocate calls are merged in the new style.
+// [2] The Allocate+Start calls are merged in the new style.
+// [3] New style devices own their EventHandler* pointers, allowing handlers
+// remain valid even after the device is stopped. Whereas old style devices
Ami GONE FROM CHROMIUM 2013/09/13 21:17:59 s/remain/to remain/
ncarter (slow) 2013/09/14 00:07:24 Done.
+// may not dereference their handlers after DeAllocate().
Ami GONE FROM CHROMIUM 2013/09/13 21:17:59 I don't follow. AFAICT from the commentary above
ncarter (slow) 2013/09/14 00:07:24 I think I figured out what was missing. I made the
+// [4] device_name() is eliminated from the new-style interface.
+//
+// TODO(nick): Remove this bridge class. It exists to enable incremental
+// migration to an alternative VideoCaptureDevice API.
+class MEDIA_EXPORT VideoCaptureDevice1 : public VideoCaptureDevice {
+ public:
+ VideoCaptureDevice1();
+ virtual ~VideoCaptureDevice1();
+
+ // VideoCaptureDevice implementation.
+ virtual void AllocateAndStart(
+ const VideoCaptureCapability& capture_format,
+ scoped_ptr<EventHandler> client) OVERRIDE;
+ virtual void StopAndDeAllocate() OVERRIDE;
+
+ // Gets the names of all video capture devices
Ami GONE FROM CHROMIUM 2013/09/13 21:17:59 stray?
ncarter (slow) 2013/09/14 00:07:24 Done.
+ // Prepare the camera for use. After this function has been called no other
+ // applications can use the camera. On completion EventHandler::OnFrameInfo()
+ // is called informing of the resulting resolution and frame rate.
// DeAllocate() must be called before this function can be called again and
// before the object is deleted.
virtual void Allocate(const VideoCaptureCapability& capture_format,
- EventHandler* observer) = 0;
+ EventHandler* client) = 0;
// Start capturing video frames. Allocate must be called before this function.
virtual void Start() = 0;
@@ -221,6 +260,10 @@ class MEDIA_EXPORT VideoCaptureDevice {
// Get the name of the capture device.
virtual const Name& device_name() = 0;
+
+ private:
+ // The device client which proxies device events to the controller.
+ scoped_ptr<EventHandler> client_;
Ami GONE FROM CHROMIUM 2013/09/13 21:17:59 This thing is known as a "Handler" (by the type),
ncarter (slow) 2013/09/14 00:07:24 "Client" is right term and it might have been a mi
};
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698