Home | History | Annotate | Download | only in OcvTransform
      1 // Defines the transform class.
      2 //
      3 // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
      4 // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
      5 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
      6 // PARTICULAR PURPOSE.
      7 //
      8 // Copyright (c) Microsoft Corporation. All rights reserved.
      9 
     10 #ifndef GRAYSCALE_H
     11 #define GRAYSCALE_H
     12 
     13 #include <new>
     14 #include <mfapi.h>
     15 #include <mftransform.h>
     16 #include <mfidl.h>
     17 #include <mferror.h>
     18 #include <strsafe.h>
     19 #include <assert.h>
     20 
     21 #include <wrl\implements.h>
     22 #include <wrl\module.h>
     23 #include <windows.media.h>
     24 
     25 #include "OcvImageManipulations.h"
     26 
     27 // CLSID of the MFT.
     28 DEFINE_GUID(CLSID_GrayscaleMFT,
     29 0x2f3dbc05, 0xc011, 0x4a8f, 0xb2, 0x64, 0xe4, 0x2e, 0x35, 0xc6, 0x7b, 0xf4);
     30 
     31 //
     32 // * IMPORTANT: If you implement your own MFT, create a new GUID for the CLSID. *
     33 //
     34 
     35 
     36 // Configuration attributes
     37 // {698649BE-8EAE-4551-A4CB-3EC98FBD3D86}
     38 DEFINE_GUID(OCV_IMAGE_EFFECT,
     39 0x698649be, 0x8eae, 0x4551, 0xa4, 0xcb, 0x3e, 0xc9, 0x8f, 0xbd, 0x3d, 0x86);
     40 
     41 
     42 enum ProcessingType
     43 {
     44     Preview,
     45     GrayScale,
     46     Canny,
     47     Sobel,
     48     Histogram,
     49     InvalidEffect
     50 };
     51 
     52 template <class T> void SafeRelease(T **ppT)
     53 {
     54     if (*ppT)
     55     {
     56         (*ppT)->Release();
     57         *ppT = NULL;
     58     }
     59 }
     60 
     61 // OcvImageManipulations class:
     62 // Implements a grayscale video effect.
     63 
     64 class OcvImageManipulations
     65     : public Microsoft::WRL::RuntimeClass<
     66            Microsoft::WRL::RuntimeClassFlags< Microsoft::WRL::RuntimeClassType::WinRtClassicComMix >,
     67            ABI::Windows::Media::IMediaExtension,
     68            IMFTransform >
     69 {
     70     InspectableClass(RuntimeClass_OcvTransform_OcvImageManipulations, BaseTrust)
     71 
     72 public:
     73     OcvImageManipulations();
     74 
     75     ~OcvImageManipulations();
     76 
     77     STDMETHOD(RuntimeClassInitialize)();
     78 
     79     // IMediaExtension
     80     STDMETHODIMP SetProperties(ABI::Windows::Foundation::Collections::IPropertySet *pConfiguration);
     81 
     82     // IMFTransform
     83     STDMETHODIMP GetStreamLimits(
     84         DWORD   *pdwInputMinimum,
     85         DWORD   *pdwInputMaximum,
     86         DWORD   *pdwOutputMinimum,
     87         DWORD   *pdwOutputMaximum
     88     );
     89 
     90     STDMETHODIMP GetStreamCount(
     91         DWORD   *pcInputStreams,
     92         DWORD   *pcOutputStreams
     93     );
     94 
     95     STDMETHODIMP GetStreamIDs(
     96         DWORD   dwInputIDArraySize,
     97         DWORD   *pdwInputIDs,
     98         DWORD   dwOutputIDArraySize,
     99         DWORD   *pdwOutputIDs
    100     );
    101 
    102     STDMETHODIMP GetInputStreamInfo(
    103         DWORD                     dwInputStreamID,
    104         MFT_INPUT_STREAM_INFO *   pStreamInfo
    105     );
    106 
    107     STDMETHODIMP GetOutputStreamInfo(
    108         DWORD                     dwOutputStreamID,
    109         MFT_OUTPUT_STREAM_INFO *  pStreamInfo
    110     );
    111 
    112     STDMETHODIMP GetAttributes(IMFAttributes** pAttributes);
    113 
    114     STDMETHODIMP GetInputStreamAttributes(
    115         DWORD           dwInputStreamID,
    116         IMFAttributes   **ppAttributes
    117     );
    118 
    119     STDMETHODIMP GetOutputStreamAttributes(
    120         DWORD           dwOutputStreamID,
    121         IMFAttributes   **ppAttributes
    122     );
    123 
    124     STDMETHODIMP DeleteInputStream(DWORD dwStreamID);
    125 
    126     STDMETHODIMP AddInputStreams(
    127         DWORD   cStreams,
    128         DWORD   *adwStreamIDs
    129     );
    130 
    131     STDMETHODIMP GetInputAvailableType(
    132         DWORD           dwInputStreamID,
    133         DWORD           dwTypeIndex, // 0-based
    134         IMFMediaType    **ppType
    135     );
    136 
    137     STDMETHODIMP GetOutputAvailableType(
    138         DWORD           dwOutputStreamID,
    139         DWORD           dwTypeIndex, // 0-based
    140         IMFMediaType    **ppType
    141     );
    142 
    143     STDMETHODIMP SetInputType(
    144         DWORD           dwInputStreamID,
    145         IMFMediaType    *pType,
    146         DWORD           dwFlags
    147     );
    148 
    149     STDMETHODIMP SetOutputType(
    150         DWORD           dwOutputStreamID,
    151         IMFMediaType    *pType,
    152         DWORD           dwFlags
    153     );
    154 
    155     STDMETHODIMP GetInputCurrentType(
    156         DWORD           dwInputStreamID,
    157         IMFMediaType    **ppType
    158     );
    159 
    160     STDMETHODIMP GetOutputCurrentType(
    161         DWORD           dwOutputStreamID,
    162         IMFMediaType    **ppType
    163     );
    164 
    165     STDMETHODIMP GetInputStatus(
    166         DWORD           dwInputStreamID,
    167         DWORD           *pdwFlags
    168     );
    169 
    170     STDMETHODIMP GetOutputStatus(DWORD *pdwFlags);
    171 
    172     STDMETHODIMP SetOutputBounds(
    173         LONGLONG        hnsLowerBound,
    174         LONGLONG        hnsUpperBound
    175     );
    176 
    177     STDMETHODIMP ProcessEvent(
    178         DWORD              dwInputStreamID,
    179         IMFMediaEvent      *pEvent
    180     );
    181 
    182     STDMETHODIMP ProcessMessage(
    183         MFT_MESSAGE_TYPE    eMessage,
    184         ULONG_PTR           ulParam
    185     );
    186 
    187     STDMETHODIMP ProcessInput(
    188         DWORD               dwInputStreamID,
    189         IMFSample           *pSample,
    190         DWORD               dwFlags
    191     );
    192 
    193     STDMETHODIMP ProcessOutput(
    194         DWORD                   dwFlags,
    195         DWORD                   cOutputBufferCount,
    196         MFT_OUTPUT_DATA_BUFFER  *pOutputSamples, // one per stream
    197         DWORD                   *pdwStatus
    198     );
    199 
    200 
    201 private:
    202     // HasPendingOutput: Returns TRUE if the MFT is holding an input sample.
    203     BOOL HasPendingOutput() const { return m_pSample != NULL; }
    204 
    205     // IsValidInputStream: Returns TRUE if dwInputStreamID is a valid input stream identifier.
    206     BOOL IsValidInputStream(DWORD dwInputStreamID) const
    207     {
    208         return dwInputStreamID == 0;
    209     }
    210 
    211     // IsValidOutputStream: Returns TRUE if dwOutputStreamID is a valid output stream identifier.
    212     BOOL IsValidOutputStream(DWORD dwOutputStreamID) const
    213     {
    214         return dwOutputStreamID == 0;
    215     }
    216 
    217     HRESULT OnGetPartialType(DWORD dwTypeIndex, IMFMediaType **ppmt);
    218     HRESULT OnCheckInputType(IMFMediaType *pmt);
    219     HRESULT OnCheckOutputType(IMFMediaType *pmt);
    220     HRESULT OnCheckMediaType(IMFMediaType *pmt);
    221     void    OnSetInputType(IMFMediaType *pmt);
    222     void    OnSetOutputType(IMFMediaType *pmt);
    223     HRESULT BeginStreaming();
    224     HRESULT EndStreaming();
    225     HRESULT OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut);
    226     HRESULT OnFlush();
    227     HRESULT UpdateFormatInfo();
    228 
    229     CRITICAL_SECTION            m_critSec;
    230 
    231     // Transformation parameters
    232     ProcessingType              m_TransformType;
    233 
    234     // Streaming
    235     bool                        m_bStreamingInitialized;
    236     IMFSample                   *m_pSample;                 // Input sample.
    237     IMFMediaType                *m_pInputType;              // Input media type.
    238     IMFMediaType                *m_pOutputType;             // Output media type.
    239 
    240     // Fomat information
    241     UINT32                      m_imageWidthInPixels;
    242     UINT32                      m_imageHeightInPixels;
    243     DWORD                       m_cbImageSize;              // Image size, in bytes.
    244 
    245     IMFAttributes               *m_pAttributes;
    246 };
    247 #endif
    248