video_capture_device.h revision 116680a4aac90f2aa7413d9095a592090648e557
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" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/single_thread_task_runner.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/base/video_frame.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/video/capture/video_capture_types.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT VideoCaptureDevice { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Represents a capture device name and ID. 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // You should not create an instance of this class directly by e.g. setting 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // various properties directly. Instead use 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // VideoCaptureDevice::GetDeviceNames to do this for you and if you need to 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // cache your own copy of a name, you can do so via the copy constructor. 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The reason for this is that a device name might contain platform specific 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // settings that are relevant only to the platform specific implementation of 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // VideoCaptureDevice::Create. 39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch class MEDIA_EXPORT Name { 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Name(); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Name(const std::string& name, const std::string& 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 }; 51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX) 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Mac targets Capture Api type: it can only be set on construction. 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch enum CaptureApiType { 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch AVFOUNDATION, 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch QTKIT, 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch API_TYPE_UNKNOWN 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // For AVFoundation Api, identify devices that are built-in or USB. 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum TransportType { 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch USB_OR_BUILT_IN, 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OTHER_TRANSPORT 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Name(const std::string& name, 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& id, 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const CaptureApiType api_type); 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX) 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Name(const std::string& name, 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& id, 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const CaptureApiType api_type, 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const TransportType transport_type); 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~Name(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Friendly name of a device 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& name() const { return device_name_; } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unique name of a device. Even if there are multiple devices with the same 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // friendly name connected to the computer this will be unique. 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& id() const { return unique_id_; } 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The unique hardware model identifier of the capture device. Returns 86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // "[vid]:[pid]" when a USB device is detected, otherwise "". 87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The implementation of this method is platform-dependent. 88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string GetModel() const; 89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Friendly name of a device, plus the model identifier in parentheses. 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string GetNameAndModel() const; 92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // These operators are needed due to storing the name in an STL container. 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // In the shared build, all methods from the STL container will be exported 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // so even though they're not used, they're still depended upon. 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator==(const Name& other) const { 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return other.id() == unique_id_; 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator<(const Name& other) const { 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return unique_id_ < other.id(); 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type() const { 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return capture_api_class_.capture_api_type(); 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX) 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TransportType transport_type() const { 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return transport_type_; 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // if defined(OS_WIN) 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string device_name_; 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string unique_id_; 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // This class wraps the CaptureApiType to give it a by default value if not 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // initialized. 120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) class CaptureApiClass { 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch CaptureApiClass(): capture_api_type_(API_TYPE_UNKNOWN) {} 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass(const CaptureApiType api_type) 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : capture_api_type_(api_type) {} 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type() const { 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK_NE(capture_api_type_, API_TYPE_UNKNOWN); 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return capture_api_type_; 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type_; 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass capture_api_class_; 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_MACOSX) 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TransportType transport_type_; 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Allow generated copy constructor and assignment. 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Manages a list of Name entries. 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::list<Name> Names; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) class MEDIA_EXPORT Client { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Memory buffer returned by Client::ReserveOutputBuffer(). 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class Buffer : public base::RefCountedThreadSafe<Buffer> { 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int id() const { return id_; } 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void* data() const { return data_; } 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t size() const { return size_; } 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class base::RefCountedThreadSafe<Buffer>; 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Buffer(int id, void* data, size_t size) 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : id_(id), data_(data), size_(size) {} 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~Buffer() {} 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int id_; 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void* const data_; 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const size_t size_; 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~Client() {} 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Reserve an output buffer into which contents can be captured directly. 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The returned Buffer will always be allocated with a memory size suitable 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // for holding a packed video frame with pixels of |format| format, of 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |dimensions| frame dimensions. It is permissible for |dimensions| to be 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // zero; in which case the returned Buffer does not guarantee memory 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // backing, but functions as a reservation for external input for the 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // purposes of buffer throttling. 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The output buffer stays reserved for use until the Buffer object is 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // destroyed. 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual scoped_refptr<Buffer> ReserveOutputBuffer( 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media::VideoFrame::Format format, 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size& dimensions) = 0; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Captured a new video frame, data for which is pointed to by |data|. 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The format of the frame is described by |frame_format|, and is assumed to 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // be tightly packed. This method will try to reserve an output buffer and 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // copy from |data| into the output buffer. If no output buffer is 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // available, the frame will be silently dropped. 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnIncomingCapturedData(const uint8* data, 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int length, 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const VideoCaptureFormat& frame_format, 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rotation, // Clockwise. 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks timestamp) = 0; 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Captured a new video frame, held in |frame|. 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // As the frame is backed by a reservation returned by 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ReserveOutputBuffer(), delivery is guaranteed and will require no 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // additional copies in the browser process. 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnIncomingCapturedVideoFrame( 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const scoped_refptr<Buffer>& buffer, 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const VideoCaptureFormat& buffer_format, 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const scoped_refptr<media::VideoFrame>& frame, 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks timestamp) = 0; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An error has occurred that cannot be handled and VideoCaptureDevice must 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // be StopAndDeAllocate()-ed. |reason| is a text description of the error. 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnError(const std::string& reason) = 0; 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // VideoCaptureDevice requests the |message| to be logged. 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnLog(const std::string& message) {} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a VideoCaptureDevice object. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return NULL if the hardware is not available. 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static VideoCaptureDevice* Create( 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Name& device_name); 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~VideoCaptureDevice(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the names of all video capture devices connected to this computer. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void GetDeviceNames(Names* device_names); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Gets the supported formats of a particular device attached to the system. 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This method should be called before allocating or starting a device. In 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // case format enumeration is not supported, or there was a problem, the 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // formats array will be empty. 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static void GetDeviceSupportedFormats(const Name& device, 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoCaptureFormats* supported_formats); 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Prepares the camera for use. After this function has been called no other 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // applications can use the camera. StopAndDeAllocate() must be called before 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the object is deleted. 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void AllocateAndStart(const VideoCaptureParams& params, 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<Client> client) = 0; 234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Deallocates the camera, possibly asynchronously. 236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This call requires the device to do the following things, eventually: put 238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // camera hardware into a state where other applications could use it, free 239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the memory associated with capture, and delete the |client| pointer passed 240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // into AllocateAndStart. 241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If deallocation is done asynchronously, then the device implementation must 243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // ensure that a subsequent AllocateAndStart() operation targeting the same ID 244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // would be sequenced through the same task runner, so that deallocation 245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // happens first. 246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void StopAndDeAllocate() = 0; 247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Gets the power line frequency from the current system time zone if this is 249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // defined, otherwise returns 0. 250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int GetPowerLineFrequencyForLocation() const; 251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected: 253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static const int kPowerLine50Hz = 50; 254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static const int kPowerLine60Hz = 60; 255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_H_ 260