home *** CD-ROM | disk | FTP | other *** search
/ Beginning Direct3D Game Programming / Direct3D.iso / directx / dxf / include / dshowidl / axextend.idl < prev    next >
Text File  |  2000-10-11  |  164KB  |  4,648 lines

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