summaryrefslogtreecommitdiff
path: root/avstream/samplemft0/Mft0.h
blob: 0cc85733105d8129b362612ef217db154431d38c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
// Mft0.h : Declaration of the CMft0

#pragma once
#include "resource.h"       // main symbols
#include "SampleMft0.h"
#include "SampleHelpers.h"

#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif

using namespace ATL;

// CMft0

class ATL_NO_VTABLE CMft0 :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<CMft0, &CLSID_Mft0>,
    public IMft0, 
    public IMFTransform,
    public IInspectable
{
public:
    CMft0() :   m_pSample(NULL),
        m_pInputType(NULL),
        m_pOutputType(NULL),
        m_pInputAttributes(0),
        m_pGlobalAttributes(0),
        m_pSourceTransform(0),
        m_bEnableEffects(TRUE),
        m_uiStreamId(0),
        m_percentOfScreen(50),
        m_nRefCount(1)
    {
        InitializeCriticalSection(&m_critSec);
    }

    DECLARE_REGISTRY_RESOURCEID(IDR_MFT0)

    DECLARE_NOT_AGGREGATABLE(CMft0)

    BEGIN_COM_MAP(CMft0)
        COM_INTERFACE_ENTRY(IMft0)
        COM_INTERFACE_ENTRY(IMFTransform)
        COM_INTERFACE_ENTRY(IInspectable)
    END_COM_MAP()

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }

    void FinalRelease()
    {
    }

public:
    STDMETHOD(UpdateDsp)(UINT32 uiPercentOfScreen);
    STDMETHOD(Enable)(void);
    STDMETHOD(Disable)(void);
    STDMETHOD(GetDspSetting)(UINT* puiPercentOfScreen, BOOL* pIsEnabled);

    STDMETHODIMP GetIids( 
        /* [out] */ _Out_ ULONG *iidCount,
        /* [size_is][size_is][out] */ _Outptr_result_buffer_maybenull_(*iidCount) IID **iids);

    STDMETHODIMP GetRuntimeClassName( 
        /* [out] */ _Outptr_result_maybenull_ HSTRING *className);

    STDMETHODIMP GetTrustLevel( 
        /* [out] */ _Out_ TrustLevel *trustLevel);

    STDMETHODIMP GetStreamLimits( 
        /* [out] */ _Out_ DWORD *pdwInputMinimum,
        /* [out] */ _Out_ DWORD *pdwInputMaximum,
        /* [out] */ _Out_ DWORD *pdwOutputMinimum,
        /* [out] */ _Out_ DWORD *pdwOutputMaximum);

    STDMETHODIMP GetStreamCount( 
        /* [out] */ _Out_ DWORD *pcInputStreams,
        /* [out] */ _Out_ DWORD *pcOutputStreams);

    STDMETHODIMP GetStreamIDs( 
        DWORD dwInputIDArraySize,
        /* [size_is][out] */ _Out_writes_(dwInputIDArraySize) DWORD *pdwInputIDs,
        DWORD dwOutputIDArraySize,
        /* [size_is][out] */ _Out_writes_(dwOutputIDArraySize) DWORD *pdwOutputIDs);

    STDMETHODIMP GetInputStreamInfo( 
        DWORD dwInputStreamID,
        /* [out] */ _Out_ MFT_INPUT_STREAM_INFO *pStreamInfo);

    STDMETHODIMP GetOutputStreamInfo( 
        DWORD dwOutputStreamID,
        /* [out] */ _Out_ MFT_OUTPUT_STREAM_INFO *pStreamInfo);

    STDMETHODIMP GetAttributes( 
        /* [out] */ _Outptr_result_maybenull_ IMFAttributes **pAttributes);

    STDMETHODIMP GetInputStreamAttributes( 
        DWORD dwInputStreamID,
        /* [out] */ _Outptr_result_maybenull_ IMFAttributes **pAttributes);

    STDMETHODIMP GetOutputStreamAttributes( 
        DWORD dwOutputStreamID,
        /* [out] */ _Outptr_result_maybenull_ IMFAttributes **pAttributes);

    STDMETHODIMP DeleteInputStream( 
        DWORD dwStreamID);

    STDMETHODIMP AddInputStreams( 
        DWORD cStreams,
        /* [in] */ _In_ DWORD *adwStreamIDs);

    STDMETHODIMP GetInputAvailableType( 
        DWORD dwInputStreamID,
        DWORD dwTypeIndex,
        /* [out] */ _Outptr_result_maybenull_ IMFMediaType **ppType);

    STDMETHODIMP GetOutputAvailableType( 
        DWORD dwOutputStreamID,
        DWORD dwTypeIndex,
        /* [out] */ _Outptr_result_maybenull_ IMFMediaType **ppType);

    STDMETHODIMP SetInputType( 
        DWORD dwInputStreamID,
        /* [in] */ _In_opt_ IMFMediaType *pType,
        DWORD dwFlags);

    STDMETHODIMP SetOutputType( 
        DWORD dwOutputStreamID,
        /* [in] */ _In_opt_ IMFMediaType *pType,
        DWORD dwFlags);

    STDMETHODIMP GetInputCurrentType( 
        DWORD dwInputStreamID,
        /* [out] */ _Outptr_result_maybenull_ IMFMediaType **ppType);

    STDMETHODIMP GetOutputCurrentType( 
        DWORD dwOutputStreamID,
        /* [out] */ _Outptr_result_maybenull_ IMFMediaType **ppType);

    STDMETHODIMP GetInputStatus( 
        DWORD dwInputStreamID,
        /* [out] */ _Out_ DWORD *pdwFlags);

    STDMETHODIMP GetOutputStatus( 
        /* [out] */ _Out_ DWORD *pdwFlags);

    STDMETHODIMP SetOutputBounds( 
        LONGLONG hnsLowerBound,
        LONGLONG hnsUpperBound);

    STDMETHODIMP ProcessEvent( 
        DWORD dwInputStreamID,
        /* [in] */ _In_opt_ 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,
        /* [size_is][out][in] */ MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
        /* [out] */ DWORD *pdwStatus);

protected:
    virtual ~CMft0()
    {
        SAFERELEASE(m_pInputAttributes);
        SAFERELEASE(m_pGlobalAttributes);
        SAFERELEASE(m_pSourceTransform);
        SAFERELEASE(m_pInputType);
        SAFERELEASE(m_pOutputType);
        SAFERELEASE(m_pSample);
        DeleteCriticalSection(&m_critSec);
    }

    STDMETHODIMP GetMediaType(DWORD  dwStreamID, DWORD dwTypeIndex, IMFMediaType **ppType);
    STDMETHODIMP IsMediaTypeSupported(UINT uiStreamId, IMFMediaType *pIMFMediaType, IMFMediaType **ppIMFMediaTypeFull = NULL);
    STDMETHODIMP GenerateMFMediaTypeListFromDevice(UINT uiStreamId);

    // 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);

    // IsValidOutputStream: Returns TRUE if dwOutputStreamID is a valid output stream identifier.
    BOOL IsValidOutputStream(DWORD dwOutputStreamID);

    STDMETHODIMP GetDefaultStride(LONG *plStride);

    STDMETHODIMP OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut);

    STDMETHODIMP OnFlush();

    CRITICAL_SECTION            m_critSec;

    IMFSample                   *m_pSample;                 // Input sample.
    IMFMediaType                *m_pInputType;              // Input media type.
    IMFMediaType                *m_pOutputType;             // Output media type.

    // Image transform function. (Changes based on the media type.)
    IMFAttributes               *m_pInputAttributes;
    IMFAttributes               *m_pGlobalAttributes;
    GUID                        m_stStreamType;
    IMFTransform                *m_pSourceTransform;
    volatile BOOL               m_bEnableEffects;
    UINT                        m_uiStreamId;
    UINT                        m_percentOfScreen;
    UINT                        m_nRefCount;
    CAtlMap<DWORD, CComPtr<IMFMediaType>> m_listOfMediaTypes;
};

OBJECT_ENTRY_AUTO(__uuidof(Mft0), CMft0)