/[cvs]/api/include/DShowIDL/axextend.idl
ViewVC logotype

Annotation of /api/include/DShowIDL/axextend.idl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Sun Jul 1 20:47:59 2001 UTC (23 years, 5 months ago) by bearsoft
Branch point for: lazy, MAIN
Initial revision

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     } ;

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26