1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Windows specific implementation of VideoCaptureDevice.
6// DirectShow is used for capturing. DirectShow provide its own threads
7// for capturing.
8
9#ifndef MEDIA_VIDEO_CAPTURE_WIN_VIDEO_CAPTURE_DEVICE_MF_WIN_H_
10#define MEDIA_VIDEO_CAPTURE_WIN_VIDEO_CAPTURE_DEVICE_MF_WIN_H_
11
12#include <mfidl.h>
13#include <mfreadwrite.h>
14
15#include <vector>
16
17#include "base/synchronization/lock.h"
18#include "base/threading/non_thread_safe.h"
19#include "base/win/scoped_comptr.h"
20#include "media/base/media_export.h"
21#include "media/video/capture/video_capture_device.h"
22
23interface IMFSourceReader;
24
25namespace media {
26
27class MFReaderCallback;
28
29const DWORD kFirstVideoStream =
30    static_cast<DWORD>(MF_SOURCE_READER_FIRST_VIDEO_STREAM);
31
32class MEDIA_EXPORT VideoCaptureDeviceMFWin
33    : public base::NonThreadSafe,
34      public VideoCaptureDevice {
35 public:
36  static bool FormatFromGuid(const GUID& guid, VideoPixelFormat* format);
37
38  explicit VideoCaptureDeviceMFWin(const Name& device_name);
39  virtual ~VideoCaptureDeviceMFWin();
40
41  // Opens the device driver for this device.
42  bool Init(const base::win::ScopedComPtr<IMFMediaSource>& source);
43
44  // VideoCaptureDevice implementation.
45  virtual void AllocateAndStart(const VideoCaptureParams& params,
46                                scoped_ptr<VideoCaptureDevice::Client> client)
47      OVERRIDE;
48  virtual void StopAndDeAllocate() OVERRIDE;
49
50  // Captured new video data.
51  void OnIncomingCapturedData(const uint8* data,
52                              int length,
53                              int rotation,
54                              const base::TimeTicks& time_stamp);
55
56 private:
57  void OnError(HRESULT hr);
58
59  Name name_;
60  base::win::ScopedComPtr<IMFActivate> device_;
61  scoped_refptr<MFReaderCallback> callback_;
62
63  base::Lock lock_;  // Used to guard the below variables.
64  scoped_ptr<VideoCaptureDevice::Client> client_;
65  base::win::ScopedComPtr<IMFSourceReader> reader_;
66  VideoCaptureFormat capture_format_;
67  bool capture_;
68
69  DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureDeviceMFWin);
70};
71
72}  // namespace media
73
74#endif  // MEDIA_VIDEO_CAPTURE_WIN_VIDEO_CAPTURE_DEVICE_MF_WIN_H_
75