diff options
Diffstat (limited to '')
-rw-r--r-- | sdk/dx8sdk/Include/DShowIDL/axextend.idl | 5169 |
1 files changed, 0 insertions, 5169 deletions
diff --git a/sdk/dx8sdk/Include/DShowIDL/axextend.idl b/sdk/dx8sdk/Include/DShowIDL/axextend.idl deleted file mode 100644 index 257fb19a..00000000 --- a/sdk/dx8sdk/Include/DShowIDL/axextend.idl +++ /dev/null @@ -1,5169 +0,0 @@ -//------------------------------------------------------------------------------ -// File: AXExtend.idl -// -// Desc: Extended streaming interface definitions for the ActiveMovie -// streaming and synchronization architecture. Core streaming -// interfaces are in AXCore.idl, and control interfaces for the -// type library are in Control.odl. -// -// Copyright (c) 1992 - 2000, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - - -// include after unknwn.idl, objidl.idl and axcore.idl - - -// forward declarations - these are the interfaces declared in this file - -interface IEnumRegFilters; -interface IFileSourceFilter; -interface IFileSinkFilter; -interface IFileSinkFilter2; -interface IGraphBuilder; -interface ICaptureGraphBuilder; -interface ICaptureGraphBuilder2; -interface IAMCopyCaptureFileProgress; -interface IFilterMapper; -interface IFilterMapper2; -interface IMediaEventSink; -interface IOverlay; -interface IOverlayNotify; -interface IOverlayNotify2; -interface IQualityControl; -interface ISeekingPassThru; -interface IAMStreamConfig; -interface IAMDevMemoryAllocator; -interface IAMDevMemoryControl; -interface IConfigInterleaving; -interface IConfigAviMux; -interface IAMVideoCompression; -interface IAMVfwCaptureDialogs; -interface IAMVfwCompressDialogs; -interface IAMDroppedFrames; -interface IAMAudioInputMixer; -interface IAMBufferNegotiation; -interface IAMAnalogVideoDecoder; -interface IAMVideoProcAmp; -interface IAMAnalogVideoEncoder; -interface IAMCameraControl; -interface IAMCrossbar; -interface IAMTVTuner; -interface IKsPropertySet; -interface IAMPhysicalPinInfo; -interface IAMExtDevice; -interface IAMExtTransport; -interface IAMTimecodeReader; -interface IAMTimecodeGenerator; -interface IAMTimecodeDisplay; -interface IDrawVideoImage; -interface IDecimateVideoImage; -interface IAMVideoDecimationProperties; -interface IAMPushSource; -interface IAMAudioRendererStats; -interface IAMLatency; -interface IAMGraphStreams; -interface IAMOverlayFX; -interface IAMOpenProgress; -interface IMpeg2Demultiplexer ; -interface IMPEG2StreamIdMap ; -interface IEnumStreamIdMap ; -interface IAMClockSlave ; -interface IEncoderAPI; -interface IVideoEncoder; -interface IAMGraphBuilderCallback; -interface IAMCertifiedOutputProtection; - -//========================================================================== -//========================================================================== -// IEnumRegFilters interface -- enumerates registered filters. -// enumerator interface returned from IFilterMapper::EnumMatchingFilters(). -// based on IEnum pseudo-template -//========================================================================== -//========================================================================== - -typedef struct { - CLSID Clsid; // class id of the filter - LPWSTR Name; // name of filter -} REGFILTER; - -[ -object, -uuid(56a868a4-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] - -// The point of the mapper is to avoid loading filters. By looking in the -// registry we can reduce the number of filters which must be loaded and tried. -// This enumerator returns descriptors of filters (including the GUIDs that -// CoCreateInstance can instantiate). The filters themselves are not loaded. - -interface IEnumRegFilters : IUnknown { - import "unknwn.idl"; - - // The caller must use CoTaskMemFree to free each REGFILTER* returned - // in the array. - HRESULT Next - ( [in] ULONG cFilters, // place this many filters... - [out] REGFILTER ** apRegFilter, // ...in this array of REGFILTER* - [out] ULONG * pcFetched // actual count passed returned here - ); - - // I can't think why anyone would want to skip, so it's not implemented. - // (anyone who thinks they know what they would be skipping over is probably - // missing some piece of the jigsaw). This ALWAYS returns E_NOTIMPL. - - HRESULT Skip( - [in] ULONG cFilters - ); - - HRESULT Reset(void); - - // No cloning either - also ALWAYS returns E_NOTIMPL. - - HRESULT Clone( - [out] IEnumRegFilters **ppEnum - ); -} - - -typedef IEnumRegFilters *PENUMREGFILTERS; - -//======================================================================== -//======================================================================== -// abstraction representing the registered information about filters. -// This allows properties of filters to be looked up without loading them. -//======================================================================== -//======================================================================== - -[ -object, -uuid(56a868a3-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IFilterMapper : IUnknown { - import "unknwn.idl"; - - //========================================================================== - // Registration functions. - // A filter should be registered before any other use. - // The registration can be NON_VOLATILE (i.e. permanent, do once ever) - // or VOLATILE (once per boot of the system). - // UnregisterFilter (obviously) removes the registration. - // The action of any of the other calls on unregistered filters is undefined. - // it will either work or you'll get an error, but I'm not saying which. - //========================================================================== - - // Four predefined values controling the order in which filters are tried - // for intelligent graph building. Intermediate values are legal. - // Any value <=MERIT_DO_NOT_USE will mean that the filter will never - // be tried by the filtergrah to automatically complete a connection. - - enum { MERIT_PREFERRED = 0x800000, - MERIT_NORMAL = 0x600000, - MERIT_UNLIKELY = 0x400000, - MERIT_DO_NOT_USE = 0x200000, - MERIT_SW_COMPRESSOR = 0x100000, - MERIT_HW_COMPRESSOR = 0x100050 - }; - - // Register a filter - - HRESULT RegisterFilter - ( [in] CLSID clsid, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name for the filter - [in] DWORD dwMerit // DO_NOT_USE, UNLIKELY, NORMAL or PREFERRED. - ); - - - // Register an identifiable instance of a filter. This deals with cases - // such as two similar sound cards which are driven by the same driver, - // but we want to choose which oif these cards the sound will come out of. - // This is not needed if there is only one instance of the filter - // (e.g. there is only one sound card in the machine) or if all instances - // of the filter are equivalent. - - // The filter itself must have already been registered // ??? Is that true? - HRESULT RegisterFilterInstance - ( [in] CLSID clsid, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name of instance. - [out] CLSID *MRId // Returned Media Resource Id. A - // locally unique id for this instance - // of this filter - ); - - - HRESULT RegisterPin - ( [in] CLSID Filter, // GUID of filter - [in] LPCWSTR Name, // Name of the pin - [in] BOOL bRendered, // The filter renders this input - [in] BOOL bOutput, // TRUE if this is an Output pin - [in] BOOL bZero, // TRUE if OK for zero instances of pin - // In this case you will have to Create - // a pin to have even one instance - [in] BOOL bMany, // TRUE if OK for many instances of pin - [in] CLSID ConnectsToFilter, // Filter it connects to if it has - // subterranean connection, else NULL - [in] LPCWSTR ConnectsToPin // Name of pin it connects to - // NULL for output pins - ); - - HRESULT RegisterPinType - ( [in] CLSID clsFilter, // GUID of filter - [in] LPCWSTR strName, // Descriptive name of the pin - [in] CLSID clsMajorType, // Major type of the data stream - [in] CLSID clsSubType // Sub type of the data stream - ); - - - HRESULT UnregisterFilter - ( [in] CLSID Filter // GUID of filter - ); - - - HRESULT UnregisterFilterInstance - ( [in] CLSID MRId // Media Resource Id of this instance - ); - - - HRESULT UnregisterPin - ( [in] CLSID Filter, // GUID of filter - [in] LPCWSTR Name // Name of the pin - ); - - - // Set *ppEnum to be an enumerator for filters matching the requirements. - - HRESULT EnumMatchingFilters - ( [out] IEnumRegFilters **ppEnum // enumerator returned - , [in] DWORD dwMerit // at least this merit needed - , [in] BOOL bInputNeeded // need at least one input pin - , [in] CLSID clsInMaj // input major type - , [in] CLSID clsInSub // input sub type - , [in] BOOL bRender // must the input be rendered? - , [in] BOOL bOututNeeded // need at least one output pin - , [in] CLSID clsOutMaj // output major type - , [in] CLSID clsOutSub // output sub type - ); - -} - -// structure used to identify media types a pin handles. Used for -// registration through IFilterMapper and IFilterMapper2 -// -typedef struct -{ - const CLSID * clsMajorType; - const CLSID * clsMinorType; -} REGPINTYPES; - -// describes pin for filter registration. Used for registration -// through IFilterMapper and IFilterMapper2 -// -typedef struct -{ - LPWSTR strName; - - // The filter renders this input - BOOL bRendered; - - // This is an Output pin - BOOL bOutput; - - // OK to have zero instances of pin In this case you will have to - // Create a pin to have even one instance - BOOL bZero; - - // OK to create many instance of pin - BOOL bMany; - - const CLSID * clsConnectsToFilter; - const WCHAR * strConnectsToPin; - - UINT nMediaTypes; - const REGPINTYPES * lpMediaType; -} REGFILTERPINS; - -// mediums (as defined in the Windows NT DDK) for registration with -// IFilterMapper2 -// -typedef struct -{ - CLSID clsMedium; - DWORD dw1; - DWORD dw2; -} REGPINMEDIUM; - -// flags for dwFlags in REFILTERPINS2 -enum -{ - // OK to have zero instances of pin In this case you will have to - // Create a pin to have even one instance - REG_PINFLAG_B_ZERO = 0x1, - - // The filter renders this input - REG_PINFLAG_B_RENDERER = 0x2, - - // OK to create many instance of pin - REG_PINFLAG_B_MANY = 0x4, - - // This is an Output pin - REG_PINFLAG_B_OUTPUT = 0x8 -}; - - -// describes pin for filter registration through IFilterMapper2 -typedef struct -{ - // combination of REG_PINFLAG flags - DWORD dwFlags; - - // number of instances of the pin if known - UINT cInstances; - - UINT nMediaTypes; - [size_is(nMediaTypes)] const REGPINTYPES * lpMediaType; - - UINT nMediums; - [size_is(nMediums)] const REGPINMEDIUM *lpMedium; - - // pin category (for Kernel Streaming pins) as defined in the - // Windows NT DDK - const CLSID *clsPinCategory; - -} REGFILTERPINS2; - -// describes filter for registration through IFilterMapper2 -typedef struct -{ - DWORD dwVersion; // 1 or 2 - DWORD dwMerit; - - /* unnamed union */ - [switch_is(dwVersion)] [switch_type(DWORD)] union - { - [case(1)] - - struct - { - ULONG cPins; - [size_is(cPins)] const REGFILTERPINS *rgPins; - }; - - [case(2)] - - struct - { - ULONG cPins2; - [size_is(cPins2)] const REGFILTERPINS2 *rgPins2; - }; - - [default] - ; - } ; - -} REGFILTER2; - - - -[ -object, -uuid(b79bb0b0-33c1-11d1-abe1-00a0c905f375), -pointer_default(unique) -] -interface IFilterMapper2 : IUnknown { - import "unknwn.idl"; - - // create or rename ActiveMovie category - HRESULT CreateCategory - ( [in] REFCLSID clsidCategory, - [in] DWORD dwCategoryMerit, - [in] LPCWSTR Description - ); - - HRESULT UnregisterFilter - ( [in] const CLSID *pclsidCategory, - [in] const OLECHAR *szInstance, - [in] REFCLSID Filter // GUID of filter - ); - - // Register a filter, pins, and media types under a category. - HRESULT RegisterFilter - ( [in] REFCLSID clsidFilter, // GUID of the filter - [in] LPCWSTR Name, // Descriptive name for the filter - - // ppMoniker can be null. or *ppMoniker can contain the - // moniker where this filter data will be written; - // *ppMoniker will be set to null on return. or *ppMoniker - // can be null in which case the moniker will be returned - // with refcount. - [in, out] IMoniker **ppMoniker, - - // can be null - [in] const CLSID *pclsidCategory, - - // cannot be null - [in] const OLECHAR *szInstance, - - // rest of filter and pin registration - [in] const REGFILTER2 *prf2 - ); - - // Set *ppEnum to be an enumerator for filters matching the - // requirements. - HRESULT EnumMatchingFilters - ( [out] IEnumMoniker **ppEnum // enumerator returned - , [in] DWORD dwFlags // 0 - , [in] BOOL bExactMatch // don't match wildcards - , [in] DWORD dwMerit // at least this merit needed - , [in] BOOL bInputNeeded // need at least one input pin - , [in] DWORD cInputTypes // Number of input types to match - // Any match is OK - , [size_is(cInputTypes*2)] const GUID *pInputTypes // input major+subtype pair array - , [in] const REGPINMEDIUM *pMedIn // input medium - , [in] const CLSID *pPinCategoryIn // input pin category - , [in] BOOL bRender // must the input be rendered? - , [in] BOOL bOutputNeeded // need at least one output pin - , [in] DWORD cOutputTypes // Number of output types to match - // Any match is OK - , [size_is(cOutputTypes*2)] const GUID *pOutputTypes // output major+subtype pair array - , [in] const REGPINMEDIUM *pMedOut // output medium - , [in] const CLSID *pPinCategoryOut // output pin category - ); -} - -[ -object, -uuid(b79bb0b1-33c1-11d1-abe1-00a0c905f375), -pointer_default(unique) -] -interface IFilterMapper3 : IFilterMapper2 { - // new interface to allow creating filters using the mapper's devenum instance - // primarily needed for out-of-proc access to a graph - HRESULT GetICreateDevEnum( [out] ICreateDevEnum **ppEnum ); -} - -//======================================================================== -//======================================================================== -// Defines IQualityControl interface -// -// Defines quality messages and allows a quality manager to install itself -// as the sink for quality messages. -//======================================================================== -//======================================================================== - -typedef enum tagQualityMessageType { - Famine, - Flood -} QualityMessageType; - -typedef struct tagQuality { - QualityMessageType Type; - long Proportion; // milli-units. 1000 = no change - // for Flood: - // What proportion of the media samples currently - // coming through are required in the future. - // 800 means please drop another 20% - // For Famine: - // How much to "keep in" e.g. 800 means send me - // 20% less e.g. by dropping 20% of the samples. - // 1100 would mean "I'm coping, send me more". - REFERENCE_TIME Late; - // How much you need to catch up by - REFERENCE_TIME TimeStamp; - // The stream time when this was generated (probably - // corresponds to the start time on some sample). -} Quality; - -typedef IQualityControl *PQUALITYCONTROL; - - -[ -object, -uuid(56a868a5-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IQualityControl : IUnknown { - - // Notify the recipient that a quality change is requested. - // pSelf is the IBaseFilter* of the sender. - // this is sent from a filter - // to (the quality manager or) an upstream peer. - HRESULT Notify - ( [in] IBaseFilter * pSelf, - [in] Quality q - ); - - // Notify the recipient that future quality messages are to be sent - // to iqc. If piqc is NULL then quality messages are to default back to - // the upstream peer. - // This is sent from the quality manager to a filter. - // The recipient should hold piqc as a WEAK reference, - // i.e. do not AddRef it, do not Release it. - HRESULT SetSink - ( [in] IQualityControl * piqc - ); -} - -//===================================================================== -//===================================================================== -// Definitions required for overlay transport -//===================================================================== -//===================================================================== - - -// Used to communicate the colour that the IOverlay client wants the window -// painted in so that it can draw directly to the correct clipping region -// A colour key can be described in two alternate ways, the first is by a -// range of one or more (system) palette indices. The second is by defining -// a colour cube with two RGB values, any of which would be acceptable. -// -// The CK values are consistent with GDI PALETTEINDEX and PALETTERGB macros - - -enum { CK_NOCOLORKEY = 0x0, // No color key is required - CK_INDEX = 0x1, // Index into the current system palette - CK_RGB = 0x2 }; // Color key is an RGB value (or range) - -typedef struct tagCOLORKEY { - - DWORD KeyType; // Explains meaning of the structure - DWORD PaletteIndex; // Palette index if available - COLORREF LowColorValue; // Low colour space RGB value - COLORREF HighColorValue; // Defines the high RGB value - -} COLORKEY; - -// When a filter sets up an advise link it can ask that only certain types -// of notifications be sent, for example just palette changes. While this -// doesn't mean that the other notification call backs won't ever be called -// the IOverlay implementation may use this as an efficiency optimisation - -enum { ADVISE_NONE = 0x0, // No notifications required - ADVISE_CLIPPING = 0x1, // Synchronous clip information - ADVISE_PALETTE = 0x2, // Palette change notifications - ADVISE_COLORKEY = 0x4, // Called when colour key changes - ADVISE_POSITION = 0x8, // Likewise when window moves etc - ADVISE_DISPLAY_CHANGE = 0x10 // Called on WM_DISPLAYCHANGE - }; - -const DWORD ADVISE_ALL = ADVISE_CLIPPING | - ADVISE_PALETTE | - ADVISE_COLORKEY | - ADVISE_POSITION; - -const DWORD ADVISE_ALL2 = ADVISE_ALL | - ADVISE_DISPLAY_CHANGE; - -// This isn't defined when you run IDL - -cpp_quote("#ifndef _WINGDI_") - -typedef struct _RGNDATAHEADER { - DWORD dwSize; - DWORD iType; - DWORD nCount; - DWORD nRgnSize; - RECT rcBound; -} RGNDATAHEADER; - -typedef struct _RGNDATA { - RGNDATAHEADER rdh; - char Buffer[1]; -} RGNDATA; - -cpp_quote("#endif") - - -//===================================================================== -//===================================================================== -// Defines IOverlayNotify interface -// -// This interface gives asynchronous notifications of changes to the -// rendering window - such as changes to the exposed window area -//===================================================================== -//===================================================================== - -[ -object, -local, -uuid(56a868a0-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IOverlayNotify : IUnknown { - - // IOverlayNotify methods - - // This notifies the filter of palette changes, the filter should copy - // the array of RGBQUADs if it needs to use them after returning. This - // is not called when the palette is actually changed in the display - // but at a short time after (in sync with WM_PALETTECHANGED messages) - - HRESULT OnPaletteChange( - [in] DWORD dwColors, // Number of colours present - [in] const PALETTEENTRY *pPalette); // Array of palette colours - - // This provides synchronous clip changes so that the client is called - // before the window is moved to freeze the video, and then when the - // window has stabilised it is called again to start playback again. - // If the window rect is all zero then the window is invisible, the - // filter must take a copy of the information if it wants to keep it - - HRESULT OnClipChange( - [in] const RECT *pSourceRect, // Region of video to use - [in] const RECT *pDestinationRect, // Where video goes - [in] const RGNDATA *pRgnData); // Defines clipping information - - HRESULT OnColorKeyChange([in] const COLORKEY *pColorKey); - - // The calls to OnClipChange happen in sync with the window. So it is - // called with an empty clip list before the window moves to freeze - // the video, and then when the window has stabilised it is called - // again with the new clip list. The OnPositionChange callback is for - // overlay cards that don't want the expense of synchronous clipping - // updates and just want to know when the source or destination video - // positions change. They will NOT be called in sync with the window - // but at some point after the window has changed (basicly in time - // with WM_SIZE etc messages received). This is therefore suitable - // for overlay cards that don't inlay their data to the frame buffer - // NOTE the destination is NOT clipped to the visible display area - - HRESULT OnPositionChange([in] const RECT *pSourceRect, - [in] const RECT *pDestinationRect); -} - -typedef IOverlayNotify *POVERLAYNOTIFY; - - -//===================================================================== -//===================================================================== -// Defines IOverlayNotify2 interface -// -// This interface gives asynchronous notifications of changes to the -// rendering window - such as changes to the exposed window area -// This is optionally supported by the advise sink for the purposes -// of accepting OnDisplayChange notification. -//===================================================================== -//===================================================================== - -cpp_quote("#if !defined(HMONITOR_DECLARED) && !defined(HMONITOR) && (WINVER < 0x0500)") -cpp_quote("#define HMONITOR_DECLARED") -cpp_quote("#if 0") -typedef HANDLE HMONITOR; -cpp_quote("#endif") -cpp_quote("DECLARE_HANDLE(HMONITOR);") -cpp_quote("#endif") - -[ -object, -local, -uuid(680EFA10-D535-11D1-87C8-00A0C9223196), -pointer_default(unique) -] -interface IOverlayNotify2 : IOverlayNotify { - - // IOverlayNotify2 methods - - HRESULT OnDisplayChange( // ADVISE_DISPLAY_CHANGE - HMONITOR hMonitor); -} - -typedef IOverlayNotify2 *POVERLAYNOTIFY2; - - -//===================================================================== -//===================================================================== -// Defines IOverlay interface -// -// This interface provides information so that a filter can write direct to -// the frame buffer while placing the video in the correct window position -//===================================================================== -//===================================================================== - -[ -object, -local, -uuid(56a868a1-0ad4-11ce-b03a-0020af0ba770), -pointer_default(unique) -] -interface IOverlay : IUnknown { - - // IOverlay methods - - HRESULT GetPalette( - [out] DWORD *pdwColors, // Number of colours present - [out] PALETTEENTRY **ppPalette); // Where to put palette data - - HRESULT SetPalette( - [in] DWORD dwColors, // Number of colours present - [in] PALETTEENTRY *pPalette); // Colours to use for palette - - // If you change the colour key through SetColorKey then all the advise - // links will receive an OnColorKeyChange callback with the new colour - - HRESULT GetDefaultColorKey([out] COLORKEY *pColorKey); - HRESULT GetColorKey([out] COLORKEY *pColorKey); - HRESULT SetColorKey([in,out] COLORKEY *pColorKey); - HRESULT GetWindowHandle([out] HWND *pHwnd); - - // The IOverlay implementation allocates the memory for the clipping - // rectangles as it can be variable in length. The filter calling - // this method should free the memory when it is finished with it - - HRESULT GetClipList([out] RECT *pSourceRect, - [out] RECT *pDestinationRect, - [out] RGNDATA **ppRgnData); - - // Returns the current video source and destination - - HRESULT GetVideoPosition([out] RECT *pSourceRect, - [out] RECT *pDestinationRect); - - HRESULT Advise( - [in] IOverlayNotify *pOverlayNotify, // Notification interface - [in] DWORD dwInterests); // Callbacks interested in - - HRESULT Unadvise(); // Stop the callbacks now -} - -typedef IOverlay *POVERLAY; - - -//===================================================================== -//===================================================================== -// control related interfaces (others are defined in control.odl) -//===================================================================== -//===================================================================== - - -//===================================================================== -//===================================================================== -// Defines IMediaEventSink interface -// -// Exposed by filtergraph. Called by filters to notify events. Will be -// passed on to application by the IMediaControl event methods. -//===================================================================== -//===================================================================== - -[ - object, - uuid(56a868a2-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IMediaEventSink : IUnknown { - - // notify an event. will be queued, but not delivered to - // the application on this thread. - HRESULT Notify( - [in] long EventCode, - [in] LONG_PTR EventParam1, - [in] LONG_PTR EventParam2 - ); -} - -typedef IMediaEventSink *PMEDIAEVENTSINK; - -//===================================================================== -//===================================================================== -// Defines IFileSourceFilter interface -// -// Exposed by source filters to set the file name and media type. -//===================================================================== -//===================================================================== - -[ - object, - uuid(56a868a6-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IFileSourceFilter : IUnknown { - - // Load a file and assign it the given media type - HRESULT Load( - [in] LPCOLESTR pszFileName, // Pointer to absolute path of file to open - [in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL - ); - // Get the currently loaded file name - HRESULT GetCurFile( - [out] LPOLESTR *ppszFileName, // Pointer to the path for the current file - [out] AM_MEDIA_TYPE *pmt // Pointer to the media type - ); -} - -typedef IFileSourceFilter *PFILTERFILESOURCE; - -//===================================================================== -//===================================================================== -// Defines IFileSinkFilter interface -// -// Exposed by renderers to set the output file name. -//===================================================================== -//===================================================================== - -[ - object, - uuid(a2104830-7c70-11cf-8bce-00aa00a3f1a6), - pointer_default(unique) -] -interface IFileSinkFilter : IUnknown { - - // Output to this file. default is to open the existing file - HRESULT SetFileName( - [in] LPCOLESTR pszFileName, // Pointer to absolute path of output file - [in, unique] const AM_MEDIA_TYPE *pmt // Media type of file - can be NULL - ); - // Get the current file name - HRESULT GetCurFile( - [out] LPOLESTR *ppszFileName, // Pointer to the path for the current file - [out] AM_MEDIA_TYPE *pmt // Pointer to the media type - ); -} - -typedef IFileSinkFilter *PFILTERFILESINK; - -[ - object, - uuid(00855B90-CE1B-11d0-BD4F-00A0C911CE86), - pointer_default(unique) -] -interface IFileSinkFilter2 : IFileSinkFilter { - - HRESULT SetMode( - [in] DWORD dwFlags // AM_FILESINK_FLAGS - ); - - HRESULT GetMode( - [out] DWORD *pdwFlags // AM_FILESINK_FLAGS - ); -} - -typedef IFileSinkFilter2 *PFILESINKFILTER2; - -typedef enum { - - // create a new file - AM_FILE_OVERWRITE = 0x00000001, - -} AM_FILESINK_FLAGS; - - -// -// Intelligent connectivity for filters - an interface supported by -// filter graphs (since it is an extension to IFilterGraph) that supports -// building of graphs by automatic selection and connection of appropriate -// filters - -[ - object, - uuid(56a868a9-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IGraphBuilder : IFilterGraph { - // Connect these two pins directly or indirectly, using transform filters - // if necessary. - - HRESULT Connect - ( [in] IPin * ppinOut, // the output pin - [in] IPin * ppinIn // the input pin - ); - - - // Connect this output pin directly or indirectly, using transform filters - // if necessary to something that will render it. - - HRESULT Render - ( [in] IPin * ppinOut // the output pin - ); - - - // Build a filter graph that will render this file using this play list. - // If lpwstrPlayList is NULL then it will use the default play list - // which will typically render the whole file. - - HRESULT RenderFile - ( [in] LPCWSTR lpcwstrFile, - [in, unique] LPCWSTR lpcwstrPlayList - ); - - - // Add to the filter graph a source filter for this file. This would - // be the same source filter that would be added by calling Render. - // This call gives you more control over building - // the rest of the graph, e.g. AddFilter(<a renderer of your choice>) - // and then Connect the two. - // The IBaseFilter* interface exposed by the source filter is returned - // in ppFilter, addrefed already for you - // The filter will be known by the name lpcwstrFIlterName - // nn this filter graph, - HRESULT AddSourceFilter - ( [in] LPCWSTR lpcwstrFileName, - [in, unique] LPCWSTR lpcwstrFilterName, - [out] IBaseFilter* *ppFilter - ); - - - // If this call is made then trace information will be written to the - // file showing the actions taken in attempting to perform an operation. - HRESULT SetLogFile - ( [in] DWORD_PTR hFile // open file handle e.g. from CreateFile - ); - - - // Request that the graph builder should return as soon as possible from - // its current task. - // Note that it is possible fot the following to occur in the following - // sequence: - // Operation begins; Abort is requested; Operation completes normally. - // This would be normal whenever the quickest way to finish an operation - // was to simply continue to the end. - HRESULT Abort(); - - // Return S_OK if the curent operation is to continue, - // return S_FALSE if the current operation is to be aborted. - // This method can be called as a callback from a filter which is doing - // some operation at the request of the graph. - HRESULT ShouldOperationContinue(); - -} - - -// -// New capture graph builder - -[ - object, - uuid(bf87b6e0-8c27-11d0-b3f0-00aa003761c5), - pointer_default(unique) -] -interface ICaptureGraphBuilder : IUnknown { - - // Use this filtergraph - HRESULT SetFiltergraph( - [in] IGraphBuilder *pfg); - - // what filtergraph are you using? - // *ppfg->Release() when you're done with it - HRESULT GetFiltergraph( - [out] IGraphBuilder **ppfg); - - // creates a rendering section in the filtergraph consisting of a MUX - // of some filetype, and a file writer (and connects them together) - // *ppf->Release() when you're done with it - // *ppSink->Release() when you're done with it - HRESULT SetOutputFileName( - [in] const GUID *pType, // type of file to write, eg. MEDIASUBTYPE_Avi - [in] LPCOLESTR lpstrFile, // filename given to file writer - [out] IBaseFilter **ppf, // returns pointer to the MUX - [out] IFileSinkFilter **ppSink);// queried from file writer - - // Looks for an interface on the filter and on the output pin of the given - // category. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or - // NULL for "don't care". - // It will also look upstream and downstream of - // the pin for the interface, to find interfaces on renderers, MUXES, TV - // Tuners, etc. - // Call *ppint->Release() when you're done with it - [local] HRESULT FindInterface( - [in, unique] const GUID *pCategory, // can be NULL for all pins - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] void **ppint); - [call_as(FindInterface)] HRESULT RemoteFindInterface( - [in, unique] const GUID *pCategory, // can be NULL for all pins - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] IUnknown **ppint); - - // Connects the pin of the given category of the source filter to the - // rendering filter, optionally through another filter (compressor?) - // For a non-NULL category, it will instantiate and connect additional - // required filters upstream too, like TV Tuners and Crossbars. - // If there is only one output pin on the source, use a NULL - // category. You can also have pSource be a pin - HRESULT RenderStream( - [in] const GUID *pCategory, // can be NULL if only one output pin - [in] IUnknown *pSource, // filter or pin - [in] IBaseFilter *pfCompressor, - [in] IBaseFilter *pfRenderer); // can be NULL - - // Sends IAMStreamControl messages to the pin of the desired category, eg. - // "capture" or "preview" - // REFERENCE_TIME=NULL means NOW - // REFERENCE_TIME=MAX_TIME means never, or cancel previous request - // NULL controls all capture filters in the graph - you will get one - // notification for each filter with a pin of that category found - // returns S_FALSE if stop will be signalled before last sample is - // rendered. - // return a FAILURE code if the filter does not support IAMStreamControl - HRESULT ControlStream( - [in] const GUID *pCategory, - [in] IBaseFilter *pFilter, - [in] REFERENCE_TIME *pstart, - [in] REFERENCE_TIME *pstop, - [in] WORD wStartCookie, // high word reserved - [in] WORD wStopCookie); // high word reserved - - // creates a pre-allocated file of a given size in bytes - HRESULT AllocCapFile( - [in] LPCOLESTR lpstr, - [in] DWORDLONG dwlSize); - - // Copies the valid file data out of the old, possibly huge old capture - // file into a shorter new file. - // Return S_FALSE from your progress function to abort capture, S_OK to - // continue - HRESULT CopyCaptureFile( - [in] LPOLESTR lpwstrOld, - [in] LPOLESTR lpwstrNew, - [in] int fAllowEscAbort, // pressing ESC will abort? - [in] IAMCopyCaptureFileProgress *pCallback); // implement this to - // get progress -} - - -// -// Capture graph builder "CopyCapturedFile" progress callback - -[ - object, - uuid(670d1d20-a068-11d0-b3f0-00aa003761c5), - pointer_default(unique) -] -interface IAMCopyCaptureFileProgress : IUnknown { - - // If you support this interface somewhere, this function will be called - // periodically while ICaptureGraphBuilder::CopyCaptureFile is executing - // to let you know the progress - // - // Return S_OK from this function to continue. Return S_FALSE to abort the - // copy - HRESULT Progress( - [in] int iProgress); // a number between 0 and 100 (%) -} - - -// -// Capture graph builder that can deal with a single filter having more than -// one pin of each category... some new devices can capture both audio and -// video, for example -// - -[ - object, - uuid(93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D), - pointer_default(unique) -] -interface ICaptureGraphBuilder2 : IUnknown { - - // Use this filtergraph - HRESULT SetFiltergraph( - [in] IGraphBuilder *pfg); - - // what filtergraph are you using? - // *ppfg->Release() when you're done with it - HRESULT GetFiltergraph( - [out] IGraphBuilder **ppfg); - - // creates a rendering section in the filtergraph consisting of a MUX - // of some filetype, and a file writer (and connects them together) - // *ppf->Release() when you're done with it - // *ppSink->Release() when you're done with it - HRESULT SetOutputFileName( - [in] const GUID *pType, // GUID of MUX filter to use - [in] LPCOLESTR lpstrFile, // filename given to file writer - [out] IBaseFilter **ppf, // returns pointer to the MUX - [out] IFileSinkFilter **ppSink);// queried from file writer - - // Looks for an interface on the filter and on the output pin of the given - // category and type. (Categories: CAPTURE/PREVIEW/VIDEOPORT/VBI etc. or - // NULL for "don't care". Type: MAJORTYPE_Video/Audio etc or NULL) - // !!! Will some filters have >1 capture pin? ie RGB and MPEG? - // It will also look upstream and downstream of - // the pin for the interface, to find interfaces on renderers, MUXES, TV - // Tuners, etc. - // Call *ppint->Release() when you're done with it - [local] HRESULT FindInterface( - [in] const GUID *pCategory, // can be NULL for all pins - [in] const GUID *pType, // Audio/Video/??? or NULL (don't care) - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] void **ppint); - [call_as(FindInterface)] HRESULT RemoteFindInterface( - [in] const GUID *pCategory, // can be NULL for all pins - [in] const GUID *pType, // Audio/Video/??? or NULL (don't care) - [in] IBaseFilter *pf, - [in] REFIID riid, - [out] IUnknown **ppint); - - // Connects the pin of the given category and type of the source filter to - // the rendering filter, optionally through another filter (compressor?) - // (Type is a Majortype, like Video or Audio) - // For a non-NULL category, it will instantiate and connect additional - // required filters upstream too, like TV Tuners and Crossbars. - // If there is only one output pin on the source, use a NULL category - // and type. You can also have pSource be a pin - HRESULT RenderStream( - [in] const GUID *pCategory, // can be NULL if only one output pin - [in] const GUID *pType, // Major type (Video/Audio/etc) - [in] IUnknown *pSource, // filter or pin - [in] IBaseFilter *pfCompressor, - [in] IBaseFilter *pfRenderer); // can be NULL - - // Sends IAMStreamControl messages to the pin of the desired category, - // (eg. "capture" or "preview") and of the desired type (eg. VIDEO or AUDIO) - // A category MUST be given. If a filter is given, a type must be too. - // REFERENCE_TIME=NULL means NOW - // REFERENCE_TIME=MAX_TIME means never, or cancel previous request - // NULL controls all capture filters in the graph - you will get one - // notification for each filter with a pin of that category found - // returns S_FALSE if stop will be signalled before last sample is - // rendered. - // return a FAILURE code if the filter does not support IAMStreamControl - HRESULT ControlStream( - [in] const GUID *pCategory, - [in] const GUID *pType, // Major type (Video/Audio/etc) - [in] IBaseFilter *pFilter, - [in] REFERENCE_TIME *pstart, - [in] REFERENCE_TIME *pstop, - [in] WORD wStartCookie, // high word reserved - [in] WORD wStopCookie); // high word reserved - - // creates a pre-allocated file of a given size in bytes - HRESULT AllocCapFile( - [in] LPCOLESTR lpstr, - [in] DWORDLONG dwlSize); - - // Copies the valid file data out of the old, possibly huge old capture - // file into a shorter new file. - // Return S_FALSE from your progress function to abort capture, S_OK to - // continue - HRESULT CopyCaptureFile( - [in] LPOLESTR lpwstrOld, - [in] LPOLESTR lpwstrNew, - [in] int fAllowEscAbort, // pressing ESC will abort? - [in] IAMCopyCaptureFileProgress *pCallback); // implement this to - // get progress - // Helper fn to find a certain pin on a filter. - HRESULT FindPin( - [in] IUnknown *pSource, - [in] PIN_DIRECTION pindir, // input or output? - [in] const GUID *pCategory, // what category? (or NULL) - [in] const GUID *pType, // what Major type (or NULL) - [in] BOOL fUnconnected, // must it be unconnected? - [in] int num, // which pin matching this? (0 based) - [out] IPin **ppPin); -} - -enum _AM_RENSDEREXFLAGS { - AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x01 // Dont add any renderers -}; - -// -// IFilterGraph2 -// -// New methods on for IFilterGraph and IGraphBuilder will have to go here. -// - -[ - object, - uuid(36b73882-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface IFilterGraph2: IGraphBuilder { - - // Add a Moniker source moniker - HRESULT AddSourceFilterForMoniker( - [in] IMoniker *pMoniker, - [in] IBindCtx *pCtx, - [in, unique] LPCWSTR lpcwstrFilterName, - [out] IBaseFilter **ppFilter - ); - - // Specify the type for a reconnect - // This is better than Reconnect as sometime the parties to a - // reconnection can't remember what type they'd agreed (!) - HRESULT ReconnectEx - ( [in] IPin * ppin, // the pin to disconnect and reconnect - [in, unique] const AM_MEDIA_TYPE *pmt // the type to reconnect with - can be NULL - ); - - // Render a pin without adding any new renderers - HRESULT RenderEx( [in] IPin *pPinOut, // Pin to render - [in] DWORD dwFlags, // flags - [in, out] DWORD *pvContext // Unused - set to NULL - ); - -#if 0 - // Method looks for a filter which supports the specified interface. If such - // a filter exists, an AddRef()'ed pointer to the requested interface is placed - // in *ppInterface. - // - // *ppInterface will be NULL on return if such a filter could not be found, and - // the method will return E_NOINTERFACE. - // - // pdwIndex is an internal index that is used for obtaining subsequent interfaces. - // *pdwIndex should be initialized to zero. It is set on return to a value that - // allows the implementation of FindFilterInterface to search for further interfaces - // if called again. If no more such interfaces exist, the method will return E_NOINTERFACE. - // - // If pdwIndex is NULL, FindFilterInterface returns an interface only if there is just - // a single filter in the graph that supports the interface. Otherwise it returns - // E_NOINTERFACE. - // - HRESULT FindFilterInterface( [in] REFIID iid, [out] void ** ppInterface, [in,out] LPDWORD pdwIndex ); - - // Tries to obtain the interface from the filter graph itself. If this fails, - // it attempts to find the unique filter that supports the interface. - // On failure the method will return E_NOINTERFACE. On success, it returns - // S_OK and an AddRef()'ed pointer to the requested interface in *ppInterface. - // - HRESULT FindInterface( [in] REFIID iid, [out] void ** ppInterface ); - -#endif -} - -// -// StreamBuilder -// aka Graph building with constraints -// aka convergent graphs -// aka Closed captioning - -[ - object, - local, - uuid(56a868bf-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IStreamBuilder : IUnknown { - - // Connect this output pin directly or indirectly, using transform filters - // if necessary to thing(s) that will render it, within this graph - // Move from Initial state to Rendered state. - - HRESULT Render - ( [in] IPin * ppinOut, // the output pin - [in] IGraphBuilder * pGraph // the graph - ); - - // Undo what you did in Render. Return to Initial state. - HRESULT Backout - ( [in] IPin * ppinOut, // the output pin - [in] IGraphBuilder * pGraph // the graph - ); -} - - -// async reader interface - supported by file source filters. Allows -// multiple overlapped reads from different positions - - -[ - object, - uuid(56a868aa-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IAsyncReader : IUnknown -{ - // pass in your preferred allocator and your preferred properties. - // method returns the actual allocator to be used. Call GetProperties - // on returned allocator to learn alignment and prefix etc chosen. - // this allocator will be not be committed and decommitted by - // the async reader, only by the consumer. - // Must call this before calling Request. - HRESULT RequestAllocator( - [in] IMemAllocator* pPreferred, - [in] ALLOCATOR_PROPERTIES* pProps, - [out] IMemAllocator ** ppActual); - - // queue a request for data. - // media sample start and stop times contain the requested absolute - // byte position (start inclusive, stop exclusive). - // may fail if sample not obtained from agreed allocator. - // may fail if start/stop position does not match agreed alignment. - // samples allocated from source pin's allocator may fail - // GetPointer until after returning from WaitForNext. - // Stop position must be aligned - this means it may exceed duration. - // on completion, stop position will be corrected to unaligned - // actual data. - HRESULT Request( - [in] IMediaSample* pSample, - [in] DWORD_PTR dwUser); // user context - - // block until the next sample is completed or the timeout occurs. - // timeout (millisecs) may be 0 or INFINITE. Samples may not - // be delivered in order. If there is a read error of any sort, a - // notification will already have been sent by the source filter, - // and HRESULT will be an error. - // If ppSample is not null, then a Request completed with the result - // code returned. - HRESULT WaitForNext( - [in] DWORD dwTimeout, - [out] IMediaSample** ppSample, // completed sample - [out] DWORD_PTR * pdwUser); // user context - - // sync read of data. Sample passed in must have been acquired from - // the agreed allocator. Start and stop position must be aligned. - // equivalent to a Request/WaitForNext pair, but may avoid the - // need for a thread on the source filter. - HRESULT SyncReadAligned( - [in] IMediaSample* pSample); - - - // sync read. works in stopped state as well as run state. - // need not be aligned. Will fail if read is beyond actual total - // length. - HRESULT SyncRead( - [in] LONGLONG llPosition, // absolute file position - [in] LONG lLength, // nr bytes required - [out, size_is(lLength)] - BYTE* pBuffer); // write data here - - // return total length of stream, and currently available length. - // reads for beyond the available length but within the total length will - // normally succeed but may block for a long period. - HRESULT Length( - [out] LONGLONG* pTotal, - [out] LONGLONG* pAvailable); - - // cause all outstanding reads to return, possibly with a failure code - //(VFW_E_TIMEOUT) indicating they were cancelled. - // Between BeginFlush and EndFlush calls, Request calls will fail and - // WaitForNext calls will always complete immediately. - HRESULT BeginFlush(void); - HRESULT EndFlush(void); -} - - -// interface provided by the filtergraph itself to let other objects -// (especially plug-in distributors, but also apps like graphedt) know -// when the graph has changed. -[ - object, - uuid(56a868ab-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IGraphVersion : IUnknown -{ - // returns the current graph version number - // this is incremented every time there is a change in the - // set of filters in the graph or in their connections - // - // if this is changed since your last enumeration, then re-enumerate - // the graph - HRESULT QueryVersion(LONG* pVersion); -} - - - - -// -// interface describing an object that uses resources. -// -// implement if: you request resources using IResourceManager. You will -// need to pass your implementation of this pointer as an in param. -// -// use if: you are a resource manager who implements IResourceManager -[ - object, - uuid(56a868ad-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IResourceConsumer : IUnknown -{ - // you may acquire the resource specified. - // return values: - // S_OK -- I have successfully acquired it - // S_FALSE -- I will acquire it and call NotifyAcquire afterwards - // VFW_S_NOT_NEEDED: I no longer need the resource - // FAILED(hr)-I tried to acquire it and failed. - - HRESULT - AcquireResource( - [in] LONG idResource); - - - - // Please release the resource. - // return values: - // S_OK -- I have released it (and want it again when available) - // S_FALSE -- I will call NotifyRelease when I have released it - // other something went wrong. - HRESULT - ReleaseResource( - [in] LONG idResource); -} - - - -// interface describing a resource manager that will resolve contention for -// named resources. -// -// implement if: you are a resource manager. The filtergraph will be a resource -// manager, internally delegating to the system wide resource manager -// (when there is one) -// -// use if: you need resources that are limited. Use the resource manager to -// resolve contention by registering the resource with this interface, -// and requesting it from this interface whenever needed. -// -// or use if: you detect focus changes which should affect resource usage. -// Notifying change of focus to the resource manager will cause the resource -// manager to switch contended resources to the objects that have the user's -// focus -[ - object, - uuid(56a868ac-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IResourceManager : IUnknown -{ - // tell the manager how many there are of a resource. - // ok if already registered. will take new count. if new count - // is lower, will de-allocate resources to new count. - // - // You get back a token that will be used in further calls. - // - // Passing a count of 0 will eliminate this resource. There is currently - // no defined way to find the id without knowing the count. - // - HRESULT - Register( - [in] LPCWSTR pName, // this named resource - [in] LONG cResource, // has this many instances - [out] LONG* plToken // token placed here on return - ); - - HRESULT - RegisterGroup( - [in] LPCWSTR pName, // this named resource group - [in] LONG cResource, // has this many resources - [in, size_is(cResource)] - LONG* palTokens, // these are the contained resources - [out] LONG* plToken // group resource id put here on return - ); - - // request the use of a given, registered resource. - // possible return values: - // S_OK == yes you can use it now - // S_FALSE == you will be called back when the resource is available - // other - there is an error. - // - // The priority of this request should be affected by the associated - // focus object -- that is, when SetFocus is called for that focus - // object (or a 'related' object) then my request should be put through. - // - // A filter should pass the filter's IUnknown here. The filtergraph - // will match filters to the filtergraph, and will attempt to trace - // filters to common source filters when checking focus objects. - // The Focus object must be valid for the entire lifetime of the request - // -- until you call CancelRequest or NotifyRelease(id, p, FALSE) - HRESULT - RequestResource( - [in] LONG idResource, - [in] IUnknown* pFocusObject, - [in] IResourceConsumer* pConsumer - ); - - - // notify the resource manager that an acquisition attempt completed. - // Call this method after an AcquireResource method returned - // S_FALSE to indicate asynchronous acquisition. - // HR should be S_OK if the resource was successfully acquired, or a - // failure code if the resource could not be acquired. - HRESULT - NotifyAcquire( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer, - [in] HRESULT hr); - - // Notify the resource manager that you have released a resource. Call - // this in response to a ReleaseResource method, or when you have finished - // with the resource. bStillWant should be TRUE if you still want the - // resource when it is next available, or FALSE if you no longer want - // the resource. - HRESULT - NotifyRelease( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer, - [in] BOOL bStillWant); - - // I don't currently have the resource, and I no longer need it. - HRESULT - CancelRequest( - [in] LONG idResource, - [in] IResourceConsumer* pConsumer); - - // Notify the resource manager that a given object has been given the - // user's focus. In ActiveMovie, this will normally be a video renderer - // whose window has received the focus. The filter graph will switch - // contended resources to (in order): - // requests made with this same focus object - // requests whose focus object shares a common source with this - // requests whose focus object shares a common filter graph - // After calling this, you *must* call ReleaseFocus before the IUnknown - // becomes invalid, unless you can guarantee that another SetFocus - // of a different object is done in the meantime. No addref is held. - // - // The resource manager will hold this pointer until replaced or cancelled, - // and will use it to resolve resource contention. It will call - // QueryInterface for IBaseFilter at least and if found will call methods on - // that interface. - HRESULT - SetFocus( - [in] IUnknown* pFocusObject); - - // Sets the focus to NULL if the current focus object is still - // pFocusObject. Call this when - // the focus object is about to be destroyed to ensure that no-one is - // still referencing the object. - HRESULT - ReleaseFocus( - [in] IUnknown* pFocusObject); - - - -// !!! still need -// -- app override (some form of SetPriority) -// -- enumeration and description of resources - -} - - -// -// Interface representing an object that can be notified about state -// and other changes within a filter graph. The filtergraph will call plug-in -// distributors that expose this optional interface so that they can -// respond to appropriate changes. -// -// Implement if: you are a plug-in distributor (your class id is found -// under HKCR\Interface\<IID>\Distributor= for some interface). -// -// Use if: you are the filtergraph. -[ - object, - uuid(56a868af-0ad4-11ce-b03a-0020af0ba770), - pointer_default(unique) -] -interface IDistributorNotify : IUnknown -{ - // called when graph is entering stop state. Called before - // filters are stopped. - HRESULT Stop(void); - - // called when graph is entering paused state, before filters are - // notified - HRESULT Pause(void); - - // called when graph is entering running state, before filters are - // notified. tStart is the stream-time offset parameter that will be - // given to each filter's IBaseFilter::Run method. - HRESULT Run(REFERENCE_TIME tStart); - - // called when the graph's clock is changing, with the new clock. Addref - // the clock if you hold it beyond this method. Called before - // the filters are notified. - HRESULT SetSyncSource( - [in] IReferenceClock * pClock); - - // called when the set of filters or their connections has changed. - // Called on every AddFilter, RemoveFilter or ConnectDirect (or anything - // that will lead to one of these). - // You don't need to rebuild your list of interesting filters at this point - // but you should release any refcounts you hold on any filters that - // have been removed. - HRESULT NotifyGraphChange(void); -} - -typedef enum { - AM_STREAM_INFO_START_DEFINED = 0x00000001, - AM_STREAM_INFO_STOP_DEFINED = 0x00000002, - AM_STREAM_INFO_DISCARDING = 0x00000004, - AM_STREAM_INFO_STOP_SEND_EXTRA = 0x00000010 -} AM_STREAM_INFO_FLAGS; - -// Stream information -typedef struct { - REFERENCE_TIME tStart; - REFERENCE_TIME tStop; - DWORD dwStartCookie; - DWORD dwStopCookie; - DWORD dwFlags; -} AM_STREAM_INFO; - -// -// IAMStreamControl -// - -[ - object, - uuid(36b73881-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface IAMStreamControl : IUnknown -{ - // The REFERENCE_TIME pointers may be null, which - // indicates immediately. If the pointer is non-NULL - // and dwCookie is non-zero, then pins should send - // EC_STREAM_CONTROL_STOPPED / EC_STREAM_CONTROL_STARTED - // with an IPin pointer and the cookie, thus allowing - // apps to tie the events back to their requests. - // If either dwCookies is zero, or the pointer is null, - // then no event is sent. - - // If you have a capture pin hooked up to a MUX input pin and they - // both support IAMStreamControl, you'll want the MUX to signal the - // stop so you know the last frame was written out. In order for the - // MUX to know it's finished, the capture pin will have to send one - // extra sample after it was supposed to stop, so the MUX can trigger - // off that. So you would set bSendExtra to TRUE for the capture pin - // Leave it FALSE in all other cases. - - HRESULT StartAt( [in] const REFERENCE_TIME * ptStart, - [in] DWORD dwCookie ); - HRESULT StopAt( [in] const REFERENCE_TIME * ptStop, - [in] BOOL bSendExtra, - [in] DWORD dwCookie ); - HRESULT GetInfo( [out] AM_STREAM_INFO *pInfo); -} - - - -// -// ISeekingPassThru -// - -[ - object, - uuid(36b73883-c2c8-11cf-8b46-00805f6cef60), - pointer_default(unique) -] -interface ISeekingPassThru : IUnknown -{ - HRESULT Init( [in] BOOL bSupportRendering, - [in] IPin *pPin); -} - - - -// -// IAMStreamConfig - pin interface -// - -// A capture filter or compression filter's output pin -// supports this interface - no matter what data type you produce. - -// This interface can be used to set the output format of a pin (as an -// alternative to connecting the pin using a specific media type). -// After setting an output format, the pin will use that format -// the next time it connects to somebody, so you can just Render that -// pin and get a desired format without using Connect(CMediaType) -// Your pin should do that by ONLY OFFERING the media type set in SetFormat -// in its enumeration of media types, and no others. This will ensure that -// that format is indeed used for connection (or at least offer it first). -// An application interested in enumerating accepted mediatypes may have to -// do so BEFORE calling SetFormat. - -// But this interface's GetStreamCaps function can get more information -// about accepted media types than the traditional way of enumerating a pin's -// media types, so it should typically be used instead. -// GetStreamCaps gets information about the kinds of formats allowed... how -// it can stretch and crop, and the frame rate and data rates allowed (for -// video) - -// VIDEO EXAMPLE -// -// GetStreamCaps returns a whole array of {MediaType, Capabilities}. -// Let's say your capture card supports JPEG anywhere between 160x120 and -// 320x240, and also the size 640x480. Also, say it supports RGB24 at -// resolutions between 160x120 and 320x240 but only multiples of 8. You would -// expose these properties by offering a media type of 320 x 240 JPEG -// (if that is your default or preferred size) coupled with -// capabilities saying minimum 160x120 and maximum 320x240 with granularity of -// 1. The next pair you expose is a media type of 640x480 JPEG coupled with -// capabilities of min 640x480 max 640x480. The third pair is media type -// 320x240 RGB24 with capabilities min 160x120 max 320x240 granularity 8. -// In this way you can expose almost every quirk your card might have. -// An application interested in knowing what compression formats you provide -// can get all the pairs and make a list of all the unique sub types of the -// media types. -// -// If a filter's output pin is connected with a media type that has rcSource -// and rcTarget not empty, it means the filter is being asked to stretch the -// rcSource sub-rectangle of its InputSize (the format of the input pin for -// a compressor, and the largest bitmap a capture filter can generate with -// every pixel unique) into the rcTarget sub-rectangle of its output format. -// For instance, if a video compressor has as input 160x120 RGB, and as output -// 320x240 MPEG with an rcSource of (10,10,20,20) and rcTarget of (0,0,100,100) -// this means the compressor is being asked to take a 10x10 piece of the 160x120 -// RGB bitmap, and make it fill the top 100x100 area of a 320x240 bitmap, -// leaving the rest of the 320x240 bitmap untouched. -// A filter does not have to support this and can fail to connect with a -// media type where rcSource and rcTarget are not empty. -// -// Your output pin is connected to the next filter with a certain media -// type (either directly or using the media type passed by SetFormat), -// and you need to look at the AvgBytesPerSecond field of the format -// of that mediatype to see what data rate you are being asked to compress -// the video to, and use that data rate. Using the number of frames per -// second in AvgTimePerFrame, you can figure out how many bytes each frame -// is supposed to be. You can make it smaller, but NEVER EVER make a bigger -// data rate. For a video compressor, your input pin's media type tells you -// the frame rate (use that AvgTimePerFrame). For a capture filter, the -// output media type tells you, so use that AvgTimePerFrame. -// -// The cropping rectangle described below is the same as the rcSrc of the -// output pin's media type. -// -// The output rectangle described below is the same of the width and height -// of the BITMAPINFOHEADER of the media type of the output pin's media type - - -// AUDIO EXAMPLE -// -// This API can return an array of pairs of (media type, capabilities). -// This can be used to expose all kinds of wierd capabilities. Let's say you -// do any PCM frequency from 11,025 to 44,100 at 8 or 16 bit mono or -// stereo, and you also do 48,000 16bit stereo as a special combination. -// You would expose 3 pairs. The first pair would have Min Freq of 11025 and -// Max Freq of 44100, with MaxChannels=2 and MinBits=8 and MaxBits=8 for the -// capabilites structure, and a media type of anything you like, maybe -// 22kHz, 8bit stereo as a default. -// The 2nd pair would be the same except for MinBits=16 and MaxBits=16 in -// the capabilities structure and the media type could be something like -// 44kHz, 16bit stereo as a default (the media type in the pair should always -// be something legal as described by the capabilities structure... the -// structure tells you how you can change the media type to produce other -// legal media types... for instance changing 44kHz to 29010Hz would be legal, -// but changing bits from 16 to 14 would not be.) -// The 3rd pair would be MinFreq=48000 MaxFreq=48000 MaxChannels=2 -// MinBits=16 and MaxBits=16, and the media type would be 48kHz 16bit stereo. -// You can also use the Granularity elements of the structure (like the example -// for video) if you support values that multiples of n, eg. you could say -// minimum bits per sample 8, max 16, and granularity 8 to describe doing -// either 8 or 16 bit all in one structure -// -// If you support non-PCM formats, the media type returned in GetStreamCaps -// can show which non-PCM formats you support (with a default sample rate, -// bit rate and channels) and the capabilities structure going with that -// media type can describe which other sample rates, bit rates and channels -// you support. - -[ - object, - uuid(C6E13340-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) -] -interface IAMStreamConfig : IUnknown -{ - - // this is the structure returned by a VIDEO filter - // - typedef struct _VIDEO_STREAM_CONFIG_CAPS { - - GUID guid; // will be MEDIATYPE_Video - - // the logical or of all the AnalogVideoStandard's supported - // typically zero if not supported - ULONG VideoStandard; - - // the inherent size of the incoming signal... taken from the input - // pin for a compressor, or the largest size a capture filter can - // digitize the signal with every pixel still unique - SIZE InputSize; - - // The input of a compressor filter may have to be connected for these - // to be known - - // smallest rcSrc cropping rect allowed - SIZE MinCroppingSize; - // largest rcSrc cropping rect allowed - SIZE MaxCroppingSize; - // granularity of cropping size - eg only widths a multiple of 4 allowed - int CropGranularityX; - int CropGranularityY; - // alignment of cropping rect - eg rect must start on multiple of 4 - int CropAlignX; - int CropAlignY; - - // The input of a compressor filter may have to be connected for these - // to be known - - // smallest bitmap this pin can produce - SIZE MinOutputSize; - // largest bitmap this pin can produce - SIZE MaxOutputSize; - // granularity of output bitmap size - int OutputGranularityX; - int OutputGranularityY; - // !!! what about alignment of rcTarget inside BIH if different? - - // how well can you stretch in the x direction? 0==not at all - // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation - // etc. - int StretchTapsX; - int StretchTapsY; - // how well can you shrink in the x direction? 0==not at all - // 1=pixel doubling 2=interpolation(2 taps) 3=better interpolation - // etc. - int ShrinkTapsX; - int ShrinkTapsY; - - // CAPTURE filter only - what frame rates are allowed? - LONGLONG MinFrameInterval; - LONGLONG MaxFrameInterval; - - // what data rates can this pin produce? - LONG MinBitsPerSecond; - LONG MaxBitsPerSecond; - } VIDEO_STREAM_CONFIG_CAPS; - - - // this is the structure returned by an AUDIO filter - // - typedef struct _AUDIO_STREAM_CONFIG_CAPS { - - GUID guid; // will be MEDIATYPE_Audio - ULONG MinimumChannels; - ULONG MaximumChannels; - ULONG ChannelsGranularity; - ULONG MinimumBitsPerSample; - ULONG MaximumBitsPerSample; - ULONG BitsPerSampleGranularity; - ULONG MinimumSampleFrequency; - ULONG MaximumSampleFrequency; - ULONG SampleFrequencyGranularity; - } AUDIO_STREAM_CONFIG_CAPS; - - // - only allowed when pin is not streaming, else the call will FAIL - // - If your output pin is not yet connected, and you can - // connect your output pin with this media type, you should - // succeed the call, and start offering it first (enumerate as format#0) - // from GetMediaType so that this format will be used to connect with - // when you do connect to somebody - // - if your output pin is already connected, and you can provide this - // type, reconnect your pin. If the other pin can't accept it, FAIL - // this call and leave your connection alone. - HRESULT SetFormat( - [in] AM_MEDIA_TYPE *pmt); - - // the format it's connected with, or will connect with - // the application is responsible for calling DeleteMediaType(*ppmt); - HRESULT GetFormat( - [out] AM_MEDIA_TYPE **ppmt); - - // how many different Stream Caps structures are there? - // also, how big is the stream caps structure? - HRESULT GetNumberOfCapabilities( - [out] int *piCount, - [out] int *piSize); // pSCC of GetStreamCaps needs to be this big - - // - gets one of the pairs of {Mediatype, Caps} - // - return S_FALSE if iIndex is too high - // - the application is responsible for calling DeleteMediaType(*ppmt); - // - the first thing pSCC points to is a GUID saying MEDIATYPE_Video - // or MEDIATYPE_Audio, so you can tell if you have a pointer to a - // VIDEO_STREAM_CONFIG_CAPS or an AUDIO_STREAM_CONFIG_CAPS structure - // There could potentially be many more possibilities other than video - // or audio. - HRESULT GetStreamCaps( - [in] int iIndex, // 0 to #caps-1 - [out] AM_MEDIA_TYPE **ppmt, - [out] BYTE *pSCC); - -} - - - -// Interface to control interleaving of different streams in one file -[ -object, -uuid(BEE3D220-157B-11d0-BD23-00A0C911CE86), -pointer_default(unique) -] -interface IConfigInterleaving : IUnknown -{ - import "unknwn.idl"; - - typedef enum - { - // uninterleaved - samples written out in the order they - // arrive. - INTERLEAVE_NONE, - - // approximate interleaving with less overhead for video - // capture - INTERLEAVE_CAPTURE, - - // full, precise interleaving. slower. - INTERLEAVE_FULL, - - // samples written out in the order they arrive. writes are - // buffered - INTERLEAVE_NONE_BUFFERED - - } InterleavingMode; - - HRESULT put_Mode( - [in] InterleavingMode mode - ); - - HRESULT get_Mode( - [out] InterleavingMode *pMode - ); - - HRESULT put_Interleaving( - [in] const REFERENCE_TIME *prtInterleave, - [in] const REFERENCE_TIME *prtPreroll - ); - - HRESULT get_Interleaving( - [out] REFERENCE_TIME *prtInterleave, - [out] REFERENCE_TIME *prtPreroll - ); -} - -// Interface to control the AVI mux -[ -object, -uuid(5ACD6AA0-F482-11ce-8B67-00AA00A3F1A6), -pointer_default(unique) -] -interface IConfigAviMux : IUnknown -{ - import "unknwn.idl"; - - // control whether the AVI mux adjusts the frame rate or audio - // sampling rate for drift when the file is closed. -1 to disables - // this behavior. - HRESULT SetMasterStream([in] LONG iStream); - HRESULT GetMasterStream([out] LONG *pStream); - - // control whether the AVI mux writes out an idx1 index chunk for - // compatibility with older AVI players. - HRESULT SetOutputCompatibilityIndex([in] BOOL fOldIndex); - HRESULT GetOutputCompatibilityIndex([out] BOOL *pfOldIndex); -} - - //--------------------------------------------------------------------- - // CompressionCaps enum - //--------------------------------------------------------------------- - - // This tells you which features of IAMVideoCompression are supported - - // CanCrunch means that it can compress video to a specified data rate - // If so, then the output pin's media type will contain that data rate - // in the format's AvgBytesPerSecond field, and that should be used. - - typedef enum - { - CompressionCaps_CanQuality = 0x01, - CompressionCaps_CanCrunch = 0x02, - CompressionCaps_CanKeyFrame = 0x04, - CompressionCaps_CanBFrame = 0x08, - CompressionCaps_CanWindow = 0x10 - } CompressionCaps; - - - - //--------------------------------------------------------------------- - // IAMVideoCompression interface - // - // Control compression parameters - pin interface - //--------------------------------------------------------------------- - - // This interface is implemented by the output pin of a video capture - // filter or video compressor that provides video data - - // You use this interface to control how video is compressed... how - // many keyframes, etc., and to find information like capabilities and - // the description of this compressor - - [ - object, - uuid(C6E13343-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMVideoCompression : IUnknown - { - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanKeyFrame - // - KeyFrameRate < 0 means use the compressor default - // - KeyFrames == 0 means only the first frame is a key - HRESULT put_KeyFrameRate ( - [in] long KeyFrameRate); - - HRESULT get_KeyFrameRate ( - [out] long * pKeyFrameRate); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanBFrame - // - If keyframes are every 10, and there are 3 P Frames per key, - // they will be spaced evenly between the key frames and the other - // 6 frames will be B frames - // - PFramesPerKeyFrame < 0 means use the compressor default - HRESULT put_PFramesPerKeyFrame ( - [in] long PFramesPerKeyFrame); - - HRESULT get_PFramesPerKeyFrame ( - [out] long * pPFramesPerKeyFrame); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanQuality - // - Controls image quality - // - If you are compressing to a fixed data rate, a high quality - // means try and use all of the data rate, and a low quality means - // feel free to use much lower than the data rate if you want to. - // - Quality < 0 means use the compressor default - HRESULT put_Quality ( - [in] double Quality); - - HRESULT get_Quality ( - [out] double * pQuality); - - // If you have set a data rate of 100K/sec on a 10fps movie, that - // will normally mean each frame must be <=10K. But a window size - // means every consecutive n frames must average to the data rate, - // but an individual frame (if n > 1) is allowed to exceed the - // frame size suggested by the data rate - HRESULT put_WindowSize ( - [in] DWORDLONG WindowSize); - - HRESULT get_WindowSize ( - [out] DWORDLONG * pWindowSize); - - // - pszVersion might be "Version 2.1.0" - // - pszDescription might be "Danny's awesome video compressor" - // - pcbVersion and pcbDescription will be filled in with the - // required length if they are too short - // - *pCapabilities is a logical OR of some CompressionCaps flags - HRESULT GetInfo( - [out, size_is(*pcbVersion)] WCHAR * pszVersion, - [in,out] int *pcbVersion, - [out, size_is(*pcbDescription)] LPWSTR pszDescription, - [in,out] int *pcbDescription, - [out] long *pDefaultKeyFrameRate, - [out] long *pDefaultPFramesPerKey, - [out] double *pDefaultQuality, - [out] long *pCapabilities //CompressionCaps - ); - - // - this means when this frame number comes along after the graph - // is running, make it a keyframe even if you weren't going to - HRESULT OverrideKeyFrame( - [in] long FrameNumber - ); - - // - Only valid if GetInfo's pCapabilities sets - // CompressionCaps_CanCrunch - // - this means when this frame number comes along after the graph - // is running, make it this many bytes big instead of whatever size - // you were going to make it. - HRESULT OverrideFrameSize( - [in] long FrameNumber, - [in] long Size - ); - - } - - //--------------------------------------------------------------------- - // VfwCaptureDialogs enum - //--------------------------------------------------------------------- - - typedef enum - { - VfwCaptureDialog_Source = 0x01, - VfwCaptureDialog_Format = 0x02, - VfwCaptureDialog_Display = 0x04 - } VfwCaptureDialogs; - - - //--------------------------------------------------------------------- - // VfwCompressDialogs enum - //--------------------------------------------------------------------- - - typedef enum - { - VfwCompressDialog_Config = 0x01, - VfwCompressDialog_About = 0x02, - // returns S_OK if the dialog exists and can be shown, else S_FALSE - VfwCompressDialog_QueryConfig = 0x04, - VfwCompressDialog_QueryAbout = 0x08 - } VfwCompressDialogs; - - - //--------------------------------------------------------------------- - // IAMVfwCaptureDialogs - filter interface - // - // Show a VfW capture driver dialog - SOURCE, FORMAT, or DISPLAY - //--------------------------------------------------------------------- - - // This interface is supported only by Microsoft's Video For Windows - // capture driver Capture Filter. It allows an application to bring up - // one of the 3 driver dialogs that VfW capture drivers have. - - [ - object, - local, - uuid(D8D715A0-6E5E-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMVfwCaptureDialogs : IUnknown - { - HRESULT HasDialog( - [in] int iDialog // VfwCaptureDialogs enum - ); - - HRESULT ShowDialog( - [in] int iDialog, // VfwCaptureDialogs enum - [in] HWND hwnd - ); - - HRESULT SendDriverMessage( - [in] int iDialog, // VfwCaptureDialogs enum - [in] int uMsg, - [in] long dw1, - [in] long dw2 - ); - - // - iDialog can be one of the VfwCaptureDialogs enums - // - HasDialog returns S_OK if it has the dialog, else S_FALSE - // - ShowDialog can only be called when not streaming or when another - // dialog is not already up - // - SendDriverMessage can send a private message to the capture driver. - // USE IT AT YOUR OWN RISK! - } - - //--------------------------------------------------------------------- - // IAMVfwCompressDialogs - filter interface - // - // Show a VfW codec driver dialog - CONFIG or ABOUT - //--------------------------------------------------------------------- - - // This interface is supported only by Microsoft's ICM Compressor filter - // (Co). It allows an application to bring up either the Configure or - // About dialogs for the ICM codec that it is currently using. - - [ - object, - local, - uuid(D8D715A3-6E5E-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMVfwCompressDialogs : IUnknown - { - - // Bring up a dialog for this codec - HRESULT ShowDialog( - [in] int iDialog, // VfwCompressDialogs enum - [in] HWND hwnd - ); - - // Calls ICGetState and gives you the result - HRESULT GetState( - [out, size_is(*pcbState)] LPVOID pState, - [in, out] int *pcbState - ); - - // Calls ICSetState - HRESULT SetState( - [in, size_is(cbState)] LPVOID pState, - [in] int cbState - ); - - // Send a codec specific message - HRESULT SendDriverMessage( - [in] int uMsg, - [in] long dw1, - [in] long dw2 - ); - - // - iDialog can be one of the VfwCaptureDialogs enums - // - ShowDialog can only be called when not streaming or when no other - // dialog is up already - // - an application can call GetState after ShowDialog(CONFIG) to - // see how the compressor was configured and next time the graph - // is used, it can call SetState with the data it saved to return - // the codec to the state configured by the dialog box from last time - // - GetState with a NULL pointer returns the size needed - // - SendDriverMessage can send a private message to the codec. - // USE IT AT YOUR OWN RISK! - } - - - //--------------------------------------------------------------------- - // IAMDroppedFrames interface - // - // Report status of capture - pin interface - //--------------------------------------------------------------------- - - // A capture filter's video output pin supports this. It reports - // how many frames were not sent (dropped), etc. - - // Every time your filter goes from STOPPED-->PAUSED, you reset all your - // counts to zero. - - // An app may call this all the time while you are capturing to see how - // capturing is going. MAKE SURE you always return as current information - // as possible while you are running. - - // When your capture filter starts running, it starts by sending frame 0, - // then 1, 2, 3, etc. The time stamp of each frame sent should correspond - // to the graph clock's time when the image was digitized. The end time - // is the start time plus the duration of the video frame. - // You should also set the MediaTime of each sample (SetMediaTime) as well. - // This should be the frame number ie (0,1) (1,2) (2,3). - // If a frame is dropped, a downstream filter will be able to tell easily - // not by looking for gaps in the regular time stamps, but by noticing a - // frame number is missing (eg. (1,2) (2,3) (4,5) (5,6) means frame 3 - // was dropped. - - // Using the info provided by this interface, an application can figure out - // the number of frames dropped, the frame rate achieved (the length of - // time the graph was running divided by the number of frames not dropped), - // and the data rate acheived (the length of time the graph was running - // divided by the average frame size). - - // If your filter is running, then paused, and then run again, you need - // to continue to deliver frames as if it was never paused. The first - // frame after the second RUN cannot be time stamped earlier than the last - // frame sent before the pause. - - // Your filter must always increment the MediaTime of each sample sent. - // Never send the same frame # twice, and never go back in time. The - // regular time stamp of a sample can also never go back in time. - - [ - object, - uuid(C6E13344-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMDroppedFrames : IUnknown - { - // Get the number of dropped frames - HRESULT GetNumDropped( - [out] long * plDropped - - ); - - //Get the number of non-dropped frames - HRESULT GetNumNotDropped( - [out] long * plNotDropped - - ); - - // - plArray points to an array of lSize longs. The filter will - // fill it with the frame number of the first lSize frames dropped. - // A filter may not have bothered to remember as many as you asked - // for, so it will set *plNumCopied to the number of frames it filled - // in. - HRESULT GetDroppedInfo( - [in] long lSize, - [out] long * plArray, - [out] long * plNumCopied - ); - - // - This is the average size of the frames it didn't drop (in bytes) - HRESULT GetAverageFrameSize( - [out] long * plAverageSize - - ); - - } - - - - cpp_quote("#define AMF_AUTOMATICGAIN -1.0") - - //--------------------------------------------------------------------- - // IAMAudioInputMixer interface - // - // Sets the recording levels, pan and EQ for the audio card inputs - //--------------------------------------------------------------------- - - // This interface is implemented by each input pin of an audio capture - // filter, to tell it what level, panning, and EQ to use for each input. - // The name of each pin will reflect the type of input, eg. "Line input 1" - // or "Mic". An application uses the pin names to decide how it wants to - // set the recording levels - - // This interface can also be supported by the audio capture filter itself - // to control to overall record level and panning after the mix - - [ - object, - uuid(54C39221-8380-11d0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMAudioInputMixer : IUnknown - { - // This interface is only supported by the input pins, not the filter - // If disabled, this channel will not be mixed in as part of the - // recorded signal. - HRESULT put_Enable ( - [in] BOOL fEnable); // TRUE=enable FALSE=disable - - //Is this channel enabled? - HRESULT get_Enable ( - [out] BOOL *pfEnable); - - // When set to mono mode, making a stereo recording of this channel - // will have both channels contain the same data... a mixture of the - // left and right signals - HRESULT put_Mono ( - [in] BOOL fMono); // TRUE=mono FALSE=multi channel - - //all channels combined into a mono signal? - HRESULT get_Mono ( - [out] BOOL *pfMono); - - // !!! WILL CARDS BE ABLE TO BOOST THE GAIN? - //Set the record level for this channel - HRESULT put_MixLevel ( - [in] double Level); // 0 = off, 1 = full (unity?) volume - // AMF_AUTOMATICGAIN, if supported, - // means automatic - - //Get the record level for this channel - HRESULT get_MixLevel ( - [out] double *pLevel); - - // For instance, when panned full left, and you make a stereo recording - // of this channel, you will record a silent right channel. - HRESULT put_Pan ( - [in] double Pan); // -1 = full left, 0 = centre, 1 = right - - //Get the pan for this channel - HRESULT get_Pan ( - [out] double *pPan); - - // Boosts the bass of low volume signals before they are recorded - // to compensate for the fact that your ear has trouble hearing quiet - // bass sounds - HRESULT put_Loudness ( - [in] BOOL fLoudness);// TRUE=on FALSE=off - - HRESULT get_Loudness ( - [out] BOOL *pfLoudness); - - // boosts or cuts the treble of the signal before it's recorded by - // a certain amount of dB - HRESULT put_Treble ( - [in] double Treble); // gain in dB (-ve = attenuate) - - //Get the treble EQ for this channel - HRESULT get_Treble ( - [out] double *pTreble); - - // This is the maximum value allowed in put_Treble. ie 6.0 means - // any value between -6.0 and 6.0 is allowed - HRESULT get_TrebleRange ( - [out] double *pRange); // largest value allowed - - // boosts or cuts the bass of the signal before it's recorded by - // a certain amount of dB - HRESULT put_Bass ( - [in] double Bass); // gain in dB (-ve = attenuate) - - // Get the bass EQ for this channel - HRESULT get_Bass ( - [out] double *pBass); - - // This is the maximum value allowed in put_Bass. ie 6.0 means - // any value between -6.0 and 6.0 is allowed - HRESULT get_BassRange ( - [out] double *pRange); // largest value allowed - - } - - - //--------------------------------------------------------------------- - // IAMBufferNegotiation interface - // - // Tells a pin what kinds of buffers to use when connected - //--------------------------------------------------------------------- - - // This interface can be implemented by any pin that will connect to - // another pin using IMemInputPin. All capture filters should support - // this interface. - - // SuggestAllocatorProperties is a way for an application to get - // in on the buffer negotiation process for a pin. This pin will use - // the numbers given to it by the application as its request to the - // allocator. An application can use a negative number for any element - // in the ALLOCATOR_PROPERTIES to mean "don't care". An application must - // call this function before the pin is connected, or it will be too late - // To ensure that an application gets what it wants, it would be wise to - // call this method on both pins being connected together, so the other - // pin doesn't overrule the application's request. - - // GetAllocatorProperties can only be called after a pin is connected and - // it returns the properties of the current allocator being used - - [ - object, - uuid(56ED71A0-AF5F-11D0-B3F0-00AA003761C5), - pointer_default(unique) - ] - interface IAMBufferNegotiation : IUnknown - { - HRESULT SuggestAllocatorProperties ( - [in] const ALLOCATOR_PROPERTIES *pprop); - - HRESULT GetAllocatorProperties ( - [out] ALLOCATOR_PROPERTIES *pprop); - - } - - - //--------------------------------------------------------------------- - // AnalogVideoStandard enum - //--------------------------------------------------------------------- - - typedef enum tagAnalogVideoStandard - { - AnalogVideo_None = 0x00000000, // This is a digital sensor - AnalogVideo_NTSC_M = 0x00000001, // 75 IRE Setup - AnalogVideo_NTSC_M_J = 0x00000002, // Japan, 0 IRE Setup - AnalogVideo_NTSC_433 = 0x00000004, - - AnalogVideo_PAL_B = 0x00000010, - AnalogVideo_PAL_D = 0x00000020, - AnalogVideo_PAL_G = 0x00000040, - AnalogVideo_PAL_H = 0x00000080, - AnalogVideo_PAL_I = 0x00000100, - AnalogVideo_PAL_M = 0x00000200, - AnalogVideo_PAL_N = 0x00000400, - - AnalogVideo_PAL_60 = 0x00000800, - - AnalogVideo_SECAM_B = 0x00001000, - AnalogVideo_SECAM_D = 0x00002000, - AnalogVideo_SECAM_G = 0x00004000, - AnalogVideo_SECAM_H = 0x00008000, - AnalogVideo_SECAM_K = 0x00010000, - AnalogVideo_SECAM_K1 = 0x00020000, - AnalogVideo_SECAM_L = 0x00040000, - AnalogVideo_SECAM_L1 = 0x00080000, - - AnalogVideo_PAL_N_COMBO // Argentina - = 0x00100000 - } AnalogVideoStandard; - - cpp_quote("#define AnalogVideo_NTSC_Mask 0x00000007") - cpp_quote("#define AnalogVideo_PAL_Mask 0x00100FF0") - cpp_quote("#define AnalogVideo_SECAM_Mask 0x000FF000") - - - //--------------------------------------------------------------------- - // TunerInputType enum - //--------------------------------------------------------------------- - - typedef enum tagTunerInputType - { - TunerInputCable, - TunerInputAntenna - } TunerInputType; - - //--------------------------------------------------------------------- - // VideoCopyProtectionType enum - //--------------------------------------------------------------------- - - typedef enum - { - VideoCopyProtectionMacrovisionBasic, - VideoCopyProtectionMacrovisionCBI - } VideoCopyProtectionType; - - //--------------------------------------------------------------------- - // PhysicalConnectorType enum - //--------------------------------------------------------------------- - - typedef enum tagPhysicalConnectorType - { - PhysConn_Video_Tuner = 1, - PhysConn_Video_Composite, - PhysConn_Video_SVideo, - PhysConn_Video_RGB, - PhysConn_Video_YRYBY, - PhysConn_Video_SerialDigital, - PhysConn_Video_ParallelDigital, - PhysConn_Video_SCSI, - PhysConn_Video_AUX, - PhysConn_Video_1394, - PhysConn_Video_USB, - PhysConn_Video_VideoDecoder, - PhysConn_Video_VideoEncoder, - PhysConn_Video_SCART, - PhysConn_Video_Black, - - - PhysConn_Audio_Tuner = 0x1000, - PhysConn_Audio_Line, - PhysConn_Audio_Mic, - PhysConn_Audio_AESDigital, - PhysConn_Audio_SPDIFDigital, - PhysConn_Audio_SCSI, - PhysConn_Audio_AUX, - PhysConn_Audio_1394, - PhysConn_Audio_USB, - PhysConn_Audio_AudioDecoder, - } PhysicalConnectorType; - - - - - //--------------------------------------------------------------------- - // IAMAnalogVideoDecoder interface - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13350-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMAnalogVideoDecoder : IUnknown - { - - //Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1... - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - //Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT put_TVFormat( - [in] long lAnalogVideoStandard - ); - - // Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // True if horizontal sync is locked - HRESULT get_HorizontalLocked ( - [out] long * plLocked); - - // True if connected to a VCR (changes PLL timing) - HRESULT put_VCRHorizontalLocking ( - [in] long lVCRHorizontalLocking); - - HRESULT get_VCRHorizontalLocking ( - [out] long * plVCRHorizontalLocking); - - // Returns the number of lines in the video signal")] - HRESULT get_NumberOfLines ( - [out] long *plNumberOfLines); - - // Enables or disables the output bus - HRESULT put_OutputEnable ( - [in] long lOutputEnable); - - HRESULT get_OutputEnable ( - [out] long *plOutputEnable); - - } - - - //--------------------------------------------------------------------- - // VideoProcAmp Property enum - //--------------------------------------------------------------------- - - typedef enum tagVideoProcAmpProperty - { - VideoProcAmp_Brightness, - VideoProcAmp_Contrast, - VideoProcAmp_Hue, - VideoProcAmp_Saturation, - VideoProcAmp_Sharpness, - VideoProcAmp_Gamma, - VideoProcAmp_ColorEnable, - VideoProcAmp_WhiteBalance, - VideoProcAmp_BacklightCompensation, - VideoProcAmp_Gain - } VideoProcAmpProperty; - - //--------------------------------------------------------------------- - // VideoProcAmp Flags enum - //--------------------------------------------------------------------- - - typedef enum tagVideoProcAmpFlags - { - VideoProcAmp_Flags_Auto = 0x0001, - VideoProcAmp_Flags_Manual = 0x0002 - } VideoProcAmpFlags; - - //--------------------------------------------------------------------- - // IAMVideoProcAmp interface - // - // Adjusts video quality in either the analog or digital domain. - // - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13360-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMVideoProcAmp : IUnknown - { - // Returns min, max, step size, and default values - HRESULT GetRange( - [in] long Property, // Which property to query - [out] long * pMin, // Range minimum - [out] long * pMax, // Range maxumum - [out] long * pSteppingDelta,// Step size - [out] long * pDefault, // Default value - [out] long * pCapsFlags // VideoProcAmpFlags - - ); - - // Set a VideoProcAmp property - HRESULT Set( - [in] long Property, // VideoProcAmpProperty - [in] long lValue, // Value to set - [in] long Flags // VideoProcAmp_Flags_* - - ); - - // Get a VideoProcAmp property - HRESULT Get( - [in] long Property, // VideoProcAmpProperty - [out] long * lValue, // Current value - [out] long * Flags // VideoProcAmp_Flags_* - ); - } - - - //--------------------------------------------------------------------- - // CameraControl Property enum - //--------------------------------------------------------------------- - - typedef enum tagCameraControlProperty - { - CameraControl_Pan, - CameraControl_Tilt, - CameraControl_Roll, - CameraControl_Zoom, - CameraControl_Exposure, - CameraControl_Iris, - CameraControl_Focus - } CameraControlProperty; - - //--------------------------------------------------------------------- - // CameraControl Flags enum - //--------------------------------------------------------------------- - - typedef enum tagCameraControlFlags - { - CameraControl_Flags_Auto = 0x0001, - CameraControl_Flags_Manual = 0x0002 - } CameraControlFlags; - - //--------------------------------------------------------------------- - // IAMCameraControl interface - // - // Control of local or remote cameras - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13370-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMCameraControl : IUnknown - { - // Returns min, max, step size, and default values - HRESULT GetRange( - [in] long Property, // Which property to query - [out] long * pMin, // Range minimum - [out] long * pMax, // Range maxumum - [out] long * pSteppingDelta,// Step size - [out] long * pDefault, // Default value - [out] long * pCapsFlags // CamaeraControlFlags - - ); - - // Set a CameraControl property - HRESULT Set( - [in] long Property, // CameraControlProperty - [in] long lValue, // Value to set - [in] long Flags // CameraControl_Flags_* - - ); - - // Get a CameraControl property - HRESULT Get( - [in] long Property, // CameraControlProperty - [out] long * lValue, // Current value - [out] long * Flags // CameraControl_Flags_* - ); - } - - //--------------------------------------------------------------------- - // VideoControl Flags enum - //--------------------------------------------------------------------- - - typedef enum tagVideoControlFlags - { - VideoControlFlag_FlipHorizontal = 0x0001, - VideoControlFlag_FlipVertical = 0x0002, - VideoControlFlag_ExternalTriggerEnable = 0x0004, - VideoControlFlag_Trigger = 0x0008 - - } VideoControlFlags; - - //--------------------------------------------------------------------- - // IAMVideoControl interface - // - // Control of horizontal & vertical flip, external trigger, - // and listing available frame rates - //--------------------------------------------------------------------- - - [ - object, - uuid(6a2e0670-28e4-11d0-a18c-00a0c9118956), - pointer_default(unique) - ] - interface IAMVideoControl : IUnknown - { - // What can the underlying hardware do? - HRESULT GetCaps( - [in] IPin * pPin, // the pin to query or control - [out] long * pCapsFlags // VideoControlFlag_* - - ); - - // Set the mode of operation - HRESULT SetMode( - [in] IPin * pPin, // the pin to query or control - [in] long Mode // VideoControlFlag_* - - ); - - // Get the mode of operation - HRESULT GetMode( - [in] IPin * pPin, // the pin to query or control - [out] long * Mode // VideoControlFlag_* - ); - - // Get actual frame rate info for USB and 1394 - // This is only available when streaming - HRESULT GetCurrentActualFrameRate( - [in] IPin * pPin, // the pin to query or control - [out] LONGLONG * ActualFrameRate // 100 nS units - ); - - // Get max available frame rate info for USB and 1394 - // Returns the max frame rate currently available based on bus bandwidth usage - HRESULT GetMaxAvailableFrameRate( - [in] IPin * pPin, // the pin to query or control - [in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1 - [in] SIZE Dimensions, // width and height - [out] LONGLONG * MaxAvailableFrameRate // 100 nS units - ); - - // Get List of available frame rates - HRESULT GetFrameRateList( - [in] IPin * pPin, // the pin to query or control - [in] long iIndex, // 0 to IAMStreamConfig->GetNumberOfCapabilities-1 - [in] SIZE Dimensions, // width and height - [out] long * ListSize, // Number of elements in the list - [out] LONGLONG ** FrameRates // Array of framerates in 100 nS units - // or NULL to just get ListSize - ); - - } - - - //--------------------------------------------------------------------- - // IAMCrossbar interface - // - // Controls a routing matrix for analog or digital video or audio - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E13380-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMCrossbar : IUnknown - { - - // How many pins are there? - HRESULT get_PinCounts( - [out] long * OutputPinCount, // count of output pins - [out] long * InputPinCount); // count of input pins - - // True if routing is possible - HRESULT CanRoute ( - [in] long OutputPinIndex, // the output pin - [in] long InputPinIndex); // the input pin - - // Routes an input pin to an output pin - HRESULT Route ( - [in] long OutputPinIndex, // the output pin - [in] long InputPinIndex); // the input pin - - // Returns the input pin connected to a given output pin - HRESULT get_IsRoutedTo ( - [in] long OutputPinIndex, // the output pin - [out] long * InputPinIndex); // the connected input pin - - // Returns a pin which is related to a given pin - // (ie. this audio pin is related to a video pin) - HRESULT get_CrossbarPinInfo ( - [in] BOOL IsInputPin, // TRUE for input pins - [in] long PinIndex, // a pin - [out] long * PinIndexRelated, // Index of related pin - [out] long * PhysicalType); // Physical type of pin - - } - - - //--------------------------------------------------------------------- - // IAMTuner interface - // - // base tuner device - //--------------------------------------------------------------------- - - // predefined subchannel values - typedef enum tagAMTunerSubChannel - { - AMTUNER_SUBCHAN_NO_TUNE = -2, // don't tune - AMTUNER_SUBCHAN_DEFAULT = -1 // use default sub chan - } AMTunerSubChannel; - - // predefined signal strength values - typedef enum tagAMTunerSignalStrength - { - AMTUNER_HASNOSIGNALSTRENGTH = -1, // cannot indicate signal strength - AMTUNER_NOSIGNAL = 0, // no signal available - AMTUNER_SIGNALPRESENT = 1 // signal present - } AMTunerSignalStrength; - - // specifies the mode of operation of the tuner - typedef enum tagAMTunerModeType - { - AMTUNER_MODE_DEFAULT = 0x0000, // default tuner mode - AMTUNER_MODE_TV = 0x0001, // tv - AMTUNER_MODE_FM_RADIO = 0x0002, // fm radio - AMTUNER_MODE_AM_RADIO = 0x0004, // am radio - AMTUNER_MODE_DSS = 0x0008, // dss - } AMTunerModeType; - - // Events reported by IAMTunerNotification - typedef enum tagAMTunerEventType{ - AMTUNER_EVENT_CHANGED = 0x0001, // status changed - } AMTunerEventType; - - interface IAMTunerNotification; - - [ - object, - uuid(211A8761-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTuner : IUnknown - { - // Sets and gets the Channel - HRESULT put_Channel( - [in] long lChannel, - [in] long lVideoSubChannel, - [in] long lAudioSubChannel - ); - HRESULT get_Channel( - [out] long *plChannel, - [out] long *plVideoSubChannel, - [out] long *plAudioSubChannel - ); - - // Gets the minimum and maximum channel available - HRESULT ChannelMinMax( - [out] long *lChannelMin, - [out] long *lChannelMax - ); - - // CountryCode is the same as the international - // long distance telephone dialing prefix - - HRESULT put_CountryCode( - [in] long lCountryCode - ); - HRESULT get_CountryCode( - [out] long *plCountryCode - ); - - HRESULT put_TuningSpace( - [in] long lTuningSpace - ); - HRESULT get_TuningSpace( - [out] long *plTuningSpace - ); - - [local] HRESULT Logon( - [in] HANDLE hCurrentUser - ); - HRESULT Logout(); - - // Signal status for current channel - // signal strength == TUNER_NOSIGNAL, or strength value - HRESULT SignalPresent( - [out] long * plSignalStrength // AMTunerSignalStrength - ); - - // allow multifunction tuner to be switch between modes - HRESULT put_Mode( - [in] AMTunerModeType lMode // AMTunerModeType - ); - HRESULT get_Mode( - [out] AMTunerModeType *plMode // AMTunerModeType - ); - - // retrieve a bitmask of the possible modes - HRESULT GetAvailableModes( - [out] long *plModes // AMTunerModeType - ); - - // allow IAMTuner clients to receive event notification - HRESULT RegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify, - [in] long lEvents // bitmask from AMTunerEventType enumeration - ); - HRESULT UnRegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify - ); - } - - //--------------------------------------------------------------------- - // IAMTunerNotification interface - // - // Provided to IAMTuner if notification callbacks are desired - //--------------------------------------------------------------------- - - [ - object, - uuid(211A8760-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTunerNotification : IUnknown - { - HRESULT OnEvent([in] AMTunerEventType Event); - } - - - //--------------------------------------------------------------------- - // IAMTVTuner interface - // - // Controls an analog TV tuner device - //--------------------------------------------------------------------- - - [ - object, - uuid(211A8766-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IAMTVTuner : IAMTuner - { - // Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ... - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - // Gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // Scans for a signal on a given channel - // NOTE: this is equivalent to put_Channel(), SignalStrength() - HRESULT AutoTune( - [in] long lChannel, - [out] long * plFoundSignal - ); - - // Saves the fine tuning information for all channels")] - HRESULT StoreAutoTune(); - - // The number of TV sources plugged into the tuner - HRESULT get_NumInputConnections( - [out] long * plNumInputConnections - ); - - // Sets or gets the tuner input type (Cable or Antenna) - HRESULT put_InputType( - [in] long lIndex, - [in] TunerInputType InputType - ); - HRESULT get_InputType( - [in] long lIndex, - [out] TunerInputType * pInputType - ); - - // Sets or gets the tuner input - HRESULT put_ConnectInput( - [in] long lIndex - ); - HRESULT get_ConnectInput( - [out] long *plIndex - ); - - // Gets the video and audio carrier frequencies - HRESULT get_VideoFrequency( - [out] long *lFreq - ); - HRESULT get_AudioFrequency( - [out] long *lFreq - ); - } - - - //--------------------------------------------------------------------- - // IBPCSatelliteTuner interface - // - // An interface supporting Satellite tuning-related functions - //--------------------------------------------------------------------- - [ - object, - local, - uuid(211A8765-03AC-11d1-8D13-00AA00BD8339), - pointer_default(unique) - ] - interface IBPCSatelliteTuner : IAMTuner - { - HRESULT get_DefaultSubChannelTypes( - [out] long *plDefaultVideoType, // Provider-specific service type - [out] long *plDefaultAudioType // Provider-specific service type - ); - - HRESULT put_DefaultSubChannelTypes( - [in] long lDefaultVideoType, // Provider-specific service type - [in] long lDefaultAudioType // Provider-specific service type - ); - - HRESULT IsTapingPermitted(); // S_OK yes, S_FALSE no - } - - - - //--------------------------------------------------------------------- - // IAMTVAudio interface - // - // TV Audio control - //--------------------------------------------------------------------- - - typedef enum tagTVAudioMode - { - AMTVAUDIO_MODE_MONO = 0x0001, // Mono - AMTVAUDIO_MODE_STEREO = 0x0002, // Stereo - AMTVAUDIO_MODE_LANG_A = 0x0010, // Primary language - AMTVAUDIO_MODE_LANG_B = 0x0020, // 2nd avail language - AMTVAUDIO_MODE_LANG_C = 0x0040, // 3rd avail language - } TVAudioMode; - - // Events reported by IAMTVAudioNotification - typedef enum tagAMTVAudioEventType - { - AMTVAUDIO_EVENT_CHANGED = 0x0001, // mode changed - } AMTVAudioEventType; - - interface IAMTVAudioNotification; - - [ - object, - local, - uuid(83EC1C30-23D1-11d1-99E6-00A0C9560266), - pointer_default(unique) - ] - interface IAMTVAudio : IUnknown - { - // retrieve a bitmask of the formats available in the hardware - HRESULT GetHardwareSupportedTVAudioModes( - [out] long *plModes // TVAudioMode - ); - - // retrieve a bitmask of the possible modes - HRESULT GetAvailableTVAudioModes( - [out] long *plModes // TVAudioMode - ); - - HRESULT get_TVAudioMode( - [out] long *plMode // TVAudioMode - ); - HRESULT put_TVAudioMode( - [in] long lMode // TVAudioMode - ); - - // allow IAMTVAudio clients to receive event notification - HRESULT RegisterNotificationCallBack( - [in] IAMTunerNotification *pNotify, - [in] long lEvents // bitmask from AMTVAudioEventType enumeration - ); - HRESULT UnRegisterNotificationCallBack( - IAMTunerNotification *pNotify - ); - } - - //--------------------------------------------------------------------- - // IAMTVAudioNotification interface - // - // Provided to IAMTVAudio clients if notification callbacks are desired - //--------------------------------------------------------------------- - - [ - object, - local, - uuid(83EC1C33-23D1-11d1-99E6-00A0C9560266), - pointer_default(unique) - ] - interface IAMTVAudioNotification : IUnknown - { - HRESULT OnEvent([in] AMTVAudioEventType Event); - } - - - - - //--------------------------------------------------------------------- - // IAMAnalogVideoEncoder interface - //--------------------------------------------------------------------- - - [ - object, - uuid(C6E133B0-30AC-11d0-A18C-00A0C9118956), - pointer_default(unique) - ] - interface IAMAnalogVideoEncoder : IUnknown - { - // Gets the supported analog video standards (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT get_AvailableTVFormats( - [out] long *lAnalogVideoStandard - ); - - // Sets or gets the current analog video standard (NTSC/M, PAL/B, SECAM/K1, ...) - HRESULT put_TVFormat( - [in] long lAnalogVideoStandard - ); - - HRESULT get_TVFormat( - [out] long * plAnalogVideoStandard - ); - - // Sets or gets the copy protection - HRESULT put_CopyProtection ( - [in] long lVideoCopyProtection); // VideoCopyProtectionType - - HRESULT get_CopyProtection ( - [out] long *lVideoCopyProtection); // VideoCopyProtectionType - - - // Enables and disables close captioning - HRESULT put_CCEnable ( - [in] long lCCEnable); - - HRESULT get_CCEnable ( - [out] long *lCCEnable); - - } - - // used by IKsPropertySet set AMPROPSETID_Pin - typedef enum { - AMPROPERTY_PIN_CATEGORY, - AMPROPERTY_PIN_MEDIUM - } AMPROPERTY_PIN; - - //--------------------------------------------------------------------- - // IKsPropertySet interface - // - // Sets or gets a property identified by a property set GUID and a - // property ID. - // - // Return codes for all 3 methods: - // E_PROP_SET_UNSUPPORTED the property set is not supported - // E_PROP_ID_UNSUPPORTED the property ID is not supported - // for the specified property set - //--------------------------------------------------------------------- - -cpp_quote("#ifndef _IKsPropertySet_") -cpp_quote("#define _IKsPropertySet_") - - //--------------------------------------------------------------------- - // #defines for IKsPropertySet::QuerySupported return result in pTypeSupport - //--------------------------------------------------------------------- - -cpp_quote("#define KSPROPERTY_SUPPORT_GET 1") -cpp_quote("#define KSPROPERTY_SUPPORT_SET 2") - - - [ - object, - uuid(31EFAC30-515C-11d0-A9AA-00AA0061BE93), - pointer_default(unique) - ] - interface IKsPropertySet : IUnknown - { - [local] HRESULT Set( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] LPVOID pInstanceData, - [in] DWORD cbInstanceData, - [in, size_is(cbPropData)] LPVOID pPropData, - [in] DWORD cbPropData); - - [call_as(Set)] HRESULT RemoteSet( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] byte * pInstanceData, - [in] DWORD cbInstanceData, - [in, size_is(cbPropData)] byte * pPropData, - [in] DWORD cbPropData); - - // To get a property, the caller allocates a buffer which the called - // function fills in. To determine necessary buffer size, call Get with - // pPropData=NULL and cbPropData=0. - [local] HRESULT Get( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] LPVOID pInstanceData, - [in] DWORD cbInstanceData, - [out, size_is(cbPropData)] LPVOID pPropData, - [in] DWORD cbPropData, - [out] DWORD * pcbReturned); - - [call_as(Get)] HRESULT RemoteGet( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [in, size_is(cbInstanceData)] byte * pInstanceData, - [in] DWORD cbInstanceData, - [out, size_is(cbPropData)] byte * pPropData, - [in] DWORD cbPropData, - [out] DWORD * pcbReturned); - // QuerySupported must either return E_NOTIMPL or correctly indicate - // if getting or setting the property set and property is supported. - // S_OK indicates the property set and property ID combination is - HRESULT QuerySupported( - [in] REFGUID guidPropSet, - [in] DWORD dwPropID, - [out] DWORD *pTypeSupport); - } -cpp_quote("#endif // _IKsPropertySet_") - -[ -object, -uuid(6025A880-C0D5-11d0-BD4E-00A0C911CE86), -pointer_default(unique) -] -interface IMediaPropertyBag : IPropertyBag -{ - import "ocidl.idl"; - - typedef IMediaPropertyBag *LPMEDIAPROPERTYBAG; - - // return the i'th element in the property bag - HRESULT EnumProperty( - [in] ULONG iProperty, - [in, out] VARIANT * pvarPropertyName, - [in, out] VARIANT * pvarPropertyValue - ); - -} - - -[ -object, -uuid(5738E040-B67F-11d0-BD4D-00A0C911CE86), -pointer_default(unique) -] -interface IPersistMediaPropertyBag : IPersist -{ - import "ocidl.idl"; - import "unknwn.idl"; - - HRESULT InitNew( - void - ); - - HRESULT Load( - [in] IMediaPropertyBag * pPropBag, - [in] IErrorLog * pErrorLog - ); - - HRESULT Save( - [in] IMediaPropertyBag * pPropBag, - [in] BOOL fClearDirty, - [in] BOOL fSaveAllProperties - ); - - - typedef IPersistMediaPropertyBag * LPPERSISTMEDIAPROPERTYBAG; -} - - - //--------------------------------------------------------------------- - // - // Defines IAMPhysicalPinInfo Interface - // - // Returns an enum and string that describes an input pin's physical type. - // - // Implement if: you have physical input pins such as video or audio (like - // on a video capture card or a VCR) - // - // Use if: you want to communicate to a user available physical input pins - // and allow them to select the active one if there is more than one - //--------------------------------------------------------------------- - - -[ - object, - uuid(F938C991-3029-11cf-8C44-00AA006B6814), - pointer_default(unique) - ] -interface IAMPhysicalPinInfo : IUnknown { - - // Returns VFW_E_NO_ACCEPTABLE_TYPES if not a physical pin - HRESULT GetPhysicalType( - [out] long *pType, // the enum representing the Physical Type - [out] LPOLESTR *ppszType // a friendly name - ); -} -typedef IAMPhysicalPinInfo *PAMPHYSICALPININFO; - - //--------------------------------------------------------------------- - // Defines IAMExtDevice Interface - // - // Base interface for external professional devices - // - // Implement if: the filter controls an external device such as a VCR, - // timecode reader/generator, etc. The intent is to build a object from - // this implementation plus another that specifically describes the device, - // such as IAMExtTransport. - // - // Use if: you want to control and external device such as a VCR - // - // See edevdefs.h for the enumerated parameter list - //--------------------------------------------------------------------- - [ - object, - uuid(B5730A90-1A2C-11cf-8C23-00AA006B6814), - pointer_default(unique) - ] - interface IAMExtDevice : IUnknown - { - // General device capabilities property. See edevdefs.h for supported - // values - HRESULT GetCapability( - [in] long Capability, // identify the property - [out] long *pValue, // return value - [out] double *pdblValue // return value - ); - - // Get external device identification string. Usually the model # - // of the device - HRESULT get_ExternalDeviceID( - [out] LPOLESTR *ppszData // ID string - ); - - HRESULT get_ExternalDeviceVersion( - [out] LPOLESTR *ppszData // revision string - ); - - // Controls the external device's power mode - HRESULT put_DevicePower([in] long PowerMode - ); - HRESULT get_DevicePower([out] long *pPowerMode - ); - - // Some devices need to be reset in some way, i.e., rewinding a VCR - // to the beginning of the tape and resetting the counter to zero. - HRESULT Calibrate( - [in] HEVENT hEvent, - [in] long Mode, - [out] long *pStatus // OATRUE is active, OAFALSE is inactive - ); - - // Selects the device's communications port, i.e.,COM1, IEEE1394, etc. - // See edevdefs.h for enums - HRESULT put_DevicePort([in] long DevicePort - ); - HRESULT get_DevicePort([out] long *pDevicePort - ); - -} -typedef IAMExtDevice *PEXTDEVICE; - - //--------------------------------------------------------------------- - // Defines IAMExtTransport Interface - // - // Contains properties and methods that control behavior of an external - // transport device such as a VTR - // - // Implement if: you control such a device. Intended to be agregated - // with IAMExtDevice. - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- -[ - object, - uuid(A03CD5F0-3045-11cf-8C44-00AA006B6814), - pointer_default(unique) - ] -interface IAMExtTransport : IUnknown { - - // General transport capabilities property. See edevdefs.h for enums - HRESULT GetCapability( - [in] long Capability, // identify the property - [out] long *pValue, // return value - [out] double *pdblValue // return value - ); - - // For disc-based devices: spinning, or not spinning. - // For tape-based device: threaded, unthreaded or ejected - HRESULT put_MediaState([in] long State - ); - HRESULT get_MediaState([out] long *pState // see edevdefs.h - ); - - // Determines state of unit's front panel - HRESULT put_LocalControl([in] long State - ); - HRESULT get_LocalControl([out] long *pState // OATRUE or OAFALSE - ); - - // Transport status such as Play, Stop, etc. More extensive - // than AM states. - HRESULT GetStatus( - [in] long StatusItem, // see edevdefs.h - [out] long *pValue - ); - - // Parameters such as recording speed, servo reference, ballistics, etc. - HRESULT GetTransportBasicParameters( - [in] long Param, - [out] long *pValue, - [out] LPOLESTR *ppszData - ); - - HRESULT SetTransportBasicParameters( - [in] long Param, - [in] long Value, - [in] LPCOLESTR pszData - ); - - // Parameters such as video output mode - HRESULT GetTransportVideoParameters( - [in] long Param, - [out] long *pValue - ); - - HRESULT SetTransportVideoParameters( - [in] long Param, - [in] long Value - ); - - // Parameters such as audio channel enable - HRESULT GetTransportAudioParameters( - [in] long Param, - [out] long *pValue - ); - - HRESULT SetTransportAudioParameters( - [in] long Param, - [in] long Value - ); - - // Mode is the movement of the transport, i.e., Play, Stop, - // Record, Edit, etc. - HRESULT put_Mode([in] long Mode - ); - HRESULT get_Mode([out] long *pMode - ); - - // Rate is for variable speed control of the the device. This - // can be linked to IMediaControl::Rate() in the implementation - // if desired. - HRESULT put_Rate([in] double dblRate - ); - HRESULT get_Rate([out] double *pdblRate - ); - - // This is a lengthy method, that is, it is in effect until canceled or complete and - // requires housekeeping by the filter. It puts transport in play mode and maintains - // fixed relationship between master time reference and transport position. - HRESULT GetChase( - [out] long *pEnabled, // OATRUE | OAFALSE - [out] long *pOffset, // offset in current time format - [out] HEVENT *phEvent // completion notification - ); - HRESULT SetChase( - [in] long Enable, // OATRUE | OAFALSE - [in] long Offset, // offset in current time format - [in] HEVENT hEvent // completion notification - ); - - // Also a lengthy method: temporarily change transport speed (for synchronizing). - HRESULT GetBump( - [out] long *pSpeed, - [out] long *pDuration // in current time format - ); - HRESULT SetBump( - [in] long Speed, - [in] long Duration // in current time format - ); - - // Enable/Disable transport anti-headclog control. - HRESULT get_AntiClogControl([out] long *pEnabled // OATRUE | OAFALSE - ); - HRESULT put_AntiClogControl([in] long Enable // OATRUE | OAFALSE - ); - - // The following group of properties describes edit events. An edit event can be a - // standard insert or assemble edit or a memorized position called a bookmark. - // A NOTE ABOUT EVENTS: as with all lengthy commands, event objects must be created to - // signal completion or error. - - // Intended usage: an edit event is prepared for use by: - // 1. Registering an edit property set and getting an EditID - // 2. Setting the necessary edit properties - // 3. Setting the edit property set active - - // Please see edevdefs.h for properties and values - - // The reference clock's advance is the mechanism that puts an edit in motion (see - // ED_EDIT_REC_INPOINT). - - // Property set methods - HRESULT GetEditPropertySet( - [in] long EditID, - [out] long *pState // ED_SET_ACTIVE | ED_SET_INACTIVE | ED_SET_INVALID - // | ED_SET_EXECUTING - ); - - HRESULT SetEditPropertySet( - [in, out] long *pEditID, - [in] long State // ED_SET_REGISTER | ED_SET_DELETE | ED_SET_ACTIVE | - ); // ED_SET_INACTIVE - - // the following properties define an edit event such as a bookmark, seek point, or - // actual edit - HRESULT GetEditProperty( - [in] long EditID, - [in] long Param, - [out] long *pValue - ); - HRESULT SetEditProperty( - [in] long EditID, - [in] long Param, - [in] long Value - ); - - // Activates a capable transport's edit control (typically used for "on the fly" editing). - HRESULT get_EditStart([out] long *pValue // OATRUE or OAFALSE - ); - HRESULT put_EditStart([in] long Value // OATRUE or OAFALSE - ); -} -typedef IAMExtTransport *PIAMEXTTRANSPORT; - - //--------------------------------------------------------------------- - // Defines IAMTimecodeReader Interface - // - // Contains properties and methods that define behavior of a - // SMPTE/MIDI Timecode Reader. It is expected that this interface - // will be combined (aggregated) with IAMExtTransport to "build" a pro - // VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //===================================================================== - - -// timecode structures -cpp_quote("#if 0") -cpp_quote("/* the following is what MIDL knows how to remote */") -typedef struct tagTIMECODE { - WORD wFrameRate; // will be replaced by AM defs, but see ED_FORMAT_SMPTE for now - WORD wFrameFract; // fractional frame. full scale is always 0x1000 - DWORD dwFrames; -}TIMECODE; -cpp_quote("#else /* 0 */") -cpp_quote("#ifndef TIMECODE_DEFINED") -cpp_quote("#define TIMECODE_DEFINED") -cpp_quote("typedef union _timecode {") -cpp_quote(" struct {") -cpp_quote(" WORD wFrameRate;") -cpp_quote(" WORD wFrameFract;") -cpp_quote(" DWORD dwFrames;") -cpp_quote(" };") -cpp_quote(" DWORDLONG qw;") -cpp_quote(" } TIMECODE;") -cpp_quote("") -cpp_quote("#endif /* TIMECODE_DEFINED */") -cpp_quote("#endif /* 0 */") - -typedef TIMECODE *PTIMECODE; - -typedef struct tagTIMECODE_SAMPLE { - LONGLONG qwTick; // ActiveMovie 100ns timestamp - TIMECODE timecode; // timecode - DWORD dwUser; // timecode user data (aka user bits) - DWORD dwFlags; // timecode flags - see below -} TIMECODE_SAMPLE; -typedef TIMECODE_SAMPLE *PTIMECODE_SAMPLE; - - -[ - object, - uuid(9B496CE1-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) -] -interface IAMTimecodeReader : IUnknown -{ - // Timecode Reader Mode - gets/sets the following properties - // ED_TCR_SOURCE - timecode gen (readback), LTC, VITC, or Control Track - HRESULT GetTCRMode( - [in] long Param, - [out] long *pValue); - HRESULT SetTCRMode( - [in] long Param, - [in] long Value); - - // Select which line of the vertical interval timecode will be read from (if VITC). - // To read VITC on specific multiple lines, the caller would make successive calls to - // put_VITCLine(), once for each line desired. - HRESULT put_VITCLine( - [in] long Line ); // valid lines are 11-20, 0 means autoselect, - // hi bit set means add to list of lines (for - // readers that test across multiple lines) - HRESULT get_VITCLine( - [out] long *pLine ); // hi bit set means multiple lines are used, - // and successive calls will cycle through the - // line numbers (like an enumerator, only simpler) - - // GetTimecode can be used to obtain the most recent timecode value available in the - // stream. The client can use this to monitor the timecode, parse duplicates and - // discontinuities. The source filter supplying the timecode or possibly a down stream - // filter might want to parse for discontinuities or errors since you have to look at - // every sample to do this properly. - // - - HRESULT GetTimecode( - [out] PTIMECODE_SAMPLE pTimecodeSample) ; - -} -typedef IAMTimecodeReader *PIAMTIMECODEREADER; - - //--------------------------------------------------------------------- - //===================================================================== - // Defines IAMTimecodeGenerator Interface - // - // Contains properties and methods that define behavior of an external - // SMPTE/MIDI Timecode Generator. It is expected that this interface - // will be combined (aggregated) with IAMExtTransport to "build" a pro - // VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- -[ - object, - uuid(9B496CE0-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) - ] -interface IAMTimecodeGenerator : IUnknown { - - // Timecode Generator Mode - gets/sets the following properties (see - // vcrdefss.h for detailed values): - // ED_TCG_TIMECODE_TYPE - LTC, VITC, or MIDI - // ED_TCG_FRAMERATE - 24, 25, 30 drop or 30 nondrop - // ED_TCG_SYNC_SOURCE - what is driving the bitclock - // ED_TCG_REFERENCE_SOURCE - what is driving the count value - HRESULT GetTCGMode( - [in] long Param, - [out] long *pValue); - - HRESULT SetTCGMode( - [in] long Param, - [in] long Value); - - // Select into which line(s) of the vertical interval timecode will be inserted (if VITC). - // Hi bit set means add this line to any previously set lines. - // To generate VITC on specific multiple lines, the caller would make successive calls to - // put_VITCLine(), once for each line desired. - HRESULT put_VITCLine( - [in] long Line // valid lines are 11-20, 0 means autoselect(this setting - ); // is for TC readers that decode from multiple lines) - HRESULT get_VITCLine( - [out] long *pLine - ); - - // Sets timecode and/or userbit value. If generator is running, takes effect - // immediately. If caller wants to set only timecode, set userbit value to -1L (and - // same for setting userbits only) - // - - HRESULT SetTimecode( - [in] PTIMECODE_SAMPLE pTimecodeSample) ; - - - // GetTimecode can be used to obtain the most recent timecode value available in the - // stream. The client can use this to monitor the timecode and verify the generator is - // working properly - // - - HRESULT GetTimecode( - [out] PTIMECODE_SAMPLE pTimecodeSample) ; - -} -typedef IAMTimecodeGenerator *PIAMTIMECODEGENERATOR; - - //--------------------------------------------------------------------- - // Defines IAMTimecodeDisplay Interface - // - // Contains properties and methods that define behavior of an external - // SMPTE/MIDI Timecode Display device (aka "character generator" for - // making "burn-ins" or "window dubs"). It is expected that this interface - // will be combined (aggregated) with IAMExtTransport and the timecode - // interfaces to "build" a pro VCR. - // - // Implement if: you control such a device - // - // Use if: you want to control such a device - // - // See edevdefs.h for the parameter lists - //--------------------------------------------------------------------- -[ - object, - uuid(9B496CE2-811B-11cf-8C77-00AA006B6814), - pointer_default(unique) - ] -interface IAMTimecodeDisplay : IUnknown -{ - // Enable/disable external device's timecode reader's character generator output. Some - // readers have this feature - this is not intended for rendering inside the PC! - HRESULT GetTCDisplayEnable( - [out] long *pState); // OATRUE | OAFALSE - HRESULT SetTCDisplayEnable( - [in] long State); // OATRUE | OAFALSE - // Timecode reader's character generator output - // characteristics (size, position, intensity, etc.). - HRESULT GetTCDisplay( - [in] long Param, - [out] long *pValue); - HRESULT SetTCDisplay( - [in] long Param, - [in] long Value); - - /* Allowable params and values (see edevdefs.h for details): - ED_TCD_SOURCE - ED_TCR | ED_TCG - ED_TCD_SIZE - ED_SMALL | ED_MED | ED_LARGE - ED_TCD_POSITION - ED_TOP | ED_MIDDLE | ED_BOTTOM or'd with - ED_LEFT | ED_CENTER | ED_RIGHT - ED_TCD_INTENSITY - ED_HIGH | ED_LOW - ED_TCD_TRANSPARENCY // set from 0 to 4, 0 being completely opaque - ED_TCD_INVERT // white on black or black on white - OATRUE | OAFALSE - ED_TCD_BORDER // white border for black chars, black border for white letters - OATRUE | OAFALSE - */ -} -typedef IAMTimecodeDisplay *PIAMTIMECODEDISPLAY; - - -[ - object, - uuid(c6545bf0-e76b-11d0-bd52-00a0c911ce86), - pointer_default(unique) -] -interface IAMDevMemoryAllocator : IUnknown -{ - HRESULT GetInfo( - [out] DWORD *pdwcbTotalFree, - [out] DWORD *pdwcbLargestFree, - [out] DWORD *pdwcbTotalMemory, - [out] DWORD *pdwcbMinimumChunk); - - HRESULT CheckMemory( - [in] const BYTE *pBuffer); - - HRESULT Alloc( - [out] BYTE **ppBuffer, - [in, out] DWORD *pdwcbBuffer); - - HRESULT Free( - [in] BYTE *pBuffer); - - HRESULT GetDevMemoryObject( - [out] IUnknown **ppUnkInnner, - [in] IUnknown *pUnkOuter); -} -typedef IAMDevMemoryAllocator *PAMDEVMEMORYALLOCATOR; - - -[ - object, - uuid(c6545bf1-e76b-11d0-bd52-00a0c911ce86), - pointer_default(unique) -] -interface IAMDevMemoryControl : IUnknown -{ - HRESULT QueryWriteSync(); - - HRESULT WriteSync(); - - HRESULT GetDevId( - [out] DWORD *pdwDevId); - -} -typedef IAMDevMemoryControl *PAMDEVMEMORYCONTROL; - -// Flags for IAMStreamSelection::Info -enum _AMSTREAMSELECTINFOFLAGS { - AMSTREAMSELECTINFO_ENABLED = 0x01, // Enable - off for disable - AMSTREAMSELECTINFO_EXCLUSIVE = 0x02 // Turns off the others in the group - // when enabling this one -}; -// Flags for IAMStreamSelection::Enable -enum _AMSTREAMSELECTENABLEFLAGS { - // Currently valid values are : - // 0 - disable all streams in the group containing this stream - // ..._ENABLE - enable only this stream with in the given group - // and disable all others - // ..._ENABLEALL - send out all streams - AMSTREAMSELECTENABLE_ENABLE = 0x01, // Enable - AMSTREAMSELECTENABLE_ENABLEALL = 0x02 // Enable all streams in the group - // containing this stream -}; - -// Control which logical streams are played and find out information about -// them -// Normally supported by a filter -[ - object, - uuid(c1960960-17f5-11d1-abe1-00a0c905f375), - pointer_default(unique) -] -interface IAMStreamSelect : IUnknown -{ - // Returns total count of streams - HRESULT Count( - [out] DWORD *pcStreams); // Count of logical streams - - // Return info for a given stream - S_FALSE if iIndex out of range - // The first steam in each group is the default - HRESULT Info( - [in] long lIndex, // 0-based index - [out] AM_MEDIA_TYPE **ppmt, // Media type - optional - // Use DeleteMediaType to free - [out] DWORD *pdwFlags, // flags - optional - [out] LCID *plcid, // LCID (returns 0 if none) - optional - [out] DWORD *pdwGroup, // Logical group - optional - [out] WCHAR **ppszName, // Name - optional - free with CoTaskMemFree - // optional - [out] IUnknown **ppObject, // Associated object - optional - // Object may change if Enable is - // called on this interface - // - returns NULL if no associated object - // Returns pin or filter for DShow - [out] IUnknown **ppUnk); // Stream specific interface - - // Enable or disable a given stream - HRESULT Enable( - [in] long lIndex, - [in] DWORD dwFlags); -} -typedef IAMStreamSelect *PAMSTREAMSELECT; - -enum _AMRESCTL_RESERVEFLAGS -{ - AMRESCTL_RESERVEFLAGS_RESERVE = 0x00, // Increment reserve count - AMRESCTL_RESERVEFLAGS_UNRESERVE = 0x01 // Decrement reserve count -}; - -// Reserve resources now so that playback can be subsequently -// guaranteed -// -// Normally supported by a filter -// -[ - object, - uuid(8389d2d0-77d7-11d1-abe6-00a0c905f375), - pointer_default(unique), - local -] -interface IAMResourceControl : IUnknown -{ - // The reserve count is incremented/decremented if and only if - // S_OK is returned - // Unreserve once for every Reserve call - HRESULT Reserve( - [in] DWORD dwFlags, // From _AMRESCTL_RESERVEFLAGS enum - [in] PVOID pvReserved // Must be NULL - ); -} - - -// Set clock adjustments - supported by some clocks -[ - object, - uuid(4d5466b0-a49c-11d1-abe8-00a0c905f375), - pointer_default(unique), - local -] -interface IAMClockAdjust : IUnknown -{ - // Set the following delta to clock times - // The clock will add adjust its times by the given delta - HRESULT SetClockDelta( - [in] REFERENCE_TIME rtDelta - ); -}; - -// Filter miscellaneous status flags - -enum _AM_FILTER_MISC_FLAGS { - AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x00000001, /* Will deliver EC_COMPLETE - at end of media */ - AM_FILTER_MISC_FLAGS_IS_SOURCE = 0x00000002 /* Filter sources data */ -}; - -[ - object, - uuid(2dd74950-a890-11d1-abe8-00a0c905f375), - pointer_default(unique), - local -] -interface IAMFilterMiscFlags : IUnknown -{ - // Get miscellaneous property flags - ULONG GetMiscFlags(void); -}; - - -// Video Image drawing interface -[ - object, - local, - uuid(48efb120-ab49-11d2-aed2-00a0c995e8d5), - pointer_default(unique), -] -interface IDrawVideoImage : IUnknown -{ - HRESULT DrawVideoImageBegin(); - - HRESULT DrawVideoImageEnd(); - - HRESULT DrawVideoImageDraw( - [in] HDC hdc, - [in] LPRECT lprcSrc, - [in] LPRECT lprcDst - ); -} - -// -// Video Image decimation interface -// -// The aim of this interface is to enable a video renderer filter to -// control the decimation properties of a video decoder connected to -// the video renderer -// -// This interface should only be supported by decoders that are capable of -// decimating their output image by an arbitary amount. -// -// -[ - object, - local, - uuid(2e5ea3e0-e924-11d2-b6da-00a0c995e8df), - pointer_default(unique), -] -interface IDecimateVideoImage : IUnknown -{ - // - // Informs the decoder that it should decimate its output - // image to the specified width and height. If the decoder can - // decimate to this size it should return S_OK. - // If the decoder can't perform the requested decimation - // or wants to stop performing the decimation that it is - // currently doing it should return E_FAIL. - // - HRESULT SetDecimationImageSize( - [in] long lWidth, - [in] long lHeight); - - // - // Informs the decoder that it should stop decimating its output image - // and resume normal output. - // - HRESULT ResetDecimationImageSize(); -} - -typedef enum _DECIMATION_USAGE { - DECIMATION_LEGACY, // decimate at ovly then video port then crop - DECIMATION_USE_DECODER_ONLY, // decimate image at the decoder only - DECIMATION_USE_VIDEOPORT_ONLY, // decimate at the video port only - DECIMATION_USE_OVERLAY_ONLY, // decimate at the overlay only - DECIMATION_DEFAULT // decimate at decoder then ovly the vide port then crop -} DECIMATION_USAGE; - -[ - object, - local, - uuid(60d32930-13da-11d3-9ec6-c4fcaef5c7be), - pointer_default(unique), -] -interface IAMVideoDecimationProperties: IUnknown -{ - // - // Queries the current usage of the above IDecimateVideoImage - // interface. - // - HRESULT QueryDecimationUsage( - [out] DECIMATION_USAGE* lpUsage); // from DECIMATION_USAGE enum - - // - // Sets the current usage of the above IDecimateVideoImage - // interface. - // - HRESULT SetDecimationUsage( - [in] DECIMATION_USAGE Usage); // from DECIMATION_USAGE enum -} - -//--------------------------------------------------------------------- -// -// IVideoFrameStep interface -// -//--------------------------------------------------------------------- - -[ - object, - uuid(e46a9787-2b71-444d-a4b5-1fab7b708d6a), - pointer_default(unique), -] -interface IVideoFrameStep : IUnknown -{ - // - // Stop(), Pause(), Run() all cancel Step as does any seeking - // request. - // - // The Step() and CancelStep() methods of this interface - // Cancel any previous step. - // - // When stepping is complete EC_STEP_COMPLETE is signalled. - // - // When the filter graph gets EC_STEP_COMPLETE it automatically - // sets the filter graph into paused state and forwards the - // notification to the application - // - // Returns S_OK if stepping initiated. - // - // dwFrames - // 1 means step 1 frame forward - // 0 is invalid - // n (n > 1) means skip n - 1 frames and show the nth - // - // pStepObject - // NULL - default step object (filter) picked - // non-NULL - use this object for stepping - // - HRESULT Step(DWORD dwFrames, [unique] IUnknown *pStepObject); - - // Can step? - // Returns S_OK if it can, S_FALSE if it can't or error code. - // bMultiple - if TRUE return whether can step n > 1 - HRESULT CanStep(long bMultiple, [unique] IUnknown *pStepObject); - - // Cancel stepping - HRESULT CancelStep(); -} - - - - -//--------------------------------------------------------------------- -// -// IAMPushSource interface -// -// Provides a means for source filters to describe information about the -// data that they source, such as whether the data is live or not, and -// what type of clock was used for timestamps. This information may be -// needed by other clocks in the graph in order to provide accurate -// synchronization. Also provides a way to specify an offset value for -// the filter to use when timestamping the streams it sources. Provides -// support for the IAMLatency interface as well. -// -//--------------------------------------------------------------------- - -enum _AM_PUSHSOURCE_FLAGS { - - // - // The default assumption is that the data is from a live source, - // time stamped with the graph clock, and the source does not - // attempt to rate match the data it delivers. - // The following flags can be used to override this assumption. - // - - // capability flags - AM_PUSHSOURCECAPS_INTERNAL_RM = 0x00000001, // source provides internal support for rate matching - AM_PUSHSOURCECAPS_NOT_LIVE = 0x00000002, // don't treat source data as live - AM_PUSHSOURCECAPS_PRIVATE_CLOCK = 0x00000004, // source data timestamped with clock not - // exposed to the graph - - // request flags, set by user via SetPushSourceFlags method - AM_PUSHSOURCEREQS_USE_STREAM_CLOCK = 0x00010000, // source was requested to timestamp - // using a clock that isn't the graph clock - - AM_PUSHSOURCEREQS_USE_CLOCK_CHAIN = 0x00020000, // source requests reference clock chaining -}; - -// -// Used to set a source filter to run in a "live" mode. -// -[ -object, - uuid(F185FE76-E64E-11d2-B76E-00C04FB6BD3D), - pointer_default(unique) -] -interface IAMPushSource : IAMLatency -{ - // used to discover push source's capabilities. - // may be any combination of the AM_PUSHSOURCE_FLAGS flags. - HRESULT GetPushSourceFlags ( - [out] ULONG *pFlags - ); - - // used to set request flags for a push source. - // may be a combination of the AM_PUSHSOURCE_REQS_xxx flags. - HRESULT SetPushSourceFlags ( - [in] ULONG Flags - ); - - // specify an offset for push source time stamps - HRESULT SetStreamOffset ( - [in] REFERENCE_TIME rtOffset - ); - - // retrieve the offset this push source is using - HRESULT GetStreamOffset ( - [out] REFERENCE_TIME *prtOffset - ); - - // retrieve the maximum stream offset this push source thinks it can support - HRESULT GetMaxStreamOffset ( - [out] REFERENCE_TIME *prtMaxOffset - ); - - // allows the filter graph to tell a push source the maximum latency allowed on the graph - // this allows pins like the video capture preview pin to be more efficient with the amount - // of buffering required to support the maximum graph latency - HRESULT SetMaxStreamOffset ( - [in] REFERENCE_TIME rtMaxOffset - ); -}; - - -// ------------------------------------------------------------------------ -// -// IAMDeviceRemoval interface -// -// Implemented by filters to request and receive WM_DEVICECHANGE -// notifications -// -// ------------------------------------------------------------------------ - -[ - object, - uuid(f90a6130-b658-11d2-ae49-0000f8754b99), - pointer_default(unique) -] -interface IAMDeviceRemoval : IUnknown -{ - - HRESULT DeviceInfo( - [out] CLSID *pclsidInterfaceClass, - [out] WCHAR **pwszSymbolicLink); - - HRESULT Reassociate(); - - HRESULT Disassociate(); -} - -// -// for DV -// -typedef struct { - //for 1st 5/6 DIF seq. - DWORD dwDVAAuxSrc; - DWORD dwDVAAuxCtl; - //for 2nd 5/6 DIF seq. - DWORD dwDVAAuxSrc1; - DWORD dwDVAAuxCtl1; - //for video information - DWORD dwDVVAuxSrc; - DWORD dwDVVAuxCtl; - DWORD dwDVReserved[2]; - -} DVINFO, *PDVINFO; - -// ------------------------------------------------------------------------ -// -// IDVEnc interface -// -// Implemented by DV encoder filters to set Encoder format -// -// ------------------------------------------------------------------------ -enum _DVENCODERRESOLUTION { //resolution - DVENCODERRESOLUTION_720x480 = 2012, - DVENCODERRESOLUTION_360x240 = 2013, - DVENCODERRESOLUTION_180x120 = 2014, - DVENCODERRESOLUTION_88x60 = 2015 -}; -enum _DVENCODERVIDEOFORMAT { //PAL/ntsc - DVENCODERVIDEOFORMAT_NTSC = 2000, - DVENCODERVIDEOFORMAT_PAL = 2001 -}; -enum _DVENCODERFORMAT { // dvsd/dvhd/dvsl - DVENCODERFORMAT_DVSD = 2007, - DVENCODERFORMAT_DVHD = 2008, - DVENCODERFORMAT_DVSL = 2009 -}; -[ - object, - uuid(d18e17a0-aacb-11d0-afb0-00aa00b67a42), - pointer_default(unique) -] -interface IDVEnc : IUnknown -{ - - HRESULT get_IFormatResolution ( - [out] int *VideoFormat, //pal or ntsc - [out] int *DVFormat, //dvsd dvhd dvsl - [out] int *Resolution, //720, 360, 180,88 - [in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO - [out] DVINFO *sDVInfo //NULL if fDVInfo=FALSE, - ); - - HRESULT put_IFormatResolution ( - [in] int VideoFormat, - [in] int DVFormat, - [in] int Resolution, - [in] BYTE fDVInfo, //TRUE: DVINFO structure exist, FALSE: Do not care DVINFO - [in] DVINFO *sDVInfo //NULL if fDVInfo=FALSE, - ); - -} - -// ------------------------------------------------------------------------ -// -// IDVDec interface -// -// Implemented by DV decoder filters to set decoder size -// -// ------------------------------------------------------------------------ -enum _DVDECODERRESOLUTION { - DVDECODERRESOLUTION_720x480 = 1000, - DVDECODERRESOLUTION_360x240 = 1001, - DVDECODERRESOLUTION_180x120 = 1002, - DVDECODERRESOLUTION_88x60 = 1003 -}; -enum _DVRESOLUTION { - DVRESOLUTION_FULL = 1000, - DVRESOLUTION_HALF = 1001, - DVRESOLUTION_QUARTER = 1002, - DVRESOLUTION_DC = 1003 -}; -[ - object, - uuid(b8e8bd60-0bfe-11d0-af91-00aa00b67a42), - pointer_default(unique) -] -interface IIPDVDec : IUnknown -{ - HRESULT get_IPDisplay ( - [out] int *displayPix // The display pixels arrage - ); - - HRESULT put_IPDisplay ( - [in] int displayPix // Change to this display pixel arrage - ) ; -} - -//------------------------------------------------------------------------ -// -// IDVRGB219 interface -// -// Implemented by both the DV encoder and decoder filters -// Used for enabling the 219 mode in which the Range of RGB24 either received -// by the encoder or produced by the decoder becomes (16,16,16)--(235,235,235) -// instead of (0,0,0)--(255,255,255). -// The interface's method has no effect in case of any other color space than -// RGB 24 -// -//------------------------------------------------------------------------ - -[ - object, - uuid(58473A19-2BC8-4663-8012-25F81BABDDD1), - pointer_default(unique) -] -interface IDVRGB219 : IUnknown -{ - HRESULT SetRGB219 ([in] BOOL bState); // State = True Turn 219 mode on else turn it off. -} - - -// ------------------------------------------------------------------------ -// -// IDVSplitter interface -// -// Implemented by DV splitter filters -// -// ------------------------------------------------------------------------ -[ - object, - uuid(92a3a302-da7c-4a1f-ba7e-1802bb5d2d02) -] -interface IDVSplitter : IUnknown -{ - HRESULT DiscardAlternateVideoFrames( - [in] int nDiscard - ) ; -} - -// Audio Renderer statistics params for IAMAudioRendererStats interface -enum _AM_AUDIO_RENDERER_STAT_PARAM { - AM_AUDREND_STAT_PARAM_BREAK_COUNT = 1, // audio breaks - AM_AUDREND_STAT_PARAM_SLAVE_MODE, // current slave mode, see AM_AUDREND_SLAVE_MODEs - AM_AUDREND_STAT_PARAM_SILENCE_DUR, // silence inserted due to gaps (ms) - AM_AUDREND_STAT_PARAM_LAST_BUFFER_DUR, // duration of the last buffer received - AM_AUDREND_STAT_PARAM_DISCONTINUITIES, // discontinuities seen since running - AM_AUDREND_STAT_PARAM_SLAVE_RATE, // what rate are we currently slaving at? S_FALSE if not slaving - AM_AUDREND_STAT_PARAM_SLAVE_DROPWRITE_DUR, // for waveOut slaving - data dropped or added to stay in-sync - // dwParam1 - dropped duration(ms) - // dwParam2 - paused duration(ms) - AM_AUDREND_STAT_PARAM_SLAVE_HIGHLOWERROR, // highest & lowest clock differences seen - // dwParam1 - high err - // dwParam2 - low err - AM_AUDREND_STAT_PARAM_SLAVE_LASTHIGHLOWERROR, // last high and low errs seen - // dwParam1 - last high err - // dwParam2 - last low err - AM_AUDREND_STAT_PARAM_SLAVE_ACCUMERROR, // error between master/slave clocks - AM_AUDREND_STAT_PARAM_BUFFERFULLNESS, // percent audio buffer fullness - AM_AUDREND_STAT_PARAM_JITTER // input buffer jitter -}; - -//--------------------------------------------------------------------- -// -// IAMAudioRendererStats interface -// -// Interface to get at statistical information that is optionally stored -// in an audio renderer filter. Supported on the filter interface (although -// this might be better for ksproxy if we define it as a pin interface?) -// -//--------------------------------------------------------------------- - -[ -object, - uuid(22320CB2-D41A-11d2-BF7C-D7CB9DF0BF93), - pointer_default(unique) -] -interface IAMAudioRendererStats : IUnknown -{ - // Get value corresponding to the passed in parameter id - HRESULT GetStatParam( - [in] DWORD dwParam, - [out] DWORD *pdwParam1, - [out] DWORD *pdwParam2 - ); -} - -//--------------------------------------------------------------------- -// -// IAMLatency interface -// -// Allows a filter to report the expected latency associated with a data -// stream flowing from its input to output pin. Supported on output pins. -// -//--------------------------------------------------------------------- - -[ -object, - uuid(62EA93BA-EC62-11d2-B770-00C04FB6BD3D), - pointer_default(unique) -] -interface IAMLatency : IUnknown -{ - HRESULT GetLatency( - [in] REFERENCE_TIME *prtLatency - ); -} - - -enum _AM_INTF_SEARCH_FLAGS { - AM_INTF_SEARCH_INPUT_PIN = 0x00000001, // search input pins - AM_INTF_SEARCH_OUTPUT_PIN = 0x00000002, // search output pins - AM_INTF_SEARCH_FILTER = 0x00000004 // search filters -}; - -//--------------------------------------------------------------------- -// -// IAMGraphStreams interface -// -// Interface used to control or search over connected streams of data -// flow within a filter graph. -// -//--------------------------------------------------------------------- - -[ -object, - uuid(632105FA-072E-11d3-8AF9-00C04FB6BD3D), - pointer_default(unique) -] -interface IAMGraphStreams : IUnknown -{ - // Search upstream from the current pin, for the specified interface. - // dwFlags can be any combination of the AM_INTF_SEARCH_FLAGS, and allows - // control over what objects to search. A value of 0 means to search all. - HRESULT FindUpstreamInterface( - [in] IPin *pPin, - [in] REFIID riid, - [out, iid_is(riid)] void **ppvInterface, - [in] DWORD dwFlags ); - - // Enable or disable the graph's setting of a timestamp offset - // on push sources. - HRESULT SyncUsingStreamOffset( [in] BOOL bUseStreamOffset ); - - // allow an app to set the maximum offset used on push source filters - HRESULT SetMaxGraphLatency( [in] REFERENCE_TIME rtMaxGraphLatency ); -} - - -// -// IAMOverlayFX -// -// This interface is exposed by the overlay mixer filter and allows -// an application to apply various "effects" to the overlay surface -// used by the overlay mixer. -// -// The effects that can be applied are described by the AMOVERLAYFX -// enumeration. -// -enum AMOVERLAYFX { - // Normal (ie. top down, left to right) video - AMOVERFX_NOFX = 0x00000000, - - // Mirror the overlay across the vertical axis - AMOVERFX_MIRRORLEFTRIGHT = 0x00000002, - - // Mirror the overlay across the horizontal axis - AMOVERFX_MIRRORUPDOWN = 0x00000004, - - // Deinterlace the overlay, if possible - AMOVERFX_DEINTERLACE = 0x00000008 -}; - -[ -object, - uuid(62fae250-7e65-4460-bfc9-6398b322073c), - pointer_default(unique) -] -interface IAMOverlayFX : IUnknown -{ - // Use this method to determine what overlay effects are currently available - // for the overlay surface used by the overlay mixer filter. - // - HRESULT QueryOverlayFXCaps( - [out] DWORD *lpdwOverlayFXCaps - ); - - // Use this method to apply a new overlay effect to the overlay surface - // used by the overlay mixer filter. This method can be called while the - // filter graph is running, the effect is applied immediately - // - HRESULT SetOverlayFX( - [in] DWORD dwOverlayFX - ); - - // Use this method to determine what effect (if any) is currently being - // applied to the overlay surface by the overlay mixer filter. - // - HRESULT GetOverlayFX( - [out] DWORD *lpdwOverlayFX - ); -} - - - -// IAMOpenProgress interface provides information about current progress through -// a download - -[ -object, -uuid(8E1C39A1-DE53-11cf-AA63-0080C744528D), -pointer_default(unique) -] - -interface IAMOpenProgress : IUnknown -{ - // QueryProgress can be used to query the source filter which supports this interface - // for progress information during a renderfile operation. - HRESULT QueryProgress( - [out] LONGLONG* pllTotal, - [out] LONGLONG* pllCurrent - ); - - // AbortOperation can be used to request an abort of RenderFile operation - // causing it to stop downloading. This methods instructs the exporter of - // the IAMOpenProgress interface to hold up their internal abort flag until - // further notice. - HRESULT AbortOperation( - ); -} - - -/*++ - IMpeg2Demultiplexer - - This interface is implemented by the MPEG-2 Demultiplexer filter, - irrespective of program vs. transport stream splitting functionality. ---*/ -[ - object, - local, - uuid (436eee9c-264f-4242-90e1-4e330c107512), - pointer_default(unique) -] -interface IMpeg2Demultiplexer : IUnknown -{ - /*++ - ------------------------------------------------------------------------ - purpose: Creates an output pin of the specified media type. - - pMediaType media type specifier for the new pin - pszPinName pin name; cannot be a duplicate of an existing pin - ppIPin IPin interface pointer to the newly created pin - --*/ - HRESULT - CreateOutputPin ( - [in] AM_MEDIA_TYPE * pMediaType, - [in] LPWSTR pszPinName, - [out] IPin ** ppIPin - ) ; - - /*++ - ------------------------------------------------------------------------ - purpose: Updates the media type of the specified output pin. If no - connection exists, the media type is updated always. If - the pin is connected, the success/failure of the call will - depend on downstream input pin's accetance/rejection of - the specified media type, and subsequent success/failure - of a reconnect. - - pszPinName pin name - pMediaType new media type specifier - --*/ - HRESULT - SetOutputPinMediaType ( - [in] LPWSTR pszPinName, - [in] AM_MEDIA_TYPE * pMediaType - ) ; - - /*++ - ------------------------------------------------------------------------ - purpose: Deletes the specified output pin. - - pszPinName pin name - --*/ - HRESULT - DeleteOutputPin ( - [in] LPWSTR pszPinName - ) ; -} ; - -//--------------------------------------------------------------------- -// IEnumStreamIdMap interface -//--------------------------------------------------------------------- - -cpp_quote("#define MPEG2_PROGRAM_STREAM_MAP 0x00000000") -cpp_quote("#define MPEG2_PROGRAM_ELEMENTARY_STREAM 0x00000001") -cpp_quote("#define MPEG2_PROGRAM_DIRECTORY_PES_PACKET 0x00000002") -cpp_quote("#define MPEG2_PROGRAM_PACK_HEADER 0x00000003") -cpp_quote("#define MPEG2_PROGRAM_PES_STREAM 0x00000004") -cpp_quote("#define MPEG2_PROGRAM_SYSTEM_HEADER 0x00000005") - -cpp_quote("#define SUBSTREAM_FILTER_VAL_NONE 0x10000000") - -typedef struct { - ULONG stream_id ; // mpeg-2 stream_id - DWORD dwMediaSampleContent ; // #define'd above - ULONG ulSubstreamFilterValue ; // filtering value - int iDataOffset ; // offset to elementary stream -} STREAM_ID_MAP ; - -/*++ - Enumerates the StreamIds mapped on a pin ---*/ -[ - object, - local, - uuid (945C1566-6202-46fc-96C7-D87F289C6534), - pointer_default(unique) -] -interface IEnumStreamIdMap : IUnknown -{ - HRESULT - Next ( - [in] ULONG cRequest, - [in, out, size_is (cRequest)] STREAM_ID_MAP * pStreamIdMap, - [out] ULONG * pcReceived - ) ; - - HRESULT - Skip ( - [in] ULONG cRecords - ) ; - - HRESULT - Reset ( - ) ; - - HRESULT - Clone ( - [out] IEnumStreamIdMap ** ppIEnumStreamIdMap - ) ; -} ; - -/*++ - Implemented on the output pin. - - Provides the ability to map/unmap a stream_id to/from an output pin. ---*/ -[ - object, - local, - uuid (D0E04C47-25B8-4369-925A-362A01D95444), - pointer_default(unique) -] -interface IMPEG2StreamIdMap : IUnknown -{ - HRESULT - MapStreamId ( - [in] ULONG ulStreamId, // mpeg-2 stream_id - [in] DWORD MediaSampleContent, // #define'd above IEnumStreamIdMap - [in] ULONG ulSubstreamFilterValue, // filter value - [in] int iDataOffset // elementary stream offset - ) ; - - HRESULT - UnmapStreamId ( - [in] ULONG culStreamId, // number of stream_id's in pulStreamId - [in] ULONG * pulStreamId // array of stream_id's to unmap - ) ; - - HRESULT - EnumStreamIdMap ( - [out] IEnumStreamIdMap ** ppIEnumStreamIdMap - ) ; -} ; - - -// Register a service provider with the filter graph -[ - object, - local, - uuid(7B3A2F01-0751-48DD-B556-004785171C54), - pointer_default(unique) -] -interface IRegisterServiceProvider : IUnknown -{ - // registers one service into it's internal table.. Object is refcounted. - // register a NULL value to remove the service - HRESULT RegisterService([in] REFGUID guidService, [in] IUnknown *pUnkObject); -}; - - - -//--------------------------------------------------------------------- -// -// IAMClockSlave interface -// -// When the audio renderer is slaving to a separate graph clock this -// interface provides a way for an app to specify how closely in sync -// the slaving renderer should try to stay to the graph clock. Note that -// using a larger tolerance for a video & audio playback graph will likely -// result in looser a/v sync, so it recommended not to change this setting -// except under special circumstances. -// -//--------------------------------------------------------------------- - -// -// Used to set/get the error tolerance used by a slaving audio renderer -// -[ -object, - uuid(9FD52741-176D-4b36-8F51-CA8F933223BE), - pointer_default(unique) -] -interface IAMClockSlave : IUnknown -{ - // set millisecond value to use for slaving tolerance - // the allowed range is 1 to 1000ms - HRESULT SetErrorTolerance ( - [in] DWORD dwTolerance - ); - - // get millisecond value currently being used for slaving tolerance - HRESULT GetErrorTolerance ( - [out] DWORD *pdwTolerance - ); -}; - - - -//--------------------------------------------------------------------- -// -// IAMGraphBuilderCallback interface -// -// Interface which gives the app a chance to configure filters -// before a connection is attempted. -// -// If this interface is supported by the site passed in to the graph -// via IObjectWithSite::SetSite, the graph will call back with each -// filter it creates as part of the Render or Connect process. Does -// not call back for source filters. Filter may be discarded and not -// used in graph or may be connected and disconnected more than once -// -// The callback occurs with the graph lock held, so do not call into -// the graph again and do not wait on other threads calling into the -// graph. -// -//--------------------------------------------------------------------- - -[ - object, - uuid(4995f511-9ddb-4f12-bd3b-f04611807b79), - local, - pointer_default(unique) -] -interface IAMGraphBuilderCallback : IUnknown -{ - // graph builder selected a filter to create and attempt to - // connect. failure indicates filter should be rejected. - HRESULT SelectedFilter( - [in] IMoniker *pMon - ); - - // app configures filter during this call. failure indicates - // filter should be rejected. - HRESULT CreatedFilter( - [in] IBaseFilter *pFil - ); -}; - -cpp_quote("#ifdef __cplusplus") -cpp_quote("#ifndef _IAMFilterGraphCallback_") -cpp_quote("#define _IAMFilterGraphCallback_") -cpp_quote("// Note: Because this interface was not defined as a proper interface it is") -cpp_quote("// supported under C++ only. Methods aren't stdcall.") -cpp_quote("EXTERN_GUID(IID_IAMFilterGraphCallback,0x56a868fd,0x0ad4,0x11ce,0xb0,0xa3,0x0,0x20,0xaf,0x0b,0xa7,0x70);") -cpp_quote("interface IAMFilterGraphCallback : public IUnknown") -cpp_quote("{") -cpp_quote(" // S_OK means rendering complete, S_FALSE means retry now.") -cpp_quote(" virtual HRESULT UnableToRender(IPin *pPin) = 0;") -cpp_quote(" ") -cpp_quote("};") -cpp_quote("#endif // _IAMFilterGraphCallback_") -cpp_quote("#endif") - -//------------------------------------------------------------------------------ -// File: EncAPI.idl -// -// Desc: Encoder (and future decoder) interface definitions. -// -// Copyright (c) 1992 - 2002, Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------ - -struct CodecAPIEventData -{ - GUID guid; - DWORD dataLength; - DWORD reserved[3]; - // BYTE data[dataLength]; -}; - -interface IStream; // forward declaration -// -// Applications can pass the CODECAPI_VIDEO_ENCODER to IsSupported to test for video encoders -// Similarly, the GUIDs for audio encoders, video decoders, audio decoders and muxes can be -// used to test for the codec classification -// -// See uuids.h for a more detailed list. -// -[ - object, - uuid(901db4c7-31ce-41a2-85dc-8fa0bf41b8da), - pointer_default(unique) -] -interface ICodecAPI : IUnknown -{ - // - // IsSupported(): - // - // Query whether a given parameter is supported. - // - HRESULT - IsSupported ( - [in] const GUID *Api - ); - - // - // IsModifiable - // - // Query whether a given parameter can be changed given the codec selection - // and other parameter selections. - // - HRESULT - IsModifiable ( - [in] const GUID *Api - ); - - // - // GetParameterRange(): - // - // Returns the valid range of values that the parameter supports should - // the parameter support a stepped range as opposed to a list of specific - // values. The support is [ValueMin .. ValueMax] by SteppingDelta. - // - // Ranged variant types must fall into one of the below types. Each - // parameter will, by definition, return a specific type. - // - // If the range has no stepping delta (any delta will do), the Stepping - // delta will be empty (VT_EMPTY). - // - HRESULT - GetParameterRange ( - [in] const GUID *Api, - [out] VARIANT *ValueMin, - [out] VARIANT *ValueMax, - [out] VARIANT *SteppingDelta - ); - - // - // GetParameterValues(): - // - // Returns the list of values supported by the given parameter as a - // COM allocated array. The total number of values will be placed in - // the ValuesCount parameter and the Values array will contain the - // individual values. This array must be freed by the caller through - // CoTaskMemFree(). - // - HRESULT - GetParameterValues ( - [in] const GUID *Api, - [out, size_is(,*ValuesCount)] VARIANT **Values, - [out] ULONG *ValuesCount - ); - - // - // GetDefaultValue(): - // - // Get the default value for a parameter, if one exists. Otherwise, - // an error will be returned. - // - HRESULT - GetDefaultValue ( - [in] const GUID *Api, - [out] VARIANT *Value - ); - - // - // GetValue(): - // - // Get the current value of a parameter. - // - HRESULT - GetValue ( - [in] const GUID *Api, - [out] VARIANT *Value - ); - - // - // SetValue(): - // - // Set the current value of a parameter. - // - HRESULT - SetValue ( - [in] const GUID *Api, - [in] VARIANT *Value - ); - - // new methods beyond IEncoderAPI - - // - // RegisterForEvent(): - // - // Enable events to be reported for the given event GUID. For DShow - // events, the event is returned as - // (EC_CODECAPI_EVENT, lParam=userData, lParam2=CodecAPIEventData* Data) - // where - // - the CodecAPIEventData is COM allocated memory and must be handled and freed - // by the application using CoTaskMemFree(). - // - the userData is the same pointer passed to RegisterForEvent - // - // Each data block starts with the following structure: - // struct CodecAPIEventData - // { - // GUID guid; - // DWORD dataLength; - // DWORD reserved[3]; // pad to 16 byte alignment - // BYTE data[dataLength]; - // } - // The guid parameter identifies the event. The data associated with the event follows the - // structure (represented by the variable length BYTE data[dataLength] array). - // - // If guid is equal to CODECAPI_CHANGELISTS, then data is an array of GUIDs that changed as - // a result of setting the parameter, as follows: - // GUID changedGuids[ header.dataLength / sizeof(GUID) ] - // - // The current array is limited, so a driver may send multiple messages if the array size is - // exceeded. - // - HRESULT - RegisterForEvent ( - [in] const GUID *Api, - [in] LONG_PTR userData - ); - - // - // UnregisterForEvent(): - // - // Disable event reporting for the given event GUID. - // - HRESULT - UnregisterForEvent ( - [in] const GUID *Api - ); - - // - // SetAllDefaults - // - HRESULT SetAllDefaults(void); - - // - // Extended SetValue & SetAllDefaults: - // - // Changes the current value of a parameter and returns back an alteration list - // - // The secondary arguments return back a list of other settings - // that changed as a result of the SetValue() call (for UI updates etc) - // The client must free the buffer. - // - HRESULT - SetValueWithNotify ( - [in] const GUID *Api, - [in] VARIANT *Value, - [out, size_is(,*ChangedParamCount)] GUID **ChangedParam, - [out] ULONG *ChangedParamCount - ); - - // - // SetAllDefaultsWithNotify - // - HRESULT SetAllDefaultsWithNotify( - [out, size_is(,*ChangedParamCount)] GUID **ChangedParam, - [out] ULONG *ChangedParamCount - ); - // - // GetAllSettings - // Load the current settings from a stream - // - HRESULT GetAllSettings( [in] IStream* ); - - // - // SetAllSettings - // Save the current settings to a stream - // - HRESULT SetAllSettings( [in] IStream* ); - - // - // SetAllSettingsWithNotify - // - HRESULT SetAllSettingsWithNotify( IStream*, - [out, size_is(,*ChangedParamCount)] GUID **ChangedParam, - [out] ULONG *ChangedParamCount ); -} - -[ - object, - local, - uuid(a8809222-07bb-48ea-951c-33158100625b), - pointer_default(unique) -] -interface IGetCapabilitiesKey : IUnknown -{ - HRESULT GetCapabilitiesKey( [out] HKEY* pHKey ); -}; - -// ----------------------------------------------------------------------------------------- -// From this point on, this is retained for backwards compatiblity only -// Do not use this for future encoders -// ----------------------------------------------------------------------------------------- -[ - object, - uuid(70423839-6ACC-4b23-B079-21DBF08156A5), - pointer_default(unique) -] -interface IEncoderAPI : IUnknown -{ - HRESULT IsSupported ( [in] const GUID *Api ); - HRESULT IsAvailable ( [in] const GUID *Api ); - HRESULT GetParameterRange ( [in] const GUID *Api, - [out] VARIANT *ValueMin, [out] VARIANT *ValueMax, - [out] VARIANT *SteppingDelta ); - HRESULT GetParameterValues ( [in] const GUID *Api, - [out, size_is(,*ValuesCount)] VARIANT **Values, - [out] ULONG *ValuesCount ); - HRESULT GetDefaultValue ( [in] const GUID *Api, [out] VARIANT *Value ); - HRESULT GetValue ( [in] const GUID *Api, [out] VARIANT *Value ); - HRESULT SetValue ( [in] const GUID *Api, [in] VARIANT *Value ); -} - -[ - object, - uuid(02997C3B-8E1B-460e-9270-545E0DE9563E), - pointer_default(unique) -] -interface IVideoEncoder : IEncoderAPI -{ -} -//--------------------------------------------------------------------- -// -// Old Encoder API Interfaces -// -//--------------------------------------------------------------------- - -cpp_quote ("#ifndef __ENCODER_API_DEFINES__") -cpp_quote ("#define __ENCODER_API_DEFINES__") - -typedef enum { - - // - // Bit rate used for encoding is constant - // - ConstantBitRate = 0, - - // - // Bit rate used for encoding is variable with the specified bitrate used - // as a guaranteed average over a specified window. The default window - // size is considered to be 5 minutes. - // - VariableBitRateAverage, - - // - // Bit rate used for encoding is variable with the specified bitrate used - // as a peak rate over a specified window. The default window size - // is considered to be 500ms (classically one GOP). - // - VariableBitRatePeak - -} VIDEOENCODER_BITRATE_MODE; - -cpp_quote ("#endif // __ENCODER_API_DEFINES__") - -cpp_quote("#define AM_GETDECODERCAP_QUERY_VMR_SUPPORT 0x00000001") -cpp_quote("#define VMR_NOTSUPPORTED 0x00000000") -cpp_quote("#define VMR_SUPPORTED 0x00000001") - -cpp_quote("#define AM_QUERY_DECODER_VMR_SUPPORT 0x00000001") -cpp_quote("#define AM_QUERY_DECODER_DXVA_1_SUPPORT 0x00000002") - -cpp_quote("#define AM_QUERY_DECODER_DVD_SUPPORT 0x00000003") -cpp_quote("#define AM_QUERY_DECODER_ATSC_SD_SUPPORT 0x00000004") -cpp_quote("#define AM_QUERY_DECODER_ATSC_HD_SUPPORT 0x00000005") -cpp_quote("#define AM_GETDECODERCAP_QUERY_VMR9_SUPPORT 0x00000006") - -cpp_quote("#define DECODER_CAP_NOTSUPPORTED 0x00000000") -cpp_quote("#define DECODER_CAP_SUPPORTED 0x00000001") - -[ - object, - local, - uuid(c0dff467-d499-4986-972b-e1d9090fa941), - pointer_default(unique) -] -interface IAMDecoderCaps : IUnknown -{ - HRESULT GetDecoderCaps([in] DWORD dwCapIndex, [out] DWORD* lpdwCap); -}; - -/////////////////////////////////////////////////////////////////////////////// -// -// IAMCertifiedOutputProtection -// -/////////////////////////////////////////////////////////////////////////////// -typedef struct _AMCOPPSignature { - BYTE Signature[256]; -} AMCOPPSignature; - -typedef struct _AMCOPPCommand { - GUID macKDI; // 16 bytes - GUID guidCommandID; // 16 bytes - DWORD dwSequence; // 4 bytes - DWORD cbSizeData; // 4 bytes - BYTE CommandData[4056]; // 4056 bytes (4056+4+4+16+16 = 4096) -} AMCOPPCommand, *LPAMCOPPCommand; - -typedef struct _AMCOPPStatusInput { - GUID rApp; // 16 bytes - GUID guidStatusRequestID;// 16 bytes - DWORD dwSequence; // 4 bytes - DWORD cbSizeData; // 4 bytes - BYTE StatusData[4056]; // 4056 bytes (4056+4+4+16+16 = 4096) -} AMCOPPStatusInput, *LPAMCOPPStatusInput; - -typedef struct _AMCOPPStatusOutput { - GUID macKDI; // 16 bytes - DWORD cbSizeData; // 4 bytes - BYTE COPPStatus[4076]; // 4076 bytes (4076+16+4 = 4096) -} AMCOPPStatusOutput, *LPAMCOPPStatusOutput; - - -[ - object, - local, - uuid(6feded3e-0ff1-4901-a2f1-43f7012c8515), - pointer_default(unique) -] -interface IAMCertifiedOutputProtection : IUnknown -{ - HRESULT KeyExchange ( - [out] GUID* pRandom, // 128-bit random number generated by Graphics Driver - [out] BYTE** VarLenCertGH, // Graphics Hardware certificate, memory released by CoTaskMemFree - [out] DWORD* pdwLengthCertGH); // Length of Graphics Hardware certificate - - HRESULT SessionSequenceStart( - [in] AMCOPPSignature*pSig); // Concatenation of 128-bit random data security session key, - // 128-bit random data integrity session key, 32-bit random - // starting status sequence number and 32-bit random starting - // command sequence number encrypted with the public key of - // the graphic hardware. This value is 2048 bits long. - - HRESULT ProtectionCommand( - [in] const AMCOPPCommand* cmd); // Encrypted command - - HRESULT ProtectionStatus( - [in] const AMCOPPStatusInput* pStatusInput, // Encrypted Status request - [out] AMCOPPStatusOutput* pStatusOutput); // Encrypted Status results -}; - |