mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
6.6 KiB
247 lines
6.6 KiB
// Defines the transform class. |
|
// |
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF |
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO |
|
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A |
|
// PARTICULAR PURPOSE. |
|
// |
|
// Copyright (c) Microsoft Corporation. All rights reserved. |
|
|
|
#ifndef GRAYSCALE_H |
|
#define GRAYSCALE_H |
|
|
|
#include <new> |
|
#include <mfapi.h> |
|
#include <mftransform.h> |
|
#include <mfidl.h> |
|
#include <mferror.h> |
|
#include <strsafe.h> |
|
#include <assert.h> |
|
|
|
#include <wrl\implements.h> |
|
#include <wrl\module.h> |
|
#include <windows.media.h> |
|
|
|
#include "OcvImageManipulations.h" |
|
|
|
// CLSID of the MFT. |
|
DEFINE_GUID(CLSID_GrayscaleMFT, |
|
0x2f3dbc05, 0xc011, 0x4a8f, 0xb2, 0x64, 0xe4, 0x2e, 0x35, 0xc6, 0x7b, 0xf4); |
|
|
|
// |
|
// * IMPORTANT: If you implement your own MFT, create a new GUID for the CLSID. * |
|
// |
|
|
|
|
|
// Configuration attributes |
|
// {698649BE-8EAE-4551-A4CB-3EC98FBD3D86} |
|
DEFINE_GUID(OCV_IMAGE_EFFECT, |
|
0x698649be, 0x8eae, 0x4551, 0xa4, 0xcb, 0x3e, 0xc9, 0x8f, 0xbd, 0x3d, 0x86); |
|
|
|
|
|
enum ProcessingType |
|
{ |
|
Preview, |
|
GrayScale, |
|
Canny, |
|
Sobel, |
|
Histogram, |
|
InvalidEffect |
|
}; |
|
|
|
template <class T> void SafeRelease(T **ppT) |
|
{ |
|
if (*ppT) |
|
{ |
|
(*ppT)->Release(); |
|
*ppT = NULL; |
|
} |
|
} |
|
|
|
// OcvImageManipulations class: |
|
// Implements a grayscale video effect. |
|
|
|
class OcvImageManipulations |
|
: public Microsoft::WRL::RuntimeClass< |
|
Microsoft::WRL::RuntimeClassFlags< Microsoft::WRL::RuntimeClassType::WinRtClassicComMix >, |
|
ABI::Windows::Media::IMediaExtension, |
|
IMFTransform > |
|
{ |
|
InspectableClass(RuntimeClass_OcvTransform_OcvImageManipulations, BaseTrust) |
|
|
|
public: |
|
OcvImageManipulations(); |
|
|
|
~OcvImageManipulations(); |
|
|
|
STDMETHOD(RuntimeClassInitialize)(); |
|
|
|
// IMediaExtension |
|
STDMETHODIMP SetProperties(ABI::Windows::Foundation::Collections::IPropertySet *pConfiguration); |
|
|
|
// IMFTransform |
|
STDMETHODIMP GetStreamLimits( |
|
DWORD *pdwInputMinimum, |
|
DWORD *pdwInputMaximum, |
|
DWORD *pdwOutputMinimum, |
|
DWORD *pdwOutputMaximum |
|
); |
|
|
|
STDMETHODIMP GetStreamCount( |
|
DWORD *pcInputStreams, |
|
DWORD *pcOutputStreams |
|
); |
|
|
|
STDMETHODIMP GetStreamIDs( |
|
DWORD dwInputIDArraySize, |
|
DWORD *pdwInputIDs, |
|
DWORD dwOutputIDArraySize, |
|
DWORD *pdwOutputIDs |
|
); |
|
|
|
STDMETHODIMP GetInputStreamInfo( |
|
DWORD dwInputStreamID, |
|
MFT_INPUT_STREAM_INFO * pStreamInfo |
|
); |
|
|
|
STDMETHODIMP GetOutputStreamInfo( |
|
DWORD dwOutputStreamID, |
|
MFT_OUTPUT_STREAM_INFO * pStreamInfo |
|
); |
|
|
|
STDMETHODIMP GetAttributes(IMFAttributes** pAttributes); |
|
|
|
STDMETHODIMP GetInputStreamAttributes( |
|
DWORD dwInputStreamID, |
|
IMFAttributes **ppAttributes |
|
); |
|
|
|
STDMETHODIMP GetOutputStreamAttributes( |
|
DWORD dwOutputStreamID, |
|
IMFAttributes **ppAttributes |
|
); |
|
|
|
STDMETHODIMP DeleteInputStream(DWORD dwStreamID); |
|
|
|
STDMETHODIMP AddInputStreams( |
|
DWORD cStreams, |
|
DWORD *adwStreamIDs |
|
); |
|
|
|
STDMETHODIMP GetInputAvailableType( |
|
DWORD dwInputStreamID, |
|
DWORD dwTypeIndex, // 0-based |
|
IMFMediaType **ppType |
|
); |
|
|
|
STDMETHODIMP GetOutputAvailableType( |
|
DWORD dwOutputStreamID, |
|
DWORD dwTypeIndex, // 0-based |
|
IMFMediaType **ppType |
|
); |
|
|
|
STDMETHODIMP SetInputType( |
|
DWORD dwInputStreamID, |
|
IMFMediaType *pType, |
|
DWORD dwFlags |
|
); |
|
|
|
STDMETHODIMP SetOutputType( |
|
DWORD dwOutputStreamID, |
|
IMFMediaType *pType, |
|
DWORD dwFlags |
|
); |
|
|
|
STDMETHODIMP GetInputCurrentType( |
|
DWORD dwInputStreamID, |
|
IMFMediaType **ppType |
|
); |
|
|
|
STDMETHODIMP GetOutputCurrentType( |
|
DWORD dwOutputStreamID, |
|
IMFMediaType **ppType |
|
); |
|
|
|
STDMETHODIMP GetInputStatus( |
|
DWORD dwInputStreamID, |
|
DWORD *pdwFlags |
|
); |
|
|
|
STDMETHODIMP GetOutputStatus(DWORD *pdwFlags); |
|
|
|
STDMETHODIMP SetOutputBounds( |
|
LONGLONG hnsLowerBound, |
|
LONGLONG hnsUpperBound |
|
); |
|
|
|
STDMETHODIMP ProcessEvent( |
|
DWORD dwInputStreamID, |
|
IMFMediaEvent *pEvent |
|
); |
|
|
|
STDMETHODIMP ProcessMessage( |
|
MFT_MESSAGE_TYPE eMessage, |
|
ULONG_PTR ulParam |
|
); |
|
|
|
STDMETHODIMP ProcessInput( |
|
DWORD dwInputStreamID, |
|
IMFSample *pSample, |
|
DWORD dwFlags |
|
); |
|
|
|
STDMETHODIMP ProcessOutput( |
|
DWORD dwFlags, |
|
DWORD cOutputBufferCount, |
|
MFT_OUTPUT_DATA_BUFFER *pOutputSamples, // one per stream |
|
DWORD *pdwStatus |
|
); |
|
|
|
|
|
private: |
|
// HasPendingOutput: Returns TRUE if the MFT is holding an input sample. |
|
BOOL HasPendingOutput() const { return m_pSample != NULL; } |
|
|
|
// IsValidInputStream: Returns TRUE if dwInputStreamID is a valid input stream identifier. |
|
BOOL IsValidInputStream(DWORD dwInputStreamID) const |
|
{ |
|
return dwInputStreamID == 0; |
|
} |
|
|
|
// IsValidOutputStream: Returns TRUE if dwOutputStreamID is a valid output stream identifier. |
|
BOOL IsValidOutputStream(DWORD dwOutputStreamID) const |
|
{ |
|
return dwOutputStreamID == 0; |
|
} |
|
|
|
HRESULT OnGetPartialType(DWORD dwTypeIndex, IMFMediaType **ppmt); |
|
HRESULT OnCheckInputType(IMFMediaType *pmt); |
|
HRESULT OnCheckOutputType(IMFMediaType *pmt); |
|
HRESULT OnCheckMediaType(IMFMediaType *pmt); |
|
void OnSetInputType(IMFMediaType *pmt); |
|
void OnSetOutputType(IMFMediaType *pmt); |
|
HRESULT BeginStreaming(); |
|
HRESULT EndStreaming(); |
|
HRESULT OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut); |
|
HRESULT OnFlush(); |
|
HRESULT UpdateFormatInfo(); |
|
|
|
CRITICAL_SECTION m_critSec; |
|
|
|
// Transformation parameters |
|
ProcessingType m_TransformType; |
|
|
|
// Streaming |
|
bool m_bStreamingInitialized; |
|
IMFSample *m_pSample; // Input sample. |
|
IMFMediaType *m_pInputType; // Input media type. |
|
IMFMediaType *m_pOutputType; // Output media type. |
|
|
|
// Fomat information |
|
UINT32 m_imageWidthInPixels; |
|
UINT32 m_imageHeightInPixels; |
|
DWORD m_cbImageSize; // Image size, in bytes. |
|
|
|
IMFAttributes *m_pAttributes; |
|
}; |
|
#endif
|
|
|