blob: b39255ea6f0a9bae598969672e12cf282512c83f (
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
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
/**************************************************************************
AVStream Filter-Centric Sample
Copyright (c) 1999 - 2001, Microsoft Corporation
File:
filter.h
Abstract:
This file contails the filter level header for the filter-centric
capture filter.
History:
created 5/31/01
**************************************************************************/
/**************************************************************************
DEFINES
**************************************************************************/
//
// VIDEO_PIN_ID:
//
// The pin factory id of the video pin (the order in the descriptor table).
//
#define VIDEO_PIN_ID 0
/**************************************************************************
CLASSES
**************************************************************************/
class CCaptureFilter {
private:
//
// The AVStream filter object associated with this CCaptureFilter.
//
PKSFILTER m_Filter;
//
// The DPC used for the timer.
//
KDPC m_TimerDpc;
//
// The timer used for simulation of capture timings.
//
KTIMER m_Timer;
//
// Boolean used to detect whether the DPC routine is to shutdown or not
//
BOOLEAN m_StoppingDPC;
//
// The event used to signal successful shutdown of the timer DPC
//
KEVENT m_StopDPCEvent;
//
// The number of timer ticks that have occurred since the timer DPC
// started firing.
//
volatile ULONG m_Tick;
//
// The system time at the point that the timer DPC starts.
//
LARGE_INTEGER m_StartTime;
//
// The amount of time between timer DPC's (and hence frame capture
// triggers).
//
LONGLONG m_TimerInterval;
//
// The wave object. This is passed to the audio pin later, but it's
// used at filter create time to determine what ranges to expose on
// the audio pin.
//
CWaveObject *m_WaveObject;
//
// The audio pin factory id. This is dynamic since the pin is created
// dynamically at filter create time.
//
ULONG m_AudioPinId;
//
// Process():
//
// The process routine for the capture filter. This is responsible for
// copying synthesized data into image buffers. The DispatchProcess()
// function bridges to this routine in the context of the CCaptureFilter.
//
NTSTATUS
Process (
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
);
//
// BindAudioToWaveObject():
//
// This function call binds the audio stream exposed by the filter to
// the wave object m_WaveObject.
//
NTSTATUS
BindAudioToWaveObject (
);
//
// Cleanup():
//
// This is the bag cleanup callback for the CCaptureFilter. Not providing
// one would cause ExFreePool to be used. This is not good for C++
// constructed objects. We simply delete the object here.
//
static
void
Cleanup (
IN CCaptureFilter *CapFilter
)
{
delete CapFilter;
}
public:
//
// CCaptureFilter():
//
// The capture filter object constructor. Since the new operator will
// have zeroed the memory, do not bother initializing any NULL or 0
// fields. Only initialize non-NULL, non-0 fields.
//
CCaptureFilter (
IN PKSFILTER Filter
);
//
// ~CCaptureFilter():
//
// The capture filter destructor.
//
~CCaptureFilter (
)
{
}
//
// StartDPC():
//
// This is called in order to start the timer DPC running.
//
void
StartDPC (
IN LONGLONG TimerInterval
);
//
// StopDPC():
//
// This is called in order to stop the timer DPC running. The function
// will not return until it guarantees that no more timer DPC's fire.
//
void
StopDPC (
);
//
// GetWaveObject():
//
// Returns the wave object that has been opened for the filter.
//
CWaveObject *
GetWaveObject (
)
{
return m_WaveObject;
}
//
// GetTimerInterval():
//
// Returns the timer interval we're using to generate DPC's.
//
LONGLONG
GetTimerInterval (
);
/*************************************************
Dispatch Routines
*************************************************/
//
// DispatchCreate():
//
// This is the filter creation dispatch for the capture filter. It
// creates the CCaptureFilter object, associates it with the AVStream
// object, and bags it for easy cleanup later.
//
static
NTSTATUS
DispatchCreate (
IN PKSFILTER Filter,
IN PIRP Irp
);
//
// DispatchProcess():
//
// This is the filter process dispatch for the capture filter. It merely
// bridges to Process() in the context of the CCaptureFilter.
//
static
NTSTATUS
DispatchProcess (
IN PKSFILTER Filter,
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
)
{
return
(reinterpret_cast <CCaptureFilter *> (Filter -> Context)) ->
Process (ProcessPinsIndex);
}
//
// TimerDpc():
//
// The timer dpc routine. This is bridged to from TimerRoutine in the
// context of the appropriate CCaptureFilter.
//
void
TimerDpc (
);
};
|