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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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