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
|
/**************************************************************************
AVStream Filter-Centric Sample
Copyright (c) 1999 - 2001, Microsoft Corporation
File:
video.h
Abstract:
This file contains the video capture pin header.
History:
created 6/11/01
**************************************************************************/
class CVideoCapturePin :
public CCapturePin {
private:
//
// A scratch buffer to write into. Due to the fact that we're likely
// sitting upstream of the VMR and getting video memory, I don't want the
// image synthesizer writing to video memory a single byte at a time.
// This will be the buffer that the image synth uses. After a synthesis,
// the buffer will get copied into the data buffers for capture.
//
PUCHAR m_SynthesisBuffer;
//
// The captured video info header. The settings for image synthesis will
// be based off this header.
//
PKS_VIDEOINFOHEADER m_VideoInfoHeader;
//
// The image synthesizer. This object is used to construct synthesized
// image data in the video format specified by the connection format.
//
CImageSynthesizer *m_ImageSynth;
//
// CaptureVideoInfoHeader():
//
// This routine stashes the video info header set on the pin connection
// in the CVideoCapturePin object. This is used to determine necessary
// variables for image synthesis, etc...
//
PKS_VIDEOINFOHEADER
CaptureVideoInfoHeader (
);
protected:
public:
//
// CVideoCapturePin():
//
// Construct a new video capture pin.
//
CVideoCapturePin (
IN PKSPIN Pin
) :
CCapturePin (Pin)
{
}
//
// ~CVideoCapturePin():
//
// Destruct a video capture pin.
//
virtual
~CVideoCapturePin (
)
{
}
//
// CaptureFrame():
//
// Called from the filter processing routine to indicate that the pin
// should attempt to trigger capture of a video frame. This routine
// will copy synthesized image data into the frame buffer and complete
// the frame buffer.
//
virtual
NTSTATUS
CaptureFrame (
IN PKSPROCESSPIN ProcessPin,
IN ULONG Tick
);
//
// Pause():
//
// Called when the video capture pin is transitioning into the pause
// state. This will instruct the capture filter to start the timer DPC's
// at the interval demanded by the video info header in the connection
// format.
//
virtual
NTSTATUS
Pause (
IN KSSTATE FromState
);
//
// Acquire():
//
// Called when the video capture pin is transitioning into the acquire
// state. This will create the necessary image synthesizer to begin
// synthesizing frame capture data when the pin transitions to the
// appropriate state.
//
virtual
NTSTATUS
Acquire (
IN KSSTATE FromState
);
//
// Stop():
//
// Called when the video capture pin is transitioning into a stop state.
// This simply destroys the image synthesizer in preparation for creating
// a new one next acquire.
//
virtual
NTSTATUS
Stop (
IN KSSTATE FromState
);
/*************************************************
Dispatch Functions
*************************************************/
//
// DispatchCreate():
//
// This is the creation dispatch for the video capture pin on the filter.
// It creates the CVideoCapturePin, associates it with the AVStream pin
// object and bags the class object for automatic cleanup when the
// pin is closed.
//
static
NTSTATUS
DispatchCreate (
IN PKSPIN Pin,
IN PIRP Irp
);
//
// DispatchSetFormat():
//
// This is the set data format dispatch for the pin. This will be called
// BEFORE pin creation to validate that a data format selected is a match
// for the range pulled out of our range list. It will also be called
// for format changes.
//
// If OldFormat is NULL, this is an indication that it's the initial
// call and not a format change. Even fixed format pins get this call
// once.
//
static
NTSTATUS
DispatchSetFormat (
IN PKSPIN Pin,
IN PKSDATAFORMAT OldFormat OPTIONAL,
IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
IN const KSDATARANGE *DataRange,
IN const KSATTRIBUTE_LIST *AttributeRange OPTIONAL
);
//
// IntersectHandler():
//
// This is the data intersection handler for the capture pin. This
// determines an optimal format in the intersection of two ranges,
// one local and one possibly foreign. If there is no compatible format,
// STATUS_NO_MATCH is returned.
//
static
NTSTATUS
IntersectHandler (
IN PKSFILTER Filter,
IN PIRP Irp,
IN PKSP_PIN PinInstance,
IN PKSDATARANGE CallerDataRange,
IN PKSDATARANGE DescriptorDataRange,
IN ULONG BufferSize,
OUT PVOID Data OPTIONAL,
OUT PULONG DataSize
);
//
// CleanupSynth():
//
// Called when the Image Synthesizer is removed from the object bag
// to be cleaned up. We simply delete the image synth.
//
static
void
CleanupSynth (
IN CImageSynthesizer *ImageSynth
)
{
delete ImageSynth;
}
};
|