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