1 |
bearsoft |
1.1 |
//------------------------------------------------------------------------------
|
2 |
|
|
// File: AXExtend.idl
|
3 |
|
|
//
|
4 |
|
|
// Desc: Extended streaming interface definitions for the ActiveMovie
|
5 |
|
|
// streaming and synchronization architecture. Core streaming
|
6 |
|
|
// interfaces are in AXCore.idl, and control interfaces for the
|
7 |
|
|
// type library are in Control.odl.
|
8 |
|
|
//
|
9 |
|
|
// Copyright (c) 1992 - 2000, Microsoft Corporation. All rights reserved.
|
10 |
|
|
//------------------------------------------------------------------------------
|
11 |
|
|
|
12 |
|
|
|
13 |
|
|
// include after unknwn.idl, objidl.idl and axcore.idl
|
14 |
|
|
|
15 |
|
|
|
16 |
|
|
// forward declarations - these are the interfaces declared in this file
|
17 |
|
|
|
18 |
|
|
interface IEnumRegFilters;
|
19 |
|
|
interface IFileSourceFilter;
|
20 |
|
|
interface IFileSinkFilter;
|
21 |
|
|
interface IFileSinkFilter2;
|
22 |
|
|
interface IGraphBuilder;
|
23 |
|
|
interface ICaptureGraphBuilder;
|
24 |
|
|
interface ICaptureGraphBuilder2;
|
25 |
|
|
interface IAMCopyCaptureFileProgress;
|
26 |
|
|
interface IFilterMapper;
|
27 |
|
|
interface IFilterMapper2;
|
28 |
|
|
interface IMediaEventSink;
|
29 |
|
|
interface IOverlay;
|
30 |
|
|
interface IOverlayNotify;
|
31 |
|
|
interface IOverlayNotify2;
|
32 |
|
|
interface IQualityControl;
|
33 |
|
|
interface ISeekingPassThru;
|
34 |
|
|
interface IAMStreamConfig;
|
35 |
|
|
interface IAMDevMemoryAllocator;
|
36 |
|
|
interface IAMDevMemoryControl;
|
37 |
|
|
interface IConfigInterleaving;
|
38 |
|
|
interface IConfigAviMux;
|
39 |
|
|
interface IAMVideoCompression;
|
40 |
|
|
interface IAMVfwCaptureDialogs;
|
41 |
|
|
interface IAMVfwCompressDialogs;
|
42 |
|
|
interface IAMDroppedFrames;
|
43 |
|
|
interface IAMAudioInputMixer;
|
44 |
|
|
interface IAMBufferNegotiation;
|
45 |
|
|
interface IAMAnalogVideoDecoder;
|
46 |
|
|
interface IAMVideoProcAmp;
|
47 |
|
|
interface IAMAnalogVideoEncoder;
|
48 |
|
|
interface IAMCameraControl;
|
49 |
|
|
interface IAMCrossbar;
|
50 |
|
|
interface IAMTVTuner;
|
51 |
|
|
interface IKsPropertySet;
|
52 |
|
|
interface IAMPhysicalPinInfo;
|
53 |
|
|
interface IAMExtDevice;
|
54 |
|
|
interface IAMExtTransport;
|
55 |
|
|
interface IAMTimecodeReader;
|
56 |
|
|
interface IAMTimecodeGenerator;
|
57 |
|
|
interface IAMTimecodeDisplay;
|
58 |
|
|
interface IDrawVideoImage;
|
59 |
|
|
interface IDecimateVideoImage;
|
60 |
|
|
interface IAMVideoDecimationProperties;
|
61 |
|
|
interface IAMPushSource;
|
62 |
|
|
interface IAMAudioRendererStats;
|
63 |
|
|
interface IAMLatency;
|
64 |
|
|
interface IAMGraphStreams;
|
65 |
|
|
interface IAMOverlayFX;
|
66 |
|
|
interface IAMOpenProgress;
|
67 |
|
|
interface IMpeg2Demultiplexer ;
|
68 |
|
|
interface IMPEG2StreamIdMap ;
|
69 |
|
|
interface IEnumStreamIdMap ;
|
70 |
|
|
|
71 |
|
|
//==========================================================================
|
72 |
|
|
//==========================================================================
|
73 |
|
|
// IEnumRegFilters interface -- enumerates registered filters.
|
74 |
|
|
// enumerator interface returned from IFilterMapper::EnumMatchingFilters().
|
75 |
|
|
// based on IEnum pseudo-template
|
76 |
|
|
//==========================================================================
|
77 |
|
|
//==========================================================================
|
78 |
|
|
|
79 |
|
|
typedef struct {
|
80 |
|
|
CLSID Clsid; // class id of the filter
|
81 |
|
|
LPWSTR Name; // name of filter
|
82 |
|
|
} REGFILTER;
|
83 |
|
|
|
84 |
|
|
[
|
85 |
|
|
object,
|
86 |
|
|
uuid(56a868a4-0ad4-11ce-b03a-0020af0ba770),
|
87 |
|
|
pointer_default(unique)
|
88 |
|
|
]
|
89 |
|
|
|
90 |
|
|
// The point of the mapper is to avoid loading filters. By looking in the
|
91 |
|
|
// registry we can reduce the number of filters which must be loaded and tried.
|
92 |
|
|
// This enumerator returns descriptors of filters (including the GUIDs that
|
93 |
|
|
// CoCreateInstance can instantiate). The filters themselves are not loaded.
|
94 |
|
|
|
95 |
|
|
interface IEnumRegFilters : IUnknown {
|
96 |
|
|
import "unknwn.idl";
|
97 |
|
|
|
98 |
|
|
// The caller must use CoTaskMemFree to free each REGFILTER* returned
|
99 |
|
|
// in the array.
|
100 |
|
|
HRESULT Next
|
101 |
|
|
( [in] ULONG cFilters, // place this many filters...
|
102 |
|
|
[out] REGFILTER ** apRegFilter, // ...in this array of REGFILTER*
|
103 |
|
|
[out] ULONG * pcFetched // actual count passed returned here
|
104 |
|
|
);
|
105 |
|
|
|
106 |
|
|
// I can't think why anyone would want to skip, so it's not implemented.
|
107 |
|
|
// (anyone who thinks they know what they would be skipping over is probably
|
108 |
|
|
// missing some piece of the jigsaw). This ALWAYS returns E_NOTIMPL.
|
109 |
|
|
|
110 |
|
|
HRESULT Skip(
|
111 |
|
|
[in] ULONG cFilters
|
112 |
|
|
);
|
113 |
|
|
|
114 |
|
|
HRESULT Reset(void);
|
115 |
|
|
|
116 |
|
|
// No cloning either - also ALWAYS returns E_NOTIMPL.
|
117 |
|
|
|
118 |
|
|
HRESULT Clone(
|
119 |
|
|
[out] IEnumRegFilters **ppEnum
|
120 |
|
|
);
|
121 |
|
|
}
|
122 |
|
|
|
123 |
|
|
|
124 |
|
|
typedef IEnumRegFilters *PENUMREGFILTERS;
|
125 |
|
|
|
126 |
|
|
//========================================================================
|
127 |
|
|
//========================================================================
|
128 |
|
|
// abstraction representing the registered information about filters.
|
129 |
|
|
// This allows properties of filters to be looked up without loading them.
|
130 |
|
|
//========================================================================
|
131 |
|
|
//========================================================================
|
132 |
|
|
|
133 |
|
|
[
|
134 |
|
|
object,
|
135 |
|
|
uuid(56a868a3-0ad4-11ce-b03a-0020af0ba770),
|
136 |
|
|
pointer_default(unique)
|
137 |
|
|
]
|
138 |
|
|
interface IFilterMapper : IUnknown {
|
139 |
|
|
import "unknwn.idl";
|
140 |
|
|
|
141 |
|
|
//==========================================================================
|
142 |
|
|
// Registration functions.
|
143 |
|
|
// A filter should be registered before any other use.
|
144 |
|
|
// The registration can be NON_VOLATILE (i.e. permanent, do once ever)
|
145 |
|
|
// or VOLATILE (once per boot of the system).
|
146 |
|
|
// UnregisterFilter (obviously) removes the registration.
|
147 |
|
|
// The action of any of the other calls on unregistered filters is undefined.
|
148 |
|
|
// it will either work or you'll get an error, but I'm not saying which.
|
149 |
|
|
//==========================================================================
|
150 |
|
|
|
151 |
|
|
// Four predefined values controling the order in which filters are tried
|
152 |
|
|
// for intelligent graph building. Intermediate values are legal.
|
153 |
|
|
// Any value <=MERIT_DO_NOT_USE will mean that the filter will never
|
154 |
|
|
// be tried by the filtergrah to automatically complete a connection.
|
155 |
|
|
|
156 |
|
|
enum { MERIT_PREFERRED = 0x800000,
|
157 |
|
|
MERIT_NORMAL = 0x600000,
|
158 |
|
|
MERIT_UNLIKELY = 0x400000,
|
159 |
|
|
MERIT_DO_NOT_USE = 0x200000,
|
160 |
|
|
MERIT_SW_COMPRESSOR = 0x100000,
|
161 |
|
|
MERIT_HW_COMPRESSOR = 0x100050
|
162 |
|
|
};
|
163 |
|
|
|
164 |
|
|
// Register a filter
|
165 |
|
|
|
166 |
|
|
HRESULT RegisterFilter
|
167 |
|
|
( [in] CLSID clsid, // GUID of the filter
|
168 |
|
|
[in] LPCWSTR Name, // Descriptive name for the filter
|
169 |
|
|
[in] DWORD dwMerit // DO_NOT_USE, UNLIKELY, NORMAL or PREFERRED.
|
170 |
|
|
);
|
171 |
|
|
|
172 |
|
|
|
173 |
|
|
// Register an identifiable instance of a filter. This deals with cases
|
174 |
|
|
// such as two similar sound cards which are driven by the same driver,
|
175 |
|
|
// but we want to choose which oif these cards the sound will come out of.
|
176 |
|
|
// This is not needed if there is only one instance of the filter
|
177 |
|
|
// (e.g. there is only one sound card in the machine) or if all instances
|
178 |
|
|
// of the filter are equivalent.
|
179 |
|
|
|
180 |
|
|
// The filter itself must have already been registered // ??? Is that true?
|
181 |
|
|
HRESULT RegisterFilterInstance
|
182 |
|
|
( [in] CLSID clsid, // GUID of the filter
|
183 |
|
|
[in] LPCWSTR Name, // Descriptive name of instance.
|
184 |
|
|
[out] CLSID *MRId // Returned Media Resource Id. A
|
185 |
|
|
// locally unique id for this instance
|
186 |
|
|
// of this filter
|
187 |
|
|
);
|
188 |
|
|
|
189 |
|
|
|
190 |
|
|
HRESULT RegisterPin
|
191 |
|
|
( [in] CLSID Filter, // GUID of filter
|
192 |
|
|
[in] LPCWSTR Name, // Name of the pin
|
193 |
|
|
[in] BOOL bRendered, // The filter renders this input
|
194 |
|
|
[in] BOOL bOutput, // TRUE if this is an Output pin
|
195 |
|
|
[in] BOOL bZero, // TRUE if OK for zero instances of pin
|
196 |
|
|
// In this case you will have to Create
|
197 |
|
|
// a pin to have even one instance
|
198 |
|
|
[in] BOOL bMany, // TRUE if OK for many instances of pin
|
199 |
|
|
[in] CLSID ConnectsToFilter, // Filter it connects to if it has
|
200 |
|
|
// subterranean connection, else NULL
|
201 |
|
|
[in] LPCWSTR ConnectsToPin // Name of pin it connects to
|
202 |
|
|
// NULL for output pins
|
203 |
|
|
);
|
204 |
|
|
|
205 |
|
|
HRESULT RegisterPinType
|
206 |
|
|
( [in] CLSID clsFilter, // GUID of filter
|
207 |
|
|
[in] LPCWSTR strName, // Descriptive name of the pin
|
208 |
|
|
[in] CLSID clsMajorType, // Major type of the data stream
|
209 |
|
|
[in] CLSID clsSubType // Sub type of the data stream
|
210 |
|
|
);
|
211 |
|
|
|
212 |
|
|
|
213 |
|
|
HRESULT UnregisterFilter
|
214 |
|
|
( [in] CLSID Filter // GUID of filter
|
215 |
|
|
);
|
216 |
|
|
|
217 |
|
|
|
218 |
|
|
HRESULT UnregisterFilterInstance
|
219 |
|
|
( [in] CLSID MRId // Media Resource Id of this instance
|
220 |
|
|
);
|
221 |
|
|
|
222 |
|
|
|
223 |
|
|
HRESULT UnregisterPin
|
224 |
|
|
( [in] CLSID Filter, // GUID of filter
|
225 |
|
|
[in] LPCWSTR Name // Name of the pin
|
226 |
|
|
);
|
227 |
|
|
|
228 |
|
|
|
229 |
|
|
// Set *ppEnum to be an enumerator for filters matching the requirements.
|
230 |
|
|
|
231 |
|
|
HRESULT EnumMatchingFilters
|
232 |
|
|
( [out] IEnumRegFilters **ppEnum // enumerator returned
|
233 |
|
|
, [in] DWORD dwMerit // at least this merit needed
|
234 |
|
|
, [in] BOOL bInputNeeded // need at least one input pin
|
235 |
|
|
, [in] CLSID clsInMaj // input major type
|
236 |
|
|
, [in] CLSID clsInSub // input sub type
|
237 |
|
|
, [in] BOOL bRender // must the input be rendered?
|
238 |
|
|
, [in] BOOL bOututNeeded // need at least one output pin
|
239 |
|
|
, [in] CLSID clsOutMaj // output major type
|
240 |
|
|
, [in] CLSID clsOutSub // output sub type
|
241 |
|
|
);
|
242 |
|
|
|
243 |
|
|
}
|
244 |
|
|
|
245 |
|
|
// structure used to identify media types a pin handles. Used for
|
246 |
|
|
// registration through IFilterMapper and IFilterMapper2
|
247 |
|
|
//
|
248 |
|
|
typedef struct
|
249 |
|
|
{
|
250 |
|
|
const CLSID * clsMajorType;
|
251 |
|
|
const CLSID * clsMinorType;
|
252 |
|
|
} REGPINTYPES;
|
253 |
|
|
|
254 |
|
|
// describes pin for filter registration. Used for registration
|
255 |
|
|
// through IFilterMapper and IFilterMapper2
|
256 |
|
|
//
|
257 |
|
|
typedef struct
|
258 |
|
|
{
|
259 |
|
|
LPWSTR strName;
|
260 |
|
|
|
261 |
|
|
// The filter renders this input
|
262 |
|
|
BOOL bRendered;
|
263 |
|
|
|
264 |
|
|
// This is an Output pin
|
265 |
|
|
BOOL bOutput;
|
266 |
|
|
|
267 |
|
|
// OK to have zero instances of pin In this case you will have to
|
268 |
|
|
// Create a pin to have even one instance
|
269 |
|
|
BOOL bZero;
|
270 |
|
|
|
271 |
|
|
// OK to create many instance of pin
|
272 |
|
|
BOOL bMany;
|
273 |
|
|
|
274 |
|
|
const CLSID * clsConnectsToFilter;
|
275 |
|
|
const WCHAR * strConnectsToPin;
|
276 |
|
|
|
277 |
|
|
UINT nMediaTypes;
|
278 |
|
|
const REGPINTYPES * lpMediaType;
|
279 |
|
|
} REGFILTERPINS;
|
280 |
|
|
|
281 |
|
|
// mediums (as defined in the Windows NT DDK) for registration with
|
282 |
|
|
// IFilterMapper2
|
283 |
|
|
//
|
284 |
|
|
typedef struct
|
285 |
|
|
{
|
286 |
|
|
CLSID clsMedium;
|
287 |
|
|
DWORD dw1;
|
288 |
|
|
DWORD dw2;
|
289 |
|
|
} REGPINMEDIUM;
|
290 |
|
|
|
291 |
|
|
// flags for dwFlags in REFILTERPINS2
|
292 |
|
|
enum
|
293 |
|
|
{
|
294 |
|
|
// OK to have zero instances of pin In this case you will have to
|
295 |
|
|
// Create a pin to have even one instance
|
296 |
|
|
REG_PINFLAG_B_ZERO = 0x1,
|
297 |
|
|
|
298 |
|
|
// The filter renders this input
|
299 |
|
|
REG_PINFLAG_B_RENDERER = 0x2,
|
300 |
|
|
|
301 |
|
|
// OK to create many instance of pin
|
302 |
|
|
REG_PINFLAG_B_MANY = 0x4,
|
303 |
|
|
|
304 |
|
|
// This is an Output pin
|
305 |
|
|
REG_PINFLAG_B_OUTPUT = 0x8
|
306 |
|
|
};
|
307 |
|
|
|
308 |
|
|
|
309 |
|
|
// describes pin for filter registration through IFilterMapper2
|
310 |
|
|
typedef struct
|
311 |
|
|
{
|
312 |
|
|
// combination of REG_PINFLAG flags
|
313 |
|
|
DWORD dwFlags;
|
314 |
|
|
|
315 |
|
|
// number of instances of the pin if known
|
316 |
|
|
UINT cInstances;
|
317 |
|
|
|
318 |
|
|
UINT nMediaTypes;
|
319 |
|
|
[size_is(nMediaTypes)] const REGPINTYPES * lpMediaType;
|
320 |
|
|
|
321 |
|
|
UINT nMediums;
|
322 |
|
|
[size_is(nMediums)] const REGPINMEDIUM *lpMedium;
|
323 |
|
|
|
324 |
|
|
// pin category (for Kernel Streaming pins) as defined in the
|
325 |
|
|
// Windows NT DDK
|
326 |
|
|
const CLSID *clsPinCategory;
|
327 |
|
|
|
328 |
|
|
} REGFILTERPINS2;
|
329 |
|
|
|
330 |
|
|
// describes filter for registration through IFilterMapper2
|
331 |
|
|
typedef struct
|
332 |
|
|
{
|
333 |
|
|
DWORD dwVersion; // 1 or 2
|
334 |
|
|
DWORD dwMerit;
|
335 |
|
|
|
336 |
|
|
/* unnamed union */
|
337 |
|
|
[switch_is(dwVersion)] [switch_type(DWORD)] union
|
338 |
|
|
{
|
339 |
|
|
[case(1)]
|
340 |
|
|
|
341 |
|
|
struct
|
342 |
|
|
{
|
343 |
|
|
ULONG cPins;
|
344 |
|
|
[size_is(cPins)] const REGFILTERPINS *rgPins;
|
345 |
|
|
};
|
346 |
|
|
|
347 |
|
|
[case(2)]
|
348 |
|
|
|
349 |
|
|
struct
|
350 |
|
|
{
|
351 |
|
|
ULONG cPins2;
|
352 |
|
|
[size_is(cPins2)] const REGFILTERPINS2 *rgPins2;
|
353 |
|
|
};
|
354 |
|
|
|
355 |
|
|
[default]
|
356 |
|
|
;
|
357 |
|
|
} ;
|
358 |
|
|
|
359 |
|
|
} REGFILTER2;
|
360 |
|
|
|
361 |
|
|
|
362 |
|
|
|
363 |
|
|
[
|
364 |
|
|
object,
|
365 |
|
|
uuid(b79bb0b0-33c1-11d1-abe1-00a0c905f375),
|
366 |
|
|
pointer_default(unique)
|
367 |
|
|
]
|
368 |
|
|
interface IFilterMapper2 : IUnknown {
|
369 |
|
|
import "unknwn.idl";
|
370 |
|
|
|
371 |
|
|
// create or rename ActiveMovie category
|
372 |
|
|
HRESULT CreateCategory
|
373 |
|
|
( [in] REFCLSID clsidCategory,
|
374 |
|
|
[in] DWORD dwCategoryMerit,
|
375 |
|
|
[in] LPCWSTR Description
|
376 |
|
|
);
|
377 |
|
|
|
378 |
|
|
HRESULT UnregisterFilter
|
379 |
|
|
( [in] const CLSID *pclsidCategory,
|
380 |
|
|
[in] const OLECHAR *szInstance,
|
381 |
|
|
[in] REFCLSID Filter // GUID of filter
|
382 |
|
|
);
|
383 |
|
|
|
384 |
|
|
// Register a filter, pins, and media types under a category.
|
385 |
|
|
HRESULT RegisterFilter
|
386 |
|
|
( [in] REFCLSID clsidFilter, // GUID of the filter
|
387 |
|
|
[in] LPCWSTR Name, // Descriptive name for the filter
|
388 |
|
|
|
389 |
|
|
// ppMoniker can be null. or *ppMoniker can contain the
|
390 |
|
|
// moniker where this filter data will be written;
|
391 |
|
|
// *ppMoniker will be set to null on return. or *ppMoniker
|
392 |
|
|
// can be null in which case the moniker will be returned
|
393 |
|
|
// with refcount.
|
394 |
|
|
[in, out] IMoniker **ppMoniker,
|
395 |
|
|
|
396 |
|
|
// can be null
|
397 |
|
|
[in] const CLSID *pclsidCategory,
|
398 |
|
|
|
399 |
|
|
// cannot be null
|
400 |
|
|
[in] const OLECHAR *szInstance,
|
401 |
|
|
|
402 |
|
|
// rest of filter and pin registration
|
403 |
|
|
[in] const REGFILTER2 *prf2
|
404 |
|
|
);
|
405 |
|
|
|
406 |
|
|
// Set *ppEnum to be an enumerator for filters matching the
|
407 |
|
|
// requirements.
|
408 |
|
|
HRESULT EnumMatchingFilters
|
409 |
|
|
( [out] IEnumMoniker **ppEnum // enumerator returned
|
410 |
|
|
, [in] DWORD dwFlags // 0
|
411 |
|
|
, [in] BOOL bExactMatch // don't match wildcards
|
412 |
|
|
, [in] DWORD dwMerit // at least this merit needed
|
413 |
|
|
, [in] BOOL bInputNeeded // need at least one input pin
|
414 |
|
|
, [in] DWORD cInputTypes // Number of input types to match
|
415 |
|
|
// Any match is OK
|
416 |
|
|
, [size_is(cInputTypes*2)] const GUID *pInputTypes // input major+subtype pair array
|
417 |
|
|
, [in] const REGPINMEDIUM *pMedIn // input medium
|
418 |
|
|
, [in] const CLSID *pPinCategoryIn // input pin category
|
419 |
|
|
, [in] BOOL bRender // must the input be rendered?
|
420 |
|
|
, [in] BOOL bOutputNeeded // need at least one output pin
|
421 |
|
|
, [in] DWORD cOutputTypes // Number of output types to match
|
422 |
|
|
// Any match is OK
|
423 |
|
|
, [size_is(cOutputTypes*2)] const GUID *pOutputTypes // output major+subtype pair array
|
424 |
|
|
, [in] const REGPINMEDIUM *pMedOut // output medium
|
425 |
|
|
, [in] const CLSID *pPinCategoryOut // output pin category
|
426 |
|
|
);
|
427 |
|
|
}
|
428 |
|
|
|
429 |
|
|
[
|
430 |
|
|
object,
|
431 |
|
|
uuid(b79bb0b1-33c1-11d1-abe1-00a0c905f375),
|
432 |
|
|
pointer_default(unique)
|
433 |
|
|
]
|
434 |
|
|
interface IFilterMapper3 : IFilterMapper2 {
|
435 |
|
|
// new interface to allow creating filters using the mapper's devenum instance
|
436 |
|
|
// primarily needed for out-of-proc access to a graph
|
437 |
|
|
HRESULT GetICreateDevEnum( [out] ICreateDevEnum **ppEnum );
|
438 |
|
|
}
|
439 |
|
|
|
440 |
|
|
//========================================================================
|
441 |
|
|
//========================================================================
|
442 |
|
|
// Defines IQualityControl interface
|
443 |
|
|
//
|
444 |
|
|
// Defines quality messages and allows a quality manager to install itself
|
445 |
|
|
// as the sink for quality messages.
|
446 |
|
|
//========================================================================
|
447 |
|
|
//========================================================================
|
448 |
|
|
|
449 |
|
|
typedef enum tagQualityMessageType {
|
450 |
|
|
Famine,
|
451 |
|
|
Flood
|
452 |
|
|
} QualityMessageType;
|
453 |
|
|
|
454 |
|
|
typedef struct tagQuality {
|
455 |
|
|
QualityMessageType Type;
|
456 |
|
|
long Proportion; // milli-units. 1000 = no change
|
457 |
|
|
// for Flood:
|
458 |
|
|
// What proportion of the media samples currently
|
459 |
|
|
// coming through are required in the future.
|
460 |
|
|
// 800 means please drop another 20%
|
461 |
|
|
// For Famine:
|
462 |
|
|
// How much to "keep in" e.g. 800 means send me
|
463 |
|
|
// 20% less e.g. by dropping 20% of the samples.
|
464 |
|
|
// 1100 would mean "I'm coping, send me more".
|
465 |
|
|
REFERENCE_TIME Late;
|
466 |
|
|
// How much you need to catch up by
|
467 |
|
|
REFERENCE_TIME TimeStamp;
|
468 |
|
|
// The stream time when this was generated (probably
|
469 |
|
|
// corresponds to the start time on some sample).
|
470 |
|
|
} Quality;
|
471 |
|
|
|
472 |
|
|
typedef IQualityControl *PQUALITYCONTROL;
|
473 |
|
|
|
474 |
|
|
|
475 |
|
|
[
|
476 |
|
|
object,
|
477 |
|
|
uuid(56a868a5-0ad4-11ce-b03a-0020af0ba770),
|
478 |
|
|
pointer_default(unique)
|
479 |
|
|
]
|
480 |
|
|
interface IQualityControl : IUnknown {
|
481 |
|
|
|
482 |
|
|
// Notify the recipient that a quality change is requested.
|
483 |
|
|
// pSelf is the IBaseFilter* of the sender.
|
484 |
|
|
// this is sent from a filter
|
485 |
|
|
// to (the quality manager or) an upstream peer.
|
486 |
|
|
HRESULT Notify
|
487 |
|
|
( [in] IBaseFilter * pSelf,
|
488 |
|
|
[in] Quality q
|
489 |
|
|
);
|
490 |
|
|
|
491 |
|
|
// Notify the recipient that future quality messages are to be sent
|
492 |
|
|
// to iqc. If piqc is NULL then quality messages are to default back to
|
493 |
|
|
// the upstream peer.
|
494 |
|
|
// This is sent from the quality manager to a filter.
|
495 |
|
|
// The recipient should hold piqc as a WEAK reference,
|
496 |
|
|
// i.e. do not AddRef it, do not Release it.
|
497 |
|
|
HRESULT SetSink
|
498 |
|
|
( [in] IQualityControl * piqc
|
499 |
|
|
);
|
500 |
|
|
}
|
501 |
|
|
|
502 |
|
|
//=====================================================================
|
503 |
|
|
//=====================================================================
|
504 |
|
|
// Definitions required for overlay transport
|
505 |
|
|
//=====================================================================
|
506 |
|
|
//=====================================================================
|
507 |
|
|
|
508 |
|
|
|
509 |
|
|
// Used to communicate the colour that the IOverlay client wants the window
|
510 |
|
|
// painted in so that it can draw directly to the correct clipping region
|
511 |
|
|
// A colour key can be described in two alternate ways, the first is by a
|
512 |
|
|
// range of one or more (system) palette indices. The second is by defining
|
513 |
|
|
// a colour cube with two RGB values, any of which would be acceptable.
|
514 |
|
|
//
|
515 |
|
|
// The CK values are consistent with GDI PALETTEINDEX and PALETTERGB macros
|
516 |
|
|
|
517 |
|
|
|
518 |
|
|
enum { CK_NOCOLORKEY = 0x0, // No color key is required
|
519 |
|
|
CK_INDEX = 0x1, // Index into the current system palette
|
520 |
|
|
CK_RGB = 0x2 }; // Color key is an RGB value (or range)
|
521 |
|
|
|
522 |
|
|
typedef struct tagCOLORKEY {
|
523 |
|
|
|
524 |
|
|
DWORD KeyType; // Explains meaning of the structure
|
525 |
|
|
DWORD PaletteIndex; // Palette index if available
|
526 |
|
|
COLORREF LowColorValue; // Low colour space RGB value
|
527 |
|
|
COLORREF HighColorValue; // Defines the high RGB value
|
528 |
|
|
|
529 |
|
|
} COLORKEY;
|
530 |
|
|
|
531 |
|
|
// When a filter sets up an advise link it can ask that only certain types
|
532 |
|
|
// of notifications be sent, for example just palette changes. While this
|
533 |
|
|
// doesn't mean that the other notification call backs won't ever be called
|
534 |
|
|
// the IOverlay implementation may use this as an efficiency optimisation
|
535 |
|
|
|
536 |
|
|
enum { ADVISE_NONE = 0x0, // No notifications required
|
537 |
|
|
ADVISE_CLIPPING = 0x1, // Synchronous clip information
|
538 |
|
|
ADVISE_PALETTE = 0x2, // Palette change notifications
|
539 |
|
|
ADVISE_COLORKEY = 0x4, // Called when colour key changes
|
540 |
|
|
ADVISE_POSITION = 0x8, // Likewise when window moves etc
|
541 |
|
|
ADVISE_DISPLAY_CHANGE = 0x10 // Called on WM_DISPLAYCHANGE
|
542 |
|
|
};
|
543 |
|
|
|
544 |
|
|
const DWORD ADVISE_ALL = ADVISE_CLIPPING |
|
545 |
|
|
ADVISE_PALETTE |
|
546 |
|
|
ADVISE_COLORKEY |
|
547 |
|
|
ADVISE_POSITION;
|
548 |
|
|
|
549 |
|
|
const DWORD ADVISE_ALL2 = ADVISE_ALL |
|
550 |
|
|
ADVISE_DISPLAY_CHANGE;
|
551 |
|
|
|
552 |
|
|
// This isn't defined when you run IDL
|
553 |
|
|
|
554 |
|
|
cpp_quote("#ifndef _WINGDI_")
|
555 |
|
|
|
556 |
|
|
typedef struct _RGNDATAHEADER {
|
557 |
|
|
DWORD dwSize;
|
558 |
|
|
DWORD iType;
|
559 |
|
|
DWORD nCount;
|
560 |
|
|
DWORD nRgnSize;
|
561 |
|
|
RECT rcBound;
|
562 |
|
|
} RGNDATAHEADER;
|
563 |
|
|
|
564 |
|
|
typedef struct _RGNDATA {
|
565 |
|
|
RGNDATAHEADER rdh;
|
566 |
|
|
char Buffer[1];
|
567 |
|
|
} RGNDATA;
|
568 |
|
|
|
569 |
|
|
cpp_quote("#endif")
|
570 |
|
|
|
571 |
|
|
|
572 |
|
|
//=====================================================================
|
573 |
|
|
//=====================================================================
|
574 |
|
|
// Defines IOverlayNotify interface
|
575 |
|
|
//
|
576 |
|
|
// This interface gives asynchronous notifications of changes to the
|
577 |
|
|
// rendering window - such as changes to the exposed window area
|
578 |
|
|
//=====================================================================
|
579 |
|
|
//=====================================================================
|
580 |
|
|
|
581 |
|
|
[
|
582 |
|
|
object,
|
583 |
|
|
local,
|
584 |
|
|
uuid(56a868a0-0ad4-11ce-b03a-0020af0ba770),
|
585 |
|
|
pointer_default(unique)
|
586 |
|
|
]
|
587 |
|
|
interface IOverlayNotify : IUnknown {
|
588 |
|
|
|
589 |
|
|
// IOverlayNotify methods
|
590 |
|
|
|
591 |
|
|
// This notifies the filter of palette changes, the filter should copy
|
592 |
|
|
// the array of RGBQUADs if it needs to use them after returning. This
|
593 |
|
|
// is not called when the palette is actually changed in the display
|
594 |
|
|
// but at a short time after (in sync with WM_PALETTECHANGED messages)
|
595 |
|
|
|
596 |
|
|
HRESULT OnPaletteChange(
|
597 |
|
|
[in] DWORD dwColors, // Number of colours present
|
598 |
|
|
[in] const PALETTEENTRY *pPalette); // Array of palette colours
|
599 |
|
|
|
600 |
|
|
// This provides synchronous clip changes so that the client is called
|
601 |
|
|
// before the window is moved to freeze the video, and then when the
|
602 |
|
|
// window has stabilised it is called again to start playback again.
|
603 |
|
|
// If the window rect is all zero then the window is invisible, the
|
604 |
|
|
// filter must take a copy of the information if it wants to keep it
|
605 |
|
|
|
606 |
|
|
HRESULT OnClipChange(
|
607 |
|
|
[in] const RECT *pSourceRect, // Region of video to use
|
608 |
|
|
[in] const RECT *pDestinationRect, // Where video goes
|
609 |
|
|
[in] const RGNDATA *pRgnData); // Defines clipping information
|
610 |
|
|
|
611 |
|
|
HRESULT OnColorKeyChange([in] const COLORKEY *pColorKey);
|
612 |
|
|
|
613 |
|
|
// The calls to OnClipChange happen in sync with the window. So it is
|
614 |
|
|
// called with an empty clip list before the window moves to freeze
|
615 |
|
|
// the video, and then when the window has stabilised it is called
|
616 |
|
|
// again with the new clip list. The OnPositionChange callback is for
|
617 |
|
|
// overlay cards that don't want the expense of synchronous clipping
|
618 |
|
|
// updates and just want to know when the source or destination video
|
619 |
|
|
// positions change. They will NOT be called in sync with the window
|
620 |
|
|
// but at some point after the window has changed (basicly in time
|
621 |
|
|
// with WM_SIZE etc messages received). This is therefore suitable
|
622 |
|
|
// for overlay cards that don't inlay their data to the frame buffer
|
623 |
|
|
// NOTE the destination is NOT clipped to the visible display area
|
624 |
|
|
|
625 |
|
|
HRESULT OnPositionChange([in] const RECT *pSourceRect,
|
626 |
|
|
[in] const RECT *pDestinationRect);
|
627 |
|
|
}
|
628 |
|
|
|
629 |
|
|
typedef IOverlayNotify *POVERLAYNOTIFY;
|
630 |
|
|
|
631 |
|
|
|
632 |
|
|
//=====================================================================
|
633 |
|
|
//=====================================================================
|
634 |
|
|
// Defines IOverlayNotify2 interface
|
635 |
|
|
//
|
636 |
|
|
// This interface gives asynchronous notifications of changes to the
|
637 |
|
|
// rendering window - such as changes to the exposed window area
|
638 |
|
|
// This is optionally supported by the advise sink for the purposes
|
639 |
|
|
// of accepting OnDisplayChange notification.
|
640 |
|
|
//=====================================================================
|
641 |
|
|
//=====================================================================
|
642 |
|
|
|
643 |
|
|
cpp_quote("#if !defined(HMONITOR_DECLARED) && !defined(HMONITOR) && (WINVER < 0x0500)")
|
644 |
|
|
cpp_quote("#define HMONITOR_DECLARED")
|
645 |
|
|
cpp_quote("#if 0")
|
646 |
|
|
typedef HANDLE HMONITOR;
|
647 |
|
|
cpp_quote("#endif")
|
648 |
|
|
cpp_quote("DECLARE_HANDLE(HMONITOR);")
|
649 |
|
|
cpp_quote("#endif")
|
650 |
|
|
|
651 |
|
|
[
|
652 |
|
|
object,
|
653 |
|
|
local,
|
654 |
|
|
uuid(680EFA10-D535-11D1-87C8-00A0C9223196),
|
655 |
|
|
pointer_default(unique)
|
656 |
|
|
]
|
657 |
|
|
interface IOverlayNotify2 : IOverlayNotify {
|
658 |
|
|
|
659 |
|
|
// IOverlayNotify2 methods
|
660 |
|
|
|
661 |
|
|
HRESULT OnDisplayChange( // ADVISE_DISPLAY_CHANGE
|
662 |
|
|
HMONITOR hMonitor);
|
663 |
|
|
}
|
664 |
|
|
|
665 |
|
|
typedef IOverlayNotify2 *POVERLAYNOTIFY2;
|
666 |
|
|
|
667 |
|
|
|
668 |
|
|
//=====================================================================
|
669 |
|
|
//=====================================================================
|
670 |
|
|
// Defines IOverlay interface
|
671 |
|
|
//
|
672 |
|
|
// This interface provides information so that a filter can write direct to
|
673 |
|
|
// the frame buffer while placing the video in the correct window position
|
674 |
|
|
//=====================================================================
|
675 |
|
|
//=====================================================================
|
676 |
|
|
|
677 |
|
|
[
|
678 |
|
|
object,
|
679 |
|
|
local,
|
680 |
|
|
uuid(56a868a1-0ad4-11ce-b03a-0020af0ba770),
|
681 |
|
|
pointer_default(unique)
|
682 |
|
|
]
|
683 |
|
|
interface IOverlay : IUnknown {
|
684 |
|
|
|
685 |
|
|
// IOverlay methods
|
686 |
|
|
|
687 |
|
|
HRESULT GetPalette(
|
688 |
|
|
[out] DWORD *pdwColors, // Number of colours present
|
689 |
|
|
[out] PALETTEENTRY **ppPalette); // Where to put palette data
|
690 |
|
|
|
691 |
|
|
HRESULT SetPalette(
|
692 |
|
|
[in] DWORD dwColors, // Number of colours present
|
693 |
|
|
[in] PALETTEENTRY *pPalette); // Colours to use for palette
|
694 |
|
|
|
695 |
|
|
// If you change the colour key through SetColorKey then all the advise
|
696 |
|
|
// links will receive an OnColorKeyChange callback with the new colour
|
697 |
|
|
|
698 |
|
|
HRESULT GetDefaultColorKey([out] COLORKEY *pColorKey);
|
699 |
|
|
HRESULT GetColorKey([out] COLORKEY *pColorKey);
|
700 |
|
|
HRESULT SetColorKey([in,out] COLORKEY *pColorKey);
|
701 |
|
|
HRESULT GetWindowHandle([out] HWND *pHwnd);
|
702 |
|
|
|
703 |
|
|
// The IOverlay implementation allocates the memory for the clipping
|
704 |
|
|
// rectangles as it can be variable in length. The filter calling
|
705 |
|
|
// this method should free the memory when it is finished with it
|
706 |
|
|
|
707 |
|
|
HRESULT GetClipList([out] RECT *pSourceRect,
|
708 |
|
|
[out] RECT *pDestinationRect,
|
709 |
|
|
[out] RGNDATA **ppRgnData);
|
710 |
|
|
|
711 |
|
|
// Returns the current video source and destination
|
712 |
|
|
|
713 |
|
|
HRESULT GetVideoPosition([out] RECT *pSourceRect,
|
714 |
|
|
[out] RECT *pDestinationRect);
|
715 |
|
|
|
716 |
|
|
HRESULT Advise(
|
717 |
|
|
[in] IOverlayNotify *pOverlayNotify, // Notification interface
|
718 |
|
|
[in] DWORD dwInterests); // Callbacks interested in
|
719 |
|
|
|
720 |
|
|
HRESULT Unadvise(); // Stop the callbacks now
|
721 |
|
|
}
|
722 |
|
|
|
723 |
|
|
typedef IOverlay *POVERLAY;
|
724 |
|
|
|
725 |
|
|
|
726 |
|
|
//=====================================================================
|
727 |
|
|
//=====================================================================
|
728 |
|
|
// control related interfaces (others are defined in control.odl)
|
729 |
|
|
//=====================================================================
|
730 |
|
|
//=====================================================================
|
731 |
|
|
|
732 |
|
|
|
733 |
|
|
//=====================================================================
|
734 |
|
|
//=====================================================================
|
735 |
|
|
// Defines IMediaEventSink interface
|
736 |
|
|
//
|
737 |
|
|
// Exposed by filtergraph. Called by filters to notify events. Will be
|
738 |
|
|
// passed on to application by the IMediaControl event methods.
|
739 |
|
|
//=====================================================================
|
740 |
|
|
//=====================================================================
|
741 |
|
|
|
742 |
|
|
[
|
743 |
|
|
object,
|
744 |
|
|
uuid(56a868a2-0ad4-11ce-b03a-0020af0ba770),
|
745 |
|
|
pointer_default(unique)
|
746 |
|
|
]
|
747 |
|
|
interface IMediaEventSink : IUnknown {
|
748 |
|
|
|
749 |
|
|
// notify an event. will be queued, but not delivered to
|
750 |
|
|
// the application on this thread.
|
751 |
|
|
HRESULT Notify(
|
752 |
|
|
[in] long EventCode,
|
753 |
|
|
[in] LONG_PTR EventParam1,
|
754 |
|
|
[in] LONG_PTR EventParam2
|
755 |
|
|
);
|
756 |
|
|
}
|
757 |
|
|
|
758 |
|
|
typedef IMediaEventSink *PMEDIAEVENTSINK;
|
759 |
|
|
|
760 |
|
|
//=====================================================================
|
761 |
|
|
//=====================================================================
|
762 |
|
|
// Defines IFileSourceFilter interface
|
763 |
|
|
//
|
764 |
|
|
// Exposed by source filters to set the file name and media type.
|
765 |
|
|
//=====================================================================
|
766 |
|
|
//=====================================================================
|
767 |
|
|
|
768 |
|
|
[
|
769 |
|
|
object,
|
770 |
|
|
uuid(56a868a6-0ad4-11ce-b03a-0020af0ba770),
|
771 |
|
|
pointer_default(unique)
|
772 |
|
|
]
|
773 |
|
|
interface IFileSourceFilter : IUnknown {
|
774 |
|
|
|
775 |
|
|
// Load a file and assign it the given media type
|
776 |
|
|
HRESULT Load(
|
777 |
|
|
[in] LPCOLESTR pszFileName, // Pointer to absolute path of file to open
|
778 |
|
|
[in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL
|
779 |
|
|
);
|
780 |
|
|
// Get the currently loaded file name
|
781 |
|
|
HRESULT GetCurFile(
|
782 |
|
|
[out] LPOLESTR *ppszFileName, // Pointer to the path for the current file
|
783 |
|
|
[out] AM_MEDIA_TYPE *pmt // Pointer to the media type
|
784 |
|
|
);
|
785 |
|
|
}
|
786 |
|
|
|
787 |
|
|
typedef IFileSourceFilter *PFILTERFILESOURCE;
|
788 |
|
|
|
789 |
|
|
//=====================================================================
|
790 |
|
|
//=====================================================================
|
791 |
|
|
// Defines IFileSinkFilter interface
|
792 |
|
|
//
|
793 |
|
|
// Exposed by renderers to set the output file name.
|
794 |
|
|
//=====================================================================
|
795 |
|
|
//=====================================================================
|
796 |
|
|
|
797 |
|
|
[
|
798 |
|
|
object,
|
799 |
|
|
uuid(a2104830-7c70-11cf-8bce-00aa00a3f1a6),
|
800 |
|
|
pointer_default(unique)
|
801 |
|
|
]
|
802 |
|
|
interface IFileSinkFilter : IUnknown {
|
803 |
|
|
|
804 |
|
|
// Output to this file. default is to open the existing file
|
805 |
|
|
HRESULT SetFileName(
|
806 |
|
|
[in] LPCOLESTR pszFileName, // Pointer to absolute path of output file
|
807 |
|
|
[in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL
|
808 |
|
|
);
|
809 |
|
|
// Get the current file name
|
810 |
|
|
HRESULT GetCurFile(
|
811 |
|
|
[out] LPOLESTR *ppszFileName, // Pointer to the path for the current file
|
812 |
|
|
[out] AM_MEDIA_TYPE *pmt // Pointer to the media type
|
813 |
|
|
);
|
814 |
|
|
}
|
815 |
|
|
|
816 |
|
|
typedef IFileSinkFilter *PFILTERFILESINK;
|
817 |
|
|
|
818 |
|
|
[
|
819 |
|
|
object,
|
820 |
|
|
uuid(00855B90-CE1B-11d0-BD4F-00A0C911CE86),
|
821 |
|
|
pointer_default(unique)
|
822 |
|
|
]
|
823 |
|
|
interface IFileSinkFilter2 : IFileSinkFilter {
|
824 |
|
|
|
825 |
|
|
HRESULT SetMode(
|
826 |
|
|
[in] DWORD dwFlags // AM_FILESINK_FLAGS
|
827 |
|
|
);
|
828 |
|
|
|
829 |
|
|
HRESULT GetMode(
|
830 |
|
|
[out] DWORD *pdwFlags // AM_FILESINK_FLAGS
|
831 |
|
|
);
|
832 |
|
|
}
|
833 |
|
|
|
834 |
|
|
typedef IFileSinkFilter2 *PFILESINKFILTER2;
|
835 |
|
|
|
836 |
|
|
typedef enum {
|
837 |
|
|
|
838 |
|
|
// create a new file
|
839 |
|
|
AM_FILE_OVERWRITE = 0x00000001,
|
840 |
|
|
|
841 |
|
|
} AM_FILESINK_FLAGS;
|
842 |
|
|
|
843 |
|
|
|
844 |
|
|
//
|
845 |
|
|
// Intelligent connectivity for filters - an interface supported by
|
846 |
|
|
// filter graphs (since it is an extension to IFilterGraph) that supports
|
847 |
|
|
// building of graphs by automatic selection and connection of appropriate
|
848 |
|
|
// filters
|
849 |
|
|
|
850 |
|
|
[
|
851 |
|
|
object,
|
852 |
|
|
uuid(56a868a9-0ad4-11ce-b03a-0020af0ba770),
|
853 |
|
|
pointer_default(unique)
|
854 |
|
|
]
|
855 |
|
|
interface IGraphBuilder : IFilterGraph {
|
856 |
|
|
// Connect these two pins directly or indirectly, using transform filters
|
857 |
|
|
// if necessary.
|
858 |
|
|
|
859 |
|
|
HRESULT Connect
|
860 |
|
|
( [in] IPin * ppinOut, // the output pin
|
861 |
|
|
[in] IPin * ppinIn // the input pin
|
862 |
|
|
);
|
863 |
|
|
|
864 |
|
|
|
865 |
|
|
// Connect this output pin directly or indirectly, using transform filters
|
866 |
|
|
// if necessary to something that will render it.
|
867 |
|
|
|
868 |
|
|
HRESULT Render
|
869 |
|
|
( [in] IPin * ppinOut // the output pin
|
870 |
|
|
);
|
871 |
|
|
|
872 |
|
|
|
873 |
|
|
// Build a filter graph that will render this file using this play list.
|
874 |
|
|
// If lpwstrPlayList is NULL then it will use the default play list
|
875 |
|
|
// which will typically render the whole file.
|
876 |
|
|
|
877 |
|
|
HRESULT RenderFile
|
878 |
|
|
( [in] LPCWSTR lpcwstrFile,
|
879 |
|
|
[in, unique] LPCWSTR lpcwstrPlayList
|
880 |
|
|
);
|
881 |
|
|
|
882 |
|
|
|
883 |
|
|
// Add to the filter graph a source filter for this file. This would
|
884 |
|
|
// be the same source filter that would be added by calling Render.
|
885 |
|
|
// This call gives you more control over building
|
886 |
|
|
// the rest of the graph, e.g. AddFilter(<a renderer of your choice>)
|
887 |
|
|
// and then Connect the two.
|
888 |
|
|
// The IBaseFilter* interface exposed by the source filter is returned
|
889 |
|
|
// in ppFilter, addrefed already for you
|
890 |
|
|
// The filter will be known by the name lpcwstrFIlterName
|
891 |
|
|
// nn this filter graph,
|
892 |
|
|
HRESULT AddSourceFilter
|
893 |
|
|
( [in] LPCWSTR lpcwstrFileName,
|
894 |
|
|
[in, unique] LPCWSTR lpcwstrFilterName,
|
895 |
|
|
[out] IBaseFilter* *ppFilter
|
896 |
|
|
);
|
897 |
|
|
|
898 |
|
|
|
899 |
|
|
// If this call is made then trace information will be written to the
|
900 |
|
|
// file showing the actions taken in attempting to perform an operation.
|
901 |
|
|
HRESULT SetLogFile
|
902 |
|
|
( [in] DWORD_PTR hFile // open file handle e.g. from CreateFile
|
903 |
|
|
);
|
904 |
|
|
|
905 |
|
|
|
906 |
|
|
// Request that the graph builder should return as soon as possible from
|
907 |
|
|
// its current task.
|
908 |
|
|
// Note that it is possible fot the following to occur in the following
|
909 |
|
|
// sequence:
|
910 |
|
|
// Operation begins; Abort is requested; Operation completes normally.
|
911 |
|
|
// This would be normal whenever the quickest way to finish an operation
|
912 |
|
|
// was to simply continue to the end.
|
913 |
|
|
HRESULT Abort();
|
914 |
|
|
|
915 |
|
|
// Return S_OK if the curent operation is to continue,
|
916 |
|
|
// return S_FALSE if the current operation is to be aborted.
|
917 |
|
|
// This method can be called as a callback from a filter which is doing
|
918 |
|
|
// some operation at the request of the graph.
|
919 |
|
|
HRESULT ShouldOperationContinue();
|
920 |
|
|
|
921 |
|
|
}
|
922 |
|
|
|
923 |
|
|
|
924 |
|
|
//
|
925 |
|
|
// New capture graph builder
|
926 |
|
|
|
927 |
|
|
[
|
928 |
|
|
object,
|
929 |
|
|
uuid(bf87b6e0-8c27-11d0-b3f0-00aa003761c5),
|
930 |
|
|
pointer_default(unique)
|
931 |
|
|
]
|
932 |
|
|
interface ICaptureGraphBuilder : IUnknown {
|
933 |
|
|
|
934 |
|
|
// Use this filtergraph
|
935 |
|
|
HRESULT SetFiltergraph(
|
936 |
|
|
[in] IGraphBuilder *pfg);
|
937 |
|
|
|
938 |
|
|
// what filtergraph are you using?
|
939 |
|
|
// *ppfg->Release() when you're done with it
|
940 |
|
|
HRESULT GetFiltergraph(
|
941 |
|
|
[out] IGraphBuilder **ppfg);
|
942 |
|
|
|
943 |
|
|
// creates a rendering section in the filtergraph consisting of a MUX
|
944 |
|
|
// of some filetype, and a file writer (and connects them together)
|
945 |
|
|
// *ppf->Release() when you're done with it
|
946 |
|
|
// *ppSink->Release() when you're done with it
|
947 |
|
|
HRESULT SetOutputFileName(
|
948 |
|
|
[in] const GUID *pType, // type of file to write, eg. MEDIASUBTYPE_Avi
|
949 |
|
|
[in] LPCOLESTR lpstrFile, // filename given to file writer
|
950 |
|
|
[out] IBaseFilter **ppf, // returns pointer to the MUX
|
951 |
|
|
[out] IFileSinkFilter **ppSink);// queried from file writer
|
952 |
|
|
|
953 |
|
|
// Looks for an interface on the filter and on the output pin of the given
|
954 |
|
|
// category. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or
|
955 |
|
|
// NULL for "don't care".
|
956 |
|
|
// It will also look upstream and downstream of
|
957 |
|
|
// the pin for the interface, to find interfaces on renderers, MUXES, TV
|
958 |
|
|
// Tuners, etc.
|
959 |
|
|
// Call *ppint->Release() when you're done with it
|
960 |
|
|
[local] HRESULT FindInterface(
|
961 |
|
|
[in, unique] const GUID *pCategory, // can be NULL for all pins
|
962 |
|
|
[in] IBaseFilter *pf,
|
963 |
|
|
[in] REFIID riid,
|
964 |
|
|
[out] void **ppint);
|
965 |
|
|
[call_as(FindInterface)] HRESULT RemoteFindInterface(
|
966 |
|
|
[in, unique] const GUID *pCategory, // can be NULL for all pins
|
967 |
|
|
[in] IBaseFilter *pf,
|
968 |
|
|
[in] REFIID riid,
|
969 |
|
|
[out] IUnknown **ppint);
|
970 |
|
|
|
971 |
|
|
// Connects the pin of the given category of the source filter to the
|
972 |
|
|
// rendering filter, optionally through another filter (compressor?)
|
973 |
|
|
// For a non-NULL category, it will instantiate and connect additional
|
974 |
|
|
// required filters upstream too, like TV Tuners and Crossbars.
|
975 |
|
|
// If there is only one output pin on the source, use a NULL
|
976 |
|
|
// category. You can also have pSource be a pin
|
977 |
|
|
HRESULT RenderStream(
|
978 |
|
|
[in] const GUID *pCategory, // can be NULL if only one output pin
|
979 |
|
|
[in] IUnknown *pSource, // filter or pin
|
980 |
|
|
[in] IBaseFilter *pfCompressor,
|
981 |
|
|
[in] IBaseFilter *pfRenderer); // can be NULL
|
982 |
|
|
|
983 |
|
|
// Sends IAMStreamControl messages to the pin of the desired category, eg.
|
984 |
|
|
// "capture" or "preview"
|
985 |
|
|
// REFERENCE_TIME=NULL means NOW
|
986 |
|
|
// REFERENCE_TIME=MAX_TIME means never, or cancel previous request
|
987 |
|
|
// NULL controls all capture filters in the graph - you will get one
|
988 |
|
|
// notification for each filter with a pin of that category found
|
989 |
|
|
// returns S_FALSE if stop will be signalled before last sample is
|
990 |
|
|
// rendered.
|
991 |
|
|
// return a FAILURE code if the filter does not support IAMStreamControl
|
992 |
|
|
HRESULT ControlStream(
|
993 |
|
|
[in] const GUID *pCategory,
|
994 |
|
|
[in] IBaseFilter *pFilter,
|
995 |
|
|
[in] REFERENCE_TIME *pstart,
|
996 |
|
|
[in] REFERENCE_TIME *pstop,
|
997 |
|
|
[in] WORD wStartCookie, // high word reserved
|
998 |
|
|
[in] WORD wStopCookie); // high word reserved
|
999 |
|
|
|
1000 |
|
|
// creates a pre-allocated file of a given size in bytes
|
1001 |
|
|
HRESULT AllocCapFile(
|
1002 |
|
|
[in] LPCOLESTR lpstr,
|
1003 |
|
|
[in] DWORDLONG dwlSize);
|
1004 |
|
|
|
1005 |
|
|
// Copies the valid file data out of the old, possibly huge old capture
|
1006 |
|
|
// file into a shorter new file.
|
1007 |
|
|
// Return S_FALSE from your progress function to abort capture, S_OK to
|
1008 |
|
|
// continue
|
1009 |
|
|
HRESULT CopyCaptureFile(
|
1010 |
|
|
[in] LPOLESTR lpwstrOld,
|
1011 |
|
|
[in] LPOLESTR lpwstrNew,
|
1012 |
|
|
[in] int fAllowEscAbort, // pressing ESC will abort?
|
1013 |
|
|
[in] IAMCopyCaptureFileProgress *pCallback); // implement this to
|
1014 |
|
|
// get progress
|
1015 |
|
|
}
|
1016 |
|
|
|
1017 |
|
|
|
1018 |
|
|
//
|
1019 |
|
|
// Capture graph builder "CopyCapturedFile" progress callback
|
1020 |
|
|
|
1021 |
|
|
[
|
1022 |
|
|
object,
|
1023 |
|
|
uuid(670d1d20-a068-11d0-b3f0-00aa003761c5),
|
1024 |
|
|
pointer_default(unique)
|
1025 |
|
|
]
|
1026 |
|
|
interface IAMCopyCaptureFileProgress : IUnknown {
|
1027 |
|
|
|
1028 |
|
|
// If you support this interface somewhere, this function will be called
|
1029 |
|
|
// periodically while ICaptureGraphBuilder::CopyCaptureFile is executing
|
1030 |
|
|
// to let you know the progress
|
1031 |
|
|
//
|
1032 |
|
|
// Return S_OK from this function to continue. Return S_FALSE to abort the
|
1033 |
|
|
// copy
|
1034 |
|
|
HRESULT Progress(
|
1035 |
|
|
[in] int iProgress); // a number between 0 and 100 (%)
|
1036 |
|
|
}
|
1037 |
|
|
|
1038 |
|
|
|
1039 |
|
|
//
|
1040 |
|
|
// Capture graph builder that can deal with a single filter having more than
|
1041 |
|
|
// one pin of each category... some new devices can capture both audio and
|
1042 |
|
|
// video, for example
|
1043 |
|
|
//
|
1044 |
|
|
|
1045 |
|
|
[
|
1046 |
|
|
object,
|
1047 |
|
|
uuid(93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D),
|
1048 |
|
|
pointer_default(unique)
|
1049 |
|
|
]
|
1050 |
|
|
interface ICaptureGraphBuilder2 : IUnknown {
|
1051 |
|
|
|
1052 |
|
|
// Use this filtergraph
|
1053 |
|
|
HRESULT SetFiltergraph(
|
1054 |
|
|
[in] IGraphBuilder *pfg);
|
1055 |
|
|
|
1056 |
|
|
// what filtergraph are you using?
|
1057 |
|
|
// *ppfg->Release() when you're done with it
|
1058 |
|
|
HRESULT GetFiltergraph(
|
1059 |
|
|
[out] IGraphBuilder **ppfg);
|
1060 |
|
|
|
1061 |
|
|
// creates a rendering section in the filtergraph consisting of a MUX
|
1062 |
|
|
// of some filetype, and a file writer (and connects them together)
|
1063 |
|
|
// *ppf->Release() when you're done with it
|
1064 |
|
|
// *ppSink->Release() when you're done with it
|
1065 |
|
|
HRESULT SetOutputFileName(
|
1066 |
|
|
[in] const GUID *pType, // GUID of MUX filter to use
|
1067 |
|
|
[in] LPCOLESTR lpstrFile, // filename given to file writer
|
1068 |
|
|
[out] IBaseFilter **ppf, // returns pointer to the MUX
|
1069 |
|
|
[out] IFileSinkFilter **ppSink);// queried from file writer
|
1070 |
|
|
|
1071 |
|
|
// Looks for an interface on the filter and on the output pin of the given
|
1072 |
|
|
// category and type. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or
|
1073 |
|
|
// NULL for "don't care". Type: MAJORTYPE_Video/Audio etc or NULL)
|
1074 |
|
|
// !!! Will some filters have >1 capture pin? ie RGB and MPEG?
|
1075 |
|
|
// It will also look upstream and downstream of
|
1076 |
|
|
// the pin for the interface, to find interfaces on renderers, MUXES, TV
|
1077 |
|
|
// Tuners, etc.
|
1078 |
|
|
// Call *ppint->Release() when you're done with it
|
1079 |
|
|
[local] HRESULT FindInterface(
|
1080 |
|
|
[in] const GUID *pCategory, // can be NULL for all pins
|
1081 |
|
|
[in] const GUID *pType, // Audio/Video/??? or NULL (don't care)
|
1082 |
|
|
[in] IBaseFilter *pf,
|
1083 |
|
|
[in] REFIID riid,
|
1084 |
|
|
[out] void **ppint);
|
1085 |
|
|
[call_as(FindInterface)] HRESULT RemoteFindInterface(
|
1086 |
|
|
[in] const GUID *pCategory, // can be NULL for all pins
|
1087 |
|
|
[in] const GUID *pType, // Audio/Video/??? or NULL (don't care)
|
1088 |
|
|
[in] IBaseFilter *pf,
|
1089 |
|
|
[in] REFIID riid,
|
1090 |
|
|
[out] IUnknown **ppint);
|
1091 |
|
|
|
1092 |
|
|
// Connects the pin of the given category and type of the source filter to
|
1093 |
|
|
// the rendering filter, optionally through another filter (compressor?)
|
1094 |
|
|
// (Type is a Majortype, like Video or Audio)
|
1095 |
|
|
// For a non-NULL category, it will instantiate and connect additional
|
1096 |
|
|
// required filters upstream too, like TV Tuners and Crossbars.
|
1097 |
|
|
// If there is only one output pin on the source, use a NULL category
|
1098 |
|
|
// and type. You can also have pSource be a pin
|
1099 |
|
|
HRESULT RenderStream(
|
1100 |
|
|
[in] const GUID *pCategory, // can be NULL if only one output pin
|
1101 |
|
|
[in] const GUID *pType, // Major type (Video/Audio/etc)
|
1102 |
|
|
[in] IUnknown *pSource, // filter or pin
|
1103 |
|
|
[in] IBaseFilter *pfCompressor,
|
1104 |
|
|
[in] IBaseFilter *pfRenderer); // can be NULL
|
1105 |
|
|
|
1106 |
|
|
// Sends IAMStreamControl messages to the pin of the desired category,
|
1107 |
|
|
// (eg. "capture" or "preview") and of the desired type (eg. VIDEO or AUDIO)
|
1108 |
|
|
// A category MUST be given. If a filter is given, a type must be too.
|
1109 |
|
|
// REFERENCE_TIME=NULL means NOW
|
1110 |
|
|
// REFERENCE_TIME=MAX_TIME means never, or cancel previous request
|
1111 |
|
|
// NULL controls all capture filters in the graph - you will get one
|
1112 |
|
|
// notification for each filter with a pin of that category found
|
1113 |
|
|
// returns S_FALSE if stop will be signalled before last sample is
|
1114 |
|
|
// rendered.
|
1115 |
|
|
// return a FAILURE code if the filter does not support IAMStreamControl
|
1116 |
|
|
HRESULT ControlStream(
|
1117 |
|
|
[in] const GUID *pCategory,
|
1118 |
|
|
[in] const GUID *pType, // Major type (Video/Audio/etc)
|
1119 |
|
|
[in] IBaseFilter *pFilter,
|
1120 |
|
|
[in] REFERENCE_TIME *pstart,
|
1121 |
|
|
[in] REFERENCE_TIME *pstop,
|
1122 |
|
|
[in] WORD wStartCookie, // high word reserved
|
1123 |
|
|
[in] WORD wStopCookie); // high word reserved
|
1124 |
|
|
|
1125 |
|
|
// creates a pre-allocated file of a given size in bytes
|
1126 |
|
|
HRESULT AllocCapFile(
|
1127 |
|
|
[in] LPCOLESTR lpstr,
|
1128 |
|
|
[in] DWORDLONG dwlSize);
|
1129 |
|
|
|
1130 |
|
|
// Copies the valid file data out of the old, possibly huge old capture
|
1131 |
|
|
// file into a shorter new file.
|
1132 |
|
|
// Return S_FALSE from your progress function to abort capture, S_OK to
|
1133 |
|
|
// continue
|
1134 |
|
|
HRESULT CopyCaptureFile(
|
1135 |
|
|
[in] LPOLESTR lpwstrOld,
|
1136 |
|
|
[in] LPOLESTR lpwstrNew,
|
1137 |
|
|
[in] int fAllowEscAbort, // pressing ESC will abort?
|
1138 |
|
|
[in] IAMCopyCaptureFileProgress *pCallback); // implement this to
|
1139 |
|
|
// get progress
|
1140 |
|
|
// Helper fn to find a certain pin on a filter.
|
1141 |
|
|
HRESULT FindPin(
|
1142 |
|
|
[in] IUnknown *pSource,
|
1143 |
|
|
[in] PIN_DIRECTION pindir, // input or output?
|
1144 |
|
|
[in] const GUID *pCategory, // what category? (or NULL)
|
1145 |
|
|
[in] const GUID *pType, // what Major type (or NULL)
|
1146 |
|
|
[in] BOOL fUnconnected, // must it be unconnected?
|
1147 |
|
|
[in] int num, // which pin matching this? (0 based)
|
1148 |
|
|
[out] IPin **ppPin);
|
1149 |
|
|
}
|
1150 |
|
|
|
1151 |
|
|
enum _AM_RENSDEREXFLAGS {
|
1152 |
|
|
AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x01 // Dont add any renderers
|
1153 |
|
|
};
|
1154 |
|
|
|
1155 |
|
|
//
|
1156 |
|
|
// IFilterGraph2
|
1157 |
|
|
//
|
1158 |
|
|
// New methods on for IFilterGraph and IGraphBuilder will have to go here.
|
1159 |
|
|
//
|
1160 |
|
|
|
1161 |
|
|
[
|
1162 |
|
|
object,
|
1163 |
|
|
uuid(36b73882-c2c8-11cf-8b46-00805f6cef60),
|
1164 |
|
|
pointer_default(unique)
|
1165 |
|
|
]
|
1166 |
|
|
interface IFilterGraph2: IGraphBuilder {
|
1167 |
|
|
|
1168 |
|
|
// Add a Moniker source moniker
|
1169 |
|
|
HRESULT AddSourceFilterForMoniker(
|
1170 |
|
|
[in] IMoniker *pMoniker,
|
1171 |
|
|
[in] IBindCtx *pCtx,
|
1172 |
|
|
[in, unique] LPCWSTR lpcwstrFilterName,
|
1173 |
|
|
[out] IBaseFilter **ppFilter
|
1174 |
|
|
);
|
1175 |
|
|
|
1176 |
|
|
// Specify the type for a reconnect
|
1177 |
|
|
// This is better than Reconnect as sometime the parties to a
|
1178 |
|
|
// reconnection can't remember what type they'd agreed (!)
|
1179 |
|
|
HRESULT ReconnectEx
|
1180 |
|
|
( [in] IPin * ppin, // the pin to disconnect and reconnect
|
1181 |
|
|
[in, unique] const AM_MEDIA_TYPE *pmt // the type to reconnect with - can be NULL
|
1182 |
|
|
);
|
1183 |
|
|
|
1184 |
|
|
// Render a pin without adding any new renderers
|
1185 |
|
|
HRESULT RenderEx( [in] IPin *pPinOut, // Pin to render
|
1186 |
|
|
[in] DWORD dwFlags, // flags
|
1187 |
|
|
[in, out] DWORD *pvContext // Unused - set to NULL
|
1188 |
|
|
);
|
1189 |
|
|
|
1190 |
|
|
#if 0
|
1191 |
|
|
// Method looks for a filter which supports the specified interface. If such
|
1192 |
|
|
// a filter exists, an AddRef()'ed pointer to the requested interface is placed
|
1193 |
|
|
// in *ppInterface.
|
1194 |
|
|
//
|
1195 |
|
|
// *ppInterface will be NULL on return if such a filter could not be found, and
|
1196 |
|
|
// the method will return E_NOINTERFACE.
|
1197 |
|
|
//
|
1198 |
|
|
// pdwIndex is an internal index that is used for obtaining subsequent interfaces.
|
1199 |
|
|
// *pdwIndex should be initialized to zero. It is set on return to a value that
|
1200 |
|
|
// allows the implementation of FindFilterInterface to search for further interfaces
|
1201 |
|
|
// if called again. If no more such interfaces exist, the method will return E_NOINTERFACE.
|
1202 |
|
|
//
|
1203 |
|
|
// If pdwIndex is NULL, FindFilterInterface returns an interface only if there is just
|
1204 |
|
|
// a single filter in the graph that supports the interface. Otherwise it returns
|
1205 |
|
|
// E_NOINTERFACE.
|
1206 |
|
|
//
|
1207 |
|
|
HRESULT FindFilterInterface( [in] REFIID iid, [out] void ** ppInterface, [in,out] LPDWORD pdwIndex );
|
1208 |
|
|
|
1209 |
|
|
// Tries to obtain the interface from the filter graph itself. If this fails,
|
1210 |
|
|
// it attempts to find the unique filter that supports the interface.
|
1211 |
|
|
// On failure the method will return E_NOINTERFACE. On success, it returns
|
1212 |
|
|
// S_OK and an AddRef()'ed pointer to the requested interface in *ppInterface.
|
1213 |
|
|
//
|
1214 |
|
|
HRESULT FindInterface( [in] REFIID iid, [out] void ** ppInterface );
|
1215 |
|
|
|
1216 |
|
|
#endif
|
1217 |
|
|
}
|
1218 |
|
|
|
1219 |
|
|
//
|
1220 |
|
|
// StreamBuilder
|
1221 |
|
|
// aka Graph building with constraints
|
1222 |
|
|
// aka convergent graphs
|
1223 |
|
|
// aka Closed captioning
|
1224 |
|
|
|
1225 |
|
|
[
|
1226 |
|
|
object,
|
1227 |
|
|
local,
|
1228 |
|
|
uuid(56a868bf-0ad4-11ce-b03a-0020af0ba770),
|
1229 |
|
|
pointer_default(unique)
|
1230 |
|
|
]
|
1231 |
|
|
interface IStreamBuilder : IUnknown {
|
1232 |
|
|
|
1233 |
|
|
// Connect this output pin directly or indirectly, using transform filters
|
1234 |
|
|
// if necessary to thing(s) that will render it, within this graph
|
1235 |
|
|
// Move from Initial state to Rendered state.
|
1236 |
|
|
|
1237 |
|
|
HRESULT Render
|
1238 |
|
|
( [in] IPin * ppinOut, // the output pin
|
1239 |
|
|
[in] IGraphBuilder * pGraph // the graph
|
1240 |
|
|
);
|
1241 |
|
|
|
1242 |
|
|
// Undo what you did in Render. Return to Initial state.
|
1243 |
|
|
HRESULT Backout
|
1244 |
|
|
( [in] IPin * ppinOut, // the output pin
|
1245 |
|
|
[in] IGraphBuilder * pGraph // the graph
|
1246 |
|
|
);
|
1247 |
|
|
}
|
1248 |
|
|
|
1249 |
|
|
|
1250 |
|
|
// async reader interface - supported by file source filters. Allows
|
1251 |
|
|
// multiple overlapped reads from different positions
|
1252 |
|
|
|
1253 |
|
|
|
1254 |
|
|
[
|
1255 |
|
|
object,
|
1256 |
|
|
uuid(56a868aa-0ad4-11ce-b03a-0020af0ba770),
|
1257 |
|
|
pointer_default(unique)
|
1258 |
|
|
]
|
1259 |
|
|
interface IAsyncReader : IUnknown
|
1260 |
|
|
{
|
1261 |
|
|
// pass in your preferred allocator and your preferred properties.
|
1262 |
|
|
// method returns the actual allocator to be used. Call GetProperties
|
1263 |
|
|
// on returned allocator to learn alignment and prefix etc chosen.
|
1264 |
|
|
// this allocator will be not be committed and decommitted by
|
1265 |
|
|
// the async reader, only by the consumer.
|
1266 |
|
|
// Must call this before calling Request.
|
1267 |
|
|
HRESULT RequestAllocator(
|
1268 |
|
|
[in] IMemAllocator* pPreferred,
|
1269 |
|
|
[in] ALLOCATOR_PROPERTIES* pProps,
|
1270 |
|
|
[out] IMemAllocator ** ppActual);
|
1271 |
|
|
|
1272 |
|
|
// queue a request for data.
|
1273 |
|
|
// media sample start and stop times contain the requested absolute
|
1274 |
|
|
// byte position (start inclusive, stop exclusive).
|
1275 |
|
|
// may fail if sample not obtained from agreed allocator.
|
1276 |
|
|
// may fail if start/stop position does not match agreed alignment.
|
1277 |
|
|
// samples allocated from source pin's allocator may fail
|
1278 |
|
|
// GetPointer until after returning from WaitForNext.
|
1279 |
|
|
// Stop position must be aligned - this means it may exceed duration.
|
1280 |
|
|
// on completion, stop position will be corrected to unaligned
|
1281 |
|
|
// actual data.
|
1282 |
|
|
HRESULT Request(
|
1283 |
|
|
[in] IMediaSample* pSample,
|
1284 |
|
|
[in] DWORD_PTR dwUser); // user context
|
1285 |
|
|
|
1286 |
|
|
// block until the next sample is completed or the timeout occurs.
|
1287 |
|
|
// timeout (millisecs) may be 0 or INFINITE. Samples may not
|
1288 |
|
|
// be delivered in order. If there is a read error of any sort, a
|
1289 |
|
|
// notification will already have been sent by the source filter,
|
1290 |
|
|
// and HRESULT will be an error.
|
1291 |
|
|
// If ppSample is not null, then a Request completed with the result
|
1292 |
|
|
// code returned.
|
1293 |
|
|
HRESULT WaitForNext(
|
1294 |
|
|
[in] DWORD dwTimeout,
|
1295 |
|
|
[out] IMediaSample** ppSample, // completed sample
|
1296 |
|
|
[out] DWORD_PTR * pdwUser); // user context
|
1297 |
|
|
|
1298 |
|
|
// sync read of data. Sample passed in must have been acquired from
|
1299 |
|
|
// the agreed allocator. Start and stop position must be aligned.
|
1300 |
|
|
// equivalent to a Request/WaitForNext pair, but may avoid the
|
1301 |
|
|
// need for a thread on the source filter.
|
1302 |
|
|
HRESULT SyncReadAligned(
|
1303 |
|
|
[in] IMediaSample* pSample);
|
1304 |
|
|
|
1305 |
|
|
|
1306 |
|
|
// sync read. works in stopped state as well as run state.
|
1307 |
|
|
// need not be aligned. Will fail if read is beyond actual total
|
1308 |
|
|
// length.
|
1309 |
|
|
HRESULT SyncRead(
|
1310 |
|
|
[in] LONGLONG llPosition, // absolute file position
|
1311 |
|
|
[in] LONG lLength, // nr bytes required
|
1312 |
|
|
[out, size_is(lLength)]
|
1313 |
|
|
BYTE* pBuffer); // write data here
|
1314 |
|
|
|
1315 |
|
|
// return total length of stream, and currently available length.
|
1316 |
|
|
// reads for beyond the available length but within the total length will
|
1317 |
|
|
// normally succeed but may block for a long period.
|
1318 |
|
|
HRESULT Length(
|
1319 |
|
|
[out] LONGLONG* pTotal,
|
1320 |
|
|
[out] LONGLONG* pAvailable);
|
1321 |
|
|
|
1322 |
|
|
// cause all outstanding reads to return, possibly with a failure code
|
1323 |
|
|
//(VFW_E_TIMEOUT) indicating they were cancelled.
|
1324 |
|
|
// Between BeginFlush and EndFlush calls, Request calls will fail and
|
1325 |
|
|
// WaitForNext calls will always complete immediately.
|
1326 |
|
|
HRESULT BeginFlush(void);
|
1327 |
|
|
HRESULT EndFlush(void);
|
1328 |
|
|
}
|
1329 |
|
|
|
1330 |
|
|
|
1331 |
|
|
// interface provided by the filtergraph itself to let other objects
|
1332 |
|
|
// (especially plug-in distributors, but also apps like graphedt) know
|
1333 |
|
|
// when the graph has changed.
|
1334 |
|
|
[
|
1335 |
|
|
object,
|
1336 |
|
|
uuid(56a868ab-0ad4-11ce-b03a-0020af0ba770),
|
1337 |
|
|
pointer_default(unique)
|
1338 |
|
|
]
|
1339 |
|
|
interface IGraphVersion : IUnknown
|
1340 |
|
|
{
|
1341 |
|
|
// returns the current graph version number
|
1342 |
|
|
// this is incremented every time there is a change in the
|
1343 |
|
|
// set of filters in the graph or in their connections
|
1344 |
|
|
//
|
1345 |
|
|
// if this is changed since your last enumeration, then re-enumerate
|
1346 |
|
|
// the graph
|
1347 |
|
|
HRESULT QueryVersion(LONG* pVersion);
|
1348 |
|
|
}
|
1349 |
|
|
|
1350 |
|
|
|
1351 |
|
|
|
1352 |
|
|
|
1353 |
|
|
//
|
1354 |
|
|
// interface describing an object that uses resources.
|
1355 |
|
|
//
|
1356 |
|
|
// implement if: you request resources using IResourceManager. You will
|
1357 |
|
|
// need to pass your implementation of this pointer as an in param.
|
1358 |
|
|
//
|
1359 |
|
|
// use if: you are a resource manager who implements IResourceManager
|
1360 |
|
|
[
|
1361 |
|
|
object,
|
1362 |
|
|
uuid(56a868ad-0ad4-11ce-b03a-0020af0ba770),
|
1363 |
|
|
pointer_default(unique)
|
1364 |
|
|
]
|
1365 |
|
|
interface IResourceConsumer : IUnknown
|
1366 |
|
|
{
|
1367 |
|
|
// you may acquire the resource specified.
|
1368 |
|
|
// return values:
|
1369 |
|
|
// S_OK -- I have successfully acquired it
|
1370 |
|
|
// S_FALSE -- I will acquire it and call NotifyAcquire afterwards
|
1371 |
|
|
// VFW_S_NOT_NEEDED: I no longer need the resource
|
1372 |
|
|
// FAILED(hr)-I tried to acquire it and failed.
|
1373 |
|
|
|
1374 |
|
|
HRESULT
|
1375 |
|
|
AcquireResource(
|
1376 |
|
|
[in] LONG idResource);
|
1377 |
|
|
|
1378 |
|
|
|
1379 |
|
|
|
1380 |
|
|
// Please release the resource.
|
1381 |
|
|
// return values:
|
1382 |
|
|
// S_OK -- I have released it (and want it again when available)
|
1383 |
|
|
// S_FALSE -- I will call NotifyRelease when I have released it
|
1384 |
|
|
// other something went wrong.
|
1385 |
|
|
HRESULT
|
1386 |
|
|
ReleaseResource(
|
1387 |
|
|
[in] LONG idResource);
|
1388 |
|
|
}
|
1389 |
|
|
|
1390 |
|
|
|
1391 |
|
|
|
1392 |
|
|
// interface describing a resource manager that will resolve contention for
|
1393 |
|
|
// named resources.
|
1394 |
|
|
//
|
1395 |
|
|
// implement if: you are a resource manager. The filtergraph will be a resource
|
1396 |
|
|
// manager, internally delegating to the system wide resource manager
|
1397 |
|
|
// (when there is one)
|
1398 |
|
|
//
|
1399 |
|
|
// use if: you need resources that are limited. Use the resource manager to
|
1400 |
|
|
// resolve contention by registering the resource with this interface,
|
1401 |
|
|
// and requesting it from this interface whenever needed.
|
1402 |
|
|
//
|
1403 |
|
|
// or use if: you detect focus changes which should affect resource usage.
|
1404 |
|
|
// Notifying change of focus to the resource manager will cause the resource
|
1405 |
|
|
// manager to switch contended resources to the objects that have the user's
|
1406 |
|
|
// focus
|
1407 |
|
|
[
|
1408 |
|
|
object,
|
1409 |
|
|
uuid(56a868ac-0ad4-11ce-b03a-0020af0ba770),
|
1410 |
|
|
pointer_default(unique)
|
1411 |
|
|
]
|
1412 |
|
|
interface IResourceManager : IUnknown
|
1413 |
|
|
{
|
1414 |
|
|
// tell the manager how many there are of a resource.
|
1415 |
|
|
// ok if already registered. will take new count. if new count
|
1416 |
|
|
// is lower, will de-allocate resources to new count.
|
1417 |
|
|
//
|
1418 |
|
|
// You get back a token that will be used in further calls.
|
1419 |
|
|
//
|
1420 |
|
|
// Passing a count of 0 will eliminate this resource. There is currently
|
1421 |
|
|
// no defined way to find the id without knowing the count.
|
1422 |
|
|
//
|
1423 |
|
|
HRESULT
|
1424 |
|
|
Register(
|
1425 |
|
|
[in] LPCWSTR pName, // this named resource
|
1426 |
|
|
[in] LONG cResource, // has this many instances
|
1427 |
|
|
[out] LONG* plToken // token placed here on return
|
1428 |
|
|
);
|
1429 |
|
|
|
1430 |
|
|
HRESULT
|
1431 |
|
|
RegisterGroup(
|
1432 |
|
|
[in] LPCWSTR pName, // this named resource group
|
1433 |
|
|
[in] LONG cResource, // has this many resources
|
1434 |
|
|
[in, size_is(cResource)]
|
1435 |
|
|
LONG* palTokens, // these are the contained resources
|
1436 |
|
|
[out] LONG* plToken // group resource id put here on return
|
1437 |
|
|
);
|
1438 |
|
|
|
1439 |
|
|
// request the use of a given, registered resource.
|
1440 |
|
|
// possible return values:
|
1441 |
|
|
// S_OK == yes you can use it now
|
1442 |
|
|
// S_FALSE == you will be called back when the resource is available
|
1443 |
|
|
// other - there is an error.
|
1444 |
|
|
//
|
1445 |
|
|
// The priority of this request should be affected by the associated
|
1446 |
|
|
// focus object -- that is, when SetFocus is called for that focus
|
1447 |
|
|
// object (or a 'related' object) then my request should be put through.
|
1448 |
|
|
//
|
1449 |
|
|
// A filter should pass the filter's IUnknown here. The filtergraph
|
1450 |
|
|
// will match filters to the filtergraph, and will attempt to trace
|
1451 |
|
|
// filters to common source filters when checking focus objects.
|
1452 |
|
|
// The Focus object must be valid for the entire lifetime of the request
|
1453 |
|
|
// -- until you call CancelRequest or NotifyRelease(id, p, FALSE)
|
1454 |
|
|
HRESULT
|
1455 |
|
|
RequestResource(
|
1456 |
|
|
[in] LONG idResource,
|
1457 |
|
|
[in] IUnknown* pFocusObject,
|
1458 |
|
|
[in] IResourceConsumer* pConsumer
|
1459 |
|
|
);
|
1460 |
|
|
|
1461 |
|
|
|
1462 |
|
|
// notify the resource manager that an acquisition attempt completed.
|
1463 |
|
|
// Call this method after an AcquireResource method returned
|
1464 |
|
|
// S_FALSE to indicate asynchronous acquisition.
|
1465 |
|
|
// HR should be S_OK if the resource was successfully acquired, or a
|
1466 |
|
|
// failure code if the resource could not be acquired.
|
1467 |
|
|
HRESULT
|
1468 |
|
|
NotifyAcquire(
|
1469 |
|
|
[in] LONG idResource,
|
1470 |
|
|
[in] IResourceConsumer* pConsumer,
|
1471 |
|
|
[in] HRESULT hr);
|
1472 |
|
|
|
1473 |
|
|
// Notify the resource manager that you have released a resource. Call
|
1474 |
|
|
// this in response to a ReleaseResource method, or when you have finished
|
1475 |
|
|
// with the resource. bStillWant should be TRUE if you still want the
|
1476 |
|
|
// resource when it is next available, or FALSE if you no longer want
|
1477 |
|
|
// the resource.
|
1478 |
|
|
HRESULT
|
1479 |
|
|
NotifyRelease(
|
1480 |
|
|
[in] LONG idResource,
|
1481 |
|
|
[in] IResourceConsumer* pConsumer,
|
1482 |
|
|
[in] BOOL bStillWant);
|
1483 |
|
|
|
1484 |
|
|
// I don't currently have the resource, and I no longer need it.
|
1485 |
|
|
HRESULT
|
1486 |
|
|
CancelRequest(
|
1487 |
|
|
[in] LONG idResource,
|
1488 |
|
|
[in] IResourceConsumer* pConsumer);
|
1489 |
|
|
|
1490 |
|
|
// Notify the resource manager that a given object has been given the
|
1491 |
|
|
// user's focus. In ActiveMovie, this will normally be a video renderer
|
1492 |
|
|
// whose window has received the focus. The filter graph will switch
|
1493 |
|
|
// contended resources to (in order):
|
1494 |
|
|
// requests made with this same focus object
|
1495 |
|
|
// requests whose focus object shares a common source with this
|
1496 |
|
|
// requests whose focus object shares a common filter graph
|
1497 |
|
|
// After calling this, you *must* call ReleaseFocus before the IUnknown
|
1498 |
|
|
// becomes invalid, unless you can guarantee that another SetFocus
|
1499 |
|
|
// of a different object is done in the meantime. No addref is held.
|
1500 |
|
|
//
|
1501 |
|
|
// The resource manager will hold this pointer until replaced or cancelled,
|
1502 |
|
|
// and will use it to resolve resource contention. It will call
|
1503 |
|
|
// QueryInterface for IBaseFilter at least and if found will call methods on
|
1504 |
|
|
// that interface.
|
1505 |
|
|
HRESULT
|
1506 |
|
|
SetFocus(
|
1507 |
|
|
[in] IUnknown* pFocusObject);
|
1508 |
|
|
|
1509 |
|
|
// Sets the focus to NULL if the current focus object is still
|
1510 |
|
|
// pFocusObject. Call this when
|
1511 |
|
|
// the focus object is about to be destroyed to ensure that no-one is
|
1512 |
|
|
// still referencing the object.
|
1513 |
|
|
HRESULT
|
1514 |
|
|
ReleaseFocus(
|
1515 |
|
|
[in] IUnknown* pFocusObject);
|
1516 |
|
|
|
1517 |
|
|
|
1518 |
|
|
|
1519 |
|
|
// !!! still need
|
1520 |
|
|
// -- app override (some form of SetPriority)
|
1521 |
|
|
// -- enumeration and description of resources
|
1522 |
|
|
|
1523 |
|
|
}
|
1524 |
|
|
|
1525 |
|
|
|
1526 |
|
|
//
|
1527 |
|
|
// Interface representing an object that can be notified about state
|
1528 |
|
|
// and other changes within a filter graph. The filtergraph will call plug-in
|
1529 |
|
|
// distributors that expose this optional interface so that they can
|
1530 |
|
|
// respond to appropriate changes.
|
1531 |
|
|
//
|
1532 |
|
|
// Implement if: you are a plug-in distributor (your class id is found
|
1533 |
|
|
// under HKCR\Interface\<IID>\Distributor= for some interface).
|
1534 |
|
|
//
|
1535 |
|
|
// Use if: you are the filtergraph.
|
1536 |
|
|
[
|
1537 |
|
|
object,
|
1538 |
|
|
uuid(56a868af-0ad4-11ce-b03a-0020af0ba770),
|
1539 |
|
|
pointer_default(unique)
|
1540 |
|
|
]
|
1541 |
|
|
interface IDistributorNotify : IUnknown
|
1542 |
|
|
{
|
1543 |
|
|
// called when graph is entering stop state. Called before
|
1544 |
|
|
// filters are stopped.
|
1545 |
|
|
HRESULT Stop(void);
|
1546 |
|
|
|
1547 |
|
|
// called when graph is entering paused state, before filters are
|
1548 |
|
|
// notified
|
1549 |
|
|
HRESULT Pause(void);
|
1550 |
|
|
|
1551 |
|
|
// called when graph is entering running state, before filters are
|
1552 |
|
|
// notified. tStart is the stream-time offset parameter that will be
|
1553 |
|
|
// given to each filter's IBaseFilter::Run method.
|
1554 |
|
|
HRESULT Run(REFERENCE_TIME tStart);
|
1555 |
|
|
|
1556 |
|
|
// called when the graph's clock is changing, with the new clock. Addref
|
1557 |
|
|
// the clock if you hold it beyond this method. Called before
|
1558 |
|
|
// the filters are notified.
|
1559 |
|
|
HRESULT SetSyncSource(
|
1560 |
|
|
[in] IReferenceClock * pClock);
|
1561 |
|
|
|
1562 |
|
|
// called when the set of filters or their connections has changed.
|
1563 |
|
|
// Called on every AddFilter, RemoveFilter or ConnectDirect (or anything
|
1564 |
|
|
// that will lead to one of these).
|
1565 |
|
|
// You don't need to rebuild your list of interesting filters at this point
|
1566 |
|
|
// but you should release any refcounts you hold on any filters that
|
1567 |
|
|
// have been removed.
|
1568 |
|
|
HRESULT NotifyGraphChange(void);
|
1569 |
|
|
}
|
1570 |
|
|
|
1571 |
|
|
typedef enum {
|
1572 |
|
|
AM_STREAM_INFO_START_DEFINED = 0x00000001,
|
1573 |
|
|
AM_STREAM_INFO_STOP_DEFINED = 0x00000002,
|
1574 |
|
|
AM_STREAM_INFO_DISCARDING = 0x00000004,
|
1575 |
|
|
AM_STREAM_INFO_STOP_SEND_EXTRA = 0x00000010
|
1576 |
|
|
} AM_STREAM_INFO_FLAGS;
|
1577 |
|
|
|
1578 |
|
|
// Stream information
|
1579 |
|
|
typedef struct {
|
1580 |
|
|
REFERENCE_TIME tStart;
|
1581 |
|
|
REFERENCE_TIME tStop;
|
1582 |
|
|
DWORD dwStartCookie;
|
1583 |
|
|
DWORD dwStopCookie;
|
1584 |
|
|
DWORD dwFlags;
|
1585 |
|
|
} AM_STREAM_INFO;
|
1586 |
|
|
|
1587 |
|
|
//
|
1588 |
|
|
// IAMStreamControl
|
1589 |
|
|
//
|
1590 |
|
|
|
1591 |
|
|
[
|
1592 |
|
|
object,
|
1593 |
|
|
uuid(36b73881-c2c8-11cf-8b46-00805f6cef60),
|
1594 |
|
|
pointer_default(unique)
|
1595 |
|
|
]
|
1596 |
|
|
interface IAMStreamControl : IUnknown
|
1597 |
|
|
{
|
1598 |
|
|
// The REFERENCE_TIME pointers may be null, which
|
1599 |
|
|
// indicates immediately. If the pointer is non-NULL
|
1600 |
|
|
// and dwCookie is non-zero, then pins should send
|
1601 |
|
|
// EC_STREAM_CONTROL_STOPPED / EC_STREAM_CONTROL_STARTED
|
1602 |
|
|
// with an IPin pointer and the cookie, thus allowing
|
1603 |
|
|
// apps to tie the events back to their requests.
|
1604 |
|
|
// If either dwCookies is zero, or the pointer is null,
|
1605 |
|
|
// then no event is sent.
|
1606 |
|
|
|
1607 |
|
|
// If you have a capture pin hooked up to a MUX input pin and they
|
1608 |
|
|
// both support IAMStreamControl, you'll want the MUX to signal the
|
1609 |
|
|
// stop so you know the last frame was written out. In order for the
|
1610 |
|
|
// MUX to know it's finished, the capture pin will have to send one
|
1611 |
|
|
// extra sample after it was supposed to stop, so the MUX can trigger
|
1612 |
|
|
// off that. So you would set bSendExtra to TRUE for the capture pin
|
1613 |
|
|
// Leave it FALSE in all other cases.
|
1614 |
|
|
|
1615 |
|
|
HRESULT StartAt( [in] const REFERENCE_TIME * ptStart,
|
1616 |
|
|
[in] DWORD dwCookie );
|
1617 |
|
|
HRESULT StopAt( [in] const REFERENCE_TIME * ptStop,
|
1618 |
|
|
[in] BOOL bSendExtra,
|
1619 |
|
|
[in] DWORD dwCookie );
|
1620 |
|
|
HRESULT GetInfo( [out] AM_STREAM_INFO *pInfo);
|
1621 |
|
|
}
|
1622 |
|
|
|
1623 |
|
|
|
1624 |
|
|
|
1625 |
|
|
//
|
1626 |
|
|
// ISeekingPassThru
|
1627 |
|
|
//
|
1628 |
|
|
|
1629 |
|
|
[
|
1630 |
|
|
object,
|
1631 |
|
|
uuid(36b73883-c2c8-11cf-8b46-00805f6cef60),
|
1632 |
|
|
pointer_default(unique)
|
1633 |
|
|
]
|
1634 |
|
|
interface ISeekingPassThru : IUnknown
|
1635 |
|
|
{
|
1636 |
|
|
HRESULT Init( [in] BOOL bSupportRendering,
|
1637 |
|
|
[in] IPin *pPin);
|
1638 |
|
|
}
|
1639 |
|
|
|
1640 |
|
|
|
1641 |
|
|
|
1642 |
|
|
//
|
1643 |
|
|
// IAMStreamConfig - pin interface
|
1644 |
|
|
//
|
1645 |
|
|
|
1646 |
|
|
// A capture filter or compression filter's output pin
|
1647 |
|
|
// supports this interface - no matter what data type you produce.
|
1648 |
|
|
|
1649 |
|
|
// This interface can be used to set the output format of a pin (as an
|
1650 |
|
|
// alternative to connecting the pin using a specific media type).
|
1651 |
|
|
// After setting an output format, the pin will use that format
|
1652 |
|
|
// the next time it connects to somebody, so you can just Render that
|
1653 |
|
|
// pin and get a desired format without using Connect(CMediaType)
|
1654 |
|
|
// Your pin should do that by ONLY OFFERING the media type set in SetFormat
|
1655 |
|
|
// in its enumeration of media types, and no others. This will ensure that
|
1656 |
|
|
// that format is indeed used for connection (or at least offer it first).
|
1657 |
|
|
// An application interested in enumerating accepted mediatypes may have to
|
1658 |
|
|
// do so BEFORE calling SetFormat.
|
1659 |
|
|
|
1660 |
|
|
// But this interface's GetStreamCaps function can get more information
|
1661 |
|
|
// about accepted media types than the traditional way of enumerating a pin's
|
1662 |
|
|
// media types, so it should typically be used instead.
|
1663 |
|
|
// GetStreamCaps gets information about the kinds of formats allowed... how
|
1664 |
|
|
// it can stretch and crop, and the frame rate and data rates allowed (for
|
1665 |
|
|
// video)
|
1666 |
|
|
|
1667 |
|
|
// VIDEO EXAMPLE
|
1668 |
|
|
//
|
1669 |
|
|
// GetStreamCaps returns a whole array of {MediaType, Capabilities}.
|
1670 |
|
|
// Let's say your capture card supports JPEG anywhere between 160x120 and
|
1671 |
|
|
// 320x240, and also the size 640x480. Also, say it supports RGB24 at
|
1672 |
|
|
// resolutions between 160x120 and 320x240 but only multiples of 8. You would
|
1673 |
|
|
// expose these properties by offering a media type of 320 x 240 JPEG
|
1674 |
|
|
// (if that is your default or preferred size) coupled with
|
1675 |
|
|
// capabilities saying minimum 160x120 and maximum 320x240 with granularity of
|
1676 |
|
|
// 1. The next pair you expose is a media type of 640x480 JPEG coupled with
|
1677 |
|
|
// capabilities of min 640x480 max 640x480. The third pair is media type
|
1678 |
|
|
// 320x240 RGB24 with capabilities min 160x120 max 320x240 granularity 8.
|
1679 |
|
|
// In this way you can expose almost every quirk your card might have.
|
1680 |
|
|
// An application interested in knowing what compression formats you provide
|
1681 |
|
|
// can get all the pairs and make a list of all the unique sub types of the
|
1682 |
|
|
// media types.
|
1683 |
|
|
//
|
1684 |
|
|
// If a filter's output pin is connected with a media type that has rcSource
|
1685 |
|
|
// and rcTarget not empty, it means the filter is being asked to stretch the
|
1686 |
|
|
// rcSource sub-rectangle of its InputSize (the format of the input pin for
|
1687 |
|
|
// a compressor, and the largest bitmap a capture filter can generate with
|
1688 |
|
|
// every pixel unique) into the rcTarget sub-rectangle of its output format.
|
1689 |
|
|
// For instance, if a video compressor has as input 160x120 RGB, and as output
|
1690 |
|
|
// 320x240 MPEG with an rcSource of (10,10,20,20) and rcTarget of (0,0,100,100)
|
1691 |
|
|
// this means the compressor is being asked to take a 10x10 piece of the 160x120
|
1692 |
|
|
// RGB bitmap, and make it fill the top 100x100 area of a 320x240 bitmap,
|
1693 |
|
|
// leaving the rest of the 320x240 bitmap untouched.
|
1694 |
|
|
// A filter does not have to support this and can fail to connect with a
|
1695 |
|
|
// media type where rcSource and rcTarget are not empty.
|
1696 |
|
|
//
|
1697 |
|
|
// Your output pin is connected to the next filter with a certain media
|
1698 |
|
|
// type (either directly or using the media type passed by SetFormat),
|
1699 |
|
|
// and you need to look at the AvgBytesPerSecond field of the format
|
1700 |
|
|
// of that mediatype to see what data rate you are being asked to compress
|
1701 |
|
|
// the video to, and use that data rate. Using the number of frames per
|
1702 |
|
|
// second in AvgTimePerFrame, you can figure out how many bytes each frame
|
1703 |
|
|
// is supposed to be. You can make it smaller, but NEVER EVER make a bigger
|
1704 |
|
|
// data rate. For a video compressor, your input pin's media type tells you
|
1705 |
|
|
// the frame rate (use that AvgTimePerFrame). For a capture filter, the
|
1706 |
|
|
// output media type tells you, so use that AvgTimePerFrame.
|
1707 |
|
|
//
|
1708 |
|
|
// The cropping rectangle described below is the same as the rcSrc of the
|
1709 |
|
|
// output pin's media type.
|
1710 |
|
|
//
|
1711 |
|
|
// The output rectangle described below is the same of the width and height
|
1712 |
|
|
// of the BITMAPINFOHEADER of the media type of the output pin's media type
|
1713 |
|
|
|
1714 |
|
|
|
1715 |
|
|
// AUDIO EXAMPLE
|
1716 |
|
|
//
|
1717 |
|
|
// This API can return an array of pairs of (media type, capabilities).
|
1718 |
|
|
// This can be used to expose all kinds of wierd capabilities. Let's say you
|
1719 |
|
|
// do any PCM frequency from 11,025 to 44,100 at 8 or 16 bit mono or
|
1720 |
|
|
// stereo, and you also do 48,000 16bit stereo as a special combination.
|
1721 |
|
|
// You would expose 3 pairs. The first pair would have Min Freq of 11025 and
|
1722 |
|
|
// Max Freq of 44100, with MaxChannels=2 and MinBits=8 and MaxBits=8 for the
|
1723 |
|
|
// capabilites structure, and a media type of anything you like, maybe
|
1724 |
|
|
// 22kHz, 8bit stereo as a default.
|
1725 |
|
|
// The 2nd pair would be the same except for MinBits=16 and MaxBits=16 in
|
1726 |
|
|
// the capabilities structure and the media type could be something like
|
1727 |
|
|
// 44kHz, 16bit stereo as a default (the media type in the pair should always
|
1728 |
|
|
// be something legal as described by the capabilities structure... the
|
1729 |
|
|
// structure tells you how you can change the media type to produce other
|
1730 |
|
|
// legal media types... for instance changing 44kHz to 29010Hz would be legal,
|
1731 |
|
|
// but changing bits from 16 to 14 would not be.)
|
1732 |
|
|
// The 3rd pair would be MinFreq=48000 MaxFreq=48000 MaxChannels=2
|
1733 |
|
|
// MinBits=16 and MaxBits=16, and the media type would be 48kHz 16bit stereo.
|
1734 |
|
|
// You can also use the Granularity elements of the structure (like the example
|
1735 |
|
|
// for video) if you support values that multiples of n, eg. you could say
|
1736 |
|
|
// minimum bits per sample 8, max 16, and granularity 8 to describe doing
|
1737 |
|
|
// either 8 or 16 bit all in one structure
|
1738 |
|
|
//
|
1739 |
|
|
// If you support non-PCM formats, the media type returned in GetStreamCaps
|
1740 |
|
|
// can show which non-PCM formats you support (with a default sample rate,
|
1741 |
|
|
// bit rate and channels) and the capabilities structure going with that
|
1742 |
|
|
// media type can describe which other sample rates, bit rates and channels
|
1743 |
|
|
// you support.
|
1744 |
|
|
|
1745 |
|
|
[
|
1746 |
|
|
object,
|
1747 |
|
|
uuid(C6E13340-30AC-11d0-A18C-00A0C9118956),
|
1748 |
|
|
pointer_default(unique)
|
1749 |
|
|
]
|
1750 |
|
|
interface IAMStreamConfig : IUnknown
|
1751 |
|
|
{
|
1752 |
|
|
|
1753 |
|
|
// this is the structure returned by a VIDEO filter
|
1754 |
|
|
//
|
1755 |
|
|
typedef struct _VIDEO_STREAM_CONFIG_CAPS {
|
1756 |
|
|
|
1757 |
|
|
GUID guid; // will be MEDIATYPE_Video
|
1758 |
|
|
|
1759 |
|
|
// the logical or of all the AnalogVideoStandard's supported
|
1760 |
|
|
// typically zero if not supported
|
1761 |
|
|
ULONG VideoStandard;
|
1762 |
|
|
|
1763 |
|
|
// the inherent size of the incoming signal... taken from the input
|
1764 |
|
|
// pin for a compressor, or the largest size a capture filter can
|
1765 |
|
|
// digitize the signal with every pixel still unique
|
1766 |
|
|
SIZE InputSize;
|
1767 |
|
|
|
1768 |
|
|
// The input of a compressor filter may have to be connected for these
|
1769 |
|
|
// to be known
|
1770 |
|
|
|
1771 |
|
|
// smallest rcSrc cropping rect allowed
|
1772 |
|
|
SIZE MinCroppingSize;
|
1773 |
|
|
// largest rcSrc cropping rect allowed
|
1774 |
|
|
SIZE MaxCroppingSize;
|
1775 |
|
|
// granularity of cropping size - eg only widths a multiple of 4 allowed
|
1776 |
|
|
int CropGranularityX;
|
1777 |
|
|
int CropGranularityY;
|
1778 |
|
|
// alignment of cropping rect - eg rect must start on multiple of 4
|
1779 |
|
|
int CropAlignX;
|
1780 |
|
|
int CropAlignY;
|
1781 |
|
|
|
1782 |
|
|
// The input of a compressor filter may have to be connected for these
|
1783 |
|
|
// to be known
|
1784 |
|
|
|
1785 |
|
|
// smallest bitmap this pin can produce
|
1786 |
|
|
SIZE MinOutputSize;
|
1787 |
|
|
// largest bitmap this pin can produce
|
1788 |
|
|
SIZE MaxOutputSize;
|
1789 |
|
|
// granularity of output bitmap size
|
1790 |
|
|
int OutputGranularityX;
|
1791 |
|
|
int OutputGranularityY;
|
1792 |
|
|
// !!! what about alignment of rcTarget inside BIH if different?
|
1793 |
|
|
|
1794 |
|
|
// how well can you stretch in the x direction? 0==not at all
|
1795 |
|
|
// 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation
|
1796 |
|
|
// etc.
|
1797 |
|
|
int StretchTapsX;
|
1798 |
|
|
int StretchTapsY;
|
1799 |
|
|
// how well can you shrink in the x direction? 0==not at all
|
1800 |
|
|
// 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation
|
1801 |
|
|
// etc.
|
1802 |
|
|
int ShrinkTapsX;
|
1803 |
|
|
int ShrinkTapsY;
|
1804 |
|
|
|
1805 |
|
|
// CAPTURE filter only - what frame rates are allowed?
|
1806 |
|
|
LONGLONG MinFrameInterval;
|
1807 |
|
|
LONGLONG MaxFrameInterval;
|
1808 |
|
|
|
1809 |
|
|
// what data rates can this pin produce?
|
1810 |
|
|
LONG MinBitsPerSecond;
|
1811 |
|
|
LONG MaxBitsPerSecond;
|
1812 |
|
|
} VIDEO_STREAM_CONFIG_CAPS;
|
1813 |
|
|
|
1814 |
|
|
|
1815 |
|
|
// this is the structure returned by an AUDIO filter
|
1816 |
|
|
//
|
1817 |
|
|
typedef struct _AUDIO_STREAM_CONFIG_CAPS {
|
1818 |
|
|
|
1819 |
|
|
GUID guid; // will be MEDIATYPE_Audio
|
1820 |
|
|
ULONG MinimumChannels;
|
1821 |
|
|
ULONG MaximumChannels;
|
1822 |
|
|
ULONG ChannelsGranularity;
|
1823 |
|
|
ULONG MinimumBitsPerSample;
|
1824 |
|
|
ULONG MaximumBitsPerSample;
|
1825 |
|
|
ULONG BitsPerSampleGranularity;
|
1826 |
|
|
ULONG MinimumSampleFrequency;
|
1827 |
|
|
ULONG MaximumSampleFrequency;
|
1828 |
|
|
ULONG SampleFrequencyGranularity;
|
1829 |
|
|
} AUDIO_STREAM_CONFIG_CAPS;
|
1830 |
|
|
|
1831 |
|
|
// - only allowed when pin is not streaming, else the call will FAIL
|
1832 |
|
|
// - If your output pin is not yet connected, and you can
|
1833 |
|
|
// connect your output pin with this media type, you should
|
1834 |
|
|
// succeed the call, and start offering it first (enumerate as format#0)
|
1835 |
|
|
// from GetMediaType so that this format will be used to connect with
|
1836 |
|
|
// when you do connect to somebody
|
1837 |
|
|
// - if your output pin is already connected, and you can provide this
|
1838 |
|
|
// type, reconnect your pin. If the other pin can't accept it, FAIL
|
1839 |
|
|
// this call and leave your connection alone.
|
1840 |
|
|
HRESULT SetFormat(
|
1841 |
|
|
[in] AM_MEDIA_TYPE *pmt);
|
1842 |
|
|
|
1843 |
|
|
// the format it's connected with, or will connect with
|
1844 |
|
|
// the application is responsible for calling DeleteMediaType(*ppmt);
|
1845 |
|
|
HRESULT GetFormat(
|
1846 |
|
|
[out] AM_MEDIA_TYPE **ppmt);
|
1847 |
|
|
|
1848 |
|
|
// how many different Stream Caps structures are there?
|
1849 |
|
|
// also, how big is the stream caps structure?
|
1850 |
|
|
HRESULT GetNumberOfCapabilities(
|
1851 |
|
|
[out] int *piCount,
|
1852 |
|
|
[out] int *piSize); // pSCC of GetStreamCaps needs to be this big
|
1853 |
|
|
|
1854 |
|
|
// - gets one of the pairs of {Mediatype, Caps}
|
1855 |
|
|
// - return S_FALSE if iIndex is too high
|
1856 |
|
|
// - the application is responsible for calling DeleteMediaType(*ppmt);
|
1857 |
|
|
// - the first thing pSCC points to is a GUID saying MEDIATYPE_Video
|
1858 |
|
|
// or MEDIATYPE_Audio, so you can tell if you have a pointer to a
|
1859 |
|
|
// VIDEO_STREAM_CONFIG_CAPS or an AUDIO_STREAM_CONFIG_CAPS structure
|
1860 |
|
|
// There could potentially be many more possibilities other than video
|
1861 |
|
|
// or audio.
|
1862 |
|
|
HRESULT GetStreamCaps(
|
1863 |
|
|
[in] int iIndex, // 0 to #caps-1
|
1864 |
|
|
[out] AM_MEDIA_TYPE **ppmt,
|
1865 |
|
|
[out] BYTE *pSCC);
|
1866 |
|
|
|
1867 |
|
|
}
|
1868 |
|
|
|
1869 |
|
|
|
1870 |
|
|
|
1871 |
|
|
// Interface to control interleaving of different streams in one file
|
1872 |
|
|
[
|
1873 |
|
|
object,
|
1874 |
|
|
uuid(BEE3D220-157B-11d0-BD23-00A0C911CE86),
|
1875 |
|
|
pointer_default(unique)
|
1876 |
|
|
]
|
1877 |
|
|
interface IConfigInterleaving : IUnknown
|
1878 |
|
|
{
|
1879 |
|
|
import "unknwn.idl";
|
1880 |
|
|
|
1881 |
|
|
typedef enum
|
1882 |
|
|
{
|
1883 |
|
|
// uninterleaved - samples written out in the order they
|
1884 |
|
|
// arrive
|
1885 |
|
|
INTERLEAVE_NONE,
|
1886 |
|
|
|
1887 |
|
|
// approximate interleaving with less overhead for video
|
1888 |
|
|
// capture
|
1889 |
|
|
INTERLEAVE_CAPTURE,
|
1890 |
|
|
|
1891 |
|
|
// full, precise interleaving. slower.
|
1892 |
|
|
INTERLEAVE_FULL
|
1893 |
|
|
|
1894 |
|
|
} InterleavingMode;
|
1895 |
|
|
|
1896 |
|
|
HRESULT put_Mode(
|
1897 |
|
|
[in] InterleavingMode mode
|
1898 |
|
|
);
|
1899 |
|
|
|
1900 |
|
|
HRESULT get_Mode(
|
1901 |
|
|
[out] InterleavingMode *pMode
|
1902 |
|
|
);
|
1903 |
|
|
|
1904 |
|
|
HRESULT put_Interleaving(
|
1905 |
|
|
[in] const REFERENCE_TIME *prtInterleave,
|
1906 |
|
|
[in] const REFERENCE_TIME *prtPreroll
|
1907 |
|
|
);
|
1908 |
|
|
|
1909 |
|
|
HRESULT get_Interleaving(
|
1910 |
|
|
[out] REFERENCE_TIME *prtInterleave,
|
1911 |
|
|
[out] REFERENCE_TIME *prtPreroll
|
1912 |
|
|
);
|
1913 |
|
|
}
|
1914 |
|
|
|
1915 |
|
|
// Interface to control the AVI mux
|
1916 |
|
|
[
|
1917 |
|
|
object,
|
1918 |
|
|
uuid(5ACD6AA0-F482-11ce-8B67-00AA00A3F1A6),
|
1919 |
|
|
pointer_default(unique)
|
1920 |
|
|
]
|
1921 |
|
|
interface IConfigAviMux : IUnknown
|
1922 |
|
|
{
|
1923 |
|
|
import "unknwn.idl";
|
1924 |
|
|
|
1925 |
|
|
// control whether the AVI mux adjusts the frame rate or audio
|
1926 |
|
|
// sampling rate for drift when the file is closed. -1 to disables
|
1927 |
|
|
// this behavior.
|
1928 |
|
|
HRESULT SetMasterStream([in] LONG iStream);
|
1929 |
|
|
HRESULT GetMasterStream([out] LONG *pStream);
|
1930 |
|
|
|
1931 |
|
|
// control whether the AVI mux writes out an idx1 index chunk for
|
1932 |
|
|
// compatibility with older AVI players.
|
1933 |
|
|
HRESULT SetOutputCompatibilityIndex([in] BOOL fOldIndex);
|
1934 |
|
|
HRESULT GetOutputCompatibilityIndex([out] BOOL *pfOldIndex);
|
1935 |
|
|
}
|
1936 |
|
|
|
1937 |
|
|
//---------------------------------------------------------------------
|
1938 |
|
|
// CompressionCaps enum
|
1939 |
|
|
//---------------------------------------------------------------------
|
1940 |
|
|
|
1941 |
|
|
// This tells you which features of IAMVideoCompression are supported
|
1942 |
|
|
|
1943 |
|
|
// CanCrunch means that it can compress video to a specified data rate
|
1944 |
|
|
// If so, then the output pin's media type will contain that data rate
|
1945 |
|
|
// in the format's AvgBytesPerSecond field, and that should be used.
|
1946 |
|
|
|
1947 |
|
|
typedef enum
|
1948 |
|
|
{
|
1949 |
|
|
CompressionCaps_CanQuality = 0x01,
|
1950 |
|
|
CompressionCaps_CanCrunch = 0x02,
|
1951 |
|
|
CompressionCaps_CanKeyFrame = 0x04,
|
1952 |
|
|
CompressionCaps_CanBFrame = 0x08,
|
1953 |
|
|
CompressionCaps_CanWindow = 0x10
|
1954 |
|
|
} CompressionCaps;
|
1955 |
|
|
|
1956 |
|
|
|
1957 |
|
|
|
1958 |
|
|
//---------------------------------------------------------------------
|
1959 |
|
|
// IAMVideoCompression interface
|
1960 |
|
|
//
|
1961 |
|
|
// Control compression parameters - pin interface
|
1962 |
|
|
//---------------------------------------------------------------------
|
1963 |
|
|
|
1964 |
|
|
// This interface is implemented by the output pin of a video capture
|
1965 |
|
|
// filter or video compressor that provides video data
|
1966 |
|
|
|
1967 |
|
|
// You use this interface to control how video is compressed... how
|
1968 |
|
|
// many keyframes, etc., and to find information like capabilities and
|
1969 |
|
|
// the description of this compressor
|
1970 |
|
|
|
1971 |
|
|
[
|
1972 |
|
|
object,
|
1973 |
|
|
uuid(C6E13343-30AC-11d0-A18C-00A0C9118956),
|
1974 |
|
|
pointer_default(unique)
|
1975 |
|
|
]
|
1976 |
|
|
interface IAMVideoCompression : IUnknown
|
1977 |
|
|
{
|
1978 |
|
|
// - Only valid if GetInfo's pCapabilities sets
|
1979 |
|
|
// CompressionCaps_CanKeyFrame
|
1980 |
|
|
// - KeyFrameRate < 0 means use the compressor default
|
1981 |
|
|
// - KeyFrames == 0 means only the first frame is a key
|
1982 |
|
|
HRESULT put_KeyFrameRate (
|
1983 |
|
|
[in] long KeyFrameRate);
|
1984 |
|
|
|
1985 |
|
|
HRESULT get_KeyFrameRate (
|
1986 |
|
|
[out] long * pKeyFrameRate);
|
1987 |
|
|
|
1988 |
|
|
// - Only valid if GetInfo's pCapabilities sets
|
1989 |
|
|
// CompressionCaps_CanBFrame
|
1990 |
|
|
// - If keyframes are every 10, and there are 3 P Frames per key,
|
1991 |
|
|
// they will be spaced evenly between the key frames and the other
|
1992 |
|
|
// 6 frames will be B frames
|
1993 |
|
|
// - PFramesPerKeyFrame < 0 means use the compressor default
|
1994 |
|
|
HRESULT put_PFramesPerKeyFrame (
|
1995 |
|
|
[in] long PFramesPerKeyFrame);
|
1996 |
|
|
|
1997 |
|
|
HRESULT get_PFramesPerKeyFrame (
|
1998 |
|
|
[out] long * pPFramesPerKeyFrame);
|
1999 |
|
|
|
2000 |
|
|
// - Only valid if GetInfo's pCapabilities sets
|
2001 |
|
|
// CompressionCaps_CanQuality
|
2002 |
|
|
// - Controls image quality
|
2003 |
|
|
// - If you are compressing to a fixed data rate, a high quality
|
2004 |
|
|
// means try and use all of the data rate, and a low quality means
|
2005 |
|
|
// feel free to use much lower than the data rate if you want to.
|
2006 |
|
|
// - Quality < 0 means use the compressor default
|
2007 |
|
|
HRESULT put_Quality (
|
2008 |
|
|
[in] double Quality);
|
2009 |
|
|
|
2010 |
|
|
HRESULT get_Quality (
|
2011 |
|
|
[out] double * pQuality);
|
2012 |
|
|
|
2013 |
|
|
// If you have set a data rate of 100K/sec on a 10fps movie, that
|
2014 |
|
|
// will normally mean each frame must be <=10K. But a window size
|
2015 |
|
|
// means every consecutive n frames must average to the data rate,
|
2016 |
|
|
// but an individual frame (if n > 1) is allowed to exceed the
|
2017 |
|
|
// frame size suggested by the data rate
|
2018 |
|
|
HRESULT put_WindowSize (
|
2019 |
|
|
[in] DWORDLONG WindowSize);
|
2020 |
|
|
|
2021 |
|
|
HRESULT get_WindowSize (
|
2022 |
|
|
[out] DWORDLONG * pWindowSize);
|
2023 |
|
|
|
2024 |
|
|
// - pszVersion might be "Version 2.1.0"
|
2025 |
|
|
// - pszDescription might be "Danny's awesome video compressor"
|
2026 |
|
|
// - pcbVersion and pcbDescription will be filled in with the
|
2027 |
|
|
// required length if they are too short
|
2028 |
|
|
// - *pCapabilities is a logical OR of some CompressionCaps flags
|
2029 |
|
|
HRESULT GetInfo(
|
2030 |
|
|
[out, size_is(*pcbVersion)] WCHAR * pszVersion,
|
2031 |
|
|
[in,out] int *pcbVersion,
|
2032 |
|
|
[out, size_is(*pcbDescription)] LPWSTR pszDescription,
|
2033 |
|
|
[in,out] int *pcbDescription,
|
2034 |
|
|
[out] long *pDefaultKeyFrameRate,
|
2035 |
|
|
[out] long *pDefaultPFramesPerKey,
|
2036 |
|
|
[out] double *pDefaultQuality,
|
2037 |
|
|
[out] long *pCapabilities //CompressionCaps
|
2038 |
|
|
);
|
2039 |
|
|
|
2040 |
|
|
// - this means when this frame number comes along after the graph
|
2041 |
|
|
// is running, make it a keyframe even if you weren't going to
|
2042 |
|
|
HRESULT OverrideKeyFrame(
|
2043 |
|
|
[in] long FrameNumber
|
2044 |
|
|
);
|
2045 |
|
|
|
2046 |
|
|
// - Only valid if GetInfo's pCapabilities sets
|
2047 |
|
|
// CompressionCaps_CanCrunch
|
2048 |
|
|
// - this means when this frame number comes along after the graph
|
2049 |
|
|
// is running, make it this many bytes big instead of whatever size
|
2050 |
|
|
// you were going to make it.
|
2051 |
|
|
HRESULT OverrideFrameSize(
|
2052 |
|
|
[in] long FrameNumber,
|
2053 |
|
|
[in] long Size
|
2054 |
|
|
);
|
2055 |
|
|
|
2056 |
|
|
}
|
2057 |
|
|
|
2058 |
|
|
//---------------------------------------------------------------------
|
2059 |
|
|
// VfwCaptureDialogs enum
|
2060 |
|
|
//---------------------------------------------------------------------
|
2061 |
|
|
|
2062 |
|
|
typedef enum
|
2063 |
|
|
{
|
2064 |
|
|
VfwCaptureDialog_Source = 0x01,
|
2065 |
|
|
VfwCaptureDialog_Format = 0x02,
|
2066 |
|
|
VfwCaptureDialog_Display = 0x04
|
2067 |
|
|
} VfwCaptureDialogs;
|
2068 |
|
|
|
2069 |
|
|
|
2070 |
|
|
//---------------------------------------------------------------------
|
2071 |
|
|
// VfwCompressDialogs enum
|
2072 |
|
|
//---------------------------------------------------------------------
|
2073 |
|
|
|
2074 |
|
|
typedef enum
|
2075 |
|
|
{
|
2076 |
|
|
VfwCompressDialog_Config = 0x01,
|
2077 |
|
|
VfwCompressDialog_About = 0x02,
|
2078 |
|
|
// returns S_OK if the dialog exists and can be shown, else S_FALSE
|
2079 |
|
|
VfwCompressDialog_QueryConfig = 0x04,
|
2080 |
|
|
VfwCompressDialog_QueryAbout = 0x08
|
2081 |
|
|
} VfwCompressDialogs;
|
2082 |
|
|
|
2083 |
|
|
|
2084 |
|
|
//---------------------------------------------------------------------
|
2085 |
|
|
// IAMVfwCaptureDialogs - filter interface
|
2086 |
|
|
//
|
2087 |
|
|
// Show a VfW capture driver dialog - SOURCE, FORMAT, or DISPLAY
|
2088 |
|
|
//---------------------------------------------------------------------
|
2089 |
|
|
|
2090 |
|
|
// This interface is supported only by Microsoft's Video For Windows
|
2091 |
|
|
// capture driver Capture Filter. It allows an application to bring up
|
2092 |
|
|
// one of the 3 driver dialogs that VfW capture drivers have.
|
2093 |
|
|
|
2094 |
|
|
[
|
2095 |
|
|
object,
|
2096 |
|
|
local,
|
2097 |
|
|
uuid(D8D715A0-6E5E-11D0-B3F0-00AA003761C5),
|
2098 |
|
|
pointer_default(unique)
|
2099 |
|
|
]
|
2100 |
|
|
interface IAMVfwCaptureDialogs : IUnknown
|
2101 |
|
|
{
|
2102 |
|
|
HRESULT HasDialog(
|
2103 |
|
|
[in] int iDialog // VfwCaptureDialogs enum
|
2104 |
|
|
);
|
2105 |
|
|
|
2106 |
|
|
HRESULT ShowDialog(
|
2107 |
|
|
[in] int iDialog, // VfwCaptureDialogs enum
|
2108 |
|
|
[in] HWND hwnd
|
2109 |
|
|
);
|
2110 |
|
|
|
2111 |
|
|
HRESULT SendDriverMessage(
|
2112 |
|
|
[in] int iDialog, // VfwCaptureDialogs enum
|
2113 |
|
|
[in] int uMsg,
|
2114 |
|
|
[in] long dw1,
|
2115 |
|
|
[in] long dw2
|
2116 |
|
|
);
|
2117 |
|
|
|
2118 |
|
|
// - iDialog can be one of the VfwCaptureDialogs enums
|
2119 |
|
|
// - HasDialog returns S_OK if it has the dialog, else S_FALSE
|
2120 |
|
|
// - ShowDialog can only be called when not streaming or when another
|
2121 |
|
|
// dialog is not already up
|
2122 |
|
|
// - SendDriverMessage can send a secret message to the capture driver.
|
2123 |
|
|
// USE IT AT YOUR OWN RISK!
|
2124 |
|
|
}
|
2125 |
|
|
|
2126 |
|
|
//---------------------------------------------------------------------
|
2127 |
|
|
// IAMVfwCompressDialogs - filter interface
|
2128 |
|
|
//
|
2129 |
|
|
// Show a VfW codec driver dialog - CONFIG or ABOUT
|
2130 |
|
|
//---------------------------------------------------------------------
|
2131 |
|
|
|
2132 |
|
|
// This interface is supported only by Microsoft's ICM Compressor filter
|
2133 |
|
|
// (Co). It allows an application to bring up either the Configure or
|
2134 |
|
|
// About dialogs for the ICM codec that it is currently using.
|
2135 |
|
|
|
2136 |
|
|
[
|
2137 |
|
|
object,
|
2138 |
|
|
local,
|
2139 |
|
|
uuid(D8D715A3-6E5E-11D0-B3F0-00AA003761C5),
|
2140 |
|
|
pointer_default(unique)
|
2141 |
|
|
]
|
2142 |
|
|
interface IAMVfwCompressDialogs : IUnknown
|
2143 |
|
|
{
|
2144 |
|
|
|
2145 |
|
|
// Bring up a dialog for this codec
|
2146 |
|
|
HRESULT ShowDialog(
|
2147 |
|
|
[in] int iDialog, // VfwCompressDialogs enum
|
2148 |
|
|
[in] HWND hwnd
|
2149 |
|
|
);
|
2150 |
|
|
|
2151 |
|
|
// Calls ICGetState and gives you the result
|
2152 |
|
|
HRESULT GetState(
|
2153 |
|
|
[out, size_is(*pcbState)] LPVOID pState,
|
2154 |
|
|
[in, out] int *pcbState
|
2155 |
|
|
);
|
2156 |
|
|
|
2157 |
|
|
// Calls ICSetState
|
2158 |
|
|
HRESULT SetState(
|
2159 |
|
|
[in, size_is(cbState)] LPVOID pState,
|
2160 |
|
|
[in] int cbState
|
2161 |
|
|
);
|
2162 |
|
|
|
2163 |
|
|
// Send a codec specific message
|
2164 |
|
|
HRESULT SendDriverMessage(
|
2165 |
|
|
[in] int uMsg,
|
2166 |
|
|
[in] long dw1,
|
2167 |
|
|
[in] long dw2
|
2168 |
|
|
);
|
2169 |
|
|
|
2170 |
|
|
// - iDialog can be one of the VfwCaptureDialogs enums
|
2171 |
|
|
// - ShowDialog can only be called when not streaming or when no other
|
2172 |
|
|
// dialog is up already
|
2173 |
|
|
// - an application can call GetState after ShowDialog(CONFIG) to
|
2174 |
|
|
// see how the compressor was configured and next time the graph
|
2175 |
|
|
// is used, it can call SetState with the data it saved to return
|
2176 |
|
|
// the codec to the state configured by the dialog box from last time
|
2177 |
|
|
// - GetState with a NULL pointer returns the size needed
|
2178 |
|
|
// - SendDriverMessage can send a secret message to the codec.
|
2179 |
|
|
// USE IT AT YOUR OWN RISK!
|
2180 |
|
|
}
|
2181 |
|
|
|
2182 |
|
|
|
2183 |
|
|
//---------------------------------------------------------------------
|
2184 |
|
|
// IAMDroppedFrames interface
|
2185 |
|
|
//
|
2186 |
|
|
// Report status of capture - pin interface
|
2187 |
|
|
//---------------------------------------------------------------------
|
2188 |
|
|
|
2189 |
|
|
// A capture filter's video output pin supports this. It reports
|
2190 |
|
|
// how many frames were not sent (dropped), etc.
|
2191 |
|
|
|
2192 |
|
|
// Every time your filter goes from STOPPED-->PAUSED, you reset all your
|
2193 |
|
|
// counts to zero.
|
2194 |
|
|
|
2195 |
|
|
// An app may call this all the time while you are capturing to see how
|
2196 |
|
|
// capturing is going. MAKE SURE you always return as current information
|
2197 |
|
|
// as possible while you are running.
|
2198 |
|
|
|
2199 |
|
|
// When your capture filter starts running, it starts by sending frame 0,
|
2200 |
|
|
// then 1, 2, 3, etc. The time stamp of each frame sent should correspond
|
2201 |
|
|
// to the graph clock's time when the image was digitized. The end time
|
2202 |
|
|
// is the start time plus the duration of the video frame.
|
2203 |
|
|
// You should also set the MediaTime of each sample (SetMediaTime) as well.
|
2204 |
|
|
// This should be the frame number ie (0,1) (1,2) (2,3).
|
2205 |
|
|
// If a frame is dropped, a downstream filter will be able to tell easily
|
2206 |
|
|
// not by looking for gaps in the regular time stamps, but by noticing a
|
2207 |
|
|
// frame number is missing (eg. (1,2) (2,3) (4,5) (5,6) means frame 3
|
2208 |
|
|
// was dropped.
|
2209 |
|
|
|
2210 |
|
|
// Using the info provided by this interface, an application can figure out
|
2211 |
|
|
// the number of frames dropped, the frame rate achieved (the length of
|
2212 |
|
|
// time the graph was running divided by the number of frames not dropped),
|
2213 |
|
|
// and the data rate acheived (the length of time the graph was running
|
2214 |
|
|
// divided by the average frame size).
|
2215 |
|
|
|
2216 |
|
|
// If your filter is running, then paused, and then run again, you need
|
2217 |
|
|
// to continue to deliver frames as if it was never paused. The first
|
2218 |
|
|
// frame after the second RUN cannot be time stamped earlier than the last
|
2219 |
|
|
// frame sent before the pause.
|
2220 |
|
|
|
2221 |
|
|
// Your filter must always increment the MediaTime of each sample sent.
|
2222 |
|
|
// Never send the same frame # twice, and never go back in time. The
|
2223 |
|
|
// regular time stamp of a sample can also never go back in time.
|
2224 |
|
|
|
2225 |
|
|
[
|
2226 |
|
|
object,
|
2227 |
|
|
uuid(C6E13344-30AC-11d0-A18C-00A0C9118956),
|
2228 |
|
|
pointer_default(unique)
|
2229 |
|
|
]
|
2230 |
|
|
interface IAMDroppedFrames : IUnknown
|
2231 |
|
|
{
|
2232 |
|
|
// Get the number of dropped frames
|
2233 |
|
|
HRESULT GetNumDropped(
|
2234 |
|
|
[out] long * plDropped
|
2235 |
|
|
|
2236 |
|
|
);
|
2237 |
|
|
|
2238 |
|
|
//Get the number of non-dropped frames
|
2239 |
|
|
HRESULT GetNumNotDropped(
|
2240 |
|
|
[out] long * plNotDropped
|
2241 |
|
|
|
2242 |
|
|
);
|
2243 |
|
|
|
2244 |
|
|
// - plArray points to an array of lSize longs. The filter will
|
2245 |
|
|
// fill it with the frame number of the first lSize frames dropped.
|
2246 |
|
|
// A filter may not have bothered to remember as many as you asked
|
2247 |
|
|
// for, so it will set *plNumCopied to the number of frames it filled
|
2248 |
|
|
// in.
|
2249 |
|
|
HRESULT GetDroppedInfo(
|
2250 |
|
|
[in] long lSize,
|
2251 |
|
|
[out] long * plArray,
|
2252 |
|
|
[out] long * plNumCopied
|
2253 |
|
|
);
|
2254 |
|
|
|
2255 |
|
|
// - This is the average size of the frames it didn't drop (in bytes)
|
2256 |
|
|
HRESULT GetAverageFrameSize(
|
2257 |
|
|
[out] long * plAverageSize
|
2258 |
|
|
|
2259 |
|
|
);
|
2260 |
|
|
|
2261 |
|
|
}
|
2262 |
|
|
|
2263 |
|
|
|
2264 |
|
|
|
2265 |
|
|
cpp_quote("#define AMF_AUTOMATICGAIN -1.0")
|
2266 |
|
|
|
2267 |
|
|
//---------------------------------------------------------------------
|
2268 |
|
|
// IAMAudioInputMixer interface
|
2269 |
|
|
//
|
2270 |
|
|
// Sets the recording levels, pan and EQ for the audio card inputs
|
2271 |
|
|
//---------------------------------------------------------------------
|
2272 |
|
|
|
2273 |
|
|
// This interface is implemented by each input pin of an audio capture
|
2274 |
|
|
// filter, to tell it what level, panning, and EQ to use for each input.
|
2275 |
|
|
// The name of each pin will reflect the type of input, eg. "Line input 1"
|
2276 |
|
|
// or "Mic". An application uses the pin names to decide how it wants to
|
2277 |
|
|
// set the recording levels
|
2278 |
|
|
|
2279 |
|
|
// This interface can also be supported by the audio capture filter itself
|
2280 |
|
|
// to control to overall record level and panning after the mix
|
2281 |
|
|
|
2282 |
|
|
[
|
2283 |
|
|
object,
|
2284 |
|
|
uuid(54C39221-8380-11d0-B3F0-00AA003761C5),
|
2285 |
|
|
pointer_default(unique)
|
2286 |
|
|
]
|
2287 |
|
|
interface IAMAudioInputMixer : IUnknown
|
2288 |
|
|
{
|
2289 |
|
|
// This interface is only supported by the input pins, not the filter
|
2290 |
|
|
// If disabled, this channel will not be mixed in as part of the
|
2291 |
|
|
// recorded signal.
|
2292 |
|
|
HRESULT put_Enable (
|
2293 |
|
|
[in] BOOL fEnable); // TRUE=enable FALSE=disable
|
2294 |
|
|
|
2295 |
|
|
//Is this channel enabled?
|
2296 |
|
|
HRESULT get_Enable (
|
2297 |
|
|
[out] BOOL *pfEnable);
|
2298 |
|
|
|
2299 |
|
|
// When set to mono mode, making a stereo recording of this channel
|
2300 |
|
|
// will have both channels contain the same data... a mixture of the
|
2301 |
|
|
// left and right signals
|
2302 |
|
|
HRESULT put_Mono (
|
2303 |
|
|
[in] BOOL fMono); // TRUE=mono FALSE=multi channel
|
2304 |
|
|
|
2305 |
|
|
//all channels combined into a mono signal?
|
2306 |
|
|
HRESULT get_Mono (
|
2307 |
|
|
[out] BOOL *pfMono);
|
2308 |
|
|
|
2309 |
|
|
// !!! WILL CARDS BE ABLE TO BOOST THE GAIN?
|
2310 |
|
|
//Set the record level for this channel
|
2311 |
|
|
HRESULT put_MixLevel (
|
2312 |
|
|
[in] double Level); // 0 = off, 1 = full (unity?) volume
|
2313 |
|
|
// AMF_AUTOMATICGAIN, if supported,
|
2314 |
|
|
// means automatic
|
2315 |
|
|
|
2316 |
|
|
//Get the record level for this channel
|
2317 |
|
|
HRESULT get_MixLevel (
|
2318 |
|
|
[out] double *pLevel);
|
2319 |
|
|
|
2320 |
|
|
// For instance, when panned full left, and you make a stereo recording
|
2321 |
|
|
// of this channel, you will record a silent right channel.
|
2322 |
|
|
HRESULT put_Pan (
|
2323 |
|
|
[in] double Pan); // -1 = full left, 0 = centre, 1 = right
|
2324 |
|
|
|
2325 |
|
|
//Get the pan for this channel
|
2326 |
|
|
HRESULT get_Pan (
|
2327 |
|
|
[out] double *pPan);
|
2328 |
|
|
|
2329 |
|
|
// Boosts the bass of low volume signals before they are recorded
|
2330 |
|
|
// to compensate for the fact that your ear has trouble hearing quiet
|
2331 |
|
|
// bass sounds
|
2332 |
|
|
HRESULT put_Loudness (
|
2333 |
|
|
[in] BOOL fLoudness);// TRUE=on FALSE=off
|
2334 |
|
|
|
2335 |
|
|
HRESULT get_Loudness (
|
2336 |
|
|
[out] BOOL *pfLoudness);
|
2337 |
|
|
|
2338 |
|
|
// boosts or cuts the treble of the signal before it's recorded by
|
2339 |
|
|
// a certain amount of dB
|
2340 |
|
|
HRESULT put_Treble (
|
2341 |
|
|
[in] double Treble); // gain in dB (-ve = attenuate)
|
2342 |
|
|
|
2343 |
|
|
//Get the treble EQ for this channel
|
2344 |
|
|
HRESULT get_Treble (
|
2345 |
|
|
[out] double *pTreble);
|
2346 |
|
|
|
2347 |
|
|
// This is the maximum value allowed in put_Treble. ie 6.0 means
|
2348 |
|
|
// any value between -6.0 and 6.0 is allowed
|
2349 |
|
|
HRESULT get_TrebleRange (
|
2350 |
|
|
[out] double *pRange); // largest value allowed
|
2351 |
|
|
|
2352 |
|
|
// boosts or cuts the bass of the signal before it's recorded by
|
2353 |
|
|
// a certain amount of dB
|
2354 |
|
|
HRESULT put_Bass (
|
2355 |
|
|
[in] double Bass); // gain in dB (-ve = attenuate)
|
2356 |
|
|
|
2357 |
|
|
// Get the bass EQ for this channel
|
2358 |
|
|
HRESULT get_Bass (
|
2359 |
|
|
[out] double *pBass);
|
2360 |
|
|
|
2361 |
|
|
// This is the maximum value allowed in put_Bass. ie 6.0 means
|
2362 |
|
|
// any value between -6.0 and 6.0 is allowed
|
2363 |
|
|
HRESULT get_BassRange (
|
2364 |
|
|
[out] double *pRange); // largest value allowed
|
2365 |
|
|
|
2366 |
|
|
}
|
2367 |
|
|
|
2368 |
|
|
|
2369 |
|
|
//---------------------------------------------------------------------
|
2370 |
|
|
// IAMBufferNegotiation interface
|
2371 |
|
|
//
|
2372 |
|
|
// Tells a pin what kinds of buffers to use when connected
|
2373 |
|
|
//---------------------------------------------------------------------
|
2374 |
|
|
|
2375 |
|
|
// This interface can be implemented by any pin that will connect to
|
2376 |
|
|
// another pin using IMemInputPin. All capture filters should support
|
2377 |
|
|
// this interface.
|
2378 |
|
|
|
2379 |
|
|
// SuggestAllocatorProperties is a way for an application to get
|
2380 |
|
|
// in on the buffer negotiation process for a pin. This pin will use
|
2381 |
|
|
// the numbers given to it by the application as its request to the
|
2382 |
|
|
// allocator. An application can use a negative number for any element
|
2383 |
|
|
// in the ALLOCATOR_PROPERTIES to mean "don't care". An application must
|
2384 |
|
|
// call this function before the pin is connected, or it will be too late
|
2385 |
|
|
// To ensure that an application gets what it wants, it would be wise to
|
2386 |
|
|
// call this method on both pins being connected together, so the other
|
2387 |
|
|
// pin doesn't overrule the application's request.
|
2388 |
|
|
|
2389 |
|
|
// GetAllocatorProperties can only be called after a pin is connected and
|
2390 |
|
|
// it returns the properties of the current allocator being used
|
2391 |
|
|
|
2392 |
|
|
[
|
2393 |
|
|
object,
|
2394 |
|
|
uuid(56ED71A0-AF5F-11D0-B3F0-00AA003761C5),
|
2395 |
|
|
pointer_default(unique)
|
2396 |
|
|
]
|
2397 |
|
|
interface IAMBufferNegotiation : IUnknown
|
2398 |
|
|
{
|
2399 |
|
|
HRESULT SuggestAllocatorProperties (
|
2400 |
|
|
[in] const ALLOCATOR_PROPERTIES *pprop);
|
2401 |
|
|
|
2402 |
|
|
HRESULT GetAllocatorProperties (
|
2403 |
|
|
[out] ALLOCATOR_PROPERTIES *pprop);
|
2404 |
|
|
|
2405 |
|
|
}
|
2406 |
|
|
|
2407 |
|
|
|
2408 |
|
|
//---------------------------------------------------------------------
|
2409 |
|
|
// AnalogVideoStandard enum
|
2410 |
|
|
//---------------------------------------------------------------------
|
2411 |
|
|
|
2412 |
|
|
typedef enum tagAnalogVideoStandard
|
2413 |
|
|
{
|
2414 |
|
|
AnalogVideo_None = 0x00000000, // This is a digital sensor
|
2415 |
|
|
AnalogVideo_NTSC_M = 0x00000001, // 75 IRE Setup
|
2416 |
|
|
AnalogVideo_NTSC_M_J = 0x00000002, // Japan, 0 IRE Setup
|
2417 |
|
|
AnalogVideo_NTSC_433 = 0x00000004,
|
2418 |
|
|
|
2419 |
|
|
AnalogVideo_PAL_B = 0x00000010,
|
2420 |
|
|
AnalogVideo_PAL_D = 0x00000020,
|
2421 |
|
|
AnalogVideo_PAL_G = 0x00000040,
|
2422 |
|
|
AnalogVideo_PAL_H = 0x00000080,
|
2423 |
|
|
AnalogVideo_PAL_I = 0x00000100,
|
2424 |
|
|
AnalogVideo_PAL_M = 0x00000200,
|
2425 |
|
|
AnalogVideo_PAL_N = 0x00000400,
|
2426 |
|
|
|
2427 |
|
|
AnalogVideo_PAL_60 = 0x00000800,
|
2428 |
|
|
|
2429 |
|
|
AnalogVideo_SECAM_B = 0x00001000,
|
2430 |
|
|
AnalogVideo_SECAM_D = 0x00002000,
|
2431 |
|
|
AnalogVideo_SECAM_G = 0x00004000,
|
2432 |
|
|
AnalogVideo_SECAM_H = 0x00008000,
|
2433 |
|
|
AnalogVideo_SECAM_K = 0x00010000,
|
2434 |
|
|
AnalogVideo_SECAM_K1 = 0x00020000,
|
2435 |
|
|
AnalogVideo_SECAM_L = 0x00040000,
|
2436 |
|
|
AnalogVideo_SECAM_L1 = 0x00080000,
|
2437 |
|
|
|
2438 |
|
|
AnalogVideo_PAL_N_COMBO // Argentina
|
2439 |
|
|
= 0x00100000
|
2440 |
|
|
} AnalogVideoStandard;
|
2441 |
|
|
|
2442 |
|
|
cpp_quote("#define AnalogVideo_NTSC_Mask 0x00000007")
|
2443 |
|
|
cpp_quote("#define AnalogVideo_PAL_Mask 0x00100FF0")
|
2444 |
|
|
cpp_quote("#define AnalogVideo_SECAM_Mask 0x000FF000")
|
2445 |
|
|
|
2446 |
|
|
|
2447 |
|
|
//---------------------------------------------------------------------
|
2448 |
|
|
// TunerInputType enum
|
2449 |
|
|
//---------------------------------------------------------------------
|
2450 |
|
|
|
2451 |
|
|
typedef enum tagTunerInputType
|
2452 |
|
|
{
|
2453 |
|
|
TunerInputCable,
|
2454 |
|
|
TunerInputAntenna
|
2455 |
|
|
} TunerInputType;
|
2456 |
|
|
|
2457 |
|
|
//---------------------------------------------------------------------
|
2458 |
|
|
// VideoCopyProtectionType enum
|
2459 |
|
|
//---------------------------------------------------------------------
|
2460 |
|
|
|
2461 |
|
|
typedef enum
|
2462 |
|
|
{
|
2463 |
|
|
VideoCopyProtectionMacrovisionBasic,
|
2464 |
|
|
VideoCopyProtectionMacrovisionCBI
|
2465 |
|
|
} VideoCopyProtectionType;
|
2466 |
|
|
|
2467 |
|
|
//---------------------------------------------------------------------
|
2468 |
|
|
// PhysicalConnectorType enum
|
2469 |
|
|
//---------------------------------------------------------------------
|
2470 |
|
|
|
2471 |
|
|
typedef enum tagPhysicalConnectorType
|
2472 |
|
|
{
|
2473 |
|
|
PhysConn_Video_Tuner = 1,
|
2474 |
|
|
PhysConn_Video_Composite,
|
2475 |
|
|
PhysConn_Video_SVideo,
|
2476 |
|
|
PhysConn_Video_RGB,
|
2477 |
|
|
PhysConn_Video_YRYBY,
|
2478 |
|
|
PhysConn_Video_SerialDigital,
|
2479 |
|
|
PhysConn_Video_ParallelDigital,
|
2480 |
|
|
PhysConn_Video_SCSI,
|
2481 |
|
|
PhysConn_Video_AUX,
|
2482 |
|
|
PhysConn_Video_1394,
|
2483 |
|
|
PhysConn_Video_USB,
|
2484 |
|
|
PhysConn_Video_VideoDecoder,
|
2485 |
|
|
PhysConn_Video_VideoEncoder,
|
2486 |
|
|
PhysConn_Video_SCART,
|
2487 |
|
|
PhysConn_Video_Black,
|
2488 |
|
|
|
2489 |
|
|
|
2490 |
|
|
PhysConn_Audio_Tuner = 0x1000,
|
2491 |
|
|
PhysConn_Audio_Line,
|
2492 |
|
|
PhysConn_Audio_Mic,
|
2493 |
|
|
PhysConn_Audio_AESDigital,
|
2494 |
|
|
PhysConn_Audio_SPDIFDigital,
|
2495 |
|
|
PhysConn_Audio_SCSI,
|
2496 |
|
|
PhysConn_Audio_AUX,
|
2497 |
|
|
PhysConn_Audio_1394,
|
2498 |
|
|
PhysConn_Audio_USB,
|
2499 |
|
|
PhysConn_Audio_AudioDecoder,
|
2500 |
|
|
} PhysicalConnectorType;
|
2501 |
|
|
|
2502 |
|
|
|
2503 |
|
|
|
2504 |
|
|
|
2505 |
|
|
//---------------------------------------------------------------------
|
2506 |
|
|
// IAMAnalogVideoDecoder interface
|
2507 |
|
|
//---------------------------------------------------------------------
|
2508 |
|
|
|
2509 |
|
|
[
|
2510 |
|
|
object,
|
2511 |
|
|
uuid(C6E13350-30AC-11d0-A18C-00A0C9118956),
|
2512 |
|
|
pointer_default(unique)
|
2513 |
|
|
]
|
2514 |
|
|
interface IAMAnalogVideoDecoder : IUnknown
|
2515 |
|
|
{
|
2516 |
|
|
|
2517 |
|
|
//Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1...
|
2518 |
|
|
HRESULT get_AvailableTVFormats(
|
2519 |
|
|
[out] long *lAnalogVideoStandard
|
2520 |
|
|
);
|
2521 |
|
|
|
2522 |
|
|
//Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...
|
2523 |
|
|
HRESULT put_TVFormat(
|
2524 |
|
|
[in] long lAnalogVideoStandard
|
2525 |
|
|
);
|
2526 |
|
|
|
2527 |
|
|
// Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...
|
2528 |
|
|
HRESULT get_TVFormat(
|
2529 |
|
|
[out] long * plAnalogVideoStandard
|
2530 |
|
|
);
|
2531 |
|
|
|
2532 |
|
|
// True if horizontal sync is locked
|
2533 |
|
|
HRESULT get_HorizontalLocked (
|
2534 |
|
|
[out] long * plLocked);
|
2535 |
|
|
|
2536 |
|
|
// True if connected to a VCR (changes PLL timing)
|
2537 |
|
|
HRESULT put_VCRHorizontalLocking (
|
2538 |
|
|
[in] long lVCRHorizontalLocking);
|
2539 |
|
|
|
2540 |
|
|
HRESULT get_VCRHorizontalLocking (
|
2541 |
|
|
[out] long * plVCRHorizontalLocking);
|
2542 |
|
|
|
2543 |
|
|
// Returns the number of lines in the video signal")]
|
2544 |
|
|
HRESULT get_NumberOfLines (
|
2545 |
|
|
[out] long *plNumberOfLines);
|
2546 |
|
|
|
2547 |
|
|
// Enables or disables the output bus
|
2548 |
|
|
HRESULT put_OutputEnable (
|
2549 |
|
|
[in] long lOutputEnable);
|
2550 |
|
|
|
2551 |
|
|
HRESULT get_OutputEnable (
|
2552 |
|
|
[out] long *plOutputEnable);
|
2553 |
|
|
|
2554 |
|
|
}
|
2555 |
|
|
|
2556 |
|
|
|
2557 |
|
|
//---------------------------------------------------------------------
|
2558 |
|
|
// VideoProcAmp Property enum
|
2559 |
|
|
//---------------------------------------------------------------------
|
2560 |
|
|
|
2561 |
|
|
typedef enum tagVideoProcAmpProperty
|
2562 |
|
|
{
|
2563 |
|
|
VideoProcAmp_Brightness,
|
2564 |
|
|
VideoProcAmp_Contrast,
|
2565 |
|
|
VideoProcAmp_Hue,
|
2566 |
|
|
VideoProcAmp_Saturation,
|
2567 |
|
|
VideoProcAmp_Sharpness,
|
2568 |
|
|
VideoProcAmp_Gamma,
|
2569 |
|
|
VideoProcAmp_ColorEnable,
|
2570 |
|
|
VideoProcAmp_WhiteBalance,
|
2571 |
|
|
VideoProcAmp_BacklightCompensation,
|
2572 |
|
|
VideoProcAmp_Gain
|
2573 |
|
|
} VideoProcAmpProperty;
|
2574 |
|
|
|
2575 |
|
|
//---------------------------------------------------------------------
|
2576 |
|
|
// VideoProcAmp Flags enum
|
2577 |
|
|
//---------------------------------------------------------------------
|
2578 |
|
|
|
2579 |
|
|
typedef enum tagVideoProcAmpFlags
|
2580 |
|
|
{
|
2581 |
|
|
VideoProcAmp_Flags_Auto = 0x0001,
|
2582 |
|
|
VideoProcAmp_Flags_Manual = 0x0002
|
2583 |
|
|
} VideoProcAmpFlags;
|
2584 |
|
|
|
2585 |
|
|
//---------------------------------------------------------------------
|
2586 |
|
|
// IAMVideoProcAmp interface
|
2587 |
|
|
//
|
2588 |
|
|
// Adjusts video quality in either the analog or digital domain.
|
2589 |
|
|
//
|
2590 |
|
|
//---------------------------------------------------------------------
|
2591 |
|
|
|
2592 |
|
|
[
|
2593 |
|
|
object,
|
2594 |
|
|
uuid(C6E13360-30AC-11d0-A18C-00A0C9118956),
|
2595 |
|
|
pointer_default(unique)
|
2596 |
|
|
]
|
2597 |
|
|
interface IAMVideoProcAmp : IUnknown
|
2598 |
|
|
{
|
2599 |
|
|
// Returns min, max, step size, and default values
|
2600 |
|
|
HRESULT GetRange(
|
2601 |
|
|
[in] long Property, // Which property to query
|
2602 |
|
|
[out] long * pMin, // Range minimum
|
2603 |
|
|
[out] long * pMax, // Range maxumum
|
2604 |
|
|
[out] long * pSteppingDelta,// Step size
|
2605 |
|
|
[out] long * pDefault, // Default value
|
2606 |
|
|
[out] long * pCapsFlags // VideoProcAmpFlags
|
2607 |
|
|
|
2608 |
|
|
);
|
2609 |
|
|
|
2610 |
|
|
// Set a VideoProcAmp property
|
2611 |
|
|
HRESULT Set(
|
2612 |
|
|
[in] long Property, // VideoProcAmpProperty
|
2613 |
|
|
[in] long lValue, // Value to set
|
2614 |
|
|
[in] long Flags // VideoProcAmp_Flags_*
|
2615 |
|
|
|
2616 |
|
|
);
|
2617 |
|
|
|
2618 |
|
|
// Get a VideoProcAmp property
|
2619 |
|
|
HRESULT Get(
|
2620 |
|
|
[in] long Property, // VideoProcAmpProperty
|
2621 |
|
|
[out] long * lValue, // Current value
|
2622 |
|
|
[out] long * Flags // VideoProcAmp_Flags_*
|
2623 |
|
|
);
|
2624 |
|
|
}
|
2625 |
|
|
|
2626 |
|
|
|
2627 |
|
|
//---------------------------------------------------------------------
|
2628 |
|
|
// CameraControl Property enum
|
2629 |
|
|
//---------------------------------------------------------------------
|
2630 |
|
|
|
2631 |
|
|
typedef enum tagCameraControlProperty
|
2632 |
|
|
{
|
2633 |
|
|
CameraControl_Pan,
|
2634 |
|
|
CameraControl_Tilt,
|
2635 |
|
|
CameraControl_Roll,
|
2636 |
|
|
CameraControl_Zoom,
|
2637 |
|
|
CameraControl_Exposure,
|
2638 |
|
|
CameraControl_Iris,
|
2639 |
|
|
CameraControl_Focus
|
2640 |
|
|
} CameraControlProperty;
|
2641 |
|
|
|
2642 |
|
|
//---------------------------------------------------------------------
|
2643 |
|
|
// CameraControl Flags enum
|
2644 |
|
|
//---------------------------------------------------------------------
|
2645 |
|
|
|
2646 |
|
|
typedef enum tagCameraControlFlags
|
2647 |
|
|
{
|
2648 |
|
|
CameraControl_Flags_Auto = 0x0001,
|
2649 |
|
|
CameraControl_Flags_Manual = 0x0002
|
2650 |
|
|
} CameraControlFlags;
|
2651 |
|
|
|
2652 |
|
|
//---------------------------------------------------------------------
|
2653 |
|
|
// IAMCameraControl interface
|
2654 |
|
|
//
|
2655 |
|
|
// Control of local or remote cameras
|
2656 |
|
|
//---------------------------------------------------------------------
|
2657 |
|
|
|
2658 |
|
|
[
|
2659 |
|
|
object,
|
2660 |
|
|
uuid(C6E13370-30AC-11d0-A18C-00A0C9118956),
|
2661 |
|
|
pointer_default(unique)
|
2662 |
|
|
]
|
2663 |
|
|
interface IAMCameraControl : IUnknown
|
2664 |
|
|
{
|
2665 |
|
|
// Returns min, max, step size, and default values
|
2666 |
|
|
HRESULT GetRange(
|
2667 |
|
|
[in] long Property, // Which property to query
|
2668 |
|
|
[out] long * pMin, // Range minimum
|
2669 |
|
|
[out] long * pMax, // Range maxumum
|
2670 |
|
|
[out] long * pSteppingDelta,// Step size
|
2671 |
|
|
[out] long * pDefault, // Default value
|
2672 |
|
|
[out] long * pCapsFlags // CamaeraControlFlags
|
2673 |
|
|
|
2674 |
|
|
);
|
2675 |
|
|
|
2676 |
|
|
// Set a CameraControl property
|
2677 |
|
|
HRESULT Set(
|
2678 |
|
|
[in] long Property, // CameraControlProperty
|
2679 |
|
|
[in] long lValue, // Value to set
|
2680 |
|
|
[in] long Flags // CameraControl_Flags_*
|
2681 |
|
|
|
2682 |
|
|
);
|
2683 |
|
|
|
2684 |
|
|
// Get a CameraControl property
|
2685 |
|
|
HRESULT Get(
|
2686 |
|
|
[in] long Property, // CameraControlProperty
|
2687 |
|
|
[out] long * lValue, // Current value
|
2688 |
|
|
[out] long * Flags // CameraControl_Flags_*
|
2689 |
|
|
);
|
2690 |
|
|
}
|
2691 |
|
|
|
2692 |
|
|
//---------------------------------------------------------------------
|
2693 |
|
|
// VideoControl Flags enum
|
2694 |
|
|
//---------------------------------------------------------------------
|
2695 |
|
|
|
2696 |
|
|
typedef enum tagVideoControlFlags
|
2697 |
|
|
{
|
2698 |
|
|
VideoControlFlag_FlipHorizontal = 0x0001,
|
2699 |
|
|
VideoControlFlag_FlipVertical = 0x0002,
|
2700 |
|
|
VideoControlFlag_ExternalTriggerEnable = 0x0004,
|
2701 |
|
|
VideoControlFlag_Trigger = 0x0008
|
2702 |
|
|
|
2703 |
|
|
} VideoControlFlags;
|
2704 |
|
|
|
2705 |
|
|
//---------------------------------------------------------------------
|
2706 |
|
|
// IAMVideoControl interface
|
2707 |
|
|
//
|
2708 |
|
|
// Control of horizontal & vertical flip, external trigger,
|
2709 |
|
|
// and listing available frame rates
|
2710 |
|
|
//---------------------------------------------------------------------
|
2711 |
|
|
|
2712 |
|
|
[
|
2713 |
|
|
object,
|
2714 |
|
|
uuid(6a2e0670-28e4-11d0-a18c-00a0c9118956),
|
2715 |
|
|
pointer_default(unique)
|
2716 |
|
|
]
|
2717 |
|
|
interface IAMVideoControl : IUnknown
|
2718 |
|
|
{
|
2719 |
|
|
// What can the underlying hardware do?
|
2720 |
|
|
HRESULT GetCaps(
|
2721 |
|
|
[in] IPin * pPin, // the pin to query or control
|
2722 |
|
|
[out] long * pCapsFlags // VideoControlFlag_*
|
2723 |
|
|
|
2724 |
|
|
);
|
2725 |
|
|
|
2726 |
|
|
// Set the mode of operation
|
2727 |
|
|
HRESULT SetMode(
|
2728 |
|
|
[in] IPin * pPin, // the pin to query or control
|
2729 |
|
|
[in] long Mode // VideoControlFlag_*
|
2730 |
|
|
|
2731 |
|
|
);
|
2732 |
|
|
|
2733 |
|
|
// Get the mode of operation
|
2734 |
|
|
HRESULT GetMode(
|
2735 |
|
|
[in] IPin * pPin, // the pin to query or control
|
2736 |
|
|
[out] long * Mode // VideoControlFlag_*
|
2737 |
|
|
);
|
2738 |
|
|
|
2739 |
|
|
// Get actual frame rate info for USB and 1394
|
2740 |
|
|
// This is only available when streaming
|
2741 |
|
|
HRESULT GetCurrentActualFrameRate(
|
2742 |
|
|
[in] IPin * pPin, // the pin to query or control
|
2743 |
|
|
[out] LONGLONG * ActualFrameRate // 100 nS units
|
2744 |
|
|
);
|
2745 |
|
|
|
2746 |
|
|
// Get max available frame rate info for USB and 1394
|
2747 |
|
|
// Returns the max frame rate currently available based on bus bandwidth usage
|
2748 |
|
|
HRESULT GetMaxAvailableFrameRate(
|
2749 |
|
|
[in] IPin * pPin, // the pin to query or control
|
2750 |
|
|
[in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1
|
2751 |
|
|
[in] SIZE Dimensions, // width and height
|
2752 |
|
|
[out] LONGLONG * MaxAvailableFrameRate // 100 nS units
|
2753 |
|
|
);
|
2754 |
|
|
|
2755 |
|
|
// Get List of available frame rates
|
2756 |
|
|
HRESULT GetFrameRateList(
|
2757 |
|
|
[in] IPin * pPin, // the pin to query or control
|
2758 |
|
|
[in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1
|
2759 |
|
|
[in] SIZE Dimensions, // width and height
|
2760 |
|
|
[out] long * ListSize, // Number of elements in the list
|
2761 |
|
|
[out] LONGLONG ** FrameRates // Array of framerates in 100 nS units
|
2762 |
|
|
// or NULL to just get ListSize
|
2763 |
|
|
);
|
2764 |
|
|
|
2765 |
|
|
}
|
2766 |
|
|
|
2767 |
|
|
|
2768 |
|
|
//---------------------------------------------------------------------
|
2769 |
|
|
// IAMCrossbar interface
|
2770 |
|
|
//
|
2771 |
|
|
// Controls a routing matrix for analog or digital video or audio
|
2772 |
|
|
//---------------------------------------------------------------------
|
2773 |
|
|
|
2774 |
|
|
[
|
2775 |
|
|
object,
|
2776 |
|
|
uuid(C6E13380-30AC-11d0-A18C-00A0C9118956),
|
2777 |
|
|
pointer_default(unique)
|
2778 |
|
|
]
|
2779 |
|
|
interface IAMCrossbar : IUnknown
|
2780 |
|
|
{
|
2781 |
|
|
|
2782 |
|
|
// How many pins are there?
|
2783 |
|
|
HRESULT get_PinCounts(
|
2784 |
|
|
[out] long * OutputPinCount, // count of output pins
|
2785 |
|
|
[out] long * InputPinCount); // count of input pins
|
2786 |
|
|
|
2787 |
|
|
// True if routing is possible
|
2788 |
|
|
HRESULT CanRoute (
|
2789 |
|
|
[in] long OutputPinIndex, // the output pin
|
2790 |
|
|
[in] long InputPinIndex); // the input pin
|
2791 |
|
|
|
2792 |
|
|
// Routes an input pin to an output pin
|
2793 |
|
|
HRESULT Route (
|
2794 |
|
|
[in] long OutputPinIndex, // the output pin
|
2795 |
|
|
[in] long InputPinIndex); // the input pin
|
2796 |
|
|
|
2797 |
|
|
// Returns the input pin connected to a given output pin
|
2798 |
|
|
HRESULT get_IsRoutedTo (
|
2799 |
|
|
[in] long OutputPinIndex, // the output pin
|
2800 |
|
|
[out] long * InputPinIndex); // the connected input pin
|
2801 |
|
|
|
2802 |
|
|
// Returns a pin which is related to a given pin
|
2803 |
|
|
// (ie. this audio pin is related to a video pin)
|
2804 |
|
|
HRESULT get_CrossbarPinInfo (
|
2805 |
|
|
[in] BOOL IsInputPin, // TRUE for input pins
|
2806 |
|
|
[in] long PinIndex, // a pin
|
2807 |
|
|
[out] long * PinIndexRelated, // Index of related pin
|
2808 |
|
|
[out] long * PhysicalType); // Physical type of pin
|
2809 |
|
|
|
2810 |
|
|
}
|
2811 |
|
|
|
2812 |
|
|
|
2813 |
|
|
//---------------------------------------------------------------------
|
2814 |
|
|
// IAMTuner interface
|
2815 |
|
|
//
|
2816 |
|
|
// base tuner device
|
2817 |
|
|
//---------------------------------------------------------------------
|
2818 |
|
|
|
2819 |
|
|
// predefined subchannel values
|
2820 |
|
|
typedef enum tagAMTunerSubChannel
|
2821 |
|
|
{
|
2822 |
|
|
AMTUNER_SUBCHAN_NO_TUNE = -2, // don't tune
|
2823 |
|
|
AMTUNER_SUBCHAN_DEFAULT = -1 // use default sub chan
|
2824 |
|
|
} AMTunerSubChannel;
|
2825 |
|
|
|
2826 |
|
|
// predefined signal strength values
|
2827 |
|
|
typedef enum tagAMTunerSignalStrength
|
2828 |
|
|
{
|
2829 |
|
|
AMTUNER_HASNOSIGNALSTRENGTH = -1, // cannot indicate signal strength
|
2830 |
|
|
AMTUNER_NOSIGNAL = 0, // no signal available
|
2831 |
|
|
AMTUNER_SIGNALPRESENT = 1 // signal present
|
2832 |
|
|
} AMTunerSignalStrength;
|
2833 |
|
|
|
2834 |
|
|
// specifies the mode of operation of the tuner
|
2835 |
|
|
typedef enum tagAMTunerModeType
|
2836 |
|
|
{
|
2837 |
|
|
AMTUNER_MODE_DEFAULT = 0x0000, // default tuner mode
|
2838 |
|
|
AMTUNER_MODE_TV = 0x0001, // tv
|
2839 |
|
|
AMTUNER_MODE_FM_RADIO = 0x0002, // fm radio
|
2840 |
|
|
AMTUNER_MODE_AM_RADIO = 0x0004, // am radio
|
2841 |
|
|
AMTUNER_MODE_DSS = 0x0008, // dss
|
2842 |
|
|
} AMTunerModeType;
|
2843 |
|
|
|
2844 |
|
|
// Events reported by IAMTunerNotification
|
2845 |
|
|
typedef enum tagAMTunerEventType{
|
2846 |
|
|
AMTUNER_EVENT_CHANGED = 0x0001, // status changed
|
2847 |
|
|
} AMTunerEventType;
|
2848 |
|
|
|
2849 |
|
|
interface IAMTunerNotification;
|
2850 |
|
|
|
2851 |
|
|
[
|
2852 |
|
|
object,
|
2853 |
|
|
uuid(211A8761-03AC-11d1-8D13-00AA00BD8339),
|
2854 |
|
|
pointer_default(unique)
|
2855 |
|
|
]
|
2856 |
|
|
interface IAMTuner : IUnknown
|
2857 |
|
|
{
|
2858 |
|
|
// Sets and gets the Channel
|
2859 |
|
|
HRESULT put_Channel(
|
2860 |
|
|
[in] long lChannel,
|
2861 |
|
|
[in] long lVideoSubChannel,
|
2862 |
|
|
[in] long lAudioSubChannel
|
2863 |
|
|
);
|
2864 |
|
|
HRESULT get_Channel(
|
2865 |
|
|
[out] long *plChannel,
|
2866 |
|
|
[out] long *plVideoSubChannel,
|
2867 |
|
|
[out] long *plAudioSubChannel
|
2868 |
|
|
);
|
2869 |
|
|
|
2870 |
|
|
// Gets the minimum and maximum channel available
|
2871 |
|
|
HRESULT ChannelMinMax(
|
2872 |
|
|
[out] long *lChannelMin,
|
2873 |
|
|
[out] long *lChannelMax
|
2874 |
|
|
);
|
2875 |
|
|
|
2876 |
|
|
// CountryCode is the same as the international
|
2877 |
|
|
// long distance telephone dialing prefix
|
2878 |
|
|
|
2879 |
|
|
HRESULT put_CountryCode(
|
2880 |
|
|
[in] long lCountryCode
|
2881 |
|
|
);
|
2882 |
|
|
HRESULT get_CountryCode(
|
2883 |
|
|
[out] long *plCountryCode
|
2884 |
|
|
);
|
2885 |
|
|
|
2886 |
|
|
HRESULT put_TuningSpace(
|
2887 |
|
|
[in] long lTuningSpace
|
2888 |
|
|
);
|
2889 |
|
|
HRESULT get_TuningSpace(
|
2890 |
|
|
[out] long *plTuningSpace
|
2891 |
|
|
);
|
2892 |
|
|
|
2893 |
|
|
[local] HRESULT Logon(
|
2894 |
|
|
[in] HANDLE hCurrentUser
|
2895 |
|
|
);
|
2896 |
|
|
HRESULT Logout();
|
2897 |
|
|
|
2898 |
|
|
// Signal status for current channel
|
2899 |
|
|
// signal strength == TUNER_NOSIGNAL, or strength value
|
2900 |
|
|
HRESULT SignalPresent(
|
2901 |
|
|
[out] long * plSignalStrength // AMTunerSignalStrength
|
2902 |
|
|
);
|
2903 |
|
|
|
2904 |
|
|
// allow multifunction tuner to be switch between modes
|
2905 |
|
|
HRESULT put_Mode(
|
2906 |
|
|
[in] AMTunerModeType lMode // AMTunerModeType
|
2907 |
|
|
);
|
2908 |
|
|
HRESULT get_Mode(
|
2909 |
|
|
[out] AMTunerModeType *plMode // AMTunerModeType
|
2910 |
|
|
);
|
2911 |
|
|
|
2912 |
|
|
// retrieve a bitmask of the possible modes
|
2913 |
|
|
HRESULT GetAvailableModes(
|
2914 |
|
|
[out] long *plModes // AMTunerModeType
|
2915 |
|
|
);
|
2916 |
|
|
|
2917 |
|
|
// allow IAMTuner clients to receive event notification
|
2918 |
|
|
HRESULT RegisterNotificationCallBack(
|
2919 |
|
|
[in] IAMTunerNotification *pNotify,
|
2920 |
|
|
[in] long lEvents // bitmask from AMTunerEventType enumeration
|
2921 |
|
|
);
|
2922 |
|
|
HRESULT UnRegisterNotificationCallBack(
|
2923 |
|
|
[in] IAMTunerNotification *pNotify
|
2924 |
|
|
);
|
2925 |
|
|
}
|
2926 |
|
|
|
2927 |
|
|
//---------------------------------------------------------------------
|
2928 |
|
|
// IAMTunerNotification interface
|
2929 |
|
|
//
|
2930 |
|
|
// Provided to IAMTuner if notification callbacks are desired
|
2931 |
|
|
//---------------------------------------------------------------------
|
2932 |
|
|
|
2933 |
|
|
[
|
2934 |
|
|
object,
|
2935 |
|
|
uuid(211A8760-03AC-11d1-8D13-00AA00BD8339),
|
2936 |
|
|
pointer_default(unique)
|
2937 |
|
|
]
|
2938 |
|
|
interface IAMTunerNotification : IUnknown
|
2939 |
|
|
{
|
2940 |
|
|
HRESULT OnEvent([in] AMTunerEventType Event);
|
2941 |
|
|
}
|
2942 |
|
|
|
2943 |
|
|
|
2944 |
|
|
//---------------------------------------------------------------------
|
2945 |
|
|
// IAMTVTuner interface
|
2946 |
|
|
//
|
2947 |
|
|
// Controls an analog TV tuner device
|
2948 |
|
|
//---------------------------------------------------------------------
|
2949 |
|
|
|
2950 |
|
|
[
|
2951 |
|
|
object,
|
2952 |
|
|
uuid(211A8766-03AC-11d1-8D13-00AA00BD8339),
|
2953 |
|
|
pointer_default(unique)
|
2954 |
|
|
]
|
2955 |
|
|
interface IAMTVTuner : IAMTuner
|
2956 |
|
|
{
|
2957 |
|
|
// Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ...
|
2958 |
|
|
HRESULT get_AvailableTVFormats(
|
2959 |
|
|
[out] long *lAnalogVideoStandard
|
2960 |
|
|
);
|
2961 |
|
|
|
2962 |
|
|
// Gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...)
|
2963 |
|
|
HRESULT get_TVFormat(
|
2964 |
|
|
[out] long * plAnalogVideoStandard
|
2965 |
|
|
);
|
2966 |
|
|
|
2967 |
|
|
// Scans for a signal on a given channel
|
2968 |
|
|
// NOTE: this is equivalent to put_Channel(), SignalStrength()
|
2969 |
|
|
HRESULT AutoTune(
|
2970 |
|
|
[in] long lChannel,
|
2971 |
|
|
[out] long * plFoundSignal
|
2972 |
|
|
);
|
2973 |
|
|
|
2974 |
|
|
// Saves the fine tuning information for all channels")]
|
2975 |
|
|
HRESULT StoreAutoTune();
|
2976 |
|
|
|
2977 |
|
|
// The number of TV sources plugged into the tuner
|
2978 |
|
|
HRESULT get_NumInputConnections(
|
2979 |
|
|
[out] long * plNumInputConnections
|
2980 |
|
|
);
|
2981 |
|
|
|
2982 |
|
|
// Sets or gets the tuner input type (Cable or Antenna)
|
2983 |
|
|
HRESULT put_InputType(
|
2984 |
|
|
[in] long lIndex,
|
2985 |
|
|
[in] TunerInputType InputType
|
2986 |
|
|
);
|
2987 |
|
|
HRESULT get_InputType(
|
2988 |
|
|
[in] long lIndex,
|
2989 |
|
|
[out] TunerInputType * pInputType
|
2990 |
|
|
);
|
2991 |
|
|
|
2992 |
|
|
// Sets or gets the tuner input
|
2993 |
|
|
HRESULT put_ConnectInput(
|
2994 |
|
|
[in] long lIndex
|
2995 |
|
|
);
|
2996 |
|
|
HRESULT get_ConnectInput(
|
2997 |
|
|
[out] long *plIndex
|
2998 |
|
|
);
|
2999 |
|
|
|
3000 |
|
|
// Gets the video and audio carrier frequencies
|
3001 |
|
|
HRESULT get_VideoFrequency(
|
3002 |
|
|
[out] long *lFreq
|
3003 |
|
|
);
|
3004 |
|
|
HRESULT get_AudioFrequency(
|
3005 |
|
|
[out] long *lFreq
|
3006 |
|
|
);
|
3007 |
|
|
}
|
3008 |
|
|
|
3009 |
|
|
|
3010 |
|
|
//---------------------------------------------------------------------
|
3011 |
|
|
// IBPCSatelliteTuner interface
|
3012 |
|
|
//
|
3013 |
|
|
// An interface supporting Satellite tuning-related functions
|
3014 |
|
|
//---------------------------------------------------------------------
|
3015 |
|
|
[
|
3016 |
|
|
object,
|
3017 |
|
|
local,
|
3018 |
|
|
uuid(211A8765-03AC-11d1-8D13-00AA00BD8339),
|
3019 |
|
|
pointer_default(unique)
|
3020 |
|
|
]
|
3021 |
|
|
interface IBPCSatelliteTuner : IAMTuner
|
3022 |
|
|
{
|
3023 |
|
|
HRESULT get_DefaultSubChannelTypes(
|
3024 |
|
|
[out] long *plDefaultVideoType, // Provider-specific service type
|
3025 |
|
|
[out] long *plDefaultAudioType // Provider-specific service type
|
3026 |
|
|
);
|
3027 |
|
|
|
3028 |
|
|
HRESULT put_DefaultSubChannelTypes(
|
3029 |
|
|
[in] long lDefaultVideoType, // Provider-specific service type
|
3030 |
|
|
[in] long lDefaultAudioType // Provider-specific service type
|
3031 |
|
|
);
|
3032 |
|
|
|
3033 |
|
|
HRESULT IsTapingPermitted(); // S_OK yes, S_FALSE no
|
3034 |
|
|
}
|
3035 |
|
|
|
3036 |
|
|
|
3037 |
|
|
|
3038 |
|
|
//---------------------------------------------------------------------
|
3039 |
|
|
// IAMTVAudio interface
|
3040 |
|
|
//
|
3041 |
|
|
// TV Audio control
|
3042 |
|
|
//---------------------------------------------------------------------
|
3043 |
|
|
|
3044 |
|
|
typedef enum tagTVAudioMode
|
3045 |
|
|
{
|
3046 |
|
|
AMTVAUDIO_MODE_MONO = 0x0001, // Mono
|
3047 |
|
|
AMTVAUDIO_MODE_STEREO = 0x0002, // Stereo
|
3048 |
|
|
AMTVAUDIO_MODE_LANG_A = 0x0010, // Primary language
|
3049 |
|
|
AMTVAUDIO_MODE_LANG_B = 0x0020, // 2nd avail language
|
3050 |
|
|
AMTVAUDIO_MODE_LANG_C = 0x0040, // 3rd avail language
|
3051 |
|
|
} TVAudioMode;
|
3052 |
|
|
|
3053 |
|
|
// Events reported by IAMTVAudioNotification
|
3054 |
|
|
typedef enum tagAMTVAudioEventType
|
3055 |
|
|
{
|
3056 |
|
|
AMTVAUDIO_EVENT_CHANGED = 0x0001, // mode changed
|
3057 |
|
|
} AMTVAudioEventType;
|
3058 |
|
|
|
3059 |
|
|
interface IAMTVAudioNotification;
|
3060 |
|
|
|
3061 |
|
|
[
|
3062 |
|
|
object,
|
3063 |
|
|
local,
|
3064 |
|
|
uuid(83EC1C30-23D1-11d1-99E6-00A0C9560266),
|
3065 |
|
|
pointer_default(unique)
|
3066 |
|
|
]
|
3067 |
|
|
interface IAMTVAudio : IUnknown
|
3068 |
|
|
{
|
3069 |
|
|
// retrieve a bitmask of the formats available in the hardware
|
3070 |
|
|
HRESULT GetHardwareSupportedTVAudioModes(
|
3071 |
|
|
[out] long *plModes // TVAudioMode
|
3072 |
|
|
);
|
3073 |
|
|
|
3074 |
|
|
// retrieve a bitmask of the possible modes
|
3075 |
|
|
HRESULT GetAvailableTVAudioModes(
|
3076 |
|
|
[out] long *plModes // TVAudioMode
|
3077 |
|
|
);
|
3078 |
|
|
|
3079 |
|
|
HRESULT get_TVAudioMode(
|
3080 |
|
|
[out] long *plMode // TVAudioMode
|
3081 |
|
|
);
|
3082 |
|
|
HRESULT put_TVAudioMode(
|
3083 |
|
|
[in] long lMode // TVAudioMode
|
3084 |
|
|
);
|
3085 |
|
|
|
3086 |
|
|
// allow IAMTVAudio clients to receive event notification
|
3087 |
|
|
HRESULT RegisterNotificationCallBack(
|
3088 |
|
|
[in] IAMTunerNotification *pNotify,
|
3089 |
|
|
[in] long lEvents // bitmask from AMTVAudioEventType enumeration
|
3090 |
|
|
);
|
3091 |
|
|
HRESULT UnRegisterNotificationCallBack(
|
3092 |
|
|
IAMTunerNotification *pNotify
|
3093 |
|
|
);
|
3094 |
|
|
}
|
3095 |
|
|
|
3096 |
|
|
//---------------------------------------------------------------------
|
3097 |
|
|
// IAMTVAudioNotification interface
|
3098 |
|
|
//
|
3099 |
|
|
// Provided to IAMTVAudio clients if notification callbacks are desired
|
3100 |
|
|
//---------------------------------------------------------------------
|
3101 |
|
|
|
3102 |
|
|
[
|
3103 |
|
|
object,
|
3104 |
|
|
local,
|
3105 |
|
|
uuid(83EC1C33-23D1-11d1-99E6-00A0C9560266),
|
3106 |
|
|
pointer_default(unique)
|
3107 |
|
|
]
|
3108 |
|
|
interface IAMTVAudioNotification : IUnknown
|
3109 |
|
|
{
|
3110 |
|
|
HRESULT OnEvent([in] AMTVAudioEventType Event);
|
3111 |
|
|
}
|
3112 |
|
|
|
3113 |
|
|
|
3114 |
|
|
|
3115 |
|
|
|
3116 |
|
|
//---------------------------------------------------------------------
|
3117 |
|
|
// IAMAnalogVideoEncoder interface
|
3118 |
|
|
//---------------------------------------------------------------------
|
3119 |
|
|
|
3120 |
|
|
[
|
3121 |
|
|
object,
|
3122 |
|
|
uuid(C6E133B0-30AC-11d0-A18C-00A0C9118956),
|
3123 |
|
|
pointer_default(unique)
|
3124 |
|
|
]
|
3125 |
|
|
interface IAMAnalogVideoEncoder : IUnknown
|
3126 |
|
|
{
|
3127 |
|
|
// Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ...)
|
3128 |
|
|
HRESULT get_AvailableTVFormats(
|
3129 |
|
|
[out] long *lAnalogVideoStandard
|
3130 |
|
|
);
|
3131 |
|
|
|
3132 |
|
|
// Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...)
|
3133 |
|
|
HRESULT put_TVFormat(
|
3134 |
|
|
[in] long lAnalogVideoStandard
|
3135 |
|
|
);
|
3136 |
|
|
|
3137 |
|
|
HRESULT get_TVFormat(
|
3138 |
|
|
[out] long * plAnalogVideoStandard
|
3139 |
|
|
);
|
3140 |
|
|
|
3141 |
|
|
// Sets or gets the copy protection
|
3142 |
|
|
HRESULT put_CopyProtection (
|
3143 |
|
|
[in] long lVideoCopyProtection); // VideoCopyProtectionType
|
3144 |
|
|
|
3145 |
|
|
HRESULT get_CopyProtection (
|
3146 |
|
|
[out] long *lVideoCopyProtection); // VideoCopyProtectionType
|
3147 |
|
|
|
3148 |
|
|
|
3149 |
|
|
// Enables and disables close captioning
|
3150 |
|
|
HRESULT put_CCEnable (
|
3151 |
|
|
[in] long lCCEnable);
|
3152 |
|
|
|
3153 |
|
|
HRESULT get_CCEnable (
|
3154 |
|
|
[out] long *lCCEnable);
|
3155 |
|
|
|
3156 |
|
|
}
|
3157 |
|
|
|
3158 |
|
|
// used by IKsPropertySet set AMPROPSETID_Pin
|
3159 |
|
|
typedef enum {
|
3160 |
|
|
AMPROPERTY_PIN_CATEGORY,
|
3161 |
|
|
AMPROPERTY_PIN_MEDIUM
|
3162 |
|
|
} AMPROPERTY_PIN;
|
3163 |
|
|
|
3164 |
|
|
//---------------------------------------------------------------------
|
3165 |
|
|
// IKsPropertySet interface
|
3166 |
|
|
//
|
3167 |
|
|
// Sets or gets a property identified by a property set GUID and a
|
3168 |
|
|
// property ID.
|
3169 |
|
|
//
|
3170 |
|
|
// Return codes for all 3 methods:
|
3171 |
|
|
// E_PROP_SET_UNSUPPORTED the property set is not supported
|
3172 |
|
|
// E_PROP_ID_UNSUPPORTED the property ID is not supported
|
3173 |
|
|
// for the specified property set
|
3174 |
|
|
//---------------------------------------------------------------------
|
3175 |
|
|
|
3176 |
|
|
cpp_quote("#ifndef _IKsPropertySet_")
|
3177 |
|
|
cpp_quote("#define _IKsPropertySet_")
|
3178 |
|
|
|
3179 |
|
|
//---------------------------------------------------------------------
|
3180 |
|
|
// #defines for IKsPropertySet::QuerySupported return result in pTypeSupport
|
3181 |
|
|
//---------------------------------------------------------------------
|
3182 |
|
|
|
3183 |
|
|
cpp_quote("#define KSPROPERTY_SUPPORT_GET 1")
|
3184 |
|
|
cpp_quote("#define KSPROPERTY_SUPPORT_SET 2")
|
3185 |
|
|
|
3186 |
|
|
|
3187 |
|
|
[
|
3188 |
|
|
object,
|
3189 |
|
|
uuid(31EFAC30-515C-11d0-A9AA-00AA0061BE93),
|
3190 |
|
|
pointer_default(unique)
|
3191 |
|
|
]
|
3192 |
|
|
interface IKsPropertySet : IUnknown
|
3193 |
|
|
{
|
3194 |
|
|
[local] HRESULT Set(
|
3195 |
|
|
[in] REFGUID guidPropSet,
|
3196 |
|
|
[in] DWORD dwPropID,
|
3197 |
|
|
[in, size_is(cbInstanceData)] LPVOID pInstanceData,
|
3198 |
|
|
[in] DWORD cbInstanceData,
|
3199 |
|
|
[in, size_is(cbPropData)] LPVOID pPropData,
|
3200 |
|
|
[in] DWORD cbPropData);
|
3201 |
|
|
|
3202 |
|
|
[call_as(Set)] HRESULT RemoteSet(
|
3203 |
|
|
[in] REFGUID guidPropSet,
|
3204 |
|
|
[in] DWORD dwPropID,
|
3205 |
|
|
[in, size_is(cbInstanceData)] byte * pInstanceData,
|
3206 |
|
|
[in] DWORD cbInstanceData,
|
3207 |
|
|
[in, size_is(cbPropData)] byte * pPropData,
|
3208 |
|
|
[in] DWORD cbPropData);
|
3209 |
|
|
|
3210 |
|
|
// To get a property, the caller allocates a buffer which the called
|
3211 |
|
|
// function fills in. To determine necessary buffer size, call Get with
|
3212 |
|
|
// pPropData=NULL and cbPropData=0.
|
3213 |
|
|
[local] HRESULT Get(
|
3214 |
|
|
[in] REFGUID guidPropSet,
|
3215 |
|
|
[in] DWORD dwPropID,
|
3216 |
|
|
[in, size_is(cbInstanceData)] LPVOID pInstanceData,
|
3217 |
|
|
[in] DWORD cbInstanceData,
|
3218 |
|
|
[out, size_is(cbPropData)] LPVOID pPropData,
|
3219 |
|
|
[in] DWORD cbPropData,
|
3220 |
|
|
[out] DWORD * pcbReturned);
|
3221 |
|
|
|
3222 |
|
|
[call_as(Get)] HRESULT RemoteGet(
|
3223 |
|
|
[in] REFGUID guidPropSet,
|
3224 |
|
|
[in] DWORD dwPropID,
|
3225 |
|
|
[in, size_is(cbInstanceData)] byte * pInstanceData,
|
3226 |
|
|
[in] DWORD cbInstanceData,
|
3227 |
|
|
[out, size_is(cbPropData)] byte * pPropData,
|
3228 |
|
|
[in] DWORD cbPropData,
|
3229 |
|
|
[out] DWORD * pcbReturned);
|
3230 |
|
|
// QuerySupported must either return E_NOTIMPL or correctly indicate
|
3231 |
|
|
// if getting or setting the property set and property is supported.
|
3232 |
|
|
// S_OK indicates the property set and property ID combination is
|
3233 |
|
|
HRESULT QuerySupported(
|
3234 |
|
|
[in] REFGUID guidPropSet,
|
3235 |
|
|
[in] DWORD dwPropID,
|
3236 |
|
|
[out] DWORD *pTypeSupport);
|
3237 |
|
|
}
|
3238 |
|
|
cpp_quote("#endif // _IKsPropertySet_")
|
3239 |
|
|
|
3240 |
|
|
[
|
3241 |
|
|
object,
|
3242 |
|
|
uuid(6025A880-C0D5-11d0-BD4E-00A0C911CE86),
|
3243 |
|
|
pointer_default(unique)
|
3244 |
|
|
]
|
3245 |
|
|
interface IMediaPropertyBag : IPropertyBag
|
3246 |
|
|
{
|
3247 |
|
|
import "ocidl.idl";
|
3248 |
|
|
|
3249 |
|
|
typedef IMediaPropertyBag *LPMEDIAPROPERTYBAG;
|
3250 |
|
|
|
3251 |
|
|
// return the i'th element in the property bag
|
3252 |
|
|
HRESULT EnumProperty(
|
3253 |
|
|
[in] ULONG iProperty,
|
3254 |
|
|
[in, out] VARIANT * pvarPropertyName,
|
3255 |
|
|
[in, out] VARIANT * pvarPropertyValue
|
3256 |
|
|
);
|
3257 |
|
|
|
3258 |
|
|
}
|
3259 |
|
|
|
3260 |
|
|
|
3261 |
|
|
[
|
3262 |
|
|
object,
|
3263 |
|
|
uuid(5738E040-B67F-11d0-BD4D-00A0C911CE86),
|
3264 |
|
|
pointer_default(unique)
|
3265 |
|
|
]
|
3266 |
|
|
interface IPersistMediaPropertyBag : IPersist
|
3267 |
|
|
{
|
3268 |
|
|
import "ocidl.idl";
|
3269 |
|
|
import "unknwn.idl";
|
3270 |
|
|
|
3271 |
|
|
HRESULT InitNew(
|
3272 |
|
|
void
|
3273 |
|
|
);
|
3274 |
|
|
|
3275 |
|
|
HRESULT Load(
|
3276 |
|
|
[in] IMediaPropertyBag * pPropBag,
|
3277 |
|
|
[in] IErrorLog * pErrorLog
|
3278 |
|
|
);
|
3279 |
|
|
|
3280 |
|
|
HRESULT Save(
|
3281 |
|
|
[in] IMediaPropertyBag * pPropBag,
|
3282 |
|
|
[in] BOOL fClearDirty,
|
3283 |
|
|
[in] BOOL fSaveAllProperties
|
3284 |
|
|
);
|
3285 |
|
|
|
3286 |
|
|
|
3287 |
|
|
typedef IPersistMediaPropertyBag * LPPERSISTMEDIAPROPERTYBAG;
|
3288 |
|
|
}
|
3289 |
|
|
|
3290 |
|
|
|
3291 |
|
|
//---------------------------------------------------------------------
|
3292 |
|
|
//
|
3293 |
|
|
// Defines IAMPhysicalPinInfo Interface
|
3294 |
|
|
//
|
3295 |
|
|
// Returns an enum and string that describes an input pin's physical type.
|
3296 |
|
|
//
|
3297 |
|
|
// Implement if: you have physical input pins such as video or audio (like
|
3298 |
|
|
// on a video capture card or a VCR)
|
3299 |
|
|
//
|
3300 |
|
|
// Use if: you want to communicate to a user available physical input pins
|
3301 |
|
|
// and allow them to select the active one if there is more than one
|
3302 |
|
|
//---------------------------------------------------------------------
|
3303 |
|
|
|
3304 |
|
|
|
3305 |
|
|
[
|
3306 |
|
|
object,
|
3307 |
|
|
uuid(F938C991-3029-11cf-8C44-00AA006B6814),
|
3308 |
|
|
pointer_default(unique)
|
3309 |
|
|
]
|
3310 |
|
|
interface IAMPhysicalPinInfo : IUnknown {
|
3311 |
|
|
|
3312 |
|
|
// Returns VFW_E_NO_ACCEPTABLE_TYPES if not a physical pin
|
3313 |
|
|
HRESULT GetPhysicalType(
|
3314 |
|
|
[out] long *pType, // the enum representing the Physical Type
|
3315 |
|
|
[out] LPOLESTR *ppszType // a friendly name
|
3316 |
|
|
);
|
3317 |
|
|
}
|
3318 |
|
|
typedef IAMPhysicalPinInfo *PAMPHYSICALPININFO;
|
3319 |
|
|
|
3320 |
|
|
//---------------------------------------------------------------------
|
3321 |
|
|
// Defines IAMExtDevice Interface
|
3322 |
|
|
//
|
3323 |
|
|
// Base interface for external professional devices
|
3324 |
|
|
//
|
3325 |
|
|
// Implement if: the filter controls an external device such as a VCR,
|
3326 |
|
|
// timecode reader/generator, etc. The intent is to build a object from
|
3327 |
|
|
// this implementation plus another that specifically describes the device,
|
3328 |
|
|
// such as IAMExtTransport.
|
3329 |
|
|
//
|
3330 |
|
|
// Use if: you want to control and external device such as a VCR
|
3331 |
|
|
//
|
3332 |
|
|
// See edevdefs.h for the enumerated parameter list
|
3333 |
|
|
//---------------------------------------------------------------------
|
3334 |
|
|
[
|
3335 |
|
|
object,
|
3336 |
|
|
uuid(B5730A90-1A2C-11cf-8C23-00AA006B6814),
|
3337 |
|
|
pointer_default(unique)
|
3338 |
|
|
]
|
3339 |
|
|
interface IAMExtDevice : IUnknown
|
3340 |
|
|
{
|
3341 |
|
|
// General device capabilities property. See edevdefs.h for supported
|
3342 |
|
|
// values
|
3343 |
|
|
HRESULT GetCapability(
|
3344 |
|
|
[in] long Capability, // identify the property
|
3345 |
|
|
[out] long *pValue, // return value
|
3346 |
|
|
[out] double *pdblValue // return value
|
3347 |
|
|
);
|
3348 |
|
|
|
3349 |
|
|
// Get external device identification string. Usually the model #
|
3350 |
|
|
// of the device
|
3351 |
|
|
HRESULT get_ExternalDeviceID(
|
3352 |
|
|
[out] LPOLESTR *ppszData // ID string
|
3353 |
|
|
);
|
3354 |
|
|
|
3355 |
|
|
HRESULT get_ExternalDeviceVersion(
|
3356 |
|
|
[out] LPOLESTR *ppszData // revision string
|
3357 |
|
|
);
|
3358 |
|
|
|
3359 |
|
|
// Controls the external device's power mode
|
3360 |
|
|
HRESULT put_DevicePower([in] long PowerMode
|
3361 |
|
|
);
|
3362 |
|
|
HRESULT get_DevicePower([out] long *pPowerMode
|
3363 |
|
|
);
|
3364 |
|
|
|
3365 |
|
|
// Some devices need to be reset in some way, i.e., rewinding a VCR
|
3366 |
|
|
// to the beginning of the tape and resetting the counter to zero.
|
3367 |
|
|
HRESULT Calibrate(
|
3368 |
|
|
[in] HEVENT hEvent,
|
3369 |
|
|
[in] long Mode,
|
3370 |
|
|
[out] long *pStatus // OATRUE is active, OAFALSE is inactive
|
3371 |
|
|
);
|
3372 |
|
|
|
3373 |
|
|
// Selects the device's communications port, i.e.,COM1, IEEE1394, etc.
|
3374 |
|
|
// See edevdefs.h for enums
|
3375 |
|
|
HRESULT put_DevicePort([in] long DevicePort
|
3376 |
|
|
);
|
3377 |
|
|
HRESULT get_DevicePort([out] long *pDevicePort
|
3378 |
|
|
);
|
3379 |
|
|
|
3380 |
|
|
}
|
3381 |
|
|
typedef IAMExtDevice *PEXTDEVICE;
|
3382 |
|
|
|
3383 |
|
|
//---------------------------------------------------------------------
|
3384 |
|
|
// Defines IAMExtTransport Interface
|
3385 |
|
|
//
|
3386 |
|
|
// Contains properties and methods that control behavior of an external
|
3387 |
|
|
// transport device such as a VTR
|
3388 |
|
|
//
|
3389 |
|
|
// Implement if: you control such a device. Intended to be agregated
|
3390 |
|
|
// with IAMExtDevice.
|
3391 |
|
|
//
|
3392 |
|
|
// Use if: you want to control such a device
|
3393 |
|
|
//
|
3394 |
|
|
// See edevdefs.h for the parameter lists
|
3395 |
|
|
//---------------------------------------------------------------------
|
3396 |
|
|
[
|
3397 |
|
|
object,
|
3398 |
|
|
uuid(A03CD5F0-3045-11cf-8C44-00AA006B6814),
|
3399 |
|
|
pointer_default(unique)
|
3400 |
|
|
]
|
3401 |
|
|
interface IAMExtTransport : IUnknown {
|
3402 |
|
|
|
3403 |
|
|
// General transport capabilities property. See edevdefs.h for enums
|
3404 |
|
|
HRESULT GetCapability(
|
3405 |
|
|
[in] long Capability, // identify the property
|
3406 |
|
|
[out] long *pValue, // return value
|
3407 |
|
|
[out] double *pdblValue // return value
|
3408 |
|
|
);
|
3409 |
|
|
|
3410 |
|
|
// For disc-based devices: spinning, or not spinning.
|
3411 |
|
|
// For tape-based device: threaded, unthreaded or ejected
|
3412 |
|
|
HRESULT put_MediaState([in] long State
|
3413 |
|
|
);
|
3414 |
|
|
HRESULT get_MediaState([out] long *pState // see edevdefs.h
|
3415 |
|
|
);
|
3416 |
|
|
|
3417 |
|
|
// Determines state of unit's front panel
|
3418 |
|
|
HRESULT put_LocalControl([in] long State
|
3419 |
|
|
);
|
3420 |
|
|
HRESULT get_LocalControl([out] long *pState // OATRUE or OAFALSE
|
3421 |
|
|
);
|
3422 |
|
|
|
3423 |
|
|
// Transport status such as Play, Stop, etc. More extensive
|
3424 |
|
|
// than AM states.
|
3425 |
|
|
HRESULT GetStatus(
|
3426 |
|
|
[in] long StatusItem, // see edevdefs.h
|
3427 |
|
|
[out] long *pValue
|
3428 |
|
|
);
|
3429 |
|
|
|
3430 |
|
|
// Parameters such as recording speed, servo reference, ballistics, etc.
|
3431 |
|
|
HRESULT GetTransportBasicParameters(
|
3432 |
|
|
[in] long Param,
|
3433 |
|
|
[out] long *pValue,
|
3434 |
|
|
[out] LPOLESTR *ppszData
|
3435 |
|
|
);
|
3436 |
|
|
|
3437 |
|
|
HRESULT SetTransportBasicParameters(
|
3438 |
|
|
[in] long Param,
|
3439 |
|
|
[in] long Value,
|
3440 |
|
|
[in] LPCOLESTR pszData
|
3441 |
|
|
);
|
3442 |
|
|
|
3443 |
|
|
// Parameters such as video output mode
|
3444 |
|
|
HRESULT GetTransportVideoParameters(
|
3445 |
|
|
[in] long Param,
|
3446 |
|
|
[out] long *pValue
|
3447 |
|
|
);
|
3448 |
|
|
|
3449 |
|
|
HRESULT SetTransportVideoParameters(
|
3450 |
|
|
[in] long Param,
|
3451 |
|
|
[in] long Value
|
3452 |
|
|
);
|
3453 |
|
|
|
3454 |
|
|
// Parameters such as audio channel enable
|
3455 |
|
|
HRESULT GetTransportAudioParameters(
|
3456 |
|
|
[in] long Param,
|
3457 |
|
|
[out] long *pValue
|
3458 |
|
|
);
|
3459 |
|
|
|
3460 |
|
|
HRESULT SetTransportAudioParameters(
|
3461 |
|
|
[in] long Param,
|
3462 |
|
|
[in] long Value
|
3463 |
|
|
);
|
3464 |
|
|
|
3465 |
|
|
// Mode is the movement of the transport, i.e., Play, Stop,
|
3466 |
|
|
// Record, Edit, etc.
|
3467 |
|
|
HRESULT put_Mode([in] long Mode
|
3468 |
|
|
);
|
3469 |
|
|
HRESULT get_Mode([out] long *pMode
|
3470 |
|
|
);
|
3471 |
|
|
|
3472 |
|
|
// Rate is for variable speed control of the the device. This
|
3473 |
|
|
// can be linked to IMediaControl::Rate() in the implementation
|
3474 |
|
|
// if desired.
|
3475 |
|
|
HRESULT put_Rate([in] double dblRate
|
3476 |
|
|
);
|
3477 |
|
|
HRESULT get_Rate([out] double *pdblRate
|
3478 |
|
|
);
|
3479 |
|
|
|
3480 |
|
|
// This is a lengthy method, that is, it is in effect until canceled or complete and
|
3481 |
|
|
// requires housekeeping by the filter. It puts transport in play mode and maintains
|
3482 |
|
|
// fixed relationship between master time reference and transport position.
|
3483 |
|
|
HRESULT GetChase(
|
3484 |
|
|
[out] long *pEnabled, // OATRUE | OAFALSE
|
3485 |
|
|
[out] long *pOffset, // offset in current time format
|
3486 |
|
|
[out] HEVENT *phEvent // completion notification
|
3487 |
|
|
);
|
3488 |
|
|
HRESULT SetChase(
|
3489 |
|
|
[in] long Enable, // OATRUE | OAFALSE
|
3490 |
|
|
[in] long Offset, // offset in current time format
|
3491 |
|
|
[in] HEVENT hEvent // completion notification
|
3492 |
|
|
);
|
3493 |
|
|
|
3494 |
|
|
// Also a lengthy method: temporarily change transport speed (for synchronizing).
|
3495 |
|
|
HRESULT GetBump(
|
3496 |
|
|
[out] long *pSpeed,
|
3497 |
|
|
[out] long *pDuration // in current time format
|
3498 |
|
|
);
|
3499 |
|
|
HRESULT SetBump(
|
3500 |
|
|
[in] long Speed,
|
3501 |
|
|
[in] long Duration // in current time format
|
3502 |
|
|
);
|
3503 |
|
|
|
3504 |
|
|
// Enable/Disable transport anti-headclog control.
|
3505 |
|
|
HRESULT get_AntiClogControl([out] long *pEnabled // OATRUE | OAFALSE
|
3506 |
|
|
);
|
3507 |
|
|
HRESULT put_AntiClogControl([in] long Enable // OATRUE | OAFALSE
|
3508 |
|
|
);
|
3509 |
|
|
|
3510 |
|
|
// The following group of properties describes edit events. An edit event can be a
|
3511 |
|
|
// standard insert or assemble edit or a memorized position called a bookmark.
|
3512 |
|
|
// A NOTE ABOUT EVENTS: as with all lengthy commands, event objects must be created to
|
3513 |
|
|
// signal completion or error.
|
3514 |
|
|
|
3515 |
|
|
// Intended usage: an edit event is prepared for use by:
|
3516 |
|
|
// 1. Registering an edit property set and getting an EditID
|
3517 |
|
|
// 2. Setting the necessary edit properties
|
3518 |
|
|
// 3. Setting the edit property set active
|
3519 |
|
|
|
3520 |
|
|
// Please see edevdefs.h for properties and values
|
3521 |
|
|
|
3522 |
|
|
// The reference clock's advance is the mechanism that puts an edit in motion (see
|
3523 |
|
|
// ED_EDIT_REC_INPOINT).
|
3524 |
|
|
|
3525 |
|
|
// Property set methods
|
3526 |
|
|
HRESULT GetEditPropertySet(
|
3527 |
|
|
[in] long EditID,
|
3528 |
|
|
[out] long *pState // ED_SET_ACTIVE | ED_SET_INACTIVE | ED_SET_INVALID
|
3529 |
|
|
// | ED_SET_EXECUTING
|
3530 |
|
|
);
|
3531 |
|
|
|
3532 |
|
|
HRESULT SetEditPropertySet(
|
3533 |
|
|
[in, out] long *pEditID,
|
3534 |
|
|
[in] long State // ED_SET_REGISTER | ED_SET_DELETE | ED_SET_ACTIVE |
|
3535 |
|
|
); // ED_SET_INACTIVE
|
3536 |
|
|
|
3537 |
|
|
// the following properties define an edit event such as a bookmark, seek point, or
|
3538 |
|
|
// actual edit
|
3539 |
|
|
HRESULT GetEditProperty(
|
3540 |
|
|
[in] long EditID,
|
3541 |
|
|
[in] long Param,
|
3542 |
|
|
[out] long *pValue
|
3543 |
|
|
);
|
3544 |
|
|
HRESULT SetEditProperty(
|
3545 |
|
|
[in] long EditID,
|
3546 |
|
|
[in] long Param,
|
3547 |
|
|
[in] long Value
|
3548 |
|
|
);
|
3549 |
|
|
|
3550 |
|
|
// Activates a capable transport's edit control (typically used for "on the fly" editing).
|
3551 |
|
|
HRESULT get_EditStart([out] long *pValue // OATRUE or OAFALSE
|
3552 |
|
|
);
|
3553 |
|
|
HRESULT put_EditStart([in] long Value // OATRUE or OAFALSE
|
3554 |
|
|
);
|
3555 |
|
|
}
|
3556 |
|
|
typedef IAMExtTransport *PIAMEXTTRANSPORT;
|
3557 |
|
|
|
3558 |
|
|
//---------------------------------------------------------------------
|
3559 |
|
|
// Defines IAMTimecodeReader Interface
|
3560 |
|
|
//
|
3561 |
|
|
// Contains properties and methods that define behavior of a
|
3562 |
|
|
// SMPTE/MIDI Timecode Reader. It is expected that this interface
|
3563 |
|
|
// will be combined (aggregated) with IAMExtTransport to "build" a pro
|
3564 |
|
|
// VCR.
|
3565 |
|
|
//
|
3566 |
|
|
// Implement if: you control such a device
|
3567 |
|
|
//
|
3568 |
|
|
// Use if: you want to control such a device
|
3569 |
|
|
//
|
3570 |
|
|
// See edevdefs.h for the parameter lists
|
3571 |
|
|
//=====================================================================
|
3572 |
|
|
|
3573 |
|
|
|
3574 |
|
|
// timecode structures
|
3575 |
|
|
cpp_quote("#if 0")
|
3576 |
|
|
cpp_quote("/* the following is what MIDL knows how to remote */")
|
3577 |
|
|
typedef struct tagTIMECODE {
|
3578 |
|
|
WORD wFrameRate; // will be replaced by AM defs, but see ED_FORMAT_SMPTE for now
|
3579 |
|
|
WORD wFrameFract; // fractional frame. full scale is always 0x1000
|
3580 |
|
|
DWORD dwFrames;
|
3581 |
|
|
}TIMECODE;
|
3582 |
|
|
cpp_quote("#else /* 0 */")
|
3583 |
|
|
cpp_quote("#ifndef TIMECODE_DEFINED")
|
3584 |
|
|
cpp_quote("#define TIMECODE_DEFINED")
|
3585 |
|
|
cpp_quote("typedef union _timecode {")
|
3586 |
|
|
cpp_quote(" struct {")
|
3587 |
|
|
cpp_quote(" WORD wFrameRate;")
|
3588 |
|
|
cpp_quote(" WORD wFrameFract;")
|
3589 |
|
|
cpp_quote(" DWORD dwFrames;")
|
3590 |
|
|
cpp_quote(" };")
|
3591 |
|
|
cpp_quote(" DWORDLONG qw;")
|
3592 |
|
|
cpp_quote(" } TIMECODE;")
|
3593 |
|
|
cpp_quote("")
|
3594 |
|
|
cpp_quote("#endif /* TIMECODE_DEFINED */")
|
3595 |
|
|
cpp_quote("#endif /* 0 */")
|
3596 |
|
|
|
3597 |
|
|
typedef TIMECODE *PTIMECODE;
|
3598 |
|
|
|
3599 |
|
|
typedef struct tagTIMECODE_SAMPLE {
|
3600 |
|
|
LONGLONG qwTick; // ActiveMovie 100ns timestamp
|
3601 |
|
|
TIMECODE timecode; // timecode
|
3602 |
|
|
DWORD dwUser; // timecode user data (aka user bits)
|
3603 |
|
|
DWORD dwFlags; // timecode flags - see below
|
3604 |
|
|
} TIMECODE_SAMPLE;
|
3605 |
|
|
typedef TIMECODE_SAMPLE *PTIMECODE_SAMPLE;
|
3606 |
|
|
|
3607 |
|
|
|
3608 |
|
|
[
|
3609 |
|
|
object,
|
3610 |
|
|
uuid(9B496CE1-811B-11cf-8C77-00AA006B6814),
|
3611 |
|
|
pointer_default(unique)
|
3612 |
|
|
]
|
3613 |
|
|
interface IAMTimecodeReader : IUnknown
|
3614 |
|
|
{
|
3615 |
|
|
// Timecode Reader Mode - gets/sets the following properties
|
3616 |
|
|
// ED_TCR_SOURCE - timecode gen (readback), LTC, VITC, or Control Track
|
3617 |
|
|
HRESULT GetTCRMode(
|
3618 |
|
|
[in] long Param,
|
3619 |
|
|
[out] long *pValue);
|
3620 |
|
|
HRESULT SetTCRMode(
|
3621 |
|
|
[in] long Param,
|
3622 |
|
|
[in] long Value);
|
3623 |
|
|
|
3624 |
|
|
// Select which line of the vertical interval timecode will be read from (if VITC).
|
3625 |
|
|
// To read VITC on specific multiple lines, the caller would make successive calls to
|
3626 |
|
|
// put_VITCLine(), once for each line desired.
|
3627 |
|
|
HRESULT put_VITCLine(
|
3628 |
|
|
[in] long Line ); // valid lines are 11-20, 0 means autoselect,
|
3629 |
|
|
// hi bit set means add to list of lines (for
|
3630 |
|
|
// readers that test across multiple lines)
|
3631 |
|
|
HRESULT get_VITCLine(
|
3632 |
|
|
[out] long *pLine ); // hi bit set means multiple lines are used,
|
3633 |
|
|
// and successive calls will cycle through the
|
3634 |
|
|
// line numbers (like an enumerator, only simpler)
|
3635 |
|
|
|
3636 |
|
|
// GetTimecode can be used to obtain the most recent timecode value available in the
|
3637 |
|
|
// stream. The client can use this to monitor the timecode, parse duplicates and
|
3638 |
|
|
// discontinuities. The source filter supplying the timecode or possibly a down stream
|
3639 |
|
|
// filter might want to parse for discontinuities or errors since you have to look at
|
3640 |
|
|
// every sample to do this properly.
|
3641 |
|
|
//
|
3642 |
|
|
|
3643 |
|
|
HRESULT GetTimecode(
|
3644 |
|
|
[out] PTIMECODE_SAMPLE pTimecodeSample) ;
|
3645 |
|
|
|
3646 |
|
|
}
|
3647 |
|
|
typedef IAMTimecodeReader *PIAMTIMECODEREADER;
|
3648 |
|
|
|
3649 |
|
|
//---------------------------------------------------------------------
|
3650 |
|
|
//=====================================================================
|
3651 |
|
|
// Defines IAMTimecodeGenerator Interface
|
3652 |
|
|
//
|
3653 |
|
|
// Contains properties and methods that define behavior of an external
|
3654 |
|
|
// SMPTE/MIDI Timecode Generator. It is expected that this interface
|
3655 |
|
|
// will be combined (aggregated) with IAMExtTransport to "build" a pro
|
3656 |
|
|
// VCR.
|
3657 |
|
|
//
|
3658 |
|
|
// Implement if: you control such a device
|
3659 |
|
|
//
|
3660 |
|
|
// Use if: you want to control such a device
|
3661 |
|
|
//
|
3662 |
|
|
// See edevdefs.h for the parameter lists
|
3663 |
|
|
//---------------------------------------------------------------------
|
3664 |
|
|
[
|
3665 |
|
|
object,
|
3666 |
|
|
uuid(9B496CE0-811B-11cf-8C77-00AA006B6814),
|
3667 |
|
|
pointer_default(unique)
|
3668 |
|
|
]
|
3669 |
|
|
interface IAMTimecodeGenerator : IUnknown {
|
3670 |
|
|
|
3671 |
|
|
// Timecode Generator Mode - gets/sets the following properties (see
|
3672 |
|
|
// vcrdefss.h for detailed values):
|
3673 |
|
|
// ED_TCG_TIMECODE_TYPE - LTC, VITC, or MIDI
|
3674 |
|
|
// ED_TCG_FRAMERATE - 24, 25, 30 drop or 30 nondrop
|
3675 |
|
|
// ED_TCG_SYNC_SOURCE - what is driving the bitclock
|
3676 |
|
|
// ED_TCG_REFERENCE_SOURCE - what is driving the count value
|
3677 |
|
|
HRESULT GetTCGMode(
|
3678 |
|
|
[in] long Param,
|
3679 |
|
|
[out] long *pValue);
|
3680 |
|
|
|
3681 |
|
|
HRESULT SetTCGMode(
|
3682 |
|
|
[in] long Param,
|
3683 |
|
|
[in] long Value);
|
3684 |
|
|
|
3685 |
|
|
// Select into which line(s) of the vertical interval timecode will be inserted (if VITC).
|
3686 |
|
|
// Hi bit set means add this line to any previously set lines.
|
3687 |
|
|
// To generate VITC on specific multiple lines, the caller would make successive calls to
|
3688 |
|
|
// put_VITCLine(), once for each line desired.
|
3689 |
|
|
HRESULT put_VITCLine(
|
3690 |
|
|
[in] long Line // valid lines are 11-20, 0 means autoselect(this setting
|
3691 |
|
|
); // is for TC readers that decode from multiple lines)
|
3692 |
|
|
HRESULT get_VITCLine(
|
3693 |
|
|
[out] long *pLine
|
3694 |
|
|
);
|
3695 |
|
|
|
3696 |
|
|
// Sets timecode and/or userbit value. If generator is running, takes effect
|
3697 |
|
|
// immediately. If caller wants to set only timecode, set userbit value to -1L (and
|
3698 |
|
|
// same for setting userbits only)
|
3699 |
|
|
//
|
3700 |
|
|
|
3701 |
|
|
HRESULT SetTimecode(
|
3702 |
|
|
[in] PTIMECODE_SAMPLE pTimecodeSample) ;
|
3703 |
|
|
|
3704 |
|
|
|
3705 |
|
|
// GetTimecode can be used to obtain the most recent timecode value available in the
|
3706 |
|
|
// stream. The client can use this to monitor the timecode and verify the generator is
|
3707 |
|
|
// working properly
|
3708 |
|
|
//
|
3709 |
|
|
|
3710 |
|
|
HRESULT GetTimecode(
|
3711 |
|
|
[out] PTIMECODE_SAMPLE pTimecodeSample) ;
|
3712 |
|
|
|
3713 |
|
|
}
|
3714 |
|
|
typedef IAMTimecodeGenerator *PIAMTIMECODEGENERATOR;
|
3715 |
|
|
|
3716 |
|
|
//---------------------------------------------------------------------
|
3717 |
|
|
// Defines IAMTimecodeDisplay Interface
|
3718 |
|
|
//
|
3719 |
|
|
// Contains properties and methods that define behavior of an external
|
3720 |
|
|
// SMPTE/MIDI Timecode Display device (aka "character generator" for
|
3721 |
|
|
// making "burn-ins" or "window dubs"). It is expected that this interface
|
3722 |
|
|
// will be combined (aggregated) with IAMExtTransport and the timecode
|
3723 |
|
|
// interfaces to "build" a pro VCR.
|
3724 |
|
|
//
|
3725 |
|
|
// Implement if: you control such a device
|
3726 |
|
|
//
|
3727 |
|
|
// Use if: you want to control such a device
|
3728 |
|
|
//
|
3729 |
|
|
// See edevdefs.h for the parameter lists
|
3730 |
|
|
//---------------------------------------------------------------------
|
3731 |
|
|
[
|
3732 |
|
|
object,
|
3733 |
|
|
uuid(9B496CE2-811B-11cf-8C77-00AA006B6814),
|
3734 |
|
|
pointer_default(unique)
|
3735 |
|
|
]
|
3736 |
|
|
interface IAMTimecodeDisplay : IUnknown
|
3737 |
|
|
{
|
3738 |
|
|
// Enable/disable external device's timecode reader's character generator output. Some
|
3739 |
|
|
// readers have this feature - this is not intended for rendering inside the PC!
|
3740 |
|
|
HRESULT GetTCDisplayEnable(
|
3741 |
|
|
[out] long *pState); // OATRUE | OAFALSE
|
3742 |
|
|
HRESULT SetTCDisplayEnable(
|
3743 |
|
|
[in] long State); // OATRUE | OAFALSE
|
3744 |
|
|
// Timecode reader's character generator output
|
3745 |
|
|
// characteristics (size, position, intensity, etc.).
|
3746 |
|
|
HRESULT GetTCDisplay(
|
3747 |
|
|
[in] long Param,
|
3748 |
|
|
[out] long *pValue);
|
3749 |
|
|
HRESULT SetTCDisplay(
|
3750 |
|
|
[in] long Param,
|
3751 |
|
|
[in] long Value);
|
3752 |
|
|
|
3753 |
|
|
/* Allowable params and values (see edevdefs.h for details):
|
3754 |
|
|
ED_TCD_SOURCE
|
3755 |
|
|
ED_TCR | ED_TCG
|
3756 |
|
|
ED_TCD_SIZE
|
3757 |
|
|
ED_SMALL | ED_MED | ED_LARGE
|
3758 |
|
|
ED_TCD_POSITION
|
3759 |
|
|
ED_TOP | ED_MIDDLE | ED_BOTTOM or'd with
|
3760 |
|
|
ED_LEFT | ED_CENTER | ED_RIGHT
|
3761 |
|
|
ED_TCD_INTENSITY
|
3762 |
|
|
ED_HIGH | ED_LOW
|
3763 |
|
|
ED_TCD_TRANSPARENCY // set from 0 to 4, 0 being completely opaque
|
3764 |
|
|
ED_TCD_INVERT // white on black or black on white
|
3765 |
|
|
OATRUE | OAFALSE
|
3766 |
|
|
ED_TCD_BORDER // white border for black chars, black border for white letters
|
3767 |
|
|
OATRUE | OAFALSE
|
3768 |
|
|
*/
|
3769 |
|
|
}
|
3770 |
|
|
typedef IAMTimecodeDisplay *PIAMTIMECODEDISPLAY;
|
3771 |
|
|
|
3772 |
|
|
|
3773 |
|
|
[
|
3774 |
|
|
object,
|
3775 |
|
|
uuid(c6545bf0-e76b-11d0-bd52-00a0c911ce86),
|
3776 |
|
|
pointer_default(unique)
|
3777 |
|
|
]
|
3778 |
|
|
interface IAMDevMemoryAllocator : IUnknown
|
3779 |
|
|
{
|
3780 |
|
|
HRESULT GetInfo(
|
3781 |
|
|
[out] DWORD *pdwcbTotalFree,
|
3782 |
|
|
[out] DWORD *pdwcbLargestFree,
|
3783 |
|
|
[out] DWORD *pdwcbTotalMemory,
|
3784 |
|
|
[out] DWORD *pdwcbMinimumChunk);
|
3785 |
|
|
|
3786 |
|
|
HRESULT CheckMemory(
|
3787 |
|
|
[in] const BYTE *pBuffer);
|
3788 |
|
|
|
3789 |
|
|
HRESULT Alloc(
|
3790 |
|
|
[out] BYTE **ppBuffer,
|
3791 |
|
|
[in, out] DWORD *pdwcbBuffer);
|
3792 |
|
|
|
3793 |
|
|
HRESULT Free(
|
3794 |
|
|
[in] BYTE *pBuffer);
|
3795 |
|
|
|
3796 |
|
|
HRESULT GetDevMemoryObject(
|
3797 |
|
|
[out] IUnknown **ppUnkInnner,
|
3798 |
|
|
[in] IUnknown *pUnkOuter);
|
3799 |
|
|
}
|
3800 |
|
|
typedef IAMDevMemoryAllocator *PAMDEVMEMORYALLOCATOR;
|
3801 |
|
|
|
3802 |
|
|
|
3803 |
|
|
[
|
3804 |
|
|
object,
|
3805 |
|
|
uuid(c6545bf1-e76b-11d0-bd52-00a0c911ce86),
|
3806 |
|
|
pointer_default(unique)
|
3807 |
|
|
]
|
3808 |
|
|
interface IAMDevMemoryControl : IUnknown
|
3809 |
|
|
{
|
3810 |
|
|
HRESULT QueryWriteSync();
|
3811 |
|
|
|
3812 |
|
|
HRESULT WriteSync();
|
3813 |
|
|
|
3814 |
|
|
HRESULT GetDevId(
|
3815 |
|
|
[out] DWORD *pdwDevId);
|
3816 |
|
|
|
3817 |
|
|
}
|
3818 |
|
|
typedef IAMDevMemoryControl *PAMDEVMEMORYCONTROL;
|
3819 |
|
|
|
3820 |
|
|
// Flags for IAMStreamSelection::Info
|
3821 |
|
|
enum _AMSTREAMSELECTINFOFLAGS {
|
3822 |
|
|
AMSTREAMSELECTINFO_ENABLED = 0x01, // Enable - off for disable
|
3823 |
|
|
AMSTREAMSELECTINFO_EXCLUSIVE = 0x02 // Turns off the others in the group
|
3824 |
|
|
// when enabling this one
|
3825 |
|
|
};
|
3826 |
|
|
// Flags for IAMStreamSelection::Enable
|
3827 |
|
|
enum _AMSTREAMSELECTENABLEFLAGS {
|
3828 |
|
|
// Currently valid values are :
|
3829 |
|
|
// 0 - disable all streams in the group containing this stream
|
3830 |
|
|
// ..._ENABLE - enable only this stream with in the given group
|
3831 |
|
|
// and disable all others
|
3832 |
|
|
// ..._ENABLEALL - send out all streams
|
3833 |
|
|
AMSTREAMSELECTENABLE_ENABLE = 0x01, // Enable
|
3834 |
|
|
AMSTREAMSELECTENABLE_ENABLEALL = 0x02 // Enable all streams in the group
|
3835 |
|
|
// containing this stream
|
3836 |
|
|
};
|
3837 |
|
|
|
3838 |
|
|
// Control which logical streams are played and find out information about
|
3839 |
|
|
// them
|
3840 |
|
|
// Normally supported by a filter
|
3841 |
|
|
[
|
3842 |
|
|
object,
|
3843 |
|
|
uuid(c1960960-17f5-11d1-abe1-00a0c905f375),
|
3844 |
|
|
pointer_default(unique)
|
3845 |
|
|
]
|
3846 |
|
|
interface IAMStreamSelect : IUnknown
|
3847 |
|
|
{
|
3848 |
|
|
// Returns total count of streams
|
3849 |
|
|
HRESULT Count(
|
3850 |
|
|
[out] DWORD *pcStreams); // Count of logical streams
|
3851 |
|
|
|
3852 |
|
|
// Return info for a given stream - S_FALSE if iIndex out of range
|
3853 |
|
|
// The first steam in each group is the default
|
3854 |
|
|
HRESULT Info(
|
3855 |
|
|
[in] long lIndex, // 0-based index
|
3856 |
|
|
[out] AM_MEDIA_TYPE **ppmt, // Media type - optional
|
3857 |
|
|
// Use DeleteMediaType to free
|
3858 |
|
|
[out] DWORD *pdwFlags, // flags - optional
|
3859 |
|
|
[out] LCID *plcid, // LCID (returns 0 if none) - optional
|
3860 |
|
|
[out] DWORD *pdwGroup, // Logical group - optional
|
3861 |
|
|
[out] WCHAR **ppszName, // Name - optional - free with CoTaskMemFree
|
3862 |
|
|
// optional
|
3863 |
|
|
[out] IUnknown **ppObject, // Associated object - optional
|
3864 |
|
|
// Object may change if Enable is
|
3865 |
|
|
// called on this interface
|
3866 |
|
|
// - returns NULL if no associated object
|
3867 |
|
|
// Returns pin or filter for DShow
|
3868 |
|
|
[out] IUnknown **ppUnk); // Stream specific interface
|
3869 |
|
|
|
3870 |
|
|
// Enable or disable a given stream
|
3871 |
|
|
HRESULT Enable(
|
3872 |
|
|
[in] long lIndex,
|
3873 |
|
|
[in] DWORD dwFlags);
|
3874 |
|
|
}
|
3875 |
|
|
typedef IAMStreamSelect *PAMSTREAMSELECT;
|
3876 |
|
|
|
3877 |
|
|
enum _AMRESCTL_RESERVEFLAGS
|
3878 |
|
|
{
|
3879 |
|
|
AMRESCTL_RESERVEFLAGS_RESERVE = 0x00, // Increment reserve count
|
3880 |
|
|
AMRESCTL_RESERVEFLAGS_UNRESERVE = 0x01 // Decrement reserve count
|
3881 |
|
|
};
|
3882 |
|
|
|
3883 |
|
|
// Reserve resources now so that playback can be subsequently
|
3884 |
|
|
// guaranteed
|
3885 |
|
|
//
|
3886 |
|
|
// Normally supported by a filter
|
3887 |
|
|
//
|
3888 |
|
|
[
|
3889 |
|
|
object,
|
3890 |
|
|
uuid(8389d2d0-77d7-11d1-abe6-00a0c905f375),
|
3891 |
|
|
pointer_default(unique),
|
3892 |
|
|
local
|
3893 |
|
|
]
|
3894 |
|
|
interface IAMResourceControl : IUnknown
|
3895 |
|
|
{
|
3896 |
|
|
// The reserve count is incremented/decremented if and only if
|
3897 |
|
|
// S_OK is returned
|
3898 |
|
|
// Unreserve once for every Reserve call
|
3899 |
|
|
HRESULT Reserve(
|
3900 |
|
|
[in] DWORD dwFlags, // From _AMRESCTL_RESERVEFLAGS enum
|
3901 |
|
|
[in] PVOID pvReserved // Must be NULL
|
3902 |
|
|
);
|
3903 |
|
|
}
|
3904 |
|
|
|
3905 |
|
|
|
3906 |
|
|
// Set clock adjustments - supported by some clocks
|
3907 |
|
|
[
|
3908 |
|
|
object,
|
3909 |
|
|
uuid(4d5466b0-a49c-11d1-abe8-00a0c905f375),
|
3910 |
|
|
pointer_default(unique),
|
3911 |
|
|
local
|
3912 |
|
|
]
|
3913 |
|
|
interface IAMClockAdjust : IUnknown
|
3914 |
|
|
{
|
3915 |
|
|
// Set the following delta to clock times
|
3916 |
|
|
// The clock will add adjust its times by the given delta
|
3917 |
|
|
HRESULT SetClockDelta(
|
3918 |
|
|
[in] REFERENCE_TIME rtDelta
|
3919 |
|
|
);
|
3920 |
|
|
};
|
3921 |
|
|
|
3922 |
|
|
// Filter miscellaneous status flags
|
3923 |
|
|
|
3924 |
|
|
enum _AM_FILTER_MISC_FLAGS {
|
3925 |
|
|
AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x00000001, /* Will deliver EC_COMPLETE
|
3926 |
|
|
at end of media */
|
3927 |
|
|
AM_FILTER_MISC_FLAGS_IS_SOURCE = 0x00000002 /* Filter sources data */
|
3928 |
|
|
};
|
3929 |
|
|
|
3930 |
|
|
[
|
3931 |
|
|
object,
|
3932 |
|
|
uuid(2dd74950-a890-11d1-abe8-00a0c905f375),
|
3933 |
|
|
pointer_default(unique),
|
3934 |
|
|
local
|
3935 |
|
|
]
|
3936 |
|
|
interface IAMFilterMiscFlags : IUnknown
|
3937 |
|
|
{
|
3938 |
|
|
// Get miscellaneous property flags
|
3939 |
|
|
ULONG GetMiscFlags(void);
|
3940 |
|
|
};
|
3941 |
|
|
|
3942 |
|
|
|
3943 |
|
|
// Video Image drawing interface
|
3944 |
|
|
[
|
3945 |
|
|
object,
|
3946 |
|
|
local,
|
3947 |
|
|
uuid(48efb120-ab49-11d2-aed2-00a0c995e8d5),
|
3948 |
|
|
pointer_default(unique),
|
3949 |
|
|
]
|
3950 |
|
|
interface IDrawVideoImage : IUnknown
|
3951 |
|
|
{
|
3952 |
|
|
HRESULT DrawVideoImageBegin();
|
3953 |
|
|
|
3954 |
|
|
HRESULT DrawVideoImageEnd();
|
3955 |
|
|
|
3956 |
|
|
HRESULT DrawVideoImageDraw(
|
3957 |
|
|
[in] HDC hdc,
|
3958 |
|
|
[in] LPRECT lprcSrc,
|
3959 |
|
|
[in] LPRECT lprcDst
|
3960 |
|
|
);
|
3961 |
|
|
}
|
3962 |
|
|
|
3963 |
|
|
//
|
3964 |
|
|
// Video Image decimation interface
|
3965 |
|
|
//
|
3966 |
|
|
// The aim of this interface is to enable a video renderer filter to
|
3967 |
|
|
// control the decimation properties of a video decoder connected to
|
3968 |
|
|
// the video renderer
|
3969 |
|
|
//
|
3970 |
|
|
// This interface should only be supported by decoders that are capable of
|
3971 |
|
|
// decimating their output image by an arbitary amount.
|
3972 |
|
|
//
|
3973 |
|
|
//
|
3974 |
|
|
[
|
3975 |
|
|
object,
|
3976 |
|
|
local,
|
3977 |
|
|
uuid(2e5ea3e0-e924-11d2-b6da-00a0c995e8df),
|
3978 |
|
|
pointer_default(unique),
|
3979 |
|
|
]
|
3980 |
|
|
interface IDecimateVideoImage : IUnknown
|
3981 |
|
|
{
|
3982 |
|
|
//
|
3983 |
|
|
// Informs the decoder that it should decimate its output
|
3984 |
|
|
// image to the specified width and height. If the decoder can
|
3985 |
|
|
// decimate to this size it should return S_OK.
|
3986 |
|
|
// If the decoder can't perform the requested decimation
|
3987 |
|
|
// or wants to stop performing the decimation that it is
|
3988 |
|
|
// currently doing it should return E_FAIL.
|
3989 |
|
|
//
|
3990 |
|
|
HRESULT SetDecimationImageSize(
|
3991 |
|
|
[in] long lWidth,
|
3992 |
|
|
[in] long lHeight);
|
3993 |
|
|
|
3994 |
|
|
//
|
3995 |
|
|
// Informs the decoder that it should stop decimating its output image
|
3996 |
|
|
// and resume normal output.
|
3997 |
|
|
//
|
3998 |
|
|
HRESULT ResetDecimationImageSize();
|
3999 |
|
|
}
|
4000 |
|
|
|
4001 |
|
|
typedef enum _DECIMATION_USAGE {
|
4002 |
|
|
DECIMATION_LEGACY, // decimate at ovly then video port then crop
|
4003 |
|
|
DECIMATION_USE_DECODER_ONLY, // decimate image at the decoder only
|
4004 |
|
|
DECIMATION_USE_VIDEOPORT_ONLY, // decimate at the video port only
|
4005 |
|
|
DECIMATION_USE_OVERLAY_ONLY, // decimate at the overlay only
|
4006 |
|
|
DECIMATION_DEFAULT // decimate at decoder then ovly the vide port then crop
|
4007 |
|
|
} DECIMATION_USAGE;
|
4008 |
|
|
|
4009 |
|
|
[
|
4010 |
|
|
object,
|
4011 |
|
|
local,
|
4012 |
|
|
uuid(60d32930-13da-11d3-9ec6-c4fcaef5c7be),
|
4013 |
|
|
pointer_default(unique),
|
4014 |
|
|
]
|
4015 |
|
|
interface IAMVideoDecimationProperties: IUnknown
|
4016 |
|
|
{
|
4017 |
|
|
//
|
4018 |
|
|
// Queries the current usage of the above IDecimateVideoImage
|
4019 |
|
|
// interface.
|
4020 |
|
|
//
|
4021 |
|
|
HRESULT QueryDecimationUsage(
|
4022 |
|
|
[out] DECIMATION_USAGE* lpUsage); // from DECIMATION_USAGE enum
|
4023 |
|
|
|
4024 |
|
|
//
|
4025 |
|
|
// Sets the current usage of the above IDecimateVideoImage
|
4026 |
|
|
// interface.
|
4027 |
|
|
//
|
4028 |
|
|
HRESULT SetDecimationUsage(
|
4029 |
|
|
[in] DECIMATION_USAGE Usage); // from DECIMATION_USAGE enum
|
4030 |
|
|
}
|
4031 |
|
|
|
4032 |
|
|
//---------------------------------------------------------------------
|
4033 |
|
|
//
|
4034 |
|
|
// IVideoFrameStep interface
|
4035 |
|
|
//
|
4036 |
|
|
//---------------------------------------------------------------------
|
4037 |
|
|
|
4038 |
|
|
[
|
4039 |
|
|
object,
|
4040 |
|
|
uuid(e46a9787-2b71-444d-a4b5-1fab7b708d6a),
|
4041 |
|
|
pointer_default(unique),
|
4042 |
|
|
]
|
4043 |
|
|
interface IVideoFrameStep : IUnknown
|
4044 |
|
|
{
|
4045 |
|
|
//
|
4046 |
|
|
// Stop(), Pause(), Run() all cancel Step as does any seeking
|
4047 |
|
|
// request.
|
4048 |
|
|
//
|
4049 |
|
|
// The Step() and CancelStep() methods of this interface
|
4050 |
|
|
// Cancel any previous step.
|
4051 |
|
|
//
|
4052 |
|
|
// When stepping is complete EC_STEP_COMPLETE is signalled.
|
4053 |
|
|
//
|
4054 |
|
|
// When the filter graph gets EC_STEP_COMPLETE it automatically
|
4055 |
|
|
// sets the filter graph into paused state and forwards the
|
4056 |
|
|
// notification to the application
|
4057 |
|
|
//
|
4058 |
|
|
// Returns S_OK if stepping initiated.
|
4059 |
|
|
//
|
4060 |
|
|
// dwFrames
|
4061 |
|
|
// 1 means step 1 frame forward
|
4062 |
|
|
// 0 is invalid
|
4063 |
|
|
// n (n > 1) means skip n - 1 frames and show the nth
|
4064 |
|
|
//
|
4065 |
|
|
// pStepObject
|
4066 |
|
|
// NULL - default step object (filter) picked
|
4067 |
|
|
// non-NULL - use this object for stepping
|
4068 |
|
|
//
|
4069 |
|
|
HRESULT Step(DWORD dwFrames, [unique] IUnknown *pStepObject);
|
4070 |
|
|
|
4071 |
|
|
// Can step?
|
4072 |
|
|
// Returns S_OK if it can, S_FALSE if it can't or error code.
|
4073 |
|
|
// bMultiple - if TRUE return whether can step n > 1
|
4074 |
|
|
HRESULT CanStep(long bMultiple, [unique] IUnknown *pStepObject);
|
4075 |
|
|
|
4076 |
|
|
// Cancel stepping
|
4077 |
|
|
HRESULT CancelStep();
|
4078 |
|
|
}
|
4079 |
|
|
|
4080 |
|
|
|
4081 |
|
|
|
4082 |
|
|
|
4083 |
|
|
//---------------------------------------------------------------------
|
4084 |
|
|
//
|
4085 |
|
|
// IAMPushSource interface
|
4086 |
|
|
//
|
4087 |
|
|
// Provides a means for source filters to describe information about the
|
4088 |
|
|
// data that they source, such as whether the data is live or not, and
|
4089 |
|
|
// what type of clock was used for timestamps. This information may be
|
4090 |
|
|
// needed by other clocks in the graph in order to provide accurate
|
4091 |
|
|
// synchronization. Also provides a way to specify an offset value for
|
4092 |
|
|
// the filter to use when timestamping the streams it sources. Provides
|
4093 |
|
|
// support for the IAMLatency interface as well.
|
4094 |
|
|
//
|
4095 |
|
|
//---------------------------------------------------------------------
|
4096 |
|
|
|
4097 |
|
|
enum _AM_PUSHSOURCE_FLAGS {
|
4098 |
|
|
|
4099 |
|
|
//
|
4100 |
|
|
// The default assumption is that the data is from a live source,
|
4101 |
|
|
// time stamped with the graph clock, and the source does not
|
4102 |
|
|
// attempt to rate match the data it delivers.
|
4103 |
|
|
// The following flags can be used to override this assumption.
|
4104 |
|
|
//
|
4105 |
|
|
|
4106 |
|
|
// capability flags
|
4107 |
|
|
AM_PUSHSOURCECAPS_INTERNAL_RM = 0x00000001, // source provides internal support for rate matching
|
4108 |
|
|
AM_PUSHSOURCECAPS_NOT_LIVE = 0x00000002, // don't treat source data as live
|
4109 |
|
|
AM_PUSHSOURCECAPS_PRIVATE_CLOCK = 0x00000004, // source data timestamped with clock not
|
4110 |
|
|
// exposed to the graph
|
4111 |
|
|
|
4112 |
|
|
// request flags, set by user via SetPushSourceFlags method
|
4113 |
|
|
AM_PUSHSOURCEREQS_USE_STREAM_CLOCK = 0x00010000 // source was requested to timestamp
|
4114 |
|
|
// using a clock that isn't the graph clock
|
4115 |
|
|
};
|
4116 |
|
|
|
4117 |
|
|
//
|
4118 |
|
|
// Used to set a source filter to run in a "live" mode.
|
4119 |
|
|
//
|
4120 |
|
|
[
|
4121 |
|
|
object,
|
4122 |
|
|
uuid(F185FE76-E64E-11d2-B76E-00C04FB6BD3D),
|
4123 |
|
|
pointer_default(unique)
|
4124 |
|
|
]
|
4125 |
|
|
interface IAMPushSource : IAMLatency
|
4126 |
|
|
{
|
4127 |
|
|
// used to discover push source's capabilities.
|
4128 |
|
|
// may be any combination of the AM_PUSHSOURCE_FLAGS flags.
|
4129 |
|
|
HRESULT GetPushSourceFlags (
|
4130 |
|
|
[out] ULONG *pFlags
|
4131 |
|
|
);
|
4132 |
|
|
|
4133 |
|
|
// used to set request flags for a push source.
|
4134 |
|
|
// may be a combination of the AM_PUSHSOURCE_REQS_xxx flags.
|
4135 |
|
|
HRESULT SetPushSourceFlags (
|
4136 |
|
|
[in] ULONG Flags
|
4137 |
|
|
);
|
4138 |
|
|
|
4139 |
|
|
// specify an offset for push source time stamps
|
4140 |
|
|
HRESULT SetStreamOffset (
|
4141 |
|
|
[in] REFERENCE_TIME rtOffset
|
4142 |
|
|
);
|
4143 |
|
|
|
4144 |
|
|
// retrieve the offset this push source is using
|
4145 |
|
|
HRESULT GetStreamOffset (
|
4146 |
|
|
[out] REFERENCE_TIME *prtOffset
|
4147 |
|
|
);
|
4148 |
|
|
|
4149 |
|
|
// retrieve the maximum stream offset this push source thinks it can support
|
4150 |
|
|
HRESULT GetMaxStreamOffset (
|
4151 |
|
|
[out] REFERENCE_TIME *prtMaxOffset
|
4152 |
|
|
);
|
4153 |
|
|
|
4154 |
|
|
// allows the filter graph to tell a push source the maximum latency allowed on the graph
|
4155 |
|
|
// this allows pins like the video capture preview pin to be more efficient with the amount
|
4156 |
|
|
// of buffering required to support the maximum graph latency
|
4157 |
|
|
HRESULT SetMaxStreamOffset (
|
4158 |
|
|
[in] REFERENCE_TIME rtMaxOffset
|
4159 |
|
|
);
|
4160 |
|
|
};
|
4161 |
|
|
|
4162 |
|
|
|
4163 |
|
|
// ------------------------------------------------------------------------
|
4164 |
|
|
//
|
4165 |
|
|
// IAMDeviceRemoval interface
|
4166 |
|
|
//
|
4167 |
|
|
// Implemented by filters to request and receive WM_DEVICECHANGE
|
4168 |
|
|
// notifications
|
4169 |
|
|
//
|
4170 |
|
|
// ------------------------------------------------------------------------
|
4171 |
|
|
|
4172 |
|
|
[
|
4173 |
|
|
object,
|
4174 |
|
|
uuid(f90a6130-b658-11d2-ae49-0000f8754b99),
|
4175 |
|
|
pointer_default(unique)
|
4176 |
|
|
]
|
4177 |
|
|
interface IAMDeviceRemoval : IUnknown
|
4178 |
|
|
{
|
4179 |
|
|
|
4180 |
|
|
HRESULT DeviceInfo(
|
4181 |
|
|
[out] CLSID *pclsidInterfaceClass,
|
4182 |
|
|
[out] WCHAR **pwszSymbolicLink);
|
4183 |
|
|
|
4184 |
|
|
HRESULT Reassociate();
|
4185 |
|
|
|
4186 |
|
|
HRESULT Disassociate();
|
4187 |
|
|
}
|
4188 |
|
|
|
4189 |
|
|
//
|
4190 |
|
|
// for DV
|
4191 |
|
|
//
|
4192 |
|
|
typedef struct {
|
4193 |
|
|
//for 1st 5/6 DIF seq.
|
4194 |
|
|
DWORD dwDVAAuxSrc;
|
4195 |
|
|
DWORD dwDVAAuxCtl;
|
4196 |
|
|
//for 2nd 5/6 DIF seq.
|
4197 |
|
|
DWORD dwDVAAuxSrc1;
|
4198 |
|
|
DWORD dwDVAAuxCtl1;
|
4199 |
|
|
//for video information
|
4200 |
|
|
DWORD dwDVVAuxSrc;
|
4201 |
|
|
DWORD dwDVVAuxCtl;
|
4202 |
|
|
DWORD dwDVReserved[2];
|
4203 |
|
|
|
4204 |
|
|
} DVINFO, *PDVINFO;
|
4205 |
|
|
|
4206 |
|
|
// ------------------------------------------------------------------------
|
4207 |
|
|
//
|
4208 |
|
|
// IDVEnc interface
|
4209 |
|
|
//
|
4210 |
|
|
// Implemented by DV encoder filters to set Encoder format
|
4211 |
|
|
//
|
4212 |
|
|
// ------------------------------------------------------------------------
|
4213 |
|
|
enum _DVENCODERRESOLUTION { //resolution
|
4214 |
|
|
DVENCODERRESOLUTION_720x480 = 2012,
|
4215 |
|
|
DVENCODERRESOLUTION_360x240 = 2013,
|
4216 |
|
|
DVENCODERRESOLUTION_180x120 = 2014,
|
4217 |
|
|
DVENCODERRESOLUTION_88x60 = 2015
|
4218 |
|
|
};
|
4219 |
|
|
enum _DVENCODERVIDEOFORMAT { //PAL/ntsc
|
4220 |
|
|
DVENCODERVIDEOFORMAT_NTSC = 2000,
|
4221 |
|
|
DVENCODERVIDEOFORMAT_PAL = 2001
|
4222 |
|
|
};
|
4223 |
|
|
enum _DVENCODERFORMAT { // dvsd/dvhd/dvsl
|
4224 |
|
|
DVENCODERFORMAT_DVSD = 2007,
|
4225 |
|
|
DVENCODERFORMAT_DVHD = 2008,
|
4226 |
|
|
DVENCODERFORMAT_DVSL = 2009
|
4227 |
|
|
};
|
4228 |
|
|
[
|
4229 |
|
|
object,
|
4230 |
|
|
uuid(d18e17a0-aacb-11d0-afb0-00aa00b67a42),
|
4231 |
|
|
pointer_default(unique)
|
4232 |
|
|
]
|
4233 |
|
|
interface IDVEnc : IUnknown
|
4234 |
|
|
{
|
4235 |
|
|
|
4236 |
|
|
HRESULT get_IFormatResolution (
|
4237 |
|
|
[out] int *VideoFormat, //pal or ntsc
|
4238 |
|
|
[out] int *DVFormat, //dvsd dvhd dvsl
|
4239 |
|
|
[out] int *Resolution, //720, 360, 180,88
|
4240 |
|
|
[in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO
|
4241 |
|
|
[out] DVINFO *sDVInfo //NULL if fDVInfo=FALSE,
|
4242 |
|
|
);
|
4243 |
|
|
|
4244 |
|
|
HRESULT put_IFormatResolution (
|
4245 |
|
|
[in] int VideoFormat,
|
4246 |
|
|
[in] int DVFormat,
|
4247 |
|
|
[in] int Resolution,
|
4248 |
|
|
[in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO
|
4249 |
|
|
[in] DVINFO *sDVInfo //NULL if fDVInfo=FALSE,
|
4250 |
|
|
);
|
4251 |
|
|
|
4252 |
|
|
}
|
4253 |
|
|
|
4254 |
|
|
// ------------------------------------------------------------------------
|
4255 |
|
|
//
|
4256 |
|
|
// IDVDec interface
|
4257 |
|
|
//
|
4258 |
|
|
// Implemented by DV decoder filters to set decoder size
|
4259 |
|
|
//
|
4260 |
|
|
// ------------------------------------------------------------------------
|
4261 |
|
|
enum _DVDECODERRESOLUTION {
|
4262 |
|
|
DVDECODERRESOLUTION_720x480 = 1000,
|
4263 |
|
|
DVDECODERRESOLUTION_360x240 = 1001,
|
4264 |
|
|
DVDECODERRESOLUTION_180x120 = 1002,
|
4265 |
|
|
DVDECODERRESOLUTION_88x60 = 1003
|
4266 |
|
|
};
|
4267 |
|
|
enum _DVRESOLUTION {
|
4268 |
|
|
DVRESOLUTION_FULL = 1000,
|
4269 |
|
|
DVRESOLUTION_HALF = 1001,
|
4270 |
|
|
DVRESOLUTION_QUARTER = 1002,
|
4271 |
|
|
DVRESOLUTION_DC = 1003
|
4272 |
|
|
};
|
4273 |
|
|
[
|
4274 |
|
|
object,
|
4275 |
|
|
uuid(b8e8bd60-0bfe-11d0-af91-00aa00b67a42),
|
4276 |
|
|
pointer_default(unique)
|
4277 |
|
|
]
|
4278 |
|
|
interface IIPDVDec : IUnknown
|
4279 |
|
|
{
|
4280 |
|
|
HRESULT get_IPDisplay (
|
4281 |
|
|
[out] int *displayPix // The display pixels arrage
|
4282 |
|
|
);
|
4283 |
|
|
|
4284 |
|
|
HRESULT put_IPDisplay (
|
4285 |
|
|
[in] int displayPix // Change to this display pixel arrage
|
4286 |
|
|
) ;
|
4287 |
|
|
}
|
4288 |
|
|
|
4289 |
|
|
// ------------------------------------------------------------------------
|
4290 |
|
|
//
|
4291 |
|
|
// IDVSplitter interface
|
4292 |
|
|
//
|
4293 |
|
|
// Implemented by DV splitter filters
|
4294 |
|
|
//
|
4295 |
|
|
// ------------------------------------------------------------------------
|
4296 |
|
|
[
|
4297 |
|
|
object,
|
4298 |
|
|
uuid(92a3a302-da7c-4a1f-ba7e-1802bb5d2d02)
|
4299 |
|
|
]
|
4300 |
|
|
interface IDVSplitter : IUnknown
|
4301 |
|
|
{
|
4302 |
|
|
HRESULT DiscardAlternateVideoFrames(
|
4303 |
|
|
[in] int nDiscard
|
4304 |
|
|
) ;
|
4305 |
|
|
}
|
4306 |
|
|
|
4307 |
|
|
// Audio Renderer statistics params for IAMAudioRendererStats interface
|
4308 |
|
|
enum _AM_AUDIO_RENDERER_STAT_PARAM {
|
4309 |
|
|
AM_AUDREND_STAT_PARAM_BREAK_COUNT = 1, // audio breaks
|
4310 |
|
|
AM_AUDREND_STAT_PARAM_SLAVE_MODE, // current slave mode, see AM_AUDREND_SLAVE_MODEs
|
4311 |
|
|
AM_AUDREND_STAT_PARAM_SILENCE_DUR, // silence inserted due to gaps (ms)
|
4312 |
|
|
AM_AUDREND_STAT_PARAM_LAST_BUFFER_DUR, // duration of the last buffer received
|
4313 |
|
|
AM_AUDREND_STAT_PARAM_DISCONTINUITIES, // discontinuities seen since running
|
4314 |
|
|
AM_AUDREND_STAT_PARAM_SLAVE_RATE, // what rate are we currently slaving at? S_FALSE if not slaving
|
4315 |
|
|
AM_AUDREND_STAT_PARAM_SLAVE_DROPWRITE_DUR, // for waveOut slaving - data dropped or added to stay in-sync
|
4316 |
|
|
// dwParam1 - dropped duration(ms)
|
4317 |
|
|
// dwParam2 - paused duration(ms)
|
4318 |
|
|
AM_AUDREND_STAT_PARAM_SLAVE_HIGHLOWERROR, // highest & lowest clock differences seen
|
4319 |
|
|
// dwParam1 - high err
|
4320 |
|
|
// dwParam2 - low err
|
4321 |
|
|
AM_AUDREND_STAT_PARAM_SLAVE_LASTHIGHLOWERROR, // last high and low errs seen
|
4322 |
|
|
// dwParam1 - last high err
|
4323 |
|
|
// dwParam2 - last low err
|
4324 |
|
|
AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR, // error between master/slave clocks
|
4325 |
|
|
AM_AUDREND_STAT_PARAM_BUFFERFULLNESS, // percent audio buffer fullness
|
4326 |
|
|
AM_AUDREND_STAT_PARAM_JITTER // input buffer jitter
|
4327 |
|
|
};
|
4328 |
|
|
|
4329 |
|
|
//---------------------------------------------------------------------
|
4330 |
|
|
//
|
4331 |
|
|
// IAMAudioRendererStats interface
|
4332 |
|
|
//
|
4333 |
|
|
// Interface to get at statistical information that is optionally stored
|
4334 |
|
|
// in an audio renderer filter. Supported on the filter interface (although
|
4335 |
|
|
// this might be better for ksproxy if we define it as a pin interface?)
|
4336 |
|
|
//
|
4337 |
|
|
//---------------------------------------------------------------------
|
4338 |
|
|
|
4339 |
|
|
[
|
4340 |
|
|
object,
|
4341 |
|
|
uuid(22320CB2-D41A-11d2-BF7C-D7CB9DF0BF93),
|
4342 |
|
|
pointer_default(unique)
|
4343 |
|
|
]
|
4344 |
|
|
interface IAMAudioRendererStats : IUnknown
|
4345 |
|
|
{
|
4346 |
|
|
// Get value corresponding to the passed in parameter id
|
4347 |
|
|
HRESULT GetStatParam(
|
4348 |
|
|
[in] DWORD dwParam,
|
4349 |
|
|
[out] DWORD *pdwParam1,
|
4350 |
|
|
[out] DWORD *pdwParam2
|
4351 |
|
|
);
|
4352 |
|
|
}
|
4353 |
|
|
|
4354 |
|
|
//---------------------------------------------------------------------
|
4355 |
|
|
//
|
4356 |
|
|
// IAMLatency interface
|
4357 |
|
|
//
|
4358 |
|
|
// Allows a filter to report the expected latency associated with a data
|
4359 |
|
|
// stream flowing from its input to output pin. Supported on output pins.
|
4360 |
|
|
//
|
4361 |
|
|
//---------------------------------------------------------------------
|
4362 |
|
|
|
4363 |
|
|
[
|
4364 |
|
|
object,
|
4365 |
|
|
uuid(62EA93BA-EC62-11d2-B770-00C04FB6BD3D),
|
4366 |
|
|
pointer_default(unique)
|
4367 |
|
|
]
|
4368 |
|
|
interface IAMLatency : IUnknown
|
4369 |
|
|
{
|
4370 |
|
|
HRESULT GetLatency(
|
4371 |
|
|
[in] REFERENCE_TIME *prtLatency
|
4372 |
|
|
);
|
4373 |
|
|
}
|
4374 |
|
|
|
4375 |
|
|
|
4376 |
|
|
enum _AM_INTF_SEARCH_FLAGS {
|
4377 |
|
|
AM_INTF_SEARCH_INPUT_PIN = 0x00000001, // search input pins
|
4378 |
|
|
AM_INTF_SEARCH_OUTPUT_PIN = 0x00000002, // search output pins
|
4379 |
|
|
AM_INTF_SEARCH_FILTER = 0x00000004 // search filters
|
4380 |
|
|
};
|
4381 |
|
|
|
4382 |
|
|
//---------------------------------------------------------------------
|
4383 |
|
|
//
|
4384 |
|
|
// IAMGraphStreams interface
|
4385 |
|
|
//
|
4386 |
|
|
// Interface used to control or search over connected streams of data
|
4387 |
|
|
// flow within a filter graph.
|
4388 |
|
|
//
|
4389 |
|
|
//---------------------------------------------------------------------
|
4390 |
|
|
|
4391 |
|
|
[
|
4392 |
|
|
object,
|
4393 |
|
|
uuid(632105FA-072E-11d3-8AF9-00C04FB6BD3D),
|
4394 |
|
|
pointer_default(unique)
|
4395 |
|
|
]
|
4396 |
|
|
interface IAMGraphStreams : IUnknown
|
4397 |
|
|
{
|
4398 |
|
|
// Search upstream from the current pin, for the specified interface.
|
4399 |
|
|
// dwFlags can be any combination of the AM_INTF_SEARCH_FLAGS, and allows
|
4400 |
|
|
// control over what objects to search. A value of 0 means to search all.
|
4401 |
|
|
HRESULT FindUpstreamInterface(
|
4402 |
|
|
[in] IPin *pPin,
|
4403 |
|
|
[in] REFIID riid,
|
4404 |
|
|
[out, iid_is(riid)] void **ppvInterface,
|
4405 |
|
|
[in] DWORD dwFlags );
|
4406 |
|
|
|
4407 |
|
|
// Enable or disable the graph's setting of a timestamp offset
|
4408 |
|
|
// on push sources.
|
4409 |
|
|
HRESULT SyncUsingStreamOffset( [in] BOOL bUseStreamOffset );
|
4410 |
|
|
|
4411 |
|
|
// allow an app to set the maximum offset used on push source filters
|
4412 |
|
|
HRESULT SetMaxGraphLatency( [in] REFERENCE_TIME rtMaxGraphLatency );
|
4413 |
|
|
}
|
4414 |
|
|
|
4415 |
|
|
|
4416 |
|
|
//
|
4417 |
|
|
// IAMOverlayFX
|
4418 |
|
|
//
|
4419 |
|
|
// This interface is exposed by the overlay mixer filter and allows
|
4420 |
|
|
// an application to apply various "effects" to the overlay surface
|
4421 |
|
|
// used by the overlay mixer.
|
4422 |
|
|
//
|
4423 |
|
|
// The effects that can be applied are described by the AMOVERLAYFX
|
4424 |
|
|
// enumeration.
|
4425 |
|
|
//
|
4426 |
|
|
enum AMOVERLAYFX {
|
4427 |
|
|
// Normal (ie. top down, left to right) video
|
4428 |
|
|
AMOVERFX_NOFX = 0x00000000,
|
4429 |
|
|
|
4430 |
|
|
// Mirror the overlay across the vertical axis
|
4431 |
|
|
AMOVERFX_MIRRORLEFTRIGHT = 0x00000002,
|
4432 |
|
|
|
4433 |
|
|
// Mirror the overlay across the horizontal axis
|
4434 |
|
|
AMOVERFX_MIRRORUPDOWN = 0x00000004,
|
4435 |
|
|
|
4436 |
|
|
// Deinterlace the overlay, if possible
|
4437 |
|
|
AMOVERFX_DEINTERLACE = 0x00000008
|
4438 |
|
|
};
|
4439 |
|
|
|
4440 |
|
|
[
|
4441 |
|
|
object,
|
4442 |
|
|
uuid(62fae250-7e65-4460-bfc9-6398b322073c),
|
4443 |
|
|
pointer_default(unique)
|
4444 |
|
|
]
|
4445 |
|
|
interface IAMOverlayFX : IUnknown
|
4446 |
|
|
{
|
4447 |
|
|
// Use this method to determine what overlay effects are currently available
|
4448 |
|
|
// for the overlay surface used by the overlay mixer filter.
|
4449 |
|
|
//
|
4450 |
|
|
HRESULT QueryOverlayFXCaps(
|
4451 |
|
|
[out] DWORD *lpdwOverlayFXCaps
|
4452 |
|
|
);
|
4453 |
|
|
|
4454 |
|
|
// Use this method to apply a new overlay effect to the overlay surface
|
4455 |
|
|
// used by the overlay mixer filter. This method can be called while the
|
4456 |
|
|
// filter graph is running, the effect is applied immediately
|
4457 |
|
|
//
|
4458 |
|
|
HRESULT SetOverlayFX(
|
4459 |
|
|
[in] DWORD dwOverlayFX
|
4460 |
|
|
);
|
4461 |
|
|
|
4462 |
|
|
// Use this method to determine what effect (if any) is currently being
|
4463 |
|
|
// applied to the overlay surface by the overlay mixer filter.
|
4464 |
|
|
//
|
4465 |
|
|
HRESULT GetOverlayFX(
|
4466 |
|
|
[out] DWORD *lpdwOverlayFX
|
4467 |
|
|
);
|
4468 |
|
|
}
|
4469 |
|
|
|
4470 |
|
|
|
4471 |
|
|
|
4472 |
|
|
// IAMOpenProgress interface provides information about current progress through
|
4473 |
|
|
// a download
|
4474 |
|
|
|
4475 |
|
|
// NOTE: The following cpp_quote is there to make sure that we do not break the whistler build when this file is
|
4476 |
|
|
// updated in Whistler as they are using a private copy of op.h which is removed as a result of moving the IAMOpenProgress
|
4477 |
|
|
// interface into axextend.idl. Html+time has a private copy of op.h in \\index1\src\newnt\inetcore\mshtml\src\time\include\op.h
|
4478 |
|
|
// which needs to be removed when integrating into Whistler to avoid any future build breaks.
|
4479 |
|
|
cpp_quote("#define __OP_H__")
|
4480 |
|
|
|
4481 |
|
|
[
|
4482 |
|
|
object,
|
4483 |
|
|
uuid(8E1C39A1-DE53-11cf-AA63-0080C744528D),
|
4484 |
|
|
pointer_default(unique)
|
4485 |
|
|
]
|
4486 |
|
|
|
4487 |
|
|
interface IAMOpenProgress : IUnknown
|
4488 |
|
|
{
|
4489 |
|
|
// QueryProgress can be used to query the source filter which supports this interface
|
4490 |
|
|
// for progress information during a renderfile operation.
|
4491 |
|
|
HRESULT QueryProgress(
|
4492 |
|
|
[out] LONGLONG* pllTotal,
|
4493 |
|
|
[out] LONGLONG* pllCurrent
|
4494 |
|
|
);
|
4495 |
|
|
|
4496 |
|
|
// AbortOperation can be used to request an abort of RenderFile operation
|
4497 |
|
|
// causing it to stop downloading. This methods instructs the exporter of
|
4498 |
|
|
// the IAMOpenProgress interface to hold up their internal abort flag until
|
4499 |
|
|
// further notice.
|
4500 |
|
|
HRESULT AbortOperation(
|
4501 |
|
|
);
|
4502 |
|
|
}
|
4503 |
|
|
|
4504 |
|
|
/*++
|
4505 |
|
|
IMpeg2Demultiplexer
|
4506 |
|
|
|
4507 |
|
|
This interface is implemented by the MPEG-2 Demultiplexer filter,
|
4508 |
|
|
irrespective of program vs. transport stream splitting functionality.
|
4509 |
|
|
--*/
|
4510 |
|
|
[
|
4511 |
|
|
object,
|
4512 |
|
|
local,
|
4513 |
|
|
uuid (436eee9c-264f-4242-90e1-4e330c107512),
|
4514 |
|
|
pointer_default(unique)
|
4515 |
|
|
]
|
4516 |
|
|
interface IMpeg2Demultiplexer : IUnknown
|
4517 |
|
|
{
|
4518 |
|
|
/*++
|
4519 |
|
|
------------------------------------------------------------------------
|
4520 |
|
|
purpose: Creates an output pin of the specified media type.
|
4521 |
|
|
|
4522 |
|
|
pMediaType media type specifier for the new pin
|
4523 |
|
|
pszPinName pin name; cannot be a duplicate of an existing pin
|
4524 |
|
|
ppIPin IPin interface pointer to the newly created pin
|
4525 |
|
|
--*/
|
4526 |
|
|
HRESULT
|
4527 |
|
|
CreateOutputPin (
|
4528 |
|
|
[in] AM_MEDIA_TYPE * pMediaType,
|
4529 |
|
|
[in] LPWSTR pszPinName,
|
4530 |
|
|
[out] IPin ** ppIPin
|
4531 |
|
|
) ;
|
4532 |
|
|
|
4533 |
|
|
/*++
|
4534 |
|
|
------------------------------------------------------------------------
|
4535 |
|
|
purpose: Updates the media type of the specified output pin. If no
|
4536 |
|
|
connection exists, the media type is updated always. If
|
4537 |
|
|
the pin is connected, the success/failure of the call will
|
4538 |
|
|
depend on downstream input pin's accetance/rejection of
|
4539 |
|
|
the specified media type, and subsequent success/failure
|
4540 |
|
|
of a reconnect.
|
4541 |
|
|
|
4542 |
|
|
pszPinName pin name
|
4543 |
|
|
pMediaType new media type specifier
|
4544 |
|
|
--*/
|
4545 |
|
|
HRESULT
|
4546 |
|
|
SetOutputPinMediaType (
|
4547 |
|
|
[in] LPWSTR pszPinName,
|
4548 |
|
|
[in] AM_MEDIA_TYPE * pMediaType
|
4549 |
|
|
) ;
|
4550 |
|
|
|
4551 |
|
|
/*++
|
4552 |
|
|
------------------------------------------------------------------------
|
4553 |
|
|
purpose: Deletes the specified output pin.
|
4554 |
|
|
|
4555 |
|
|
pszPinName pin name
|
4556 |
|
|
--*/
|
4557 |
|
|
HRESULT
|
4558 |
|
|
DeleteOutputPin (
|
4559 |
|
|
[in] LPWSTR pszPinName
|
4560 |
|
|
) ;
|
4561 |
|
|
} ;
|
4562 |
|
|
|
4563 |
|
|
//---------------------------------------------------------------------
|
4564 |
|
|
// IEnumStreamIdMap interface
|
4565 |
|
|
//---------------------------------------------------------------------
|
4566 |
|
|
|
4567 |
|
|
cpp_quote("#define MPEG2_PROGRAM_STREAM_MAP 0x00000000")
|
4568 |
|
|
cpp_quote("#define MPEG2_PROGRAM_ELEMENTARY_STREAM 0x00000001")
|
4569 |
|
|
cpp_quote("#define MPEG2_PROGRAM_DIRECTORY_PES_PACKET 0x00000002")
|
4570 |
|
|
cpp_quote("#define MPEG2_PROGRAM_PACK_HEADER 0x00000003")
|
4571 |
|
|
cpp_quote("#define MPEG2_PROGRAM_PES_STREAM 0x00000004")
|
4572 |
|
|
cpp_quote("#define MPEG2_PROGRAM_SYSTEM_HEADER 0x00000005")
|
4573 |
|
|
|
4574 |
|
|
cpp_quote("#define SUBSTREAM_FILTER_VAL_NONE 0x10000000")
|
4575 |
|
|
|
4576 |
|
|
typedef struct {
|
4577 |
|
|
ULONG stream_id ; // mpeg-2 stream_id
|
4578 |
|
|
DWORD dwMediaSampleContent ; // #define'd above
|
4579 |
|
|
ULONG ulSubstreamFilterValue ; // filtering value
|
4580 |
|
|
int iDataOffset ; // offset to elementary stream
|
4581 |
|
|
} STREAM_ID_MAP ;
|
4582 |
|
|
|
4583 |
|
|
/*++
|
4584 |
|
|
Enumerates the StreamIds mapped on a pin
|
4585 |
|
|
--*/
|
4586 |
|
|
[
|
4587 |
|
|
object,
|
4588 |
|
|
local,
|
4589 |
|
|
uuid (945C1566-6202-46fc-96C7-D87F289C6534),
|
4590 |
|
|
pointer_default(unique)
|
4591 |
|
|
]
|
4592 |
|
|
interface IEnumStreamIdMap : IUnknown
|
4593 |
|
|
{
|
4594 |
|
|
HRESULT
|
4595 |
|
|
Next (
|
4596 |
|
|
[in] ULONG cRequest,
|
4597 |
|
|
[in, out, size_is (cRequest)] STREAM_ID_MAP * pStreamIdMap,
|
4598 |
|
|
[out] ULONG * pcReceived
|
4599 |
|
|
) ;
|
4600 |
|
|
|
4601 |
|
|
HRESULT
|
4602 |
|
|
Skip (
|
4603 |
|
|
[in] ULONG cRecords
|
4604 |
|
|
) ;
|
4605 |
|
|
|
4606 |
|
|
HRESULT
|
4607 |
|
|
Reset (
|
4608 |
|
|
) ;
|
4609 |
|
|
|
4610 |
|
|
HRESULT
|
4611 |
|
|
Clone (
|
4612 |
|
|
[out] IEnumStreamIdMap ** ppIEnumStreamIdMap
|
4613 |
|
|
) ;
|
4614 |
|
|
} ;
|
4615 |
|
|
|
4616 |
|
|
/*++
|
4617 |
|
|
Implemented on the output pin.
|
4618 |
|
|
|
4619 |
|
|
Provides the ability to map/unmap a stream_id to/from an output pin.
|
4620 |
|
|
--*/
|
4621 |
|
|
[
|
4622 |
|
|
object,
|
4623 |
|
|
local,
|
4624 |
|
|
uuid (D0E04C47-25B8-4369-925A-362A01D95444),
|
4625 |
|
|
pointer_default(unique)
|
4626 |
|
|
]
|
4627 |
|
|
interface IMPEG2StreamIdMap : IUnknown
|
4628 |
|
|
{
|
4629 |
|
|
HRESULT
|
4630 |
|
|
MapStreamId (
|
4631 |
|
|
[in] ULONG ulStreamId, // mpeg-2 stream_id
|
4632 |
|
|
[in] DWORD MediaSampleContent, // #define'd above IEnumStreamIdMap
|
4633 |
|
|
[in] ULONG ulSubstreamFilterValue, // filter value
|
4634 |
|
|
[in] int iDataOffset // elementary stream offset
|
4635 |
|
|
) ;
|
4636 |
|
|
|
4637 |
|
|
HRESULT
|
4638 |
|
|
UnmapStreamId (
|
4639 |
|
|
[in] ULONG culStreamId, // number of stream_id's in pulStreamId
|
4640 |
|
|
[in] ULONG * pulStreamId // array of stream_id's to unmap
|
4641 |
|
|
) ;
|
4642 |
|
|
|
4643 |
|
|
HRESULT
|
4644 |
|
|
EnumStreamIdMap (
|
4645 |
|
|
[out] IEnumStreamIdMap ** ppIEnumStreamIdMap
|
4646 |
|
|
) ;
|
4647 |
|
|
} ;
|