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