Home | History | Annotate | Download | only in cap_winrt
      1 // Copyright (c) Microsoft. All rights reserved.
      2 //
      3 // The MIT License (MIT)
      4 //
      5 // Permission is hereby granted, free of charge, to any person obtaining a copy
      6 // of this software and associated documentation files(the "Software"), to deal
      7 // in the Software without restriction, including without limitation the rights
      8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      9 // copies of the Software, and to permit persons to whom the Software is
     10 // furnished to do so, subject to the following conditions :
     11 //
     12 // The above copyright notice and this permission notice shall be included in
     13 // all copies or substantial portions of the Software.
     14 //
     15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
     18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     21 // THE SOFTWARE.
     22 
     23 #pragma once
     24 
     25 #include "MFIncludes.hpp"
     26 
     27 
     28 namespace Media {
     29 
     30 class MediaSink;
     31 
     32 enum class CaptureStreamType
     33 {
     34     Preview = 0,
     35     Record
     36 };
     37 
     38 ref class CaptureFrameGrabber sealed
     39 {
     40 public:
     41 
     42     // IClosable
     43     virtual ~CaptureFrameGrabber();
     44 
     45     virtual void ShowCameraSettings();
     46 
     47 internal:
     48 
     49     static concurrency::task<CaptureFrameGrabber^> CreateAsync(_In_ WMC::MediaCapture^ capture, _In_ WMMp::VideoEncodingProperties^ props)
     50     {
     51         return CreateAsync(capture, props, CaptureStreamType::Preview);
     52     }
     53 
     54     static concurrency::task<CaptureFrameGrabber^> CreateAsync(_In_ WMC::MediaCapture^ capture, _In_ WMMp::VideoEncodingProperties^ props, CaptureStreamType streamType);
     55 
     56     concurrency::task<MW::ComPtr<IMF2DBuffer2>> GetFrameAsync();
     57     concurrency::task<void> FinishAsync();
     58 
     59 private:
     60 
     61     CaptureFrameGrabber(_In_ WMC::MediaCapture^ capture, _In_ WMMp::VideoEncodingProperties^ props, CaptureStreamType streamType);
     62 
     63     void ProcessSample(_In_ MediaSample^ sample);
     64 
     65     Platform::Agile<WMC::MediaCapture> _capture;
     66     ::Windows::Media::IMediaExtension^ _mediaExtension;
     67 
     68     MW::ComPtr<MediaSink> _mediaSink;
     69 
     70     CaptureStreamType _streamType;
     71 
     72     enum class State
     73     {
     74         Created,
     75         Started,
     76         Closing,
     77         Closed
     78     } _state;
     79 
     80     std::queue<concurrency::task_completion_event<MW::ComPtr<IMF2DBuffer2>>> _videoSampleRequestQueue;
     81     AutoMF _mf;
     82     MWW::SRWLock _lock;
     83 };
     84 
     85 }