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