mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 07:13:02 +04:00
d08cb6b357
Signed-off-by: Maxim Kostin <v-maxkos@microsoft.com>
172 lines
4.4 KiB
C++
172 lines
4.4 KiB
C++
// Header for standard system include files.
|
|
|
|
// Copyright (c) Microsoft. All rights reserved.
|
|
//
|
|
// The MIT License (MIT)
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files(the "Software"), to deal
|
|
// in the Software without restriction, including without limitation the rights
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions :
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
// THE SOFTWARE.
|
|
|
|
#pragma once
|
|
|
|
#include <collection.h>
|
|
#include <ppltasks.h>
|
|
|
|
#include <wrl\implements.h>
|
|
#include <wrl\wrappers\corewrappers.h>
|
|
#include <Roerrorapi.h>
|
|
|
|
#include <queue>
|
|
#include <sstream>
|
|
|
|
#include <robuffer.h>
|
|
|
|
#include <mfapi.h>
|
|
#include <mfidl.h>
|
|
#include <Mferror.h>
|
|
|
|
#include <windows.media.h>
|
|
#include <windows.media.mediaproperties.h>
|
|
|
|
namespace AWM = ::ABI::Windows::Media;
|
|
namespace AWMMp = ::ABI::Windows::Media::MediaProperties;
|
|
namespace AWFC = ::ABI::Windows::Foundation::Collections;
|
|
namespace MW = ::Microsoft::WRL;
|
|
namespace MWD = ::Microsoft::WRL::Details;
|
|
namespace MWW = ::Microsoft::WRL::Wrappers;
|
|
namespace WMC = ::Windows::Media::Capture;
|
|
namespace WF = ::Windows::Foundation;
|
|
namespace WMMp = ::Windows::Media::MediaProperties;
|
|
namespace WSS = ::Windows::Storage::Streams;
|
|
|
|
// Exception-based error handling
|
|
#define CHK(statement) {HRESULT _hr = (statement); if (FAILED(_hr)) { throw ref new Platform::COMException(_hr); };}
|
|
#define CHKNULL(p) {if ((p) == nullptr) { throw ref new Platform::NullReferenceException(L#p); };}
|
|
|
|
// Exception-free error handling
|
|
#define CHK_RETURN(statement) {hr = (statement); if (FAILED(hr)) { return hr; };}
|
|
|
|
// Cast a C++/CX msartpointer to an ABI smartpointer
|
|
template<typename T, typename U>
|
|
MW::ComPtr<T> As(U^ in)
|
|
{
|
|
MW::ComPtr<T> out;
|
|
CHK(reinterpret_cast<IInspectable*>(in)->QueryInterface(IID_PPV_ARGS(&out)));
|
|
return out;
|
|
}
|
|
|
|
// Cast an ABI smartpointer
|
|
template<typename T, typename U>
|
|
Microsoft::WRL::ComPtr<T> As(const Microsoft::WRL::ComPtr<U>& in)
|
|
{
|
|
Microsoft::WRL::ComPtr<T> out;
|
|
CHK(in.As(&out));
|
|
return out;
|
|
}
|
|
|
|
// Cast an ABI smartpointer
|
|
template<typename T, typename U>
|
|
Microsoft::WRL::ComPtr<T> As(U* in)
|
|
{
|
|
Microsoft::WRL::ComPtr<T> out;
|
|
CHK(in->QueryInterface(IID_PPV_ARGS(&out)));
|
|
return out;
|
|
}
|
|
|
|
// Get access to bytes in IBuffer
|
|
inline unsigned char* GetData(_In_ WSS::IBuffer^ buffer)
|
|
{
|
|
unsigned char* bytes = nullptr;
|
|
CHK(As<WSS::IBufferByteAccess>(buffer)->Buffer(&bytes));
|
|
return bytes;
|
|
}
|
|
|
|
// Class to start and shutdown Media Foundation
|
|
class AutoMF
|
|
{
|
|
public:
|
|
AutoMF()
|
|
: _bInitialized(false)
|
|
{
|
|
CHK(MFStartup(MF_VERSION));
|
|
}
|
|
|
|
~AutoMF()
|
|
{
|
|
if (_bInitialized)
|
|
{
|
|
(void)MFShutdown();
|
|
}
|
|
}
|
|
|
|
private:
|
|
bool _bInitialized;
|
|
};
|
|
|
|
// Class to track error origin
|
|
template <size_t N>
|
|
HRESULT OriginateError(__in HRESULT hr, __in wchar_t const (&str)[N])
|
|
{
|
|
if (FAILED(hr))
|
|
{
|
|
::RoOriginateErrorW(hr, N - 1, str);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
// Class to track error origin
|
|
inline HRESULT OriginateError(__in HRESULT hr)
|
|
{
|
|
if (FAILED(hr))
|
|
{
|
|
::RoOriginateErrorW(hr, 0, nullptr);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
// Converts exceptions into HRESULTs
|
|
template <typename Lambda>
|
|
HRESULT ExceptionBoundary(Lambda&& lambda)
|
|
{
|
|
try
|
|
{
|
|
lambda();
|
|
return S_OK;
|
|
}
|
|
catch (Platform::Exception^ e)
|
|
{
|
|
return e->HResult;
|
|
}
|
|
catch (const std::bad_alloc&)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch (const std::exception&)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
// Wraps an IMFSample in a C++/CX class to be able to define a callback delegate
|
|
ref class MediaSample sealed
|
|
{
|
|
internal:
|
|
MW::ComPtr<IMFSample> Sample;
|
|
};
|
|
|
|
delegate void MediaSampleHandler(MediaSample^ sample); |