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}