Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/samples/winrt/ImageManipulations/MediaExtensions/OcvTransform/OcvTransform.h
16349 views
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
249