1 |
//------------------------------------------------------------------------------
|
2 |
// File: DynGraph.idl
|
3 |
//
|
4 |
// Desc: Dynamic graph interfaces.
|
5 |
//
|
6 |
// Copyright (c) 1999 - 2000, Microsoft Corporation. All rights reserved.
|
7 |
//------------------------------------------------------------------------------
|
8 |
|
9 |
|
10 |
interface IPinConnection;
|
11 |
interface IPinFlowControl;
|
12 |
interface IGraphConfig;
|
13 |
interface IGraphConfigCallback;
|
14 |
|
15 |
//--------------------------------------------------------------------
|
16 |
//
|
17 |
// IPinConnection - supported by input pins
|
18 |
//
|
19 |
//--------------------------------------------------------------------
|
20 |
[
|
21 |
local,
|
22 |
object,
|
23 |
uuid(4a9a62d3-27d4-403d-91e9-89f540e55534),
|
24 |
pointer_default(unique)
|
25 |
]
|
26 |
interface IPinConnection : IUnknown {
|
27 |
|
28 |
// Do you accept this type chane in your current state?
|
29 |
HRESULT DynamicQueryAccept([in] const AM_MEDIA_TYPE *pmt);
|
30 |
|
31 |
// Set event when EndOfStream receive - do NOT pass it on
|
32 |
// This condition is cancelled by a flush or Stop
|
33 |
HRESULT NotifyEndOfStream([in] HANDLE hNotifyEvent);
|
34 |
|
35 |
// Are you an 'end pin'
|
36 |
HRESULT IsEndPin();
|
37 |
|
38 |
HRESULT DynamicDisconnect();
|
39 |
};
|
40 |
|
41 |
//--------------------------------------------------------------------
|
42 |
//
|
43 |
// IPinFlowControl - supported by output pins
|
44 |
//
|
45 |
//--------------------------------------------------------------------
|
46 |
[
|
47 |
local,
|
48 |
object,
|
49 |
uuid(c56e9858-dbf3-4f6b-8119-384af2060deb),
|
50 |
pointer_default(unique)
|
51 |
]
|
52 |
interface IPinFlowControl : IUnknown {
|
53 |
// Block processing on this pin
|
54 |
HRESULT Block([in] DWORD dwBlockFlags, [in] HANDLE hEvent);
|
55 |
}
|
56 |
|
57 |
// block flags
|
58 |
enum _AM_PIN_FLOW_CONTROL_BLOCK_FLAGS {
|
59 |
AM_PIN_FLOW_CONTROL_BLOCK = 0x00000001, // 0 means unblock
|
60 |
};
|
61 |
|
62 |
|
63 |
// Reconnect flags
|
64 |
typedef enum _AM_GRAPH_CONFIG_RECONNECT_FLAGS {
|
65 |
AM_GRAPH_CONFIG_RECONNECT_DIRECTCONNECT = 0x00000001,
|
66 |
AM_GRAPH_CONFIG_RECONNECT_CACHE_REMOVED_FILTERS = 0x00000002,
|
67 |
AM_GRAPH_CONFIG_RECONNECT_USE_ONLY_CACHED_FILTERS = 0x00000004
|
68 |
} AM_GRAPH_CONFIG_RECONNECT_FLAGS;
|
69 |
|
70 |
// RemoveFilterEx flags
|
71 |
enum _REM_FILTER_FLAGS {
|
72 |
REMFILTERF_LEAVECONNECTED = 0x00000001
|
73 |
};
|
74 |
|
75 |
typedef enum _AM_FILTER_FLAGS {
|
76 |
AM_FILTER_FLAGS_REMOVABLE = 0x00000001
|
77 |
} AM_FILTER_FLAGS;
|
78 |
|
79 |
|
80 |
//--------------------------------------------------------------------
|
81 |
//
|
82 |
// IGraphConfig
|
83 |
//
|
84 |
//--------------------------------------------------------------------
|
85 |
|
86 |
[
|
87 |
local,
|
88 |
object,
|
89 |
uuid(03A1EB8E-32BF-4245-8502-114D08A9CB88),
|
90 |
pointer_default(unique)
|
91 |
]
|
92 |
interface IGraphConfig : IUnknown {
|
93 |
HRESULT Reconnect([in] IPin *pOutputPin,
|
94 |
[in] IPin *pInputPin,
|
95 |
[in] const AM_MEDIA_TYPE *pmtFirstConnection,
|
96 |
[in] IBaseFilter *pUsingFilter, // can be NULL
|
97 |
[in] HANDLE hAbortEvent,
|
98 |
[in] DWORD dwFlags);
|
99 |
|
100 |
HRESULT Reconfigure([in] IGraphConfigCallback *pCallback,
|
101 |
[in] PVOID pvContext,
|
102 |
[in] DWORD dwFlags,
|
103 |
[in] HANDLE hAbortEvent);
|
104 |
|
105 |
|
106 |
HRESULT AddFilterToCache([in] IBaseFilter *pFilter);
|
107 |
HRESULT EnumCacheFilter([out] IEnumFilters **pEnum);
|
108 |
HRESULT RemoveFilterFromCache([in]IBaseFilter *pFilter);
|
109 |
|
110 |
// Get the start time associated with the last Run() call
|
111 |
// If the graph is not running returns VFW_E_WRONG_STATE
|
112 |
HRESULT GetStartTime([out] REFERENCE_TIME *prtStart);
|
113 |
|
114 |
HRESULT PushThroughData(
|
115 |
[in] IPin *pOutputPin,
|
116 |
[in] IPinConnection *pConnection,
|
117 |
[in] HANDLE hEventAbort);
|
118 |
|
119 |
HRESULT SetFilterFlags([in] IBaseFilter *pFilter, [in] DWORD dwFlags);
|
120 |
HRESULT GetFilterFlags([in] IBaseFilter *pFilter, [out] DWORD *pdwFlags);
|
121 |
|
122 |
HRESULT RemoveFilterEx( [in] IBaseFilter *pFilter, DWORD Flags );
|
123 |
}
|
124 |
|
125 |
//--------------------------------------------------------------------
|
126 |
//
|
127 |
// IGraphConfigCallback
|
128 |
//
|
129 |
//--------------------------------------------------------------------
|
130 |
|
131 |
[
|
132 |
local,
|
133 |
object,
|
134 |
uuid(ade0fd60-d19d-11d2-abf6-00a0c905f375),
|
135 |
pointer_default(unique)
|
136 |
]
|
137 |
interface IGraphConfigCallback : IUnknown
|
138 |
{
|
139 |
HRESULT Reconfigure(PVOID pvContext, DWORD dwFlags);
|
140 |
}
|
141 |
|
142 |
// Filter Chain Definition
|
143 |
//
|
144 |
// Filter chains have the following properties:
|
145 |
//
|
146 |
// - Each filter chain has one or more filters.
|
147 |
//
|
148 |
// - Each filter in a filter chain has at most one connected input pin and one
|
149 |
// connected output pin. For example, filters A, C, D, F, G, H, I, J and K
|
150 |
// (see the diagram below) can be in a filter chain because each one has at
|
151 |
// most one connected input pin and one connected output pin.
|
152 |
//
|
153 |
// - Any filter in a chain is reachable by any other filter in the chain.
|
154 |
// For example, in the filter chain F-G-H, F can reach H by following the F-
|
155 |
// G connection to G and then following the G-H connection to H. Filters F
|
156 |
// and J cannot be in the same filter chain because J is not reachable from
|
157 |
// F. Anotherwords, there no sequence of connected filters between F and J.
|
158 |
//
|
159 |
// - The start filter is the only filter in the filter chain who's input
|
160 |
// pin is not connected to another filter in the chain. For instance, F is
|
161 |
// the start filter in F-G-H because F's input pin is connected to E and E
|
162 |
// is not in the filter chain. G's input pin is connected to F and H's is
|
163 |
// connected to G. Both F and G are in the filter chain.
|
164 |
//
|
165 |
// - The end filter is the only filter in the filter chain who's output pin
|
166 |
// is not connected to another filter in the chain. For example, in the
|
167 |
// filter chain J-K, K is the end filter because K's output pin is
|
168 |
// connected to L. J's output pin is connected to K and K is in the J-K
|
169 |
// filter chain.
|
170 |
//
|
171 |
//
|
172 |
// --->|---| |---|--->
|
173 |
// | C |--->| D |
|
174 |
// |---| |---|--->|---| |---|--->|---| |---| |---| |---|
|
175 |
// | A |--->| B | | E |--->| F |--->| G |--->| H |
|
176 |
// |---| |---|--->|---|------------>|---| |---| |---| |---|
|
177 |
// | I |--->
|
178 |
// --->|---|--->
|
179 |
//
|
180 |
// |---| |---| |---|
|
181 |
// | J |--->| K |--->| L |
|
182 |
// |---| |---| |---|
|
183 |
//
|
184 |
// Example Filter Graph
|
185 |
//
|
186 |
//
|
187 |
//
|
188 |
// IFilterChain Methods Documentation
|
189 |
//
|
190 |
// HRESULT StartChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
|
191 |
//
|
192 |
// StartChain() switches all the filters in the chain into the running state
|
193 |
// If one of the filters will not switch to the running state, then all the filters
|
194 |
// in the chain are stopped. This method can only be called if the filter graph is
|
195 |
// running.
|
196 |
//
|
197 |
// Parameters:
|
198 |
// - pStartFilter [in]
|
199 |
// The first filter in the filter chain. Note that this can be the same
|
200 |
// filter as pEndFilter .
|
201 |
//
|
202 |
// - pEndFilter [in]
|
203 |
// The last filter in the filter chain. Note that this can be the same
|
204 |
// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends
|
205 |
// from pStartFilter to the last downstream filter which can be in a filter chain.
|
206 |
// For example, IFilterChain::StartChain( A, NULL ) would start filter A.
|
207 |
// IFilterChain::StartChain( G, NULL ) would start filters G and H.
|
208 |
// IFilterChain::StartChain( C, NULL ) would start filters C and D. Finally,
|
209 |
// IFilterChain::StartChain( E, NULL ) would fail because E cannot be in a
|
210 |
// filter chain (see the Filter Chain Definition section for more information).
|
211 |
//
|
212 |
// Return Value:
|
213 |
// An HRESULT. See the Direct Show SDK and COM SDK documentation for more
|
214 |
// information on interpreting HRESULTs.
|
215 |
//
|
216 |
//
|
217 |
//
|
218 |
//
|
219 |
// HRESULT PauseChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
|
220 |
//
|
221 |
// PauseChain() switches all the filters in a chain to the paused state. If it cannot
|
222 |
// switch one of the filtres into the paused state, all the filters in the chain are
|
223 |
// stopped. This method can only be called if the filter graph is paused.
|
224 |
//
|
225 |
// Parameters:
|
226 |
// - pStartFilter [in]
|
227 |
// The first filter in the filter chain. Note that this can be the same
|
228 |
// filter as pEndFilter .
|
229 |
//
|
230 |
// - pEndFilter [in]
|
231 |
// The last filter in the filter chain. Note that this can be the same
|
232 |
// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends
|
233 |
// from pStartFilter to the last downstream filter which can be in a filter chain.
|
234 |
// For example, IFilterChain::StopChain( A, NULL ) would stop filter A.
|
235 |
// IFilterChain::StopChain( G, NULL ) would stop filters G and H.
|
236 |
// IFilterChain::StopChain( C, NULL ) would stop filters C and D. Finally,
|
237 |
// IFilterChain::StopChain( E, NULL ) would fail because E cannot be in a filter
|
238 |
// chain (see the Filter Chain Definition section for more information).
|
239 |
//
|
240 |
//
|
241 |
// Return Value:
|
242 |
// An HRESULT. See the Direct Show SDK and COM SDK documentation for more
|
243 |
// information on interpreting HRESULTs.
|
244 |
//
|
245 |
//
|
246 |
//
|
247 |
// HRESULT StopChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
|
248 |
//
|
249 |
// StopChain() switches all the filters in chain to the stopped state.
|
250 |
//
|
251 |
// Parameters:
|
252 |
// - pStartFilter [in]
|
253 |
// The first filter in the filter chain. Note that this can be the same
|
254 |
// filter as pEndFilter .
|
255 |
//
|
256 |
// - pEndFilter [in]
|
257 |
// The last filter in the filter chain. Note that this can be the same
|
258 |
// filter as pStartFilter. If pEndFilter is NULL then the filter chain extends
|
259 |
// from pStartFilter to the last downstream filter which can be in a filter chain.
|
260 |
// For example, IFilterChain::StopChain( A, NULL ) would stop filter A.
|
261 |
// IFilterChain::StopChain( G, NULL ) would stop filters G and H.
|
262 |
// IFilterChain::StopChain( C, NULL ) would stop filters C and D. Finally,
|
263 |
// IFilterChain::StopChain( E, NULL ) would fail because E cannot be in a filter
|
264 |
// chain (see the Filter Chain Definition section for more information).
|
265 |
//
|
266 |
//
|
267 |
// Return Value:
|
268 |
// An HRESULT. See the Direct Show SDK and COM SDK documentation for more
|
269 |
// information on interpreting HRESULTs.
|
270 |
//
|
271 |
//
|
272 |
//
|
273 |
//
|
274 |
//
|
275 |
// HRESULT RemoveChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
|
276 |
//
|
277 |
// RemoveChain() removes every filter in a chain from the filter graph.
|
278 |
// The filters can be removed while the graph is running.
|
279 |
//
|
280 |
// Parameters:
|
281 |
// - pStartFilter [in]
|
282 |
// The first filter in the filter chain. Note that this can be the same
|
283 |
// filter as pEndFilter .
|
284 |
//
|
285 |
// - pEndFilter [in]
|
286 |
// The last filter in the filter chain. Note that this can be the same
|
287 |
// filter as pStartFilter. If pEndFilter is NULL then the filter chain
|
288 |
// extends from pStartFilter to the last downstream filter which can be in a
|
289 |
// filter chain. For example, IFilterChain::RemoveChain( A, NULL ) would remove
|
290 |
// filter A from the filter graph. IFilterChain::RemoveChain( G, NULL ) would
|
291 |
// remove filters G and H. IFilterChain::RemoveChain( C, NULL ) would remove
|
292 |
// filters C and D. Finally, IFilterChain::RemoveChain( E, NULL ) would fail
|
293 |
// because E cannot be in a filter chain (see the Filter Chain Definition
|
294 |
// section for more information).
|
295 |
//
|
296 |
//
|
297 |
// Return Value:
|
298 |
// An HRESULT. See the Direct Show SDK and COM SDK documentation for more
|
299 |
// information on interpreting HRESULTs.
|
300 |
//
|
301 |
//
|
302 |
[
|
303 |
local,
|
304 |
object,
|
305 |
uuid(DCFBDCF6-0DC2-45f5-9AB2-7C330EA09C29),
|
306 |
pointer_default(unique)
|
307 |
]
|
308 |
interface IFilterChain : IUnknown
|
309 |
{
|
310 |
HRESULT StartChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
|
311 |
HRESULT PauseChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
|
312 |
HRESULT StopChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
|
313 |
HRESULT RemoveChain( [in] IBaseFilter *pStartFilter, [in] IBaseFilter *pEndFilter );
|
314 |
}
|
315 |
|
316 |
|
317 |
|
318 |
|