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