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