1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (c) Microsoft. All rights reserved. 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The MIT License (MIT) 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Permission is hereby granted, free of charge, to any person obtaining a copy 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// of this software and associated documentation files(the "Software"), to deal 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// in the Software without restriction, including without limitation the rights 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// copies of the Software, and to permit persons to whom the Software is 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// furnished to do so, subject to the following conditions : 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The above copyright notice and this permission notice shall be included in 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// all copies or substantial portions of the Software. 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// THE SOFTWARE. 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#pragma once 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "MFIncludes.hpp" 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace Media { 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass MediaSink; 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerenum class CaptureStreamType 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Preview = 0, 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Record 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerref class CaptureFrameGrabber sealed 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic: 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // IClosable 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual ~CaptureFrameGrabber(); 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void ShowCameraSettings(); 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinternal: 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler static concurrency::task<CaptureFrameGrabber^> CreateAsync(_In_ WMC::MediaCapture^ capture, _In_ WMMp::VideoEncodingProperties^ props) 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return CreateAsync(capture, props, CaptureStreamType::Preview); 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler static concurrency::task<CaptureFrameGrabber^> CreateAsync(_In_ WMC::MediaCapture^ capture, _In_ WMMp::VideoEncodingProperties^ props, CaptureStreamType streamType); 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler concurrency::task<MW::ComPtr<IMF2DBuffer2>> GetFrameAsync(); 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler concurrency::task<void> FinishAsync(); 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprivate: 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CaptureFrameGrabber(_In_ WMC::MediaCapture^ capture, _In_ WMMp::VideoEncodingProperties^ props, CaptureStreamType streamType); 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void ProcessSample(_In_ MediaSample^ sample); 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Platform::Agile<WMC::MediaCapture> _capture; 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ::Windows::Media::IMediaExtension^ _mediaExtension; 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MW::ComPtr<MediaSink> _mediaSink; 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler CaptureStreamType _streamType; 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler enum class State 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Created, 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Started, 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Closing, 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Closed 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } _state; 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler std::queue<concurrency::task_completion_event<MW::ComPtr<IMF2DBuffer2>>> _videoSampleRequestQueue; 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler AutoMF _mf; 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MWW::SRWLock _lock; 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}