Path: blob/master/samples/winrt/ImageManipulations/MediaExtensions/OcvTransform/OcvTransform.h
16349 views
// Defines the transform class.1//2// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF3// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO4// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A5// PARTICULAR PURPOSE.6//7// Copyright (c) Microsoft Corporation. All rights reserved.89#ifndef GRAYSCALE_H10#define GRAYSCALE_H1112#include <new>13#include <mfapi.h>14#include <mftransform.h>15#include <mfidl.h>16#include <mferror.h>17#include <strsafe.h>18#include <assert.h>1920#include <wrl\implements.h>21#include <wrl\module.h>22#include <windows.media.h>2324#include "OcvImageManipulations.h"2526// CLSID of the MFT.27DEFINE_GUID(CLSID_GrayscaleMFT,280x2f3dbc05, 0xc011, 0x4a8f, 0xb2, 0x64, 0xe4, 0x2e, 0x35, 0xc6, 0x7b, 0xf4);2930//31// * IMPORTANT: If you implement your own MFT, create a new GUID for the CLSID. *32//333435// Configuration attributes36// {698649BE-8EAE-4551-A4CB-3EC98FBD3D86}37DEFINE_GUID(OCV_IMAGE_EFFECT,380x698649be, 0x8eae, 0x4551, 0xa4, 0xcb, 0x3e, 0xc9, 0x8f, 0xbd, 0x3d, 0x86);394041enum ProcessingType42{43Preview,44GrayScale,45Canny,46Sobel,47Histogram,48InvalidEffect49};5051template <class T> void SafeRelease(T **ppT)52{53if (*ppT)54{55(*ppT)->Release();56*ppT = NULL;57}58}5960// OcvImageManipulations class:61// Implements a grayscale video effect.6263class OcvImageManipulations64: public Microsoft::WRL::RuntimeClass<65Microsoft::WRL::RuntimeClassFlags< Microsoft::WRL::RuntimeClassType::WinRtClassicComMix >,66ABI::Windows::Media::IMediaExtension,67IMFTransform >68{69InspectableClass(RuntimeClass_OcvTransform_OcvImageManipulations, BaseTrust)7071public:72OcvImageManipulations();7374~OcvImageManipulations();7576STDMETHOD(RuntimeClassInitialize)();7778// IMediaExtension79STDMETHODIMP SetProperties(ABI::Windows::Foundation::Collections::IPropertySet *pConfiguration);8081// IMFTransform82STDMETHODIMP GetStreamLimits(83DWORD *pdwInputMinimum,84DWORD *pdwInputMaximum,85DWORD *pdwOutputMinimum,86DWORD *pdwOutputMaximum87);8889STDMETHODIMP GetStreamCount(90DWORD *pcInputStreams,91DWORD *pcOutputStreams92);9394STDMETHODIMP GetStreamIDs(95DWORD dwInputIDArraySize,96DWORD *pdwInputIDs,97DWORD dwOutputIDArraySize,98DWORD *pdwOutputIDs99);100101STDMETHODIMP GetInputStreamInfo(102DWORD dwInputStreamID,103MFT_INPUT_STREAM_INFO * pStreamInfo104);105106STDMETHODIMP GetOutputStreamInfo(107DWORD dwOutputStreamID,108MFT_OUTPUT_STREAM_INFO * pStreamInfo109);110111STDMETHODIMP GetAttributes(IMFAttributes** pAttributes);112113STDMETHODIMP GetInputStreamAttributes(114DWORD dwInputStreamID,115IMFAttributes **ppAttributes116);117118STDMETHODIMP GetOutputStreamAttributes(119DWORD dwOutputStreamID,120IMFAttributes **ppAttributes121);122123STDMETHODIMP DeleteInputStream(DWORD dwStreamID);124125STDMETHODIMP AddInputStreams(126DWORD cStreams,127DWORD *adwStreamIDs128);129130STDMETHODIMP GetInputAvailableType(131DWORD dwInputStreamID,132DWORD dwTypeIndex, // 0-based133IMFMediaType **ppType134);135136STDMETHODIMP GetOutputAvailableType(137DWORD dwOutputStreamID,138DWORD dwTypeIndex, // 0-based139IMFMediaType **ppType140);141142STDMETHODIMP SetInputType(143DWORD dwInputStreamID,144IMFMediaType *pType,145DWORD dwFlags146);147148STDMETHODIMP SetOutputType(149DWORD dwOutputStreamID,150IMFMediaType *pType,151DWORD dwFlags152);153154STDMETHODIMP GetInputCurrentType(155DWORD dwInputStreamID,156IMFMediaType **ppType157);158159STDMETHODIMP GetOutputCurrentType(160DWORD dwOutputStreamID,161IMFMediaType **ppType162);163164STDMETHODIMP GetInputStatus(165DWORD dwInputStreamID,166DWORD *pdwFlags167);168169STDMETHODIMP GetOutputStatus(DWORD *pdwFlags);170171STDMETHODIMP SetOutputBounds(172LONGLONG hnsLowerBound,173LONGLONG hnsUpperBound174);175176STDMETHODIMP ProcessEvent(177DWORD dwInputStreamID,178IMFMediaEvent *pEvent179);180181STDMETHODIMP ProcessMessage(182MFT_MESSAGE_TYPE eMessage,183ULONG_PTR ulParam184);185186STDMETHODIMP ProcessInput(187DWORD dwInputStreamID,188IMFSample *pSample,189DWORD dwFlags190);191192STDMETHODIMP ProcessOutput(193DWORD dwFlags,194DWORD cOutputBufferCount,195MFT_OUTPUT_DATA_BUFFER *pOutputSamples, // one per stream196DWORD *pdwStatus197);198199200private:201// HasPendingOutput: Returns TRUE if the MFT is holding an input sample.202BOOL HasPendingOutput() const { return m_pSample != NULL; }203204// IsValidInputStream: Returns TRUE if dwInputStreamID is a valid input stream identifier.205BOOL IsValidInputStream(DWORD dwInputStreamID) const206{207return dwInputStreamID == 0;208}209210// IsValidOutputStream: Returns TRUE if dwOutputStreamID is a valid output stream identifier.211BOOL IsValidOutputStream(DWORD dwOutputStreamID) const212{213return dwOutputStreamID == 0;214}215216HRESULT OnGetPartialType(DWORD dwTypeIndex, IMFMediaType **ppmt);217HRESULT OnCheckInputType(IMFMediaType *pmt);218HRESULT OnCheckOutputType(IMFMediaType *pmt);219HRESULT OnCheckMediaType(IMFMediaType *pmt);220void OnSetInputType(IMFMediaType *pmt);221void OnSetOutputType(IMFMediaType *pmt);222HRESULT BeginStreaming();223HRESULT EndStreaming();224HRESULT OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut);225HRESULT OnFlush();226HRESULT UpdateFormatInfo();227228CRITICAL_SECTION m_critSec;229230// Transformation parameters231ProcessingType m_TransformType;232233// Streaming234bool m_bStreamingInitialized;235IMFSample *m_pSample; // Input sample.236IMFMediaType *m_pInputType; // Input media type.237IMFMediaType *m_pOutputType; // Output media type.238239// Fomat information240UINT32 m_imageWidthInPixels;241UINT32 m_imageHeightInPixels;242DWORD m_cbImageSize; // Image size, in bytes.243244IMFAttributes *m_pAttributes;245};246#endif247248249