video_capture_device.h revision f2477e01787aa58f445919b809d89e252beef54f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VideoCaptureDevice is the abstract base class for realizing video capture 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// device support in Chromium. It provides the interface for OS dependent 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementations. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The class is created and functions are invoked on a thread owned by 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// VideoCaptureManager. Capturing is done on other threads, depending on the OS 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specific implementation. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_H_ 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_H_ 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/logging.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/base/video_frame.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/video/capture/video_capture_types.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT VideoCaptureDevice { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Represents a capture device name and ID. 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // You should not create an instance of this class directly by e.g. setting 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // various properties directly. Instead use 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // VideoCaptureDevice::GetDeviceNames to do this for you and if you need to 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // cache your own copy of a name, you can do so via the copy constructor. 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The reason for this is that a device name might contain platform specific 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // settings that are relevant only to the platform specific implementation of 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // VideoCaptureDevice::Create. 38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch class MEDIA_EXPORT Name { 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Name() {} 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Name(const std::string& name, const std::string& id) 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : device_name_(name), unique_id_(id) {} 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Windows targets Capture Api type: it can only be set on construction. 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enum CaptureApiType { 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MEDIA_FOUNDATION, 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DIRECT_SHOW, 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch API_TYPE_UNKNOWN 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Name(const std::string& name, 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& id, 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const CaptureApiType api_type) 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : device_name_(name), unique_id_(id), capture_api_class_(api_type) {} 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // if defined(OS_WIN) 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ~Name() {} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Friendly name of a device 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& name() const { return device_name_; } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unique name of a device. Even if there are multiple devices with the same 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // friendly name connected to the computer this will be unique. 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& id() const { return unique_id_; } 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The unique hardware model identifier of the capture device. Returns 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // "[vid]:[pid]" when a USB device is detected, otherwise "". 68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The implementation of this method is platform-dependent. 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string GetModel() const; 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Friendly name of a device, plus the model identifier in parentheses. 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string GetNameAndModel() const; 73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // These operators are needed due to storing the name in an STL container. 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // In the shared build, all methods from the STL container will be exported 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // so even though they're not used, they're still depended upon. 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator==(const Name& other) const { 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return other.id() == unique_id_; 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator<(const Name& other) const { 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return unique_id_ < other.id(); 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type() const { 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return capture_api_class_.capture_api_type(); 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // if defined(OS_WIN) 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string device_name_; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string unique_id_; 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This class wraps the CaptureApiType, so it has a by default value if not 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // inititalized, and I (mcasas) do a DCHECK on reading its value. 96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) class CaptureApiClass { 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass(): capture_api_type_(API_TYPE_UNKNOWN) {} 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass(const CaptureApiType api_type) 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : capture_api_type_(api_type) {} 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type() const { 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_NE(capture_api_type_, API_TYPE_UNKNOWN); 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return capture_api_type_; 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type_; 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass capture_api_class_; 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // if defined(OS_WIN) 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Allow generated copy constructor and assignment. 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Manages a list of Name entries. 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class MEDIA_EXPORT Names 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public NON_EXPORTED_BASE(std::list<Name>) { 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns NULL if no entry was found by that ID. 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Name* FindById(const std::string& id); 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Allow generated copy constructor and assignment. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) class MEDIA_EXPORT Client { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Memory buffer returned by Client::ReserveOutputBuffer(). 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class Buffer : public base::RefCountedThreadSafe<Buffer> { 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int id() const { return id_; } 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void* data() const { return data_; } 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t size() const { return size_; } 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class base::RefCountedThreadSafe<Buffer>; 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Buffer(int id, void* data, size_t size) 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : id_(id), data_(data), size_(size) {} 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~Buffer() {} 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int id_; 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void* const data_; 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const size_t size_; 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~Client() {} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Reserve an output buffer into which contents can be captured directly. 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The returned Buffer will always be allocated with a memory size suitable 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // for holding a packed video frame of |format| format, of |dimensions| 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // dimensions. It is permissible for |dimensions| to be zero; in which 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // case the returned Buffer does not guarantee memory backing, but functions 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // as a reservation for external input for the purposes of buffer 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // throttling. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The output buffer stays reserved for use until the Buffer object is 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // destroyed. 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual scoped_refptr<Buffer> ReserveOutputBuffer( 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media::VideoFrame::Format format, 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size& dimensions) = 0; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Captured a new video frame as a raw buffer. The size, color format, and 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layout are taken from the parameters specified by an earlier call to 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OnFrameInfo(). |data| must be packed, with no padding between rows and/or 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // color planes. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This method will try to reserve an output buffer and copy from |data| 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // into the output buffer. If no output buffer is available, the frame will 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be silently dropped. 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnIncomingCapturedFrame( 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const uint8* data, 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int length, 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time timestamp, 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int rotation, // Clockwise. 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool flip_vert, 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool flip_horiz, 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const VideoCaptureFormat& frame_format) = 0; 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Captured a new video frame, held in |buffer|. 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // As the frame is backed by a reservation returned by 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ReserveOutputBuffer(), delivery is guaranteed and will require no 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // additional copies in the browser process. |dimensions| indicates the 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // frame width and height of the buffer contents; this is assumed to be of 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |format| format and tightly packed. 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnIncomingCapturedBuffer(const scoped_refptr<Buffer>& buffer, 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media::VideoFrame::Format format, 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size& dimensions, 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time timestamp, 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int frame_rate) = 0; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An error has occurred that cannot be handled and VideoCaptureDevice must 192d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // be StopAndDeAllocate()-ed. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnError() = 0; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a VideoCaptureDevice object. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return NULL if the hardware is not available. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static VideoCaptureDevice* Create(const Name& device_name); 199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~VideoCaptureDevice(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the names of all video capture devices connected to this computer. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void GetDeviceNames(Names* device_names); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Gets the capabilities of a particular device attached to the system. This 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // method should be called before allocating or starting a device. In case 2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // format enumeration is not supported, or there was a problem, the formats 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // array will be empty. 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static void GetDeviceSupportedFormats(const Name& device, 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) VideoCaptureCapabilities* formats); 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare the camera for use. After this function has been called no other 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // applications can use the camera. StopAndDeAllocate() must be called before 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the object is deleted. 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void AllocateAndStart(const VideoCaptureParams& params, 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<Client> client) = 0; 216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Deallocates the camera, possibly asynchronously. 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This call requires the device to do the following things, eventually: put 220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // camera hardware into a state where other applications could use it, free 221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the memory associated with capture, and delete the |client| pointer passed 222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // into AllocateAndStart. 223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If deallocation is done asynchronously, then the device implementation must 225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // ensure that a subsequent AllocateAndStart() operation targeting the same ID 226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // would be sequenced through the same task runner, so that deallocation 227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // happens first. 228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void StopAndDeAllocate() = 0; 229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_H_ 234