12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Windows specific implementation of VideoCaptureDevice.
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DirectShow is used for capturing. DirectShow provide its own threads
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for capturing.
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef MEDIA_VIDEO_CAPTURE_WIN_VIDEO_CAPTURE_DEVICE_MF_WIN_H_
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MEDIA_VIDEO_CAPTURE_WIN_VIDEO_CAPTURE_DEVICE_MF_WIN_H_
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <mfidl.h>
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <mfreadwrite.h>
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/non_thread_safe.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/win/scoped_comptr.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/media_export.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/video/capture/video_capture_device.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)interface IMFSourceReader;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MFReaderCallback;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst DWORD kFirstVideoStream =
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    static_cast<DWORD>(MF_SOURCE_READER_FIRST_VIDEO_STREAM);
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass MEDIA_EXPORT VideoCaptureDeviceMFWin
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public base::NonThreadSafe,
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      public VideoCaptureDevice {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static bool FormatFromGuid(const GUID& guid, VideoPixelFormat* format);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit VideoCaptureDeviceMFWin(const Name& device_name);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~VideoCaptureDeviceMFWin();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Opens the device driver for this device.
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool Init(const base::win::ScopedComPtr<IMFMediaSource>& source);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // VideoCaptureDevice implementation.
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void AllocateAndStart(const VideoCaptureParams& params,
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                scoped_ptr<VideoCaptureDevice::Client> client)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      OVERRIDE;
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void StopAndDeAllocate() OVERRIDE;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Captured new video data.
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnIncomingCapturedData(const uint8* data,
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              int length,
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              int rotation,
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              const base::TimeTicks& time_stamp);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnError(HRESULT hr);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Name name_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::win::ScopedComPtr<IMFActivate> device_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MFReaderCallback> callback_;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Lock lock_;  // Used to guard the below variables.
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<VideoCaptureDevice::Client> client_;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::win::ScopedComPtr<IMFSourceReader> reader_;
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  VideoCaptureFormat capture_format_;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool capture_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureDeviceMFWin);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace media
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // MEDIA_VIDEO_CAPTURE_WIN_VIDEO_CAPTURE_DEVICE_MF_WIN_H_
75