video_capture_device.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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: 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Name() {} 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Name(const std::string& name, const std::string& id) 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : device_name_(name), unique_id_(id) {} 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Windows targets Capture Api type: it can only be set on construction. 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enum CaptureApiType { 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MEDIA_FOUNDATION, 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DIRECT_SHOW, 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch API_TYPE_UNKNOWN 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_MACOSX) 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Mac targets Capture Api type: it can only be set on construction. 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch enum CaptureApiType { 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch AVFOUNDATION, 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch QTKIT, 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch API_TYPE_UNKNOWN 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Name(const std::string& name, 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& id, 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const CaptureApiType api_type) 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : device_name_(name), unique_id_(id), capture_api_class_(api_type) {} 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ~Name() {} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Friendly name of a device 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& name() const { return device_name_; } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unique name of a device. Even if there are multiple devices with the same 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // friendly name connected to the computer this will be unique. 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& id() const { return unique_id_; } 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The unique hardware model identifier of the capture device. Returns 77558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // "[vid]:[pid]" when a USB device is detected, otherwise "". 78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The implementation of this method is platform-dependent. 79558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string GetModel() const; 80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Friendly name of a device, plus the model identifier in parentheses. 82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string GetNameAndModel() const; 83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // These operators are needed due to storing the name in an STL container. 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // In the shared build, all methods from the STL container will be exported 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // so even though they're not used, they're still depended upon. 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator==(const Name& other) const { 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return other.id() == unique_id_; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator<(const Name& other) const { 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return unique_id_ < other.id(); 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type() const { 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return capture_api_class_.capture_api_type(); 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // if defined(OS_WIN) 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string device_name_; 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string unique_id_; 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // This class wraps the CaptureApiType to give it a by default value if not 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // initialized. 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) class CaptureApiClass { 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch CaptureApiClass(): capture_api_type_(API_TYPE_UNKNOWN) {} 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass(const CaptureApiType api_type) 110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : capture_api_type_(api_type) {} 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type() const { 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DCHECK_NE(capture_api_type_, API_TYPE_UNKNOWN); 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return capture_api_type_; 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type_; 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass capture_api_class_; 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Allow generated copy constructor and assignment. 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Manages a list of Name entries. 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::list<Name> Names; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) class MEDIA_EXPORT Client { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Memory buffer returned by Client::ReserveOutputBuffer(). 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class Buffer : public base::RefCountedThreadSafe<Buffer> { 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int id() const { return id_; } 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void* data() const { return data_; } 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) size_t size() const { return size_; } 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class base::RefCountedThreadSafe<Buffer>; 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Buffer(int id, void* data, size_t size) 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : id_(id), data_(data), size_(size) {} 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~Buffer() {} 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int id_; 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void* const data_; 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const size_t size_; 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~Client() {} 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Reserve an output buffer into which contents can be captured directly. 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The returned Buffer will always be allocated with a memory size suitable 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // for holding a packed video frame with pixels of |format| format, of 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |dimensions| frame dimensions. It is permissible for |dimensions| to be 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // zero; in which case the returned Buffer does not guarantee memory 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // backing, but functions as a reservation for external input for the 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // purposes of buffer throttling. 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The output buffer stays reserved for use until the Buffer object is 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // destroyed. 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual scoped_refptr<Buffer> ReserveOutputBuffer( 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media::VideoFrame::Format format, 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Size& dimensions) = 0; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Captured a new video frame, data for which is pointed to by |data|. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The format of the frame is described by |frame_format|, and is assumed to 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // be tightly packed. This method will try to reserve an output buffer and 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // copy from |data| into the output buffer. If no output buffer is 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // available, the frame will be silently dropped. 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnIncomingCapturedData(const uint8* data, 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int length, 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const VideoCaptureFormat& frame_format, 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int rotation, // Clockwise. 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks timestamp) = 0; 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Captured a new video frame, held in |frame|. 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // As the frame is backed by a reservation returned by 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ReserveOutputBuffer(), delivery is guaranteed and will require no 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // additional copies in the browser process. 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnIncomingCapturedVideoFrame( 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const scoped_refptr<Buffer>& buffer, 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const VideoCaptureFormat& buffer_format, 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const scoped_refptr<media::VideoFrame>& frame, 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks timestamp) = 0; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An error has occurred that cannot be handled and VideoCaptureDevice must 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // be StopAndDeAllocate()-ed. |reason| is a text description of the error. 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnError(const std::string& reason) = 0; 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // VideoCaptureDevice requests the |message| to be logged. 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnLog(const std::string& message) {} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a VideoCaptureDevice object. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return NULL if the hardware is not available. 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static VideoCaptureDevice* Create( 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Name& device_name); 200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~VideoCaptureDevice(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the names of all video capture devices connected to this computer. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void GetDeviceNames(Names* device_names); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Gets the supported formats of a particular device attached to the system. 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This method should be called before allocating or starting a device. In 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // case format enumeration is not supported, or there was a problem, the 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // formats array will be empty. 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static void GetDeviceSupportedFormats(const Name& device, 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoCaptureFormats* supported_formats); 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Prepares the camera for use. After this function has been called no other 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // applications can use the camera. StopAndDeAllocate() must be called before 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the object is deleted. 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void AllocateAndStart(const VideoCaptureParams& params, 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<Client> client) = 0; 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Deallocates the camera, possibly asynchronously. 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This call requires the device to do the following things, eventually: put 221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // camera hardware into a state where other applications could use it, free 222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the memory associated with capture, and delete the |client| pointer passed 223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // into AllocateAndStart. 224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If deallocation is done asynchronously, then the device implementation must 226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // ensure that a subsequent AllocateAndStart() operation targeting the same ID 227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // would be sequenced through the same task runner, so that deallocation 228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // happens first. 229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void StopAndDeAllocate() = 0; 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Gets the power line frequency from the current system time zone if this is 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // defined, otherwise returns 0. 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int GetPowerLineFrequencyForLocation() const; 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected: 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static const int kPowerLine50Hz = 50; 237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static const int kPowerLine60Hz = 60; 238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_H_ 243