Axextend.Idl
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:160k
源码类别:

模拟服务器

开发平台:

C/C++

  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. // include after unknwn.idl, objidl.idl and axcore.idl
  12. // forward declarations - these are the interfaces declared in this file
  13. interface IEnumRegFilters;
  14. interface IFileSourceFilter;
  15. interface IFileSinkFilter;
  16. interface IFileSinkFilter2;
  17. interface IGraphBuilder;
  18. interface ICaptureGraphBuilder;
  19. interface ICaptureGraphBuilder2;
  20. interface IAMCopyCaptureFileProgress;
  21. interface IFilterMapper;
  22. interface IFilterMapper2;
  23. interface IMediaEventSink;
  24. interface IOverlay;
  25. interface IOverlayNotify;
  26. interface IOverlayNotify2;
  27. interface IQualityControl;
  28. interface ISeekingPassThru;
  29. interface IAMStreamConfig;
  30. interface IAMDevMemoryAllocator;
  31. interface IAMDevMemoryControl;
  32. interface IConfigInterleaving;
  33. interface IConfigAviMux;
  34. interface IAMVideoCompression;
  35. interface IAMVfwCaptureDialogs;
  36. interface IAMVfwCompressDialogs;
  37. interface IAMDroppedFrames;
  38. interface IAMAudioInputMixer;
  39. interface IAMBufferNegotiation;
  40. interface IAMAnalogVideoDecoder;
  41. interface IAMVideoProcAmp;
  42. interface IAMAnalogVideoEncoder;
  43. interface IAMCameraControl;
  44. interface IAMCrossbar;
  45. interface IAMTVTuner;
  46. interface IKsPropertySet;
  47. interface IAMPhysicalPinInfo;
  48. interface IAMExtDevice;
  49. interface IAMExtTransport;
  50. interface IAMTimecodeReader;
  51. interface IAMTimecodeGenerator;
  52. interface IAMTimecodeDisplay;
  53. interface IDrawVideoImage;
  54. interface IDecimateVideoImage;
  55. interface IAMVideoDecimationProperties;
  56. interface IAMPushSource;
  57. interface IAMAudioRendererStats;
  58. interface IAMLatency;
  59. interface IAMGraphStreams;
  60. interface IAMOverlayFX;
  61. interface IAMOpenProgress;
  62. interface IMpeg2Demultiplexer ;
  63. interface IMPEG2StreamIdMap ;
  64. interface IEnumStreamIdMap ;
  65. //==========================================================================
  66. //==========================================================================
  67. // IEnumRegFilters interface -- enumerates registered filters.
  68. // enumerator interface returned from IFilterMapper::EnumMatchingFilters().
  69. // based on IEnum pseudo-template
  70. //==========================================================================
  71. //==========================================================================
  72. typedef struct {
  73.     CLSID Clsid;             // class id of the filter
  74.     LPWSTR Name;             // name of filter
  75. } REGFILTER;
  76. [
  77. object,
  78. uuid(56a868a4-0ad4-11ce-b03a-0020af0ba770),
  79. pointer_default(unique)
  80. ]
  81. // The point of the mapper is to avoid loading filters.  By looking in the
  82. // registry we can reduce the number of filters which must be loaded and tried.
  83. // This enumerator returns descriptors of filters (including the GUIDs that
  84. // CoCreateInstance can instantiate).  The filters themselves are not loaded.
  85. interface IEnumRegFilters : IUnknown {
  86.     import "unknwn.idl";
  87.     // The caller must use CoTaskMemFree to free each REGFILTER* returned
  88.     // in the array.
  89.     HRESULT Next
  90.         ( [in]  ULONG cFilters,           // place this many filters...
  91.           [out] REGFILTER ** apRegFilter, // ...in this array of REGFILTER*
  92.           [out] ULONG * pcFetched         // actual count passed returned here
  93.         );
  94.     // I can't think why anyone would want to skip, so it's not implemented.
  95.     // (anyone who thinks they know what they would be skipping over is probably
  96.     // missing some piece of the jigsaw). This ALWAYS returns E_NOTIMPL.
  97.     HRESULT Skip(
  98.         [in] ULONG cFilters
  99.     );
  100.     HRESULT Reset(void);
  101.     // No cloning either - also ALWAYS returns E_NOTIMPL.
  102.     HRESULT Clone(
  103.         [out] IEnumRegFilters **ppEnum
  104.     );
  105. }
  106. typedef IEnumRegFilters *PENUMREGFILTERS;
  107. //========================================================================
  108. //========================================================================
  109. // abstraction representing the registered information about filters.
  110. // This allows properties of filters to be looked up without loading them.
  111. //========================================================================
  112. //========================================================================
  113. [
  114. object,
  115. uuid(56a868a3-0ad4-11ce-b03a-0020af0ba770),
  116. pointer_default(unique)
  117. ]
  118. interface IFilterMapper : IUnknown {
  119.     import "unknwn.idl";
  120.     //==========================================================================
  121.     // Registration functions.
  122.     // A filter should be registered before any other use.
  123.     // The registration can be NON_VOLATILE (i.e. permanent, do once ever)
  124.     // or VOLATILE (once per boot of the system).
  125.     // UnregisterFilter (obviously) removes the registration.
  126.     // The action of any of the other calls on unregistered filters is undefined.
  127.     // it will either work or you'll get an error, but I'm not saying which.
  128.     //==========================================================================
  129.     // Four predefined values controling the order in which filters are tried
  130.     // for intelligent graph building.  Intermediate values are legal.
  131.     // Any value <=MERIT_DO_NOT_USE will mean that the filter will never
  132.     // be tried by the filtergrah to automatically complete a connection.
  133.     enum { MERIT_PREFERRED     = 0x800000,
  134.            MERIT_NORMAL        = 0x600000,
  135.            MERIT_UNLIKELY      = 0x400000,
  136.            MERIT_DO_NOT_USE    = 0x200000,
  137.            MERIT_SW_COMPRESSOR = 0x100000,
  138.            MERIT_HW_COMPRESSOR = 0x100050
  139.          };
  140.     // Register a filter
  141.     HRESULT RegisterFilter
  142.         ( [in] CLSID   clsid,    // GUID of the filter
  143.           [in] LPCWSTR Name,     // Descriptive name for the filter
  144.           [in] DWORD   dwMerit   // DO_NOT_USE, UNLIKELY, NORMAL or PREFERRED.
  145.         );
  146.     // Register an identifiable instance of a filter.  This deals with cases
  147.     // such as two similar sound cards which are driven by the same driver,
  148.     // but we want to choose which oif these cards the sound will come out of.
  149.     // This is not needed if there is only one instance of the filter
  150.     // (e.g. there is only one sound card in the machine) or if all instances
  151.     // of the filter are equivalent.
  152.     // The filter itself must have already been registered   // ??? Is that true?
  153.     HRESULT RegisterFilterInstance
  154.         ( [in]  CLSID  clsid,      // GUID of the filter
  155.           [in]  LPCWSTR Name,      // Descriptive name of instance.
  156.           [out] CLSID *MRId        // Returned Media Resource Id.  A
  157.                                    // locally unique id for this instance
  158.                                    // of this filter
  159.         );
  160.     HRESULT RegisterPin
  161.         ( [in] CLSID   Filter,           // GUID of filter
  162.           [in] LPCWSTR Name,             // Name of the pin
  163.           [in] BOOL    bRendered,        // The filter renders this input
  164.           [in] BOOL    bOutput,          // TRUE if this is an Output pin
  165.           [in] BOOL    bZero,            // TRUE if OK for zero instances of pin
  166.                                          // In this case you will have to Create
  167.                                          // a pin to have even one instance
  168.           [in] BOOL    bMany,            // TRUE if OK for many instances of pin
  169.           [in] CLSID   ConnectsToFilter, // Filter it connects to if it has
  170.                                          // subterranean connection, else NULL
  171.           [in] LPCWSTR ConnectsToPin     // Name of pin it connects to
  172.                                          // NULL for output pins
  173.         );
  174.     HRESULT RegisterPinType
  175.         ( [in] CLSID   clsFilter,        // GUID of filter
  176.           [in] LPCWSTR strName,          // Descriptive name of the pin
  177.           [in] CLSID   clsMajorType,     // Major type of the data stream
  178.           [in] CLSID   clsSubType        // Sub type of the data stream
  179.         );
  180.     HRESULT UnregisterFilter
  181.         ( [in] CLSID  Filter             // GUID of filter
  182.         );
  183.     HRESULT UnregisterFilterInstance
  184.         ( [in] CLSID  MRId               // Media Resource Id of this instance
  185.         );
  186.     HRESULT UnregisterPin
  187.         ( [in] CLSID   Filter,           // GUID of filter
  188.           [in] LPCWSTR Name              // Name of the pin
  189.         );
  190.     // Set *ppEnum to be an enumerator for filters matching the requirements.
  191.     HRESULT EnumMatchingFilters
  192.        ( [out] IEnumRegFilters **ppEnum  // enumerator returned
  193.        , [in]  DWORD dwMerit             // at least this merit needed
  194.        , [in]  BOOL  bInputNeeded        // need at least one input pin
  195.        , [in]  CLSID clsInMaj            // input major type
  196.        , [in]  CLSID clsInSub            // input sub type
  197.        , [in]  BOOL  bRender             // must the input be rendered?
  198.        , [in]  BOOL  bOututNeeded        // need at least one output pin
  199.        , [in]  CLSID clsOutMaj           // output major type
  200.        , [in]  CLSID clsOutSub           // output sub type
  201.        );
  202. }
  203. // structure used to identify media types a pin handles. Used for
  204. // registration through IFilterMapper and IFilterMapper2
  205. //
  206. typedef struct
  207. {
  208.     const CLSID * clsMajorType;
  209.     const CLSID * clsMinorType;
  210. } REGPINTYPES;
  211. // describes pin for filter registration. Used for registration
  212. // through IFilterMapper and IFilterMapper2
  213. //
  214. typedef struct
  215. {
  216.     LPWSTR           strName;
  217.     // The filter renders this input
  218.     BOOL             bRendered;
  219.     // This is an Output pin
  220.     BOOL             bOutput;
  221.     // OK to have zero instances of pin In this case you will have to
  222.     // Create a pin to have even one instance
  223.     BOOL             bZero;
  224.     // OK to create many instance of  pin
  225.     BOOL             bMany;
  226.     const CLSID *    clsConnectsToFilter;
  227.     const WCHAR *    strConnectsToPin;
  228.     UINT             nMediaTypes;
  229.     const REGPINTYPES * lpMediaType;
  230. } REGFILTERPINS;
  231. // mediums (as defined in the Windows NT DDK) for registration with
  232. // IFilterMapper2
  233. //
  234. typedef struct
  235. {
  236.     CLSID clsMedium;
  237.     DWORD dw1;
  238.     DWORD dw2;
  239. } REGPINMEDIUM;
  240. // flags for dwFlags in REFILTERPINS2
  241. enum
  242. {
  243.     // OK to have zero instances of pin In this case you will have to
  244.     // Create a pin to have even one instance
  245.     REG_PINFLAG_B_ZERO = 0x1,
  246.     // The filter renders this input
  247.     REG_PINFLAG_B_RENDERER = 0x2,
  248.     // OK to create many instance of  pin
  249.     REG_PINFLAG_B_MANY = 0x4,
  250.     // This is an Output pin
  251.     REG_PINFLAG_B_OUTPUT = 0x8
  252. };
  253. // describes pin for filter registration through IFilterMapper2
  254. typedef struct
  255. {
  256.     // combination of REG_PINFLAG flags
  257.     DWORD dwFlags;
  258.     // number of instances of the pin if known
  259.     UINT             cInstances;
  260.     UINT             nMediaTypes;
  261.     [size_is(nMediaTypes)] const REGPINTYPES * lpMediaType;
  262.     UINT             nMediums;
  263.     [size_is(nMediums)] const REGPINMEDIUM *lpMedium;
  264.     // pin category (for Kernel Streaming pins) as defined in the
  265.     // Windows NT DDK
  266.     const CLSID      *clsPinCategory;
  267. } REGFILTERPINS2;
  268. // describes filter for registration through IFilterMapper2
  269. typedef struct
  270. {
  271.     DWORD dwVersion;            // 1 or 2
  272.     DWORD dwMerit;
  273.     /* unnamed union */
  274.     [switch_is(dwVersion)] [switch_type(DWORD)] union
  275.     {
  276.         [case(1)]
  277.             struct
  278.             {
  279.                 ULONG cPins;
  280.                 [size_is(cPins)] const REGFILTERPINS *rgPins;
  281.             };
  282.         [case(2)]
  283.             struct
  284.             {
  285.                 ULONG cPins2;
  286.                 [size_is(cPins2)] const REGFILTERPINS2 *rgPins2;
  287.             };
  288.         [default]
  289.             ;
  290.     } ;
  291. } REGFILTER2;
  292. [
  293. object,
  294. uuid(b79bb0b0-33c1-11d1-abe1-00a0c905f375),
  295. pointer_default(unique)
  296. ]
  297. interface IFilterMapper2 : IUnknown {
  298.     import "unknwn.idl";
  299.     // create or rename ActiveMovie category
  300.     HRESULT CreateCategory
  301.         ( [in] REFCLSID clsidCategory,
  302.           [in] DWORD dwCategoryMerit,
  303.           [in] LPCWSTR Description
  304.           );
  305.     HRESULT UnregisterFilter
  306.         ( [in] const CLSID *pclsidCategory,
  307.           [in] const OLECHAR *szInstance,
  308.           [in] REFCLSID Filter // GUID of filter
  309.         );
  310.     // Register a filter, pins, and media types under a category.
  311.     HRESULT RegisterFilter
  312.         ( [in] REFCLSID clsidFilter,     // GUID of the filter
  313.           [in] LPCWSTR Name,             // Descriptive name for the filter
  314.           // ppMoniker can be null. or *ppMoniker can contain the
  315.           // moniker where this filter data will be written;
  316.           // *ppMoniker will be set to null on return. or *ppMoniker
  317.           // can be null in which case the moniker will be returned
  318.           // with refcount.
  319.           [in, out] IMoniker **ppMoniker,
  320.           // can be null
  321.           [in] const CLSID *pclsidCategory,
  322.           // cannot be null
  323.           [in] const OLECHAR *szInstance,
  324.           // rest of filter and pin registration
  325.           [in] const REGFILTER2 *prf2
  326.         );
  327.     // Set *ppEnum to be an enumerator for filters matching the
  328.     // requirements.
  329.     HRESULT EnumMatchingFilters
  330.        ( [out] IEnumMoniker **ppEnum           // enumerator returned
  331.        , [in]  DWORD dwFlags                   // 0
  332.        , [in]  BOOL bExactMatch                // don't match wildcards
  333.        , [in]  DWORD dwMerit                   // at least this merit needed
  334.        , [in]  BOOL  bInputNeeded              // need at least one input pin
  335.        , [in]  DWORD cInputTypes               // Number of input types to match
  336.                                                // Any match is OK
  337.        , [size_is(cInputTypes*2)]  const GUID *pInputTypes // input major+subtype pair array
  338.        , [in]  const REGPINMEDIUM *pMedIn      // input medium
  339.        , [in]  const CLSID *pPinCategoryIn     // input pin category
  340.        , [in]  BOOL  bRender                   // must the input be rendered?
  341.        , [in]  BOOL  bOutputNeeded             // need at least one output pin
  342.        , [in]  DWORD cOutputTypes              // Number of output types to match
  343.                                                // Any match is OK
  344.        , [size_is(cOutputTypes*2)]  const GUID *pOutputTypes // output major+subtype pair array
  345.        , [in]  const REGPINMEDIUM *pMedOut     // output medium
  346.        , [in]  const CLSID *pPinCategoryOut    // output pin category
  347.        );
  348. }
  349. [
  350. object,
  351. uuid(b79bb0b1-33c1-11d1-abe1-00a0c905f375),
  352. pointer_default(unique)
  353. ]
  354. interface IFilterMapper3 : IFilterMapper2 {
  355.     // new interface to allow creating filters using the mapper's devenum instance
  356.     // primarily needed for out-of-proc access to a graph
  357.     HRESULT GetICreateDevEnum( [out] ICreateDevEnum **ppEnum );
  358. }
  359. //========================================================================
  360. //========================================================================
  361. // Defines IQualityControl interface
  362. //
  363. // Defines quality messages and allows a quality manager to install itself
  364. // as the sink for quality messages.
  365. //========================================================================
  366. //========================================================================
  367. typedef enum tagQualityMessageType {
  368.     Famine,
  369.     Flood
  370. } QualityMessageType;
  371. typedef struct tagQuality {
  372.     QualityMessageType Type;
  373.     long                Proportion;   // milli-units.  1000 = no change
  374.                             // for Flood:
  375.                             // What proportion of the media samples currently
  376.                             // coming through are required in the future.
  377.                             // 800 means please drop another 20%
  378.                             // For Famine:
  379.                             // How much to "keep in" e.g. 800 means send me
  380.                             // 20% less e.g. by dropping 20% of the samples.
  381.                             // 1100 would mean "I'm coping, send me more".
  382.     REFERENCE_TIME       Late;
  383.                             // How much you need to catch up by
  384.     REFERENCE_TIME       TimeStamp;
  385.                             // The stream time when this was generated (probably
  386.                             // corresponds to the start time on some sample).
  387. } Quality;
  388. typedef IQualityControl *PQUALITYCONTROL;
  389. [
  390. object,
  391. uuid(56a868a5-0ad4-11ce-b03a-0020af0ba770),
  392. pointer_default(unique)
  393. ]
  394. interface IQualityControl : IUnknown {
  395.     // Notify the recipient that a quality change is requested.
  396.     // pSelf is the IBaseFilter* of the sender.
  397.     // this is sent from a filter
  398.     // to (the quality manager or) an upstream peer.
  399.     HRESULT Notify
  400.         ( [in] IBaseFilter * pSelf,
  401.           [in] Quality q
  402.         );
  403.     // Notify the recipient that future quality messages are to be sent
  404.     // to iqc.  If piqc is NULL then quality messages are to default back to
  405.     // the upstream peer.
  406.     // This is sent from the quality manager to a filter.
  407.     // The recipient should hold piqc as a WEAK reference,
  408.     // i.e. do not AddRef it, do not Release it.
  409.     HRESULT SetSink
  410.         ( [in] IQualityControl * piqc
  411.         );
  412. }
  413. //=====================================================================
  414. //=====================================================================
  415. // Definitions required for overlay transport
  416. //=====================================================================
  417. //=====================================================================
  418. // Used to communicate the colour that the IOverlay client wants the window
  419. // painted in so that it can draw directly to the correct clipping region
  420. // A colour key can be described in two alternate ways, the first is by a
  421. // range of one or more (system) palette indices. The second is by defining
  422. // a colour cube with two RGB values, any of which would be acceptable.
  423. //
  424. // The CK values are consistent with GDI PALETTEINDEX and PALETTERGB macros
  425. enum { CK_NOCOLORKEY = 0x0,     // No color key is required
  426.        CK_INDEX       = 0x1,    // Index into the current system palette
  427.        CK_RGB         = 0x2 };  // Color key is an RGB value (or range)
  428. typedef struct tagCOLORKEY {
  429.     DWORD    KeyType;           // Explains meaning of the structure
  430.     DWORD    PaletteIndex;      // Palette index if available
  431.     COLORREF LowColorValue;     // Low colour space RGB value
  432.     COLORREF HighColorValue;    // Defines the high RGB value
  433. } COLORKEY;
  434. // When a filter sets up an advise link it can ask that only certain types
  435. // of notifications be sent, for example just palette changes. While this
  436. // doesn't mean that the other notification call backs won't ever be called
  437. // the IOverlay implementation may use this as an efficiency optimisation
  438. enum { ADVISE_NONE = 0x0,               // No notifications required
  439.        ADVISE_CLIPPING = 0x1,           // Synchronous clip information
  440.        ADVISE_PALETTE = 0x2,            // Palette change notifications
  441.        ADVISE_COLORKEY = 0x4,           // Called when colour key changes
  442.        ADVISE_POSITION = 0x8,           // Likewise when window moves etc
  443.        ADVISE_DISPLAY_CHANGE = 0x10     // Called on WM_DISPLAYCHANGE
  444.      };
  445. const DWORD ADVISE_ALL = ADVISE_CLIPPING |
  446.                          ADVISE_PALETTE |
  447.                          ADVISE_COLORKEY |
  448.                          ADVISE_POSITION;
  449. const DWORD ADVISE_ALL2 = ADVISE_ALL |
  450.                           ADVISE_DISPLAY_CHANGE;
  451. // This isn't defined when you run IDL
  452. cpp_quote("#ifndef _WINGDI_")
  453. typedef struct _RGNDATAHEADER {
  454.     DWORD dwSize;
  455.     DWORD iType;
  456.     DWORD nCount;
  457.     DWORD nRgnSize;
  458.     RECT  rcBound;
  459. } RGNDATAHEADER;
  460. typedef struct _RGNDATA {
  461.     RGNDATAHEADER rdh;
  462.     char Buffer[1];
  463. } RGNDATA;
  464. cpp_quote("#endif")
  465. //=====================================================================
  466. //=====================================================================
  467. // Defines IOverlayNotify interface
  468. //
  469. // This interface gives asynchronous notifications of changes to the
  470. // rendering window - such as changes to the exposed window area
  471. //=====================================================================
  472. //=====================================================================
  473. [
  474. object,
  475. local,
  476. uuid(56a868a0-0ad4-11ce-b03a-0020af0ba770),
  477. pointer_default(unique)
  478. ]
  479. interface IOverlayNotify : IUnknown {
  480.     // IOverlayNotify methods
  481.     // This notifies the filter of palette changes, the filter should copy
  482.     // the array of RGBQUADs if it needs to use them after returning. This
  483.     // is not called when the palette is actually changed in the display
  484.     // but at a short time after (in sync with WM_PALETTECHANGED messages)
  485.     HRESULT OnPaletteChange(
  486.         [in] DWORD dwColors,                // Number of colours present
  487.         [in] const PALETTEENTRY *pPalette); // Array of palette colours
  488.     // This provides synchronous clip changes so that the client is called
  489.     // before the window is moved to freeze the video, and then when the
  490.     // window has stabilised it is called again to start playback again.
  491.     // If the window rect is all zero then the window is invisible, the
  492.     // filter must take a copy of the information if it wants to keep it
  493.     HRESULT OnClipChange(
  494.         [in] const RECT *pSourceRect,       // Region of video to use
  495.         [in] const RECT *pDestinationRect,  // Where video goes
  496.         [in] const RGNDATA *pRgnData);      // Defines clipping information
  497.     HRESULT OnColorKeyChange([in] const COLORKEY *pColorKey);
  498.     // The calls to OnClipChange happen in sync with the window. So it is
  499.     // called with an empty clip list before the window moves to freeze
  500.     // the video, and then when the window has stabilised it is called
  501.     // again with the new clip list. The OnPositionChange callback is for
  502.     // overlay cards that don't want the expense of synchronous clipping
  503.     // updates and just want to know when the source or destination video
  504.     // positions change. They will NOT be called in sync with the window
  505.     // but at some point after the window has changed (basicly in time
  506.     // with WM_SIZE etc messages received). This is therefore suitable
  507.     // for overlay cards that don't inlay their data to the frame buffer
  508.     // NOTE the destination is NOT clipped to the visible display area
  509.     HRESULT OnPositionChange([in] const RECT *pSourceRect,
  510.                              [in] const RECT *pDestinationRect);
  511. }
  512. typedef IOverlayNotify *POVERLAYNOTIFY;
  513. //=====================================================================
  514. //=====================================================================
  515. // Defines IOverlayNotify2 interface
  516. //
  517. // This interface gives asynchronous notifications of changes to the
  518. // rendering window - such as changes to the exposed window area
  519. // This is optionally supported by the advise sink for the purposes
  520. // of accepting OnDisplayChange notification.
  521. //=====================================================================
  522. //=====================================================================
  523. cpp_quote("#if !defined(HMONITOR_DECLARED) && !defined(HMONITOR) && (WINVER < 0x0500)")
  524. cpp_quote("#define HMONITOR_DECLARED")
  525. cpp_quote("#if 0")
  526. typedef HANDLE HMONITOR;
  527. cpp_quote("#endif")
  528. cpp_quote("DECLARE_HANDLE(HMONITOR);")
  529. cpp_quote("#endif")
  530. [
  531. object,
  532. local,
  533. uuid(680EFA10-D535-11D1-87C8-00A0C9223196),
  534. pointer_default(unique)
  535. ]
  536. interface IOverlayNotify2 : IOverlayNotify {
  537.     // IOverlayNotify2 methods
  538.     HRESULT OnDisplayChange(    // ADVISE_DISPLAY_CHANGE
  539.         HMONITOR hMonitor);
  540. }
  541. typedef IOverlayNotify2 *POVERLAYNOTIFY2;
  542. //=====================================================================
  543. //=====================================================================
  544. // Defines IOverlay interface
  545. //
  546. // This interface provides information so that a filter can write direct to
  547. // the frame buffer while placing the video in the correct window position
  548. //=====================================================================
  549. //=====================================================================
  550. [
  551. object,
  552. local,
  553. uuid(56a868a1-0ad4-11ce-b03a-0020af0ba770),
  554. pointer_default(unique)
  555. ]
  556. interface IOverlay : IUnknown {
  557.     // IOverlay methods
  558.     HRESULT GetPalette(
  559.         [out] DWORD *pdwColors,              // Number of colours present
  560.         [out] PALETTEENTRY **ppPalette);     // Where to put palette data
  561.     HRESULT SetPalette(
  562.         [in] DWORD dwColors,                 // Number of colours present
  563.         [in] PALETTEENTRY *pPalette);        // Colours to use for palette
  564.     // If you change the colour key through SetColorKey then all the advise
  565.     // links will receive an OnColorKeyChange callback with the new colour
  566.     HRESULT GetDefaultColorKey([out] COLORKEY *pColorKey);
  567.     HRESULT GetColorKey([out] COLORKEY *pColorKey);
  568.     HRESULT SetColorKey([in,out] COLORKEY *pColorKey);
  569.     HRESULT GetWindowHandle([out] HWND *pHwnd);
  570.     // The IOverlay implementation allocates the memory for the clipping
  571.     // rectangles as it can be variable in length. The filter calling
  572.     // this method should free the memory when it is finished with it
  573.     HRESULT GetClipList([out] RECT *pSourceRect,
  574.                         [out] RECT *pDestinationRect,
  575.                         [out] RGNDATA **ppRgnData);
  576.     // Returns the current video source and destination
  577.     HRESULT GetVideoPosition([out] RECT *pSourceRect,
  578.                              [out] RECT *pDestinationRect);
  579.     HRESULT Advise(
  580.         [in] IOverlayNotify *pOverlayNotify, // Notification interface
  581.         [in] DWORD dwInterests);             // Callbacks interested in
  582.     HRESULT Unadvise();                      // Stop the callbacks now
  583. }
  584. typedef IOverlay *POVERLAY;
  585. //=====================================================================
  586. //=====================================================================
  587. // control related interfaces (others are defined in control.odl)
  588. //=====================================================================
  589. //=====================================================================
  590. //=====================================================================
  591. //=====================================================================
  592. // Defines IMediaEventSink interface
  593. //
  594. // Exposed by filtergraph. Called by filters to notify events. Will be
  595. // passed on to application by the IMediaControl event methods.
  596. //=====================================================================
  597. //=====================================================================
  598. [
  599.         object,
  600.         uuid(56a868a2-0ad4-11ce-b03a-0020af0ba770),
  601.         pointer_default(unique)
  602. ]
  603. interface IMediaEventSink : IUnknown {
  604.     // notify an event. will be queued, but not delivered to
  605.     // the application on this thread.
  606.     HRESULT Notify(
  607.         [in] long EventCode,
  608.         [in] LONG_PTR EventParam1,
  609.         [in] LONG_PTR EventParam2
  610.     );
  611. }
  612. typedef IMediaEventSink *PMEDIAEVENTSINK;
  613. //=====================================================================
  614. //=====================================================================
  615. // Defines IFileSourceFilter interface
  616. //
  617. // Exposed by source filters to set the file name and media type.
  618. //=====================================================================
  619. //=====================================================================
  620. [
  621.         object,
  622.         uuid(56a868a6-0ad4-11ce-b03a-0020af0ba770),
  623.         pointer_default(unique)
  624. ]
  625. interface IFileSourceFilter : IUnknown {
  626.     // Load a file and assign it the given media type
  627.     HRESULT Load(
  628.         [in] LPCOLESTR pszFileName,     // Pointer to absolute path of file to open
  629.         [in, unique] const AM_MEDIA_TYPE *pmt   // Media type of file - can be NULL
  630.     );
  631.     // Get the currently loaded file name
  632.     HRESULT GetCurFile(
  633.         [out] LPOLESTR *ppszFileName,   // Pointer to the path for the current file
  634.         [out] AM_MEDIA_TYPE *pmt        // Pointer to the media type
  635.     );
  636. }
  637. typedef IFileSourceFilter *PFILTERFILESOURCE;
  638. //=====================================================================
  639. //=====================================================================
  640. // Defines IFileSinkFilter interface
  641. //
  642. // Exposed by renderers to set the output file name.
  643. //=====================================================================
  644. //=====================================================================
  645. [
  646.         object,
  647.         uuid(a2104830-7c70-11cf-8bce-00aa00a3f1a6),
  648.         pointer_default(unique)
  649. ]
  650. interface IFileSinkFilter : IUnknown {
  651.     // Output to this file. default is to open the existing file
  652.     HRESULT SetFileName(
  653.         [in] LPCOLESTR pszFileName,     // Pointer to absolute path of output file
  654.         [in, unique] const AM_MEDIA_TYPE *pmt   // Media type of file - can be NULL
  655.     );
  656.     // Get the current file name
  657.     HRESULT GetCurFile(
  658.         [out] LPOLESTR *ppszFileName,   // Pointer to the path for the current file
  659.         [out] AM_MEDIA_TYPE *pmt        // Pointer to the media type
  660.     );
  661. }
  662. typedef IFileSinkFilter *PFILTERFILESINK;
  663. [
  664.         object,
  665.         uuid(00855B90-CE1B-11d0-BD4F-00A0C911CE86),
  666.         pointer_default(unique)
  667. ]
  668. interface IFileSinkFilter2 : IFileSinkFilter {
  669.     HRESULT SetMode(
  670.         [in] DWORD dwFlags              // AM_FILESINK_FLAGS
  671.     );
  672.     HRESULT GetMode(
  673.         [out] DWORD *pdwFlags           // AM_FILESINK_FLAGS
  674.     );
  675. }
  676. typedef IFileSinkFilter2 *PFILESINKFILTER2;
  677. typedef enum {
  678.     // create a new file
  679.     AM_FILE_OVERWRITE = 0x00000001,
  680. } AM_FILESINK_FLAGS;
  681. //
  682. // Intelligent connectivity for filters - an interface supported by
  683. // filter graphs (since it is an extension to IFilterGraph) that supports
  684. // building of graphs by automatic selection and connection of appropriate
  685. // filters
  686. [
  687.     object,
  688.     uuid(56a868a9-0ad4-11ce-b03a-0020af0ba770),
  689.     pointer_default(unique)
  690. ]
  691. interface IGraphBuilder : IFilterGraph {
  692.     // Connect these two pins directly or indirectly, using transform filters
  693.     // if necessary.
  694.     HRESULT Connect
  695.         ( [in] IPin * ppinOut,    // the output pin
  696.           [in] IPin * ppinIn      // the input pin
  697.         );
  698.     // Connect this output pin directly or indirectly, using transform filters
  699.     // if necessary to something that will render it.
  700.     HRESULT Render
  701.         ( [in] IPin * ppinOut     // the output pin
  702.         );
  703.     // Build a filter graph that will render this file using this play list.
  704.     // If lpwstrPlayList is NULL then it will use the default play list
  705.     // which will typically render the whole file.
  706.     HRESULT RenderFile
  707.         ( [in] LPCWSTR lpcwstrFile,
  708.           [in, unique] LPCWSTR lpcwstrPlayList
  709.         );
  710.     // Add to the filter graph a source filter for this file.  This would
  711.     // be the same source filter that would be added by calling Render.
  712.     // This call gives you more control over building
  713.     // the rest of the graph, e.g. AddFilter(<a renderer of your choice>)
  714.     // and then Connect the two.
  715.     // The IBaseFilter* interface exposed by the source filter is returned
  716.     // in ppFilter, addrefed already for you
  717.     // The filter will be known by the name lpcwstrFIlterName
  718.     // nn this filter graph,
  719.     HRESULT AddSourceFilter
  720.         ( [in]      LPCWSTR lpcwstrFileName,
  721.           [in, unique]      LPCWSTR lpcwstrFilterName,
  722.           [out]     IBaseFilter* *ppFilter
  723.         );
  724.     // If this call is made then trace information will be written to the
  725.     // file showing the actions taken in attempting to perform an operation.
  726.     HRESULT SetLogFile
  727.         ( [in]      DWORD_PTR hFile  // open file handle e.g. from CreateFile
  728.         );
  729.     // Request that the graph builder should return as soon as possible from
  730.     // its current task.
  731.     // Note that it is possible fot the following to occur in the following
  732.     // sequence:
  733.     //     Operation begins; Abort is requested; Operation completes normally.
  734.     // This would be normal whenever the quickest way to finish an operation
  735.     // was to simply continue to the end.
  736.     HRESULT Abort();
  737.     // Return S_OK if the curent operation is to continue,
  738.     // return S_FALSE if the current operation is to be aborted.
  739.     // This method can be called as a callback from a filter which is doing
  740.     // some operation at the request of the graph.
  741.     HRESULT ShouldOperationContinue();
  742. }
  743. //
  744. // New capture graph builder
  745. [
  746.     object,
  747.     uuid(bf87b6e0-8c27-11d0-b3f0-00aa003761c5),
  748.     pointer_default(unique)
  749. ]
  750. interface ICaptureGraphBuilder : IUnknown {
  751.     // Use this filtergraph
  752.     HRESULT SetFiltergraph(
  753. [in] IGraphBuilder *pfg);
  754.     // what filtergraph are you using?
  755.     // *ppfg->Release() when you're done with it
  756.     HRESULT GetFiltergraph(
  757. [out] IGraphBuilder **ppfg);
  758.     // creates a rendering section in the filtergraph consisting of a MUX
  759.     // of some filetype, and a file writer (and connects them together)
  760.     // *ppf->Release() when you're done with it
  761.     // *ppSink->Release() when you're done with it
  762.     HRESULT SetOutputFileName(
  763. [in] const GUID *pType, // type of file to write, eg. MEDIASUBTYPE_Avi
  764. [in] LPCOLESTR lpstrFile, // filename given to file writer
  765. [out] IBaseFilter **ppf, // returns pointer to the MUX
  766.         [out] IFileSinkFilter **ppSink);// queried from file writer
  767.     // Looks for an interface on the filter and on the output pin of the given
  768.     // category.  (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or
  769.     // NULL for "don't care".
  770.     // It will also look upstream and downstream of
  771.     // the pin for the interface, to find interfaces on renderers, MUXES, TV
  772.     // Tuners, etc.
  773.     // Call *ppint->Release() when you're done with it
  774.     [local] HRESULT FindInterface(
  775. [in, unique] const GUID *pCategory, // can be NULL for all pins
  776. [in] IBaseFilter *pf,
  777. [in] REFIID riid,
  778. [out] void **ppint);
  779.     [call_as(FindInterface)] HRESULT RemoteFindInterface(
  780. [in, unique] const GUID *pCategory, // can be NULL for all pins
  781. [in] IBaseFilter *pf,
  782. [in] REFIID riid,
  783. [out] IUnknown **ppint);
  784.     // Connects the pin of the given category of the source filter to the
  785.     // rendering filter, optionally through another filter (compressor?)
  786.     // For a non-NULL category, it will instantiate and connect additional
  787.     // required filters upstream too, like TV Tuners and Crossbars.
  788.     // If there is only one output pin on the source, use a NULL
  789.     // category.  You can also have pSource be a pin
  790.     HRESULT RenderStream(
  791. [in] const GUID *pCategory, // can be NULL if only one output pin
  792. [in] IUnknown *pSource, // filter or pin
  793. [in] IBaseFilter *pfCompressor,
  794. [in] IBaseFilter *pfRenderer); // can be NULL
  795.     // Sends IAMStreamControl messages to the pin of the desired category, eg.
  796.     // "capture" or "preview"
  797.     // REFERENCE_TIME=NULL means NOW
  798.     // REFERENCE_TIME=MAX_TIME means never, or cancel previous request
  799.     // NULL controls all capture filters in the graph - you will get one
  800.     //     notification for each filter with a pin of that category found
  801.     // returns S_FALSE if stop will be signalled before last sample is
  802.     //     rendered.
  803.     // return a FAILURE code if the filter does not support IAMStreamControl
  804.     HRESULT ControlStream(
  805. [in] const GUID *pCategory,
  806. [in] IBaseFilter *pFilter,
  807. [in] REFERENCE_TIME *pstart,
  808. [in] REFERENCE_TIME *pstop,
  809. [in] WORD wStartCookie, // high word reserved
  810. [in] WORD wStopCookie); // high word reserved
  811.     // creates a pre-allocated file of a given size in bytes
  812.     HRESULT AllocCapFile(
  813. [in] LPCOLESTR lpstr,
  814. [in] DWORDLONG dwlSize);
  815.     // Copies the valid file data out of the old, possibly huge old capture
  816.     //   file into a shorter new file.
  817.     // Return S_FALSE from your progress function to abort capture, S_OK to
  818.     //   continue
  819.     HRESULT CopyCaptureFile(
  820. [in] LPOLESTR lpwstrOld,
  821. [in] LPOLESTR lpwstrNew,
  822. [in] int fAllowEscAbort, // pressing ESC will abort?
  823. [in] IAMCopyCaptureFileProgress *pCallback); // implement this to
  824. // get progress
  825. }
  826. //
  827. // Capture graph builder "CopyCapturedFile" progress callback
  828. [
  829.     object,
  830.     uuid(670d1d20-a068-11d0-b3f0-00aa003761c5),
  831.     pointer_default(unique)
  832. ]
  833. interface IAMCopyCaptureFileProgress : IUnknown {
  834.     // If you support this interface somewhere, this function will be called
  835.     // periodically while ICaptureGraphBuilder::CopyCaptureFile is executing
  836.     // to let you know the progress
  837.     //
  838.     // Return S_OK from this function to continue.  Return S_FALSE to abort the
  839.     // copy
  840.     HRESULT Progress(
  841. [in] int iProgress); // a number between 0 and 100 (%)
  842. }
  843. //
  844. // Capture graph builder that can deal with a single filter having more than
  845. // one pin of each category... some new devices can capture both audio and
  846. // video, for example
  847. //
  848. [
  849.     object,
  850.     uuid(93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D),
  851.     pointer_default(unique)
  852. ]
  853. interface ICaptureGraphBuilder2 : IUnknown {
  854.     // Use this filtergraph
  855.     HRESULT SetFiltergraph(
  856. [in] IGraphBuilder *pfg);
  857.     // what filtergraph are you using?
  858.     // *ppfg->Release() when you're done with it
  859.     HRESULT GetFiltergraph(
  860. [out] IGraphBuilder **ppfg);
  861.     // creates a rendering section in the filtergraph consisting of a MUX
  862.     // of some filetype, and a file writer (and connects them together)
  863.     // *ppf->Release() when you're done with it
  864.     // *ppSink->Release() when you're done with it
  865.     HRESULT SetOutputFileName(
  866. [in] const GUID *pType, // GUID of MUX filter to use
  867. [in] LPCOLESTR lpstrFile, // filename given to file writer
  868. [out] IBaseFilter **ppf, // returns pointer to the MUX
  869.         [out] IFileSinkFilter **ppSink);// queried from file writer
  870.     // Looks for an interface on the filter and on the output pin of the given
  871.     // category and type.  (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or
  872.     // NULL for "don't care".  Type:  MAJORTYPE_Video/Audio etc or NULL)
  873.     // !!! Will some filters have >1 capture pin?  ie RGB and MPEG?
  874.     // It will also look upstream and downstream of
  875.     // the pin for the interface, to find interfaces on renderers, MUXES, TV
  876.     // Tuners, etc.
  877.     // Call *ppint->Release() when you're done with it
  878.     [local] HRESULT FindInterface(
  879. [in] const GUID *pCategory, // can be NULL for all pins
  880. [in] const GUID *pType, // Audio/Video/??? or NULL (don't care)
  881. [in] IBaseFilter *pf,
  882. [in] REFIID riid,
  883. [out] void **ppint);
  884.     [call_as(FindInterface)] HRESULT RemoteFindInterface(
  885. [in] const GUID *pCategory, // can be NULL for all pins
  886. [in] const GUID *pType, // Audio/Video/??? or NULL (don't care)
  887. [in] IBaseFilter *pf,
  888. [in] REFIID riid,
  889. [out] IUnknown **ppint);
  890.     // Connects the pin of the given category and type of the source filter to
  891.     // the rendering filter, optionally through another filter (compressor?)
  892.     // (Type is a Majortype, like Video or Audio)
  893.     // For a non-NULL category, it will instantiate and connect additional
  894.     // required filters upstream too, like TV Tuners and Crossbars.
  895.     // If there is only one output pin on the source, use a NULL category
  896.     // and type.  You can also have pSource be a pin
  897.     HRESULT RenderStream(
  898. [in] const GUID *pCategory, // can be NULL if only one output pin
  899. [in] const GUID *pType, // Major type (Video/Audio/etc)
  900. [in] IUnknown *pSource, // filter or pin
  901. [in] IBaseFilter *pfCompressor,
  902. [in] IBaseFilter *pfRenderer); // can be NULL
  903.     // Sends IAMStreamControl messages to the pin of the desired category,
  904.     // (eg. "capture" or "preview") and of the desired type (eg. VIDEO or AUDIO)
  905.     // A category MUST be given.  If a filter is given, a type must be too.
  906.     // REFERENCE_TIME=NULL means NOW
  907.     // REFERENCE_TIME=MAX_TIME means never, or cancel previous request
  908.     // NULL controls all capture filters in the graph - you will get one
  909.     //     notification for each filter with a pin of that category found
  910.     // returns S_FALSE if stop will be signalled before last sample is
  911.     //     rendered.
  912.     // return a FAILURE code if the filter does not support IAMStreamControl
  913.     HRESULT ControlStream(
  914. [in] const GUID *pCategory,
  915. [in] const GUID *pType, // Major type (Video/Audio/etc)
  916. [in] IBaseFilter *pFilter,
  917. [in] REFERENCE_TIME *pstart,
  918. [in] REFERENCE_TIME *pstop,
  919. [in] WORD wStartCookie, // high word reserved
  920. [in] WORD wStopCookie); // high word reserved
  921.     // creates a pre-allocated file of a given size in bytes
  922.     HRESULT AllocCapFile(
  923. [in] LPCOLESTR lpstr,
  924. [in] DWORDLONG dwlSize);
  925.     // Copies the valid file data out of the old, possibly huge old capture
  926.     //   file into a shorter new file.
  927.     // Return S_FALSE from your progress function to abort capture, S_OK to
  928.     //   continue
  929.     HRESULT CopyCaptureFile(
  930. [in] LPOLESTR lpwstrOld,
  931. [in] LPOLESTR lpwstrNew,
  932. [in] int fAllowEscAbort, // pressing ESC will abort?
  933. [in] IAMCopyCaptureFileProgress *pCallback); // implement this to
  934. // get progress
  935.     // Helper fn to find a certain pin on a filter.
  936.     HRESULT FindPin(
  937. [in] IUnknown *pSource,
  938. [in] PIN_DIRECTION pindir, // input or output?
  939. [in] const GUID *pCategory, // what category? (or NULL)
  940. [in] const GUID *pType, // what Major type (or NULL)
  941. [in] BOOL fUnconnected, // must it be unconnected?
  942. [in] int num, // which pin matching this? (0 based)
  943. [out] IPin **ppPin);
  944. }
  945. enum _AM_RENSDEREXFLAGS {
  946.     AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x01 // Dont add any renderers
  947. };
  948. //
  949. // IFilterGraph2
  950. //
  951. // New methods on for IFilterGraph and IGraphBuilder will have to go here.
  952. //
  953. [
  954.     object,
  955.     uuid(36b73882-c2c8-11cf-8b46-00805f6cef60),
  956.     pointer_default(unique)
  957. ]
  958. interface IFilterGraph2: IGraphBuilder {
  959.     // Add a Moniker source moniker
  960.     HRESULT AddSourceFilterForMoniker(
  961.           [in] IMoniker *pMoniker,
  962.           [in] IBindCtx *pCtx,
  963.           [in, unique] LPCWSTR lpcwstrFilterName,
  964.           [out] IBaseFilter **ppFilter
  965.     );
  966.     // Specify the type for a reconnect
  967.     // This is better than Reconnect as sometime the parties to a
  968.     // reconnection can't remember what type they'd agreed (!)
  969.     HRESULT ReconnectEx
  970.         ( [in] IPin * ppin,             // the pin to disconnect and reconnect
  971.           [in, unique] const AM_MEDIA_TYPE *pmt // the type to reconnect with - can be NULL
  972.         );
  973.     // Render a pin without adding any new renderers
  974.     HRESULT RenderEx( [in] IPin *pPinOut,         // Pin to render
  975.                       [in] DWORD dwFlags,         // flags
  976.                       [in, out] DWORD *pvContext   // Unused - set to NULL
  977.                     );
  978. #if 0
  979.     // Method looks for a filter which supports the specified interface.  If such
  980.     // a filter exists, an AddRef()'ed pointer to the requested interface is placed
  981.     // in *ppInterface.
  982.     //
  983.     // *ppInterface will be NULL on return if such a filter could not be found, and
  984.     // the method will return E_NOINTERFACE.
  985.     //
  986.     // pdwIndex is an internal index that is used for obtaining subsequent interfaces.
  987.     // *pdwIndex should be initialized to zero.  It is set on return to a value that
  988.     // allows the implementation of FindFilterInterface to search for further interfaces
  989.     // if called again.  If no more such interfaces exist, the method will return E_NOINTERFACE.
  990.     //
  991.     // If pdwIndex is NULL, FindFilterInterface returns an interface only if there is just
  992.     // a single filter in the graph that supports the interface.  Otherwise it returns
  993.     // E_NOINTERFACE.
  994.     //
  995.     HRESULT FindFilterInterface( [in] REFIID iid, [out] void ** ppInterface, [in,out] LPDWORD pdwIndex );
  996.     // Tries to obtain the interface from the filter graph itself.  If this fails,
  997.     // it attempts to find the unique filter that supports the interface.
  998.     // On failure the method will return E_NOINTERFACE.  On success, it returns
  999.     // S_OK and an AddRef()'ed pointer to the requested interface in *ppInterface.
  1000.     //
  1001.     HRESULT FindInterface( [in] REFIID iid, [out] void ** ppInterface );
  1002. #endif
  1003. }
  1004. //
  1005. // StreamBuilder
  1006. // aka Graph building with constraints
  1007. // aka convergent graphs
  1008. // aka Closed captioning
  1009. [
  1010.     object,
  1011.     local,
  1012.     uuid(56a868bf-0ad4-11ce-b03a-0020af0ba770),
  1013.     pointer_default(unique)
  1014. ]
  1015. interface IStreamBuilder : IUnknown {
  1016.     // Connect this output pin directly or indirectly, using transform filters
  1017.     // if necessary to thing(s) that will render it, within this graph
  1018.     // Move from Initial state to Rendered state.
  1019.     HRESULT Render
  1020.         ( [in] IPin * ppinOut,         // the output pin
  1021.           [in] IGraphBuilder * pGraph  // the graph
  1022.         );
  1023.     // Undo what you did in Render.  Return to Initial state.
  1024.     HRESULT Backout
  1025.         ( [in] IPin * ppinOut,         // the output pin
  1026.           [in] IGraphBuilder * pGraph  // the graph
  1027.         );
  1028. }
  1029. // async reader interface - supported by file source filters. Allows
  1030. // multiple overlapped reads from different positions
  1031. [
  1032.         object,
  1033.         uuid(56a868aa-0ad4-11ce-b03a-0020af0ba770),
  1034.         pointer_default(unique)
  1035. ]
  1036. interface IAsyncReader : IUnknown
  1037. {
  1038.     // pass in your preferred allocator and your preferred properties.
  1039.     // method returns the actual allocator to be used. Call GetProperties
  1040.     // on returned allocator to learn alignment and prefix etc chosen.
  1041.     // this allocator will be not be committed and decommitted by
  1042.     // the async reader, only by the consumer.
  1043.     // Must call this before calling Request.
  1044.     HRESULT RequestAllocator(
  1045.                 [in]  IMemAllocator* pPreferred,
  1046.                 [in]  ALLOCATOR_PROPERTIES* pProps,
  1047.                 [out] IMemAllocator ** ppActual);
  1048.     // queue a request for data.
  1049.     // media sample start and stop times contain the requested absolute
  1050.     // byte position (start inclusive, stop exclusive).
  1051.     // may fail if sample not obtained from agreed allocator.
  1052.     // may fail if start/stop position does not match agreed alignment.
  1053.     // samples allocated from source pin's allocator may fail
  1054.     // GetPointer until after returning from WaitForNext.
  1055.     // Stop position must be aligned - this means it may exceed duration.
  1056.     // on completion, stop position will be corrected to unaligned
  1057.     // actual data.
  1058.     HRESULT Request(
  1059.                 [in] IMediaSample* pSample,
  1060.                 [in] DWORD_PTR dwUser);         // user context
  1061.     // block until the next sample is completed or the timeout occurs.
  1062.     // timeout (millisecs) may be 0 or INFINITE. Samples may not
  1063.     // be delivered in order. If there is a read error of any sort, a
  1064.     // notification will already have been sent by the source filter,
  1065.     // and HRESULT will be an error.
  1066.     // If ppSample is not null, then a Request completed with the result
  1067.     // code returned.
  1068.     HRESULT WaitForNext(
  1069.                 [in]  DWORD dwTimeout,
  1070.                 [out] IMediaSample** ppSample,  // completed sample
  1071.                 [out] DWORD_PTR * pdwUser); // user context
  1072.     // sync read of data. Sample passed in must have been acquired from
  1073.     // the agreed allocator. Start and stop position must be aligned.
  1074.     // equivalent to a Request/WaitForNext pair, but may avoid the
  1075.     // need for a thread on the source filter.
  1076.     HRESULT SyncReadAligned(
  1077.                 [in] IMediaSample* pSample);
  1078.     // sync read. works in stopped state as well as run state.
  1079.     // need not be aligned. Will fail if read is beyond actual total
  1080.     // length.
  1081.     HRESULT SyncRead(
  1082.                 [in]  LONGLONG llPosition, // absolute file position
  1083.                 [in]  LONG lLength, // nr bytes required
  1084.                 [out, size_is(lLength)]
  1085.       BYTE* pBuffer); // write data here
  1086.     // return total length of stream, and currently available length.
  1087.     // reads for beyond the available length but within the total length will
  1088.     // normally succeed but may block for a long period.
  1089.     HRESULT Length(
  1090.                 [out] LONGLONG* pTotal,
  1091.                 [out] LONGLONG* pAvailable);
  1092.     // cause all outstanding reads to return, possibly with a failure code
  1093.     //(VFW_E_TIMEOUT) indicating they were cancelled.
  1094.     // Between BeginFlush and EndFlush calls, Request calls will fail and
  1095.     // WaitForNext calls will always complete immediately.
  1096.     HRESULT BeginFlush(void);
  1097.     HRESULT EndFlush(void);
  1098. }
  1099. // interface provided by the filtergraph itself to let other objects
  1100. // (especially plug-in distributors, but also apps like graphedt) know
  1101. // when the graph has changed.
  1102. [
  1103.     object,
  1104.     uuid(56a868ab-0ad4-11ce-b03a-0020af0ba770),
  1105.     pointer_default(unique)
  1106. ]
  1107. interface IGraphVersion : IUnknown
  1108. {
  1109.     // returns the current graph version number
  1110.     // this is incremented every time there is a change in the
  1111.     // set of filters in the graph or in their connections
  1112.     //
  1113.     // if this is changed since your last enumeration, then re-enumerate
  1114.     // the graph
  1115.     HRESULT QueryVersion(LONG* pVersion);
  1116. }
  1117. //
  1118. // interface describing an object that uses resources.
  1119. //
  1120. // implement if: you request resources using IResourceManager. You will
  1121. // need to pass your implementation of this pointer as an in param.
  1122. //
  1123. // use if: you are a resource manager who implements IResourceManager
  1124. [
  1125.     object,
  1126.     uuid(56a868ad-0ad4-11ce-b03a-0020af0ba770),
  1127.     pointer_default(unique)
  1128. ]
  1129. interface IResourceConsumer : IUnknown
  1130. {
  1131.     // you may acquire the resource specified.
  1132.     // return values:
  1133.     //      S_OK    -- I have successfully acquired it
  1134.     //      S_FALSE -- I will acquire it and call NotifyAcquire afterwards
  1135.     //      VFW_S_NOT_NEEDED: I no longer need the resource
  1136.     //      FAILED(hr)-I tried to acquire it and failed.
  1137.     HRESULT
  1138.     AcquireResource(
  1139.         [in] LONG idResource);
  1140.     // Please release the resource.
  1141.     // return values:
  1142.     //      S_OK    -- I have released it (and want it again when available)
  1143.     //      S_FALSE -- I will call NotifyRelease when I have released it
  1144.     //      other   something went wrong.
  1145.     HRESULT
  1146.     ReleaseResource(
  1147.         [in] LONG idResource);
  1148. }
  1149. // interface describing a resource manager that will resolve contention for
  1150. // named resources.
  1151. //
  1152. // implement if: you are a resource manager. The filtergraph will be a resource
  1153. // manager, internally delegating to the system wide resource manager
  1154. // (when there is one)
  1155. //
  1156. // use if: you need resources that are limited. Use the resource manager to
  1157. // resolve contention by registering the resource with this interface,
  1158. // and requesting it from this interface whenever needed.
  1159. //
  1160. // or use if: you detect focus changes which should affect resource usage.
  1161. // Notifying change of focus to the resource manager will cause the resource
  1162. // manager to switch contended resources to the objects that have the user's
  1163. // focus
  1164. [
  1165.     object,
  1166.     uuid(56a868ac-0ad4-11ce-b03a-0020af0ba770),
  1167.     pointer_default(unique)
  1168. ]
  1169. interface IResourceManager : IUnknown
  1170. {
  1171.     // tell the manager how many there are of a resource.
  1172.     // ok if already registered. will take new count. if new count
  1173.     // is lower, will de-allocate resources to new count.
  1174.     //
  1175.     // You get back a token that will be used in further calls.
  1176.     //
  1177.     // Passing a count of 0 will eliminate this resource. There is currently
  1178.     // no defined way to find the id without knowing the count.
  1179.     //
  1180.     HRESULT
  1181.     Register(
  1182.         [in] LPCWSTR pName,         // this named resource
  1183.         [in] LONG   cResource,      // has this many instances
  1184.         [out] LONG* plToken         // token placed here on return
  1185.         );
  1186.     HRESULT
  1187.     RegisterGroup(
  1188.         [in] LPCWSTR pName,         // this named resource group
  1189.         [in] LONG cResource,        // has this many resources
  1190.         [in, size_is(cResource)]
  1191.              LONG* palTokens,      // these are the contained resources
  1192.         [out] LONG* plToken        // group resource id put here on return
  1193.         );
  1194.     // request the use of a given, registered resource.
  1195.     // possible return values:
  1196.     //      S_OK == yes you can use it now
  1197.     //      S_FALSE == you will be called back when the resource is available
  1198.     //      other - there is an error.
  1199.     //
  1200.     // The priority of this request should be affected by the associated
  1201.     // focus object -- that is, when SetFocus is called for that focus
  1202.     // object (or a 'related' object) then my request should be put through.
  1203.     //
  1204.     // A filter should pass the filter's IUnknown here. The filtergraph
  1205.     // will match filters to the filtergraph, and will attempt to trace
  1206.     // filters to common source filters when checking focus objects.
  1207.     // The Focus object must be valid for the entire lifetime of the request
  1208.     // -- until you call CancelRequest or NotifyRelease(id, p, FALSE)
  1209.     HRESULT
  1210.     RequestResource(
  1211.         [in] LONG idResource,
  1212.         [in] IUnknown* pFocusObject,
  1213.         [in] IResourceConsumer* pConsumer
  1214.         );
  1215.     // notify the resource manager that an acquisition attempt completed.
  1216.     // Call this method after an AcquireResource method returned
  1217.     // S_FALSE to indicate asynchronous acquisition.
  1218.     // HR should be S_OK if the resource was successfully acquired, or a
  1219.     // failure code if the resource could not be acquired.
  1220.     HRESULT
  1221.     NotifyAcquire(
  1222.         [in] LONG idResource,
  1223.         [in] IResourceConsumer* pConsumer,
  1224.         [in] HRESULT hr);
  1225.     // Notify the resource manager that you have released a resource. Call
  1226.     // this in response to a ReleaseResource method, or when you have finished
  1227.     // with the resource. bStillWant should be TRUE if you still want the
  1228.     // resource when it is next available, or FALSE if you no longer want
  1229.     // the resource.
  1230.     HRESULT
  1231.     NotifyRelease(
  1232.         [in] LONG idResource,
  1233.         [in] IResourceConsumer* pConsumer,
  1234.         [in] BOOL bStillWant);
  1235.     // I don't currently have the resource, and I no longer need it.
  1236.     HRESULT
  1237.     CancelRequest(
  1238.         [in] LONG idResource,
  1239.         [in] IResourceConsumer* pConsumer);
  1240.     // Notify the resource manager that a given object has been given the
  1241.     // user's focus. In ActiveMovie, this will normally be a video renderer
  1242.     // whose window has received the focus. The filter graph will switch
  1243.     // contended resources to (in order):
  1244.     //      requests made with this same focus object
  1245.     //      requests whose focus object shares a common source with this
  1246.     //      requests whose focus object shares a common filter graph
  1247.     // After calling this, you *must* call ReleaseFocus before the IUnknown
  1248.     // becomes invalid, unless you can guarantee that another SetFocus
  1249.     // of a different object is done in the meantime. No addref is held.
  1250.     //
  1251.     // The resource manager will hold this pointer until replaced or cancelled,
  1252.     // and will use it to resolve resource contention. It will call
  1253.     // QueryInterface for IBaseFilter at least and if found will call methods on
  1254.     // that interface.
  1255.     HRESULT
  1256.     SetFocus(
  1257.         [in] IUnknown* pFocusObject);
  1258.     // Sets the focus to NULL if the current focus object is still
  1259.     // pFocusObject. Call this when
  1260.     // the focus object is about to be destroyed to ensure that no-one is
  1261.     // still referencing the object.
  1262.     HRESULT
  1263.     ReleaseFocus(
  1264.         [in] IUnknown* pFocusObject);
  1265. // !!! still need
  1266. //      -- app override (some form of SetPriority)
  1267. //      -- enumeration and description of resources
  1268. }
  1269. //
  1270. // Interface representing an object that can be notified about state
  1271. // and other changes within a filter graph. The filtergraph will call plug-in
  1272. // distributors that expose this optional interface so that they can
  1273. // respond to appropriate changes.
  1274. //
  1275. // Implement if: you are a plug-in distributor (your class id is found
  1276. // under HKCRInterface<IID>Distributor= for some interface).
  1277. //
  1278. // Use if: you are the filtergraph.
  1279. [
  1280.     object,
  1281.     uuid(56a868af-0ad4-11ce-b03a-0020af0ba770),
  1282.     pointer_default(unique)
  1283. ]
  1284. interface IDistributorNotify : IUnknown
  1285. {
  1286.     // called when graph is entering stop state. Called before
  1287.     // filters are stopped.
  1288.     HRESULT Stop(void);
  1289.     // called when graph is entering paused state, before filters are
  1290.     // notified
  1291.     HRESULT Pause(void);
  1292.     // called when graph is entering running state, before filters are
  1293.     // notified. tStart is the stream-time offset parameter that will be
  1294.     // given to each filter's IBaseFilter::Run method.
  1295.     HRESULT Run(REFERENCE_TIME tStart);
  1296.     // called when the graph's clock is changing, with the new clock. Addref
  1297.     // the clock if you hold it beyond this method. Called before
  1298.     // the filters are notified.
  1299.     HRESULT SetSyncSource(
  1300.         [in] IReferenceClock * pClock);
  1301.     // called when the set of filters or their connections has changed.
  1302.     // Called on every AddFilter, RemoveFilter or ConnectDirect (or anything
  1303.     // that will lead to one of these).
  1304.     // You don't need to rebuild your list of interesting filters at this point
  1305.     // but you should release any refcounts you hold on any filters that
  1306.     // have been removed.
  1307.     HRESULT NotifyGraphChange(void);
  1308. }
  1309. typedef enum {
  1310.     AM_STREAM_INFO_START_DEFINED = 0x00000001,
  1311.     AM_STREAM_INFO_STOP_DEFINED  = 0x00000002,
  1312.     AM_STREAM_INFO_DISCARDING    = 0x00000004,
  1313.     AM_STREAM_INFO_STOP_SEND_EXTRA = 0x00000010
  1314. } AM_STREAM_INFO_FLAGS;
  1315. //  Stream information
  1316. typedef struct {
  1317.     REFERENCE_TIME tStart;
  1318.     REFERENCE_TIME tStop;
  1319.     DWORD dwStartCookie;
  1320.     DWORD dwStopCookie;
  1321.     DWORD dwFlags;
  1322. } AM_STREAM_INFO;
  1323. //
  1324. // IAMStreamControl
  1325. //
  1326. [
  1327.     object,
  1328.     uuid(36b73881-c2c8-11cf-8b46-00805f6cef60),
  1329.     pointer_default(unique)
  1330. ]
  1331. interface IAMStreamControl : IUnknown
  1332. {
  1333.     // The REFERENCE_TIME pointers may be null, which
  1334.     // indicates immediately.  If the pointer is non-NULL
  1335.     // and dwCookie is non-zero, then pins should send
  1336.     // EC_STREAM_CONTROL_STOPPED / EC_STREAM_CONTROL_STARTED
  1337.     // with an IPin pointer and the cookie, thus allowing
  1338.     // apps to tie the events back to their requests.
  1339.     // If either dwCookies is zero, or the pointer is null,
  1340.     // then no event is sent.
  1341.     // If you have a capture pin hooked up to a MUX input pin and they
  1342.     // both support IAMStreamControl, you'll want the MUX to signal the
  1343.     // stop so you know the last frame was written out.  In order for the
  1344.     // MUX to know it's finished, the capture pin will have to send one
  1345.     // extra sample after it was supposed to stop, so the MUX can trigger
  1346.     // off that.  So you would set bSendExtra to TRUE for the capture pin
  1347.     // Leave it FALSE in all other cases.
  1348.     HRESULT StartAt( [in] const REFERENCE_TIME * ptStart,
  1349.                      [in] DWORD dwCookie );
  1350.     HRESULT StopAt(  [in] const REFERENCE_TIME * ptStop,
  1351.                      [in] BOOL bSendExtra,
  1352.                      [in] DWORD dwCookie );
  1353.     HRESULT GetInfo( [out] AM_STREAM_INFO *pInfo);
  1354. }
  1355. //
  1356. // ISeekingPassThru
  1357. //
  1358. [
  1359.     object,
  1360.     uuid(36b73883-c2c8-11cf-8b46-00805f6cef60),
  1361.     pointer_default(unique)
  1362. ]
  1363. interface ISeekingPassThru : IUnknown
  1364. {
  1365.     HRESULT Init(  [in] BOOL bSupportRendering,
  1366.    [in] IPin *pPin);
  1367. }
  1368. //
  1369. // IAMStreamConfig - pin interface
  1370. //
  1371. // A capture filter or compression filter's output pin
  1372. // supports this interface - no matter what data type you produce.
  1373. // This interface can be used to set the output format of a pin (as an
  1374. // alternative to connecting the pin using a specific media type).
  1375. // After setting an output format, the pin will use that format
  1376. // the next time it connects to somebody, so you can just Render that
  1377. // pin and get a desired format without using Connect(CMediaType)
  1378. // Your pin should do that by ONLY OFFERING the media type set in SetFormat
  1379. // in its enumeration of media types, and no others.  This will ensure that
  1380. // that format is indeed used for connection (or at least offer it first).
  1381. // An application interested in enumerating accepted mediatypes may have to
  1382. // do so BEFORE calling SetFormat.
  1383. // But this interface's GetStreamCaps function can get more information
  1384. // about accepted media types than the traditional way of enumerating a pin's
  1385. // media types, so it should typically be used instead.
  1386. // GetStreamCaps gets information about the kinds of formats allowed... how
  1387. // it can stretch and crop, and the frame rate and data rates allowed (for
  1388. // video)
  1389. // VIDEO EXAMPLE
  1390. //
  1391. // GetStreamCaps returns a whole array of {MediaType, Capabilities}.
  1392. // Let's say your capture card supports JPEG anywhere between 160x120 and
  1393. // 320x240, and also the size 640x480.  Also, say it supports RGB24 at
  1394. // resolutions between 160x120 and 320x240 but only multiples of 8.  You would
  1395. // expose these properties by offering a media type of 320 x 240 JPEG
  1396. // (if that is your default or preferred size) coupled with
  1397. // capabilities saying minimum 160x120 and maximum 320x240 with granularity of
  1398. // 1.  The next pair you expose is a media type of 640x480 JPEG coupled with
  1399. // capabilities of min 640x480 max 640x480.  The third pair is media type
  1400. // 320x240 RGB24 with capabilities min 160x120 max 320x240 granularity 8.
  1401. // In this way you can expose almost every quirk your card might have.
  1402. // An application interested in knowing what compression formats you provide
  1403. // can get all the pairs and make a list of all the unique sub types of the
  1404. // media types.
  1405. //
  1406. // If a filter's output pin is connected with a media type that has rcSource
  1407. // and rcTarget not empty, it means the filter is being asked to stretch the
  1408. // rcSource sub-rectangle of its InputSize (the format of the input pin for
  1409. // a compressor, and the largest bitmap a capture filter can generate with
  1410. // every pixel unique) into the rcTarget sub-rectangle of its output format.
  1411. // For instance, if a video compressor has as input 160x120 RGB, and as output
  1412. // 320x240 MPEG with an rcSource of (10,10,20,20) and rcTarget of (0,0,100,100)
  1413. // this means the compressor is being asked to take a 10x10 piece of the 160x120
  1414. // RGB bitmap, and make it fill the top 100x100 area of a 320x240 bitmap,
  1415. // leaving the rest of the 320x240 bitmap untouched.
  1416. // A filter does not have to support this and can fail to connect with a
  1417. // media type where rcSource and rcTarget are not empty.
  1418. //
  1419. // Your output pin is connected to the next filter with a certain media
  1420. // type (either directly or using the media type passed by SetFormat),
  1421. // and you need to look at the AvgBytesPerSecond field of the format
  1422. // of that mediatype to see what data rate you are being asked to compress
  1423. // the video to, and use that data rate.  Using the number of frames per
  1424. // second in AvgTimePerFrame, you can figure out how many bytes each frame
  1425. // is supposed to be.  You can make it smaller, but NEVER EVER make a bigger
  1426. // data rate.  For a video compressor, your input pin's media type tells you
  1427. // the frame rate (use that AvgTimePerFrame).  For a capture filter, the
  1428. // output media type tells you, so use that AvgTimePerFrame.
  1429. //
  1430. // The cropping rectangle described below is the same as the rcSrc of the
  1431. // output pin's media type.
  1432. //
  1433. // The output rectangle described below is the same of the width and height
  1434. // of the BITMAPINFOHEADER of the media type of the output pin's media type
  1435. // AUDIO EXAMPLE
  1436. //
  1437. // This API can return an array of pairs of (media type, capabilities).
  1438. // This can be used to expose all kinds of wierd capabilities.  Let's say you
  1439. // do any PCM frequency from 11,025 to 44,100 at 8 or 16 bit mono or
  1440. // stereo, and you also do 48,000 16bit stereo as a special combination.
  1441. // You would expose 3 pairs.  The first pair would have Min Freq of 11025 and
  1442. // Max Freq of 44100, with MaxChannels=2 and MinBits=8 and MaxBits=8 for the
  1443. // capabilites structure, and a media type of anything you like, maybe
  1444. // 22kHz, 8bit stereo as a default.
  1445. // The 2nd pair would be the same except for MinBits=16 and MaxBits=16 in
  1446. // the capabilities structure and the media type could be something like
  1447. // 44kHz, 16bit stereo as a default (the media type in the pair should always
  1448. // be something legal as described by the capabilities structure... the
  1449. // structure tells you how you can change the media type to produce other
  1450. // legal media types... for instance changing 44kHz to 29010Hz would be legal,
  1451. // but changing bits from 16 to 14 would not be.)
  1452. // The 3rd pair would be MinFreq=48000 MaxFreq=48000 MaxChannels=2
  1453. // MinBits=16 and MaxBits=16, and the media type would be 48kHz 16bit stereo.
  1454. // You can also use the Granularity elements of the structure (like the example
  1455. // for video) if you support values that multiples of n, eg.  you could say
  1456. // minimum bits per sample 8, max 16, and granularity 8 to describe doing
  1457. // either 8 or 16 bit all in one structure
  1458. //
  1459. // If you support non-PCM formats, the media type returned in GetStreamCaps
  1460. // can show which non-PCM formats you support (with a default sample rate,
  1461. // bit rate and channels) and the capabilities structure going with that
  1462. // media type can describe which other sample rates, bit rates and channels
  1463. // you support.
  1464. [
  1465.     object,
  1466.     uuid(C6E13340-30AC-11d0-A18C-00A0C9118956),
  1467.     pointer_default(unique)
  1468. ]
  1469. interface IAMStreamConfig : IUnknown
  1470. {
  1471.     // this is the structure returned by a VIDEO filter
  1472.     //
  1473.     typedef struct _VIDEO_STREAM_CONFIG_CAPS {
  1474. GUID     guid; // will be MEDIATYPE_Video
  1475. // the logical or of all the AnalogVideoStandard's supported
  1476. // typically zero if not supported
  1477. ULONG     VideoStandard;
  1478. // the inherent size of the incoming signal... taken from the input
  1479. // pin for a compressor, or the largest size a capture filter can
  1480. // digitize the signal with every pixel still unique
  1481.         SIZE        InputSize;
  1482. // The input of a compressor filter may have to be connected for these
  1483. // to be known
  1484. // smallest rcSrc cropping rect allowed
  1485.         SIZE        MinCroppingSize;
  1486. // largest rcSrc cropping rect allowed
  1487.         SIZE        MaxCroppingSize;
  1488. // granularity of cropping size - eg only widths a multiple of 4 allowed
  1489.         int         CropGranularityX;
  1490.         int         CropGranularityY;
  1491. // alignment of cropping rect - eg rect must start on multiple of 4
  1492. int     CropAlignX;
  1493. int     CropAlignY;
  1494. // The input of a compressor filter may have to be connected for these
  1495. // to be known
  1496. // smallest bitmap this pin can produce
  1497.         SIZE        MinOutputSize;
  1498. // largest bitmap this pin can produce
  1499.         SIZE        MaxOutputSize;
  1500. // granularity of output bitmap size
  1501.         int         OutputGranularityX;
  1502.         int         OutputGranularityY;
  1503. // !!! what about alignment of rcTarget inside BIH if different?
  1504. // how well can you stretch in the x direction?  0==not at all
  1505. // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation
  1506. // etc.
  1507. int     StretchTapsX;
  1508. int     StretchTapsY;
  1509. // how well can you shrink in the x direction?  0==not at all
  1510. // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation
  1511. // etc.
  1512. int     ShrinkTapsX;
  1513. int     ShrinkTapsY;
  1514. // CAPTURE filter only - what frame rates are allowed?
  1515.         LONGLONG    MinFrameInterval;
  1516.         LONGLONG    MaxFrameInterval;
  1517. // what data rates can this pin produce?
  1518.         LONG        MinBitsPerSecond;
  1519.         LONG        MaxBitsPerSecond;
  1520.     } VIDEO_STREAM_CONFIG_CAPS;
  1521.     // this is the structure returned by an AUDIO filter
  1522.     //
  1523.     typedef struct _AUDIO_STREAM_CONFIG_CAPS {
  1524.    GUID    guid; // will be MEDIATYPE_Audio
  1525. ULONG     MinimumChannels;
  1526.     ULONG      MaximumChannels;
  1527. ULONG      ChannelsGranularity;
  1528.     ULONG      MinimumBitsPerSample;
  1529.     ULONG      MaximumBitsPerSample;
  1530. ULONG      BitsPerSampleGranularity;
  1531.     ULONG      MinimumSampleFrequency;
  1532.     ULONG      MaximumSampleFrequency;
  1533. ULONG      SampleFrequencyGranularity;
  1534.     } AUDIO_STREAM_CONFIG_CAPS;
  1535.     // - only allowed when pin is not streaming, else the call will FAIL
  1536.     // - If your output pin is not yet connected, and you can
  1537.     //   connect your output pin with this media type, you should
  1538.     //   succeed the call, and start offering it first (enumerate as format#0)
  1539.     //   from GetMediaType so that this format will be used to connect with
  1540.     //   when you do connect to somebody
  1541.     // - if your output pin is already connected, and you can provide this
  1542.     //   type, reconnect your pin.  If the other pin can't accept it, FAIL
  1543.     //   this call and leave your connection alone.
  1544.     HRESULT SetFormat(
  1545.             [in] AM_MEDIA_TYPE *pmt);
  1546.     // the format it's connected with, or will connect with
  1547.     // the application is responsible for calling DeleteMediaType(*ppmt);
  1548.     HRESULT GetFormat(
  1549.             [out] AM_MEDIA_TYPE **ppmt);
  1550.     // how many different Stream Caps structures are there?
  1551.     // also, how big is the stream caps structure?
  1552.     HRESULT GetNumberOfCapabilities(
  1553.             [out] int *piCount,
  1554.     [out] int *piSize); // pSCC of GetStreamCaps needs to be this big
  1555.     // - gets one of the pairs of {Mediatype, Caps}
  1556.     // - return S_FALSE if iIndex is too high
  1557.     // - the application is responsible for calling DeleteMediaType(*ppmt);
  1558.     // - the first thing pSCC points to is a GUID saying MEDIATYPE_Video
  1559.     //   or MEDIATYPE_Audio, so you can tell if you have a pointer to a
  1560.     //   VIDEO_STREAM_CONFIG_CAPS or an AUDIO_STREAM_CONFIG_CAPS structure
  1561.     //   There could potentially be many more possibilities other than video
  1562.     //   or audio.
  1563.     HRESULT GetStreamCaps(
  1564.     [in]  int iIndex, // 0 to #caps-1
  1565.     [out] AM_MEDIA_TYPE **ppmt,
  1566.             [out] BYTE *pSCC);
  1567. }
  1568. // Interface to control interleaving of different streams in one file
  1569. [
  1570. object,
  1571. uuid(BEE3D220-157B-11d0-BD23-00A0C911CE86),
  1572. pointer_default(unique)
  1573. ]
  1574. interface IConfigInterleaving : IUnknown
  1575. {
  1576.     import "unknwn.idl";
  1577.     typedef enum
  1578.     {
  1579.         // uninterleaved - samples written out in the order they
  1580.         // arrive
  1581.         INTERLEAVE_NONE,
  1582.             // approximate interleaving with less overhead for video
  1583.             // capture
  1584.         INTERLEAVE_CAPTURE,
  1585.         // full, precise interleaving. slower.
  1586.         INTERLEAVE_FULL
  1587.     } InterleavingMode;
  1588.     HRESULT put_Mode(
  1589.         [in] InterleavingMode mode
  1590.         );
  1591.     HRESULT get_Mode(
  1592.         [out] InterleavingMode *pMode
  1593.         );
  1594.     HRESULT put_Interleaving(
  1595.         [in] const REFERENCE_TIME *prtInterleave,
  1596.         [in] const REFERENCE_TIME *prtPreroll
  1597.         );
  1598.     HRESULT get_Interleaving(
  1599.         [out] REFERENCE_TIME *prtInterleave,
  1600.         [out] REFERENCE_TIME *prtPreroll
  1601.         );
  1602. }
  1603. // Interface to control the AVI mux
  1604. [
  1605. object,
  1606. uuid(5ACD6AA0-F482-11ce-8B67-00AA00A3F1A6),
  1607. pointer_default(unique)
  1608. ]
  1609. interface IConfigAviMux : IUnknown
  1610. {
  1611.     import "unknwn.idl";
  1612.     // control whether the AVI mux adjusts the frame rate or audio
  1613.     // sampling rate for drift when the file is closed. -1 to disables
  1614.     // this behavior.
  1615.     HRESULT SetMasterStream([in] LONG iStream);
  1616.     HRESULT GetMasterStream([out] LONG *pStream);
  1617.     // control whether the AVI mux writes out an idx1 index chunk for
  1618.     // compatibility with older AVI players.
  1619.     HRESULT SetOutputCompatibilityIndex([in] BOOL fOldIndex);
  1620.     HRESULT GetOutputCompatibilityIndex([out] BOOL *pfOldIndex);
  1621. }
  1622.     //---------------------------------------------------------------------
  1623.     //  CompressionCaps enum
  1624.     //---------------------------------------------------------------------
  1625.     // This tells you which features of IAMVideoCompression are supported
  1626.     // CanCrunch means that it can compress video to a specified data rate
  1627.     // If so, then the output pin's media type will contain that data rate
  1628.     // in the format's AvgBytesPerSecond field, and that should be used.
  1629.     typedef enum
  1630.     {
  1631.         CompressionCaps_CanQuality =  0x01,
  1632.         CompressionCaps_CanCrunch =   0x02,
  1633.         CompressionCaps_CanKeyFrame = 0x04,
  1634.         CompressionCaps_CanBFrame =   0x08,
  1635.         CompressionCaps_CanWindow =   0x10
  1636.     } CompressionCaps;
  1637.     //---------------------------------------------------------------------
  1638.     // IAMVideoCompression interface
  1639.     //
  1640.     // Control compression parameters - pin interface
  1641.     //---------------------------------------------------------------------
  1642.     // This interface is implemented by the output pin of a video capture
  1643.     // filter or video compressor that provides video data
  1644.     // You use this interface to control how video is compressed... how
  1645.     // many keyframes, etc., and to find information like capabilities and
  1646.     // the description of this compressor
  1647.     [
  1648. object,
  1649.         uuid(C6E13343-30AC-11d0-A18C-00A0C9118956),
  1650.         pointer_default(unique)
  1651.     ]
  1652.     interface IAMVideoCompression : IUnknown
  1653.     {
  1654. // - Only valid if GetInfo's pCapabilities sets
  1655. //   CompressionCaps_CanKeyFrame
  1656.         // - KeyFrameRate < 0 means use the compressor default
  1657. // - KeyFrames == 0 means only the first frame is a key
  1658.         HRESULT put_KeyFrameRate (
  1659.                     [in] long KeyFrameRate);
  1660.         HRESULT get_KeyFrameRate (
  1661.                     [out] long * pKeyFrameRate);
  1662. // - Only valid if GetInfo's pCapabilities sets
  1663. //   CompressionCaps_CanBFrame
  1664. // - If keyframes are every 10, and there are 3 P Frames per key,
  1665. //   they will be spaced evenly between the key frames and the other
  1666. //   6 frames will be B frames
  1667. // - PFramesPerKeyFrame < 0 means use the compressor default
  1668.         HRESULT put_PFramesPerKeyFrame (
  1669.                     [in] long PFramesPerKeyFrame);
  1670.         HRESULT get_PFramesPerKeyFrame (
  1671.                     [out] long * pPFramesPerKeyFrame);
  1672. // - Only valid if GetInfo's pCapabilities sets
  1673. //   CompressionCaps_CanQuality
  1674. // - Controls image quality
  1675. // - If you are compressing to a fixed data rate, a high quality
  1676. //   means try and use all of the data rate, and a low quality means
  1677. //   feel free to use much lower than the data rate if you want to.
  1678.         // - Quality < 0 means use the compressor default
  1679.         HRESULT put_Quality (
  1680.                     [in] double Quality);
  1681.         HRESULT get_Quality (
  1682.                     [out] double * pQuality);
  1683. // If you have set a data rate of 100K/sec on a 10fps movie, that
  1684. // will normally mean each frame must be <=10K.  But a window size
  1685. // means every consecutive n frames must average to the data rate,
  1686. // but an individual frame (if n > 1) is allowed to exceed the
  1687. // frame size suggested by the data rate
  1688.         HRESULT put_WindowSize (
  1689.                     [in] DWORDLONG WindowSize);
  1690.         HRESULT get_WindowSize (
  1691.                     [out] DWORDLONG * pWindowSize);
  1692. // - pszVersion might be "Version 2.1.0"
  1693. // - pszDescription might be "Danny's awesome video compressor"
  1694. // - pcbVersion and pcbDescription will be filled in with the
  1695. //   required length if they are too short
  1696. // - *pCapabilities is a logical OR of some CompressionCaps flags
  1697.         HRESULT GetInfo(
  1698.                     [out, size_is(*pcbVersion)] WCHAR * pszVersion,
  1699.                     [in,out] int *pcbVersion,
  1700.                     [out, size_is(*pcbDescription)] LPWSTR pszDescription,
  1701.                     [in,out] int *pcbDescription,
  1702.     [out] long *pDefaultKeyFrameRate,
  1703.     [out] long *pDefaultPFramesPerKey,
  1704.     [out] double *pDefaultQuality,
  1705.                     [out] long *pCapabilities  //CompressionCaps
  1706.         );
  1707. // - this means when this frame number comes along after the graph
  1708. //   is running, make it a keyframe even if you weren't going to
  1709.         HRESULT OverrideKeyFrame(
  1710.                     [in]  long FrameNumber
  1711.         );
  1712. // - Only valid if GetInfo's pCapabilities sets
  1713. //   CompressionCaps_CanCrunch
  1714. // - this means when this frame number comes along after the graph
  1715. //   is running, make it this many bytes big instead of whatever size
  1716. //   you were going to make it.
  1717.         HRESULT OverrideFrameSize(
  1718.                     [in]  long FrameNumber,
  1719.                     [in]  long Size
  1720.         );
  1721.     }
  1722.     //---------------------------------------------------------------------
  1723.     //  VfwCaptureDialogs enum
  1724.     //---------------------------------------------------------------------
  1725.     typedef enum
  1726.     {
  1727.          VfwCaptureDialog_Source = 0x01,
  1728.  VfwCaptureDialog_Format = 0x02,
  1729.  VfwCaptureDialog_Display = 0x04
  1730.     } VfwCaptureDialogs;
  1731.     //---------------------------------------------------------------------
  1732.     //  VfwCompressDialogs enum
  1733.     //---------------------------------------------------------------------
  1734.     typedef enum
  1735.     {
  1736.          VfwCompressDialog_Config = 0x01,
  1737.  VfwCompressDialog_About =  0x02,
  1738.  // returns S_OK if the dialog exists and can be shown, else S_FALSE
  1739.          VfwCompressDialog_QueryConfig = 0x04,
  1740.  VfwCompressDialog_QueryAbout =  0x08
  1741.     } VfwCompressDialogs;
  1742.     //---------------------------------------------------------------------
  1743.     // IAMVfwCaptureDialogs - filter interface
  1744.     //
  1745.     // Show a VfW capture driver dialog - SOURCE, FORMAT, or DISPLAY
  1746.     //---------------------------------------------------------------------
  1747.     // This interface is supported only by Microsoft's Video For Windows
  1748.     // capture driver Capture Filter.  It allows an application to bring up
  1749.     // one of the 3 driver dialogs that VfW capture drivers have.
  1750.     [
  1751. object,
  1752.         local,
  1753.         uuid(D8D715A0-6E5E-11D0-B3F0-00AA003761C5),
  1754.         pointer_default(unique)
  1755.     ]
  1756.     interface IAMVfwCaptureDialogs : IUnknown
  1757.     {
  1758.         HRESULT HasDialog(
  1759.                     [in]  int iDialog // VfwCaptureDialogs enum
  1760.         );
  1761.         HRESULT ShowDialog(
  1762.                     [in]  int iDialog, // VfwCaptureDialogs enum
  1763.     [in]  HWND hwnd
  1764.         );
  1765.         HRESULT SendDriverMessage(
  1766.                     [in]  int iDialog, // VfwCaptureDialogs enum
  1767.                     [in]  int uMsg,
  1768.                     [in]  long dw1,
  1769.                     [in]  long dw2
  1770.         );
  1771.         // - iDialog can be one of the VfwCaptureDialogs enums
  1772.         // - HasDialog returns S_OK if it has the dialog, else S_FALSE
  1773.   // - ShowDialog can only be called when not streaming or when another
  1774. //   dialog is not already up
  1775. // - SendDriverMessage can send a secret message to the capture driver.
  1776. //   USE IT AT YOUR OWN RISK!
  1777.     }
  1778.     //---------------------------------------------------------------------
  1779.     // IAMVfwCompressDialogs - filter interface
  1780.     //
  1781.     // Show a VfW codec driver dialog - CONFIG or ABOUT
  1782.     //---------------------------------------------------------------------
  1783.     // This interface is supported only by Microsoft's ICM Compressor filter
  1784.     // (Co).  It allows an application to bring up either the Configure or
  1785.     // About dialogs for the ICM codec that it is currently using.
  1786.     [
  1787. object,
  1788. local,
  1789.         uuid(D8D715A3-6E5E-11D0-B3F0-00AA003761C5),
  1790.         pointer_default(unique)
  1791.     ]
  1792.     interface IAMVfwCompressDialogs : IUnknown
  1793.     {
  1794.         // Bring up a dialog for this codec
  1795.         HRESULT ShowDialog(
  1796.                     [in]  int iDialog,   // VfwCompressDialogs enum
  1797.     [in]  HWND hwnd
  1798.         );
  1799.         // Calls ICGetState and gives you the result
  1800.         HRESULT GetState(
  1801.                     [out, size_is(*pcbState)] LPVOID pState,
  1802.     [in, out]  int *pcbState
  1803.         );
  1804.         // Calls ICSetState
  1805.         HRESULT SetState(
  1806.                     [in, size_is(cbState)] LPVOID pState,
  1807.     [in]  int cbState
  1808.         );
  1809.         // Send a codec specific message
  1810.         HRESULT SendDriverMessage(
  1811.                     [in]  int uMsg,
  1812.                     [in]  long dw1,
  1813.                     [in]  long dw2
  1814.         );
  1815.         // - iDialog can be one of the VfwCaptureDialogs enums
  1816.   // - ShowDialog can only be called when not streaming or when no other
  1817. //   dialog is up already
  1818.   // - an application can call GetState after ShowDialog(CONFIG) to
  1819. //   see how the compressor was configured and next time the graph
  1820.     //   is used, it can call SetState with the data it saved to return
  1821. //   the codec to the state configured by the dialog box from last time
  1822. // - GetState with a NULL pointer returns the size needed
  1823. // - SendDriverMessage can send a secret message to the codec.
  1824. //   USE IT AT YOUR OWN RISK!
  1825.     }
  1826.     //---------------------------------------------------------------------
  1827.     // IAMDroppedFrames interface
  1828.     //
  1829.     // Report status of capture - pin interface
  1830.     //---------------------------------------------------------------------
  1831.     // A capture filter's video output pin supports this.  It reports
  1832.     // how many frames were not sent (dropped), etc.
  1833.     // Every time your filter goes from STOPPED-->PAUSED, you reset all your
  1834.     // counts to zero.
  1835.     // An app may call this all the time while you are capturing to see how
  1836.     // capturing is going.  MAKE SURE you always return as current information
  1837.     // as possible while you are running.
  1838.     // When your capture filter starts running, it starts by sending frame 0,
  1839.     // then 1, 2, 3, etc.  The time stamp of each frame sent should correspond
  1840.     // to the graph clock's time when the image was digitized.  The end time
  1841.     // is the start time plus the duration of the video frame.
  1842.     // You should also set the MediaTime of each sample (SetMediaTime) as well.
  1843.     // This should be the frame number ie (0,1) (1,2) (2,3).
  1844.     // If a frame is dropped, a downstream filter will be able to tell easily
  1845.     // not by looking for gaps in the regular time stamps, but by noticing a
  1846.     // frame number is missing (eg.  (1,2) (2,3) (4,5) (5,6) means frame 3
  1847.     // was dropped.
  1848.     // Using the info provided by this interface, an application can figure out
  1849.     // the number of frames dropped, the frame rate achieved (the length of
  1850.     // time the graph was running divided by the number of frames not dropped),
  1851.     // and the data rate acheived (the length of time the graph was running
  1852.     // divided by the average frame size).
  1853.     // If your filter is running, then paused, and then run again, you need
  1854.     // to continue to deliver frames as if it was never paused.  The first
  1855.     // frame after the second RUN cannot be time stamped earlier than the last
  1856.     // frame sent before the pause.
  1857.     // Your filter must always increment the MediaTime of each sample sent.
  1858.     // Never send the same frame # twice, and never go back in time.  The
  1859.     // regular time stamp of a sample can also never go back in time.
  1860.     [
  1861. object,
  1862.         uuid(C6E13344-30AC-11d0-A18C-00A0C9118956),
  1863.         pointer_default(unique)
  1864.     ]
  1865.     interface IAMDroppedFrames : IUnknown
  1866.     {
  1867.         // Get the number of dropped frames
  1868.         HRESULT GetNumDropped(
  1869.                     [out]  long * plDropped
  1870.         );
  1871.         //Get the number of non-dropped frames
  1872.         HRESULT GetNumNotDropped(
  1873.                     [out]  long * plNotDropped
  1874.         );
  1875. // - plArray points to an array of lSize longs.  The filter will
  1876. //   fill it with the frame number of the first lSize frames dropped.
  1877. //   A filter may not have bothered to remember as many as you asked
  1878. //   for, so it will set *plNumCopied to the number of frames it filled
  1879. //   in.
  1880.         HRESULT GetDroppedInfo(
  1881.                     [in]   long lSize,
  1882.                     [out]  long * plArray,
  1883.                     [out]  long *  plNumCopied
  1884.         );
  1885. // - This is the average size of the frames it didn't drop (in bytes)
  1886.         HRESULT GetAverageFrameSize(
  1887.                     [out]  long * plAverageSize
  1888.         );
  1889.     }
  1890.     cpp_quote("#define AMF_AUTOMATICGAIN -1.0")
  1891.     //---------------------------------------------------------------------
  1892.     // IAMAudioInputMixer interface
  1893.     //
  1894.     // Sets the recording levels, pan and EQ for the audio card inputs
  1895.     //---------------------------------------------------------------------
  1896.     // This interface is implemented by each input pin of an audio capture
  1897.     // filter, to tell it what level, panning, and EQ to use for each input.
  1898.     // The name of each pin will reflect the type of input, eg. "Line input 1"
  1899.     // or "Mic".  An application uses the pin names to decide how it wants to
  1900.     // set the recording levels
  1901.     // This interface can also be supported by the audio capture filter itself
  1902.     // to control to overall record level and panning after the mix
  1903.     [
  1904. object,
  1905.         uuid(54C39221-8380-11d0-B3F0-00AA003761C5),
  1906.         pointer_default(unique)
  1907.     ]
  1908.     interface IAMAudioInputMixer : IUnknown
  1909.     {
  1910. // This interface is only supported by the input pins, not the filter
  1911.   // If disabled, this channel will not be mixed in as part of the
  1912. // recorded signal.
  1913.         HRESULT put_Enable (
  1914.     [in] BOOL fEnable); // TRUE=enable FALSE=disable
  1915. //Is this channel enabled?
  1916.         HRESULT get_Enable (
  1917.     [out] BOOL *pfEnable);
  1918. // When set to mono mode, making a stereo recording of this channel
  1919.   // will have both channels contain the same data... a mixture of the
  1920. // left and right signals
  1921.         HRESULT put_Mono (
  1922.     [in] BOOL fMono); // TRUE=mono FALSE=multi channel
  1923.         //all channels combined into a mono signal?
  1924.         HRESULT get_Mono (
  1925.     [out] BOOL *pfMono);
  1926.   // !!! WILL CARDS BE ABLE TO BOOST THE GAIN?
  1927.         //Set the record level for this channel
  1928.         HRESULT put_MixLevel (
  1929.                     [in] double Level); // 0 = off, 1 = full (unity?) volume
  1930. // AMF_AUTOMATICGAIN, if supported,
  1931. // means automatic
  1932.         //Get the record level for this channel
  1933.         HRESULT get_MixLevel (
  1934.                     [out] double *pLevel);
  1935. // For instance, when panned full left, and you make a stereo recording
  1936. // of this channel, you will record a silent right channel.
  1937.         HRESULT put_Pan (
  1938.                     [in] double Pan); // -1 = full left, 0 = centre, 1 = right