video_capture_device.h revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/video/capture/video_capture_types.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT VideoCaptureDevice { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Represents a capture device name and ID. 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // You should not create an instance of this class directly by e.g. setting 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // various properties directly. Instead use 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // VideoCaptureDevice::GetDeviceNames to do this for you and if you need to 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // cache your own copy of a name, you can do so via the copy constructor. 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The reason for this is that a device name might contain platform specific 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // settings that are relevant only to the platform specific implementation of 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // VideoCaptureDevice::Create. 35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch class MEDIA_EXPORT Name { 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Name() {} 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Name(const std::string& name, const std::string& id) 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : device_name_(name), unique_id_(id) {} 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Windows targets Capture Api type: it can only be set on construction. 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enum CaptureApiType { 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MEDIA_FOUNDATION, 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DIRECT_SHOW, 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch API_TYPE_UNKNOWN 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Name(const std::string& name, 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& id, 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const CaptureApiType api_type) 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : device_name_(name), unique_id_(id), capture_api_class_(api_type) {} 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // if defined(OS_WIN) 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ~Name() {} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Friendly name of a device 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& name() const { return device_name_; } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unique name of a device. Even if there are multiple devices with the same 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // friendly name connected to the computer this will be unique. 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& id() const { return unique_id_; } 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The unique hardware model identifier of the capture device. Returns 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // "[vid]:[pid]" when a USB device is detected, otherwise "". 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The implementation of this method is platform-dependent. 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string GetModel() const; 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 68558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Friendly name of a device, plus the model identifier in parentheses. 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string GetNameAndModel() const; 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // These operators are needed due to storing the name in an STL container. 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // In the shared build, all methods from the STL container will be exported 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // so even though they're not used, they're still depended upon. 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator==(const Name& other) const { 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return other.id() == unique_id_; 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool operator<(const Name& other) const { 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return unique_id_ < other.id(); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type() const { 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return capture_api_class_.capture_api_type(); 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // if defined(OS_WIN) 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string device_name_; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string unique_id_; 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This class wraps the CaptureApiType, so it has a by default value if not 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // inititalized, and I (mcasas) do a DCHECK on reading its value. 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) class CaptureApiClass { 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass(): capture_api_type_(API_TYPE_UNKNOWN) {} 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass(const CaptureApiType api_type) 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : capture_api_type_(api_type) {} 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type() const { 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_NE(capture_api_type_, API_TYPE_UNKNOWN); 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return capture_api_type_; 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiType capture_api_type_; 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CaptureApiClass capture_api_class_; 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // if defined(OS_WIN) 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Allow generated copy constructor and assignment. 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Manages a list of Name entries. 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class MEDIA_EXPORT Names 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public NON_EXPORTED_BASE(std::list<Name>) { 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns NULL if no entry was found by that ID. 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Name* FindById(const std::string& id); 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Allow generated copy constructor and assignment. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) class MEDIA_EXPORT Client { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~Client() {} 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reserve an output buffer into which a video frame can be captured 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // directly. If all buffers are currently busy, returns NULL. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The returned VideoFrames will always be allocated with a YV12 format. The 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // size will match that specified by an earlier call to OnFrameInfo. It is 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the VideoCaptureDevice's responsibility to obey whatever stride and 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // memory layout are indicated on the returned VideoFrame object. 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The output buffer stays reserved for use by the calling 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // VideoCaptureDevice until either the last reference to the VideoFrame is 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // released, or until the buffer is passed back to the Client's 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OnIncomingCapturedFrame() method. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<media::VideoFrame> ReserveOutputBuffer() = 0; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Captured a new video frame as a raw buffer. The size, color format, and 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layout are taken from the parameters specified by an earlier call to 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OnFrameInfo(). |data| must be packed, with no padding between rows and/or 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // color planes. 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This method will try to reserve an output buffer and copy from |data| 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // into the output buffer. If no output buffer is available, the frame will 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be silently dropped. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnIncomingCapturedFrame(const uint8* data, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int length, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time timestamp, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int rotation, // Clockwise. 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool flip_vert, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool flip_horiz) = 0; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Captured a new video frame, held in a VideoFrame container. 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |frame| was created via the ReserveOutputBuffer() mechanism, then the 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // frame delivery is guaranteed (it will not be silently dropped), and 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // delivery will require no additional copies in the browser process. For 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // such frames, the VideoCaptureDevice's reservation on the output buffer 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ends immediately. The VideoCaptureDevice may not read or write the 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // underlying memory afterwards, and it should release its references to 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |frame| as soon as possible, to allow buffer reuse. 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |frame| was NOT created via ReserveOutputBuffer(), then this method 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will try to reserve an output buffer and copy from |frame| into the 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // output buffer. If no output buffer is available, the frame will be 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // silently dropped. |frame| must be allocated as RGB32, YV12 or I420, and 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the size must match that specified by an earlier call to OnFrameInfo(). 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnIncomingCapturedVideoFrame( 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<media::VideoFrame>& frame, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time timestamp) = 0; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An error has occurred that cannot be handled and VideoCaptureDevice must 174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // be StopAndDeAllocate()-ed. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnError() = 0; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Called when VideoCaptureDevice::AllocateAndStart() has been called to 178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // inform of the resulting frame size. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnFrameInfo(const VideoCaptureCapability& info) = 0; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called when the native resolution of VideoCaptureDevice has been changed 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // and it needs to inform its client of the new frame size. 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnFrameInfoChanged(const VideoCaptureCapability& info) {}; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a VideoCaptureDevice object. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return NULL if the hardware is not available. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static VideoCaptureDevice* Create(const Name& device_name); 188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~VideoCaptureDevice(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the names of all video capture devices connected to this computer. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void GetDeviceNames(Names* device_names); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepare the camera for use. After this function has been called no other 19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // applications can use the camera. On completion Client::OnFrameInfo() 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is called informing of the resulting resolution and frame rate. 196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // StopAndDeAllocate() must be called before the object is deleted. 197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void AllocateAndStart( 198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const VideoCaptureCapability& capture_format, 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<Client> client) = 0; 200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Deallocates the camera, possibly asynchronously. 202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This call requires the device to do the following things, eventually: put 204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // camera hardware into a state where other applications could use it, free 205d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the memory associated with capture, and delete the |client| pointer passed 206d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // into AllocateAndStart. 207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If deallocation is done asynchronously, then the device implementation must 209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // ensure that a subsequent AllocateAndStart() operation targeting the same ID 210d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // would be sequenced through the same task runner, so that deallocation 211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // happens first. 212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void StopAndDeAllocate() = 0; 213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// VideoCaptureDevice1 is a bridge to an older API against which 216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// VideoCaptureDevices were implemented. Differences between VideoCaptureDevice 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// (new style) and VideoCaptureDevice1 (old style) are as follows: 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// [1] The Stop+DeAllocate calls are merged in the new style. 220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// [2] The Allocate+Start calls are merged in the new style. 22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// [3] New style devices own their Client* pointers, allowing the client to 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// linger after the device is stopped. Whereas old style devices 22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// may not dereference their client after DeAllocate(). 224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// [4] device_name() is eliminated from the new-style interface. 225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// 226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// TODO(nick): Remove this bridge class. It exists to enable incremental 227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// migration to an alternative VideoCaptureDevice API. 228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class MEDIA_EXPORT VideoCaptureDevice1 : public VideoCaptureDevice { 229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) VideoCaptureDevice1(); 231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~VideoCaptureDevice1(); 232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 233d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // VideoCaptureDevice implementation. 234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void AllocateAndStart( 235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const VideoCaptureCapability& capture_format, 23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<Client> client) OVERRIDE; 237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void StopAndDeAllocate() OVERRIDE; 238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Prepare the camera for use. After this function has been called no other 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // applications can use the camera. On completion Client::OnFrameInfo() 241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // is called informing of the resulting resolution and frame rate. 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DeAllocate() must be called before this function can be called again and 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the object is deleted. 244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void Allocate(const VideoCaptureCapability& capture_format, 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Client* client) = 0; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start capturing video frames. Allocate must be called before this function. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start() = 0; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop capturing video frames. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Stop() = 0; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Deallocates the camera. This means other applications can use it. After 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this function has been called the capture device is reset to the state it 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // was when created. After DeAllocate() is called, the VideoCaptureDevice is 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // not permitted to make any additional calls to its Client. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DeAllocate() = 0; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the name of the capture device. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const Name& device_name() = 0; 261d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 262d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 263d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The device client which proxies device events to the controller. 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_ptr<Client> client_; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_VIDEO_CAPTURE_VIDEO_CAPTURE_DEVICE_H_ 270