/*
 * Copyright (C) 2002 Robert Shearman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

interface IAMAnalogVideoDecoder;
interface IAMAnalogVideoEncoder;
interface IAMAudioInputMixer;
interface IAMAudioRendererStats;
interface IAMBufferNegotiation;
interface IAMCameraControl;
interface IAMCertifiedOutputProtection;
interface IAMClockSlave;
interface IAMCopyCaptureFileProgress;
interface IAMCrossbar;
interface IAMDevMemoryAllocator;
interface IAMDevMemoryControl;
interface IAMDroppedFrames;
interface IAMExtDevice;
interface IAMExtTransport;
interface IAMGraphStreams;
interface IAMLatency;
interface IAMOpenProgress;
interface IAMOverlayFX;
interface IAMPhysicalPinInfo;
interface IAMPushSource;
interface IAMStreamConfig;
interface IAMTimecodeDisplay;
interface IAMTimecodeGenerator;
interface IAMTimecodeReader;
interface IAMTVTuner;
interface IAMVfwCaptureDialogs;
interface IAMVfwCompressDialogs;
interface IAMVideoCompression;
interface IAMVideoDecimationProperties;
interface IAMVideoProcAmp;
interface IAMGraphBuilderCallback;
interface ICaptureGraphBuilder;
interface ICaptureGraphBuilder2;
interface IConfigAviMux;
interface IConfigInterleaving;
interface IDecimateVideoImage;
interface IDrawVideoImage;
interface IEnumRegFilters;
interface IEnumStreamIdMap;
interface IFileSourceFilter;
interface IFileSinkFilter;
interface IFileSinkFilter2;
interface IFilterMapper;
interface IFilterMapper2;
interface IGraphBuilder;
interface IKsPropertySet;
interface IMediaEventSink;
interface IMpeg2Demultiplexer;
interface IMPEG2StreamIdMap;
interface IOverlay;
interface IOverlayNotify;
interface IOverlayNotify2;
interface IQualityControl;
interface ISeekingPassThru;

#include <axextendenums.h>

typedef struct
{
    CLSID Clsid;
    LPWSTR Name;
} REGFILTER;

typedef enum tagTVAudioMode {
    AMTVAUDIO_MODE_MONO         = 0x0001,
    AMTVAUDIO_MODE_STEREO       = 0x0002,
    AMTVAUDIO_MODE_LANG_A       = 0x0010,
    AMTVAUDIO_MODE_LANG_B       = 0x0020,
    AMTVAUDIO_MODE_LANG_C       = 0x0040,
    AMTVAUDIO_PRESET_STEREO     = 0x0200,
    AMTVAUDIO_PRESET_LANG_A     = 0x1000,
    AMTVAUDIO_PRESET_LANG_B     = 0x2000,
    AMTVAUDIO_PRESET_LANG_C     = 0x4000
} TVAudioMode;

[
object,
uuid(56a868a4-0ad4-11ce-b03a-0020af0ba770),
pointer_default(unique)
]
interface IEnumRegFilters : IUnknown
{
    HRESULT Next
        ( [in]  ULONG cFilters,
          [out] REGFILTER ** apRegFilter,
          [out] ULONG * pcFetched
        );

    HRESULT Skip(
        [in] ULONG cFilters
    );

    HRESULT Reset(void);

    HRESULT Clone(
        [out] IEnumRegFilters **ppEnum
    );
}


typedef IEnumRegFilters *PENUMREGFILTERS;

[
object,
uuid(56a868a3-0ad4-11ce-b03a-0020af0ba770),
pointer_default(unique)
]
interface IFilterMapper : IUnknown
{
    enum { MERIT_PREFERRED     = 0x800000,
           MERIT_NORMAL        = 0x600000,
           MERIT_UNLIKELY      = 0x400000,
           MERIT_DO_NOT_USE    = 0x200000,
           MERIT_SW_COMPRESSOR = 0x100000,
           MERIT_HW_COMPRESSOR = 0x100050
         };

    HRESULT RegisterFilter
        ( [in] CLSID   clsid,
          [in] LPCWSTR Name,
          [in] DWORD   dwMerit
        );

    HRESULT RegisterFilterInstance
        ( [in]  CLSID  clsid,
          [in]  LPCWSTR Name,
          [out] CLSID *MRId
        );


    HRESULT RegisterPin
        ( [in] CLSID   Filter,
          [in] LPCWSTR Name,
          [in] BOOL    bRendered,
          [in] BOOL    bOutput,
          [in] BOOL    bZero,
          [in] BOOL    bMany,
          [in] CLSID   ConnectsToFilter,
          [in] LPCWSTR ConnectsToPin
        );

    HRESULT RegisterPinType
        ( [in] CLSID   clsFilter,
          [in] LPCWSTR strName,
          [in] CLSID   clsMajorType,
          [in] CLSID   clsSubType
        );


    HRESULT UnregisterFilter
        ( [in] CLSID  Filter
        );


    HRESULT UnregisterFilterInstance
        ( [in] CLSID  MRId
        );


    HRESULT UnregisterPin
        ( [in] CLSID   Filter,
          [in] LPCWSTR Name
        );

    HRESULT EnumMatchingFilters
       ( [out] IEnumRegFilters **ppEnum,
         [in]  DWORD dwMerit,
         [in]  BOOL  bInputNeeded,
         [in]  CLSID clsInMaj,
         [in]  CLSID clsInSub,
         [in]  BOOL  bRender,
         [in]  BOOL  bOutputNeeded,
         [in]  CLSID clsOutMaj,
         [in]  CLSID clsOutSub
       );

}

typedef struct
{
    const CLSID * clsMajorType;
    const CLSID * clsMinorType;
} REGPINTYPES;

typedef struct
{
    LPWSTR           strName;
    BOOL             bRendered;
    BOOL             bOutput;
    BOOL             bZero;
    BOOL             bMany;
    const CLSID *    clsConnectsToFilter;
    const WCHAR *    strConnectsToPin;
    UINT             nMediaTypes;
    const REGPINTYPES * lpMediaType;
} REGFILTERPINS;

typedef struct
{
    CLSID clsMedium;
    DWORD dw1;
    DWORD dw2;
} REGPINMEDIUM;

enum
{
    REG_PINFLAG_B_ZERO = 0x1,
    REG_PINFLAG_B_RENDERER = 0x2,
    REG_PINFLAG_B_MANY = 0x4,
    REG_PINFLAG_B_OUTPUT = 0x8
};


typedef struct
{
    DWORD dwFlags;
    UINT             cInstances;
    UINT             nMediaTypes;
    [size_is(nMediaTypes)] const REGPINTYPES * lpMediaType;
    UINT             nMediums;
    [size_is(nMediums)] const REGPINMEDIUM *lpMedium;
    const CLSID      *clsPinCategory;
} REGFILTERPINS2;

typedef struct
{
    DWORD dwVersion;
    DWORD dwMerit;
    [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
{
    HRESULT CreateCategory
        ( [in] REFCLSID clsidCategory,
          [in] DWORD dwCategoryMerit,
          [in] LPCWSTR Description
          );

    HRESULT UnregisterFilter
        ( [in] const CLSID *pclsidCategory,
          [in] LPCOLESTR szInstance,
          [in] REFCLSID Filter
        );

    HRESULT RegisterFilter
        ( [in] REFCLSID clsidFilter,
          [in] LPCWSTR Name,
          [in, out] IMoniker **ppMoniker,
          [in] const CLSID *pclsidCategory,
          [in] LPCOLESTR szInstance,
          [in] const REGFILTER2 *prf2
        );

    HRESULT EnumMatchingFilters
       ( [out] IEnumMoniker **ppEnum,
         [in]  DWORD dwFlags,
         [in]  BOOL bExactMatch,
         [in]  DWORD dwMerit,
         [in]  BOOL  bInputNeeded,
         [in]  DWORD cInputTypes,
         [size_is(cInputTypes*2)]  const GUID *pInputTypes,
         [in]  const REGPINMEDIUM *pMedIn,
         [in]  const CLSID *pPinCategoryIn,
         [in]  BOOL  bRender,
         [in]  BOOL  bOutputNeeded,
         [in]  DWORD cOutputTypes,
         [size_is(cOutputTypes*2)]  const GUID *pOutputTypes,
         [in]  const REGPINMEDIUM *pMedOut,
         [in]  const CLSID *pPinCategoryOut
       );
}

[
object,
uuid(b79bb0b1-33c1-11d1-abe1-00a0c905f375),
pointer_default(unique)
]
interface IFilterMapper3 : IFilterMapper2
{
    HRESULT GetICreateDevEnum( [out] ICreateDevEnum **ppEnum );
}

typedef enum tagQualityMessageType
{
    Famine,
    Flood
} QualityMessageType;

typedef struct tagQuality
{
    QualityMessageType Type;
    LONG               Proportion;
    REFERENCE_TIME       Late;
    REFERENCE_TIME       TimeStamp;
} Quality;

typedef IQualityControl *PQUALITYCONTROL;

[
object,
uuid(56a868a5-0ad4-11ce-b03a-0020af0ba770),
pointer_default(unique)
]
interface IQualityControl : IUnknown
{
    HRESULT Notify
        ( [in] IBaseFilter * pSelf,
          [in] Quality q
        );

    HRESULT SetSink
        ( [in] IQualityControl * piqc
        );
}

enum
{
    CK_NOCOLORKEY  = 0x0,
    CK_INDEX       = 0x1,
    CK_RGB         = 0x2
};

typedef struct tagCOLORKEY
{
    DWORD    KeyType;
    DWORD    PaletteIndex;
    COLORREF LowColorValue;
    COLORREF HighColorValue;
} COLORKEY;

enum
{
    ADVISE_NONE = 0x0,
    ADVISE_CLIPPING = 0x1,
    ADVISE_PALETTE = 0x2,
    ADVISE_COLORKEY = 0x4,
    ADVISE_POSITION = 0x8,
    ADVISE_DISPLAY_CHANGE = 0x10
};

const DWORD ADVISE_ALL = ADVISE_CLIPPING |
                         ADVISE_PALETTE  |
                         ADVISE_COLORKEY |
                         ADVISE_POSITION;

const DWORD ADVISE_ALL2 = ADVISE_ALL |
                          ADVISE_DISPLAY_CHANGE;

cpp_quote("#ifndef _WINGDI_")

/* already defined in wingdi.h, but needed for WIDL */

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 /* _WINGDI_ */")

[
object,
local,
uuid(56a868a0-0ad4-11ce-b03a-0020af0ba770),
pointer_default(unique)
]
interface IOverlayNotify : IUnknown
{
    HRESULT OnPaletteChange(
        [in] DWORD dwColors,
        [in] const PALETTEENTRY *pPalette);

    HRESULT OnClipChange(
        [in] const RECT *pSourceRect,
        [in] const RECT *pDestinationRect,
        [in] const RGNDATA *pRgnData);

    HRESULT OnColorKeyChange([in] const COLORKEY *pColorKey);

    HRESULT OnPositionChange([in] const RECT *pSourceRect,
                             [in] const RECT *pDestinationRect);
}

typedef IOverlayNotify *POVERLAYNOTIFY;

cpp_quote("#if 0")
typedef HANDLE HMONITOR;
cpp_quote("#endif /* 0 */")

[
object,
local,
uuid(680EFA10-D535-11D1-87C8-00A0C9223196),
pointer_default(unique)
]
interface IOverlayNotify2 : IOverlayNotify
{
    HRESULT OnDisplayChange(
        HMONITOR hMonitor);
}

typedef IOverlayNotify2 *POVERLAYNOTIFY2;

[
object,
local,
uuid(56a868a1-0ad4-11ce-b03a-0020af0ba770),
pointer_default(unique)
]
interface IOverlay : IUnknown
{
    HRESULT GetPalette(
        [out] DWORD *pdwColors,
        [out] PALETTEENTRY **ppPalette);

    HRESULT SetPalette(
        [in] DWORD dwColors,
        [in] PALETTEENTRY *pPalette);

    HRESULT GetDefaultColorKey([out] COLORKEY *pColorKey);

    HRESULT GetColorKey([out] COLORKEY *pColorKey);

    HRESULT SetColorKey([in,out] COLORKEY *pColorKey);

    HRESULT GetWindowHandle([out] HWND *pHwnd);

    HRESULT GetClipList([out] RECT *pSourceRect,
                        [out] RECT *pDestinationRect,
                        [out] RGNDATA **ppRgnData);

    HRESULT GetVideoPosition([out] RECT *pSourceRect,
                             [out] RECT *pDestinationRect);

    HRESULT Advise(
        [in] IOverlayNotify *pOverlayNotify,
        [in] DWORD dwInterests);

    HRESULT Unadvise();
}

typedef IOverlay *POVERLAY;

[
object,
uuid(56a868a2-0ad4-11ce-b03a-0020af0ba770),
pointer_default(unique)
]
interface IMediaEventSink : IUnknown
{
    HRESULT Notify(
        [in] LONG EventCode,
        [in] LONG_PTR EventParam1,
        [in] LONG_PTR EventParam2
    );
}

typedef IMediaEventSink *PMEDIAEVENTSINK;

[
object,
uuid(56a868a6-0ad4-11ce-b03a-0020af0ba770),
pointer_default(unique)
]
interface IFileSourceFilter : IUnknown
{
    HRESULT Load(
        [in] LPCOLESTR pszFileName,
        [in, unique] const AM_MEDIA_TYPE *pmt
    );

    HRESULT GetCurFile(
        [out] LPOLESTR *ppszFileName,
        [out] AM_MEDIA_TYPE *pmt
    );
}

typedef IFileSourceFilter *PFILTERFILESOURCE;

[
object,
uuid(a2104830-7c70-11cf-8bce-00aa00a3f1a6),
pointer_default(unique)
]
interface IFileSinkFilter : IUnknown
{
    HRESULT SetFileName(
        [in] LPCOLESTR pszFileName,
        [in, unique] const AM_MEDIA_TYPE *pmt
    );

    HRESULT GetCurFile(
        [out] LPOLESTR *ppszFileName,
        [out] AM_MEDIA_TYPE *pmt
    );
}

typedef IFileSinkFilter *PFILTERFILESINK;

[
        object,
        uuid(00855B90-CE1B-11d0-BD4F-00A0C911CE86),
        pointer_default(unique)
]
interface IFileSinkFilter2 : IFileSinkFilter
{
    HRESULT SetMode(
        [in] DWORD dwFlags
    );

    HRESULT GetMode(
        [out] DWORD *pdwFlags
    );
}

typedef IFileSinkFilter2 *PFILESINKFILTER2;

typedef enum
{
    AM_FILE_OVERWRITE = 0x00000001,
} AM_FILESINK_FLAGS;

[
object,
uuid(56a868a9-0ad4-11ce-b03a-0020af0ba770),
pointer_default(unique)
]
interface IGraphBuilder : IFilterGraph
{
    HRESULT Connect
        ( [in] IPin * ppinOut,
          [in] IPin * ppinIn
        );

    HRESULT Render
        ( [in] IPin * ppinOut
        );

    HRESULT RenderFile
        ( [in] LPCWSTR lpcwstrFile,
          [in, unique] LPCWSTR lpcwstrPlayList
        );

    HRESULT AddSourceFilter
        ( [in]      LPCWSTR lpcwstrFileName,
          [in, unique]      LPCWSTR lpcwstrFilterName,
          [out]     IBaseFilter* *ppFilter
        );

    HRESULT SetLogFile
        ( [in]      DWORD_PTR hFile
        );

    HRESULT Abort();

    HRESULT ShouldOperationContinue();
}


[
    object,
    uuid(bf87b6e0-8c27-11d0-b3f0-00aa003761c5),
    pointer_default(unique)
]
interface ICaptureGraphBuilder : IUnknown {

    HRESULT SetFiltergraph(
        [in] IGraphBuilder *pfg);

    HRESULT GetFiltergraph(
        [out] IGraphBuilder **ppfg);

    HRESULT SetOutputFileName(
        [in] const GUID *pType,
        [in] LPCOLESTR lpstrFile,
        [out] IBaseFilter **ppf,
        [out] IFileSinkFilter **ppSink);

    [local] HRESULT FindInterface(
        [in, unique] const GUID *pCategory,
        [in] IBaseFilter *pf,
        [in] REFIID riid,
        [out] void **ppint);

    [call_as(FindInterface)] HRESULT RemoteFindInterface(
        [in, unique] const GUID *pCategory,
        [in] IBaseFilter *pf,
        [in] REFIID riid,
        [out] IUnknown **ppint);

    HRESULT RenderStream(
        [in] const GUID *pCategory,
        [in] IUnknown *pSource,
        [in] IBaseFilter *pfCompressor,
        [in] IBaseFilter *pfRenderer);

    HRESULT ControlStream(
        [in] const GUID *pCategory,
        [in] IBaseFilter *pFilter,
        [in] REFERENCE_TIME *pstart,
        [in] REFERENCE_TIME *pstop,
        [in] WORD wStartCookie,
        [in] WORD wStopCookie);

    HRESULT AllocCapFile(
        [in] LPCOLESTR lpstr,
        [in] DWORDLONG dwlSize);

    HRESULT CopyCaptureFile(
        [in] LPOLESTR lpwstrOld,
        [in] LPOLESTR lpwstrNew,
        [in] int fAllowEscAbort,
        [in] IAMCopyCaptureFileProgress *pCallback);
}

[
object,
uuid(670d1d20-a068-11d0-b3f0-00aa003761c5),
pointer_default(unique)
]
interface IAMCopyCaptureFileProgress : IUnknown
{
    HRESULT Progress(
        [in] int iProgress);
}

[
    object,
    uuid(93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D),
    pointer_default(unique)
]
interface ICaptureGraphBuilder2 : IUnknown
{
    HRESULT SetFiltergraph(
        [in] IGraphBuilder *pfg);

    HRESULT GetFiltergraph(
        [out] IGraphBuilder **ppfg);

    HRESULT SetOutputFileName(
        [in] const GUID *pType,
        [in] LPCOLESTR lpstrFile,
        [out] IBaseFilter **ppf,
        [out] IFileSinkFilter **ppSink);

    [local] HRESULT FindInterface(
        [in] const GUID *pCategory,
        [in] const GUID *pType,
        [in] IBaseFilter *pf,
        [in] REFIID riid,
        [out] void **ppint);

    [call_as(FindInterface)] HRESULT RemoteFindInterface(
        [in] const GUID *pCategory,
        [in] const GUID *pType,
        [in] IBaseFilter *pf,
        [in] REFIID riid,
        [out] IUnknown **ppint);

    HRESULT RenderStream(
        [in] const GUID *pCategory,
        [in] const GUID *pType,
        [in] IUnknown *pSource,
        [in] IBaseFilter *pfCompressor,
        [in] IBaseFilter *pfRenderer);

    HRESULT ControlStream(
        [in] const GUID *pCategory,
        [in] const GUID *pType,
        [in] IBaseFilter *pFilter,
        [in] REFERENCE_TIME *pstart,
        [in] REFERENCE_TIME *pstop,
        [in] WORD wStartCookie,
        [in] WORD wStopCookie);

    HRESULT AllocCapFile(
        [in] LPCOLESTR lpstr,
        [in] DWORDLONG dwlSize);

    HRESULT CopyCaptureFile(
        [in] LPOLESTR lpwstrOld,
        [in] LPOLESTR lpwstrNew,
        [in] int fAllowEscAbort,
        [in] IAMCopyCaptureFileProgress *pCallback);

    HRESULT FindPin(
        [in] IUnknown *pSource,
        [in] PIN_DIRECTION pindir,
        [in] const GUID *pCategory,
        [in] const GUID *pType,
        [in] BOOL fUnconnected,
        [in] int num,
        [out] IPin **ppPin);
}

[
    local,
    object,
    uuid(5acd6aa0-f482-11ce-8b67-00aa00a3f1a6),
    pointer_default(unique)
]
interface IConfigAviMux : IUnknown
{
    HRESULT SetMasterStream(
        [in] LONG iStream);

    HRESULT GetMasterStream(
        [out] LONG *pStream);

    HRESULT SetOutputCompatibilityIndex(
        [in] BOOL fOldIndex);

    HRESULT GetOutputCompatibilityIndex(
        [out] BOOL *pfOldIndex);
}

[
    local,
    object,
    uuid(bee3d220-157b-11d0-bd23-00a0c911ce86),
    pointer_default(unique)
]
interface IConfigInterleaving : IUnknown
{
    typedef enum InterleavingMode {
        INTERLEAVE_NONE,
        INTERLEAVE_CAPTURE,
        INTERLEAVE_FULL,
        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);
}

[
    local,
    object,
    uuid(9fd52741-176d-4b36-8f51-ca8f933223be),
    pointer_default(unique)
]
interface IAMClockSlave : IUnknown
{
    HRESULT SetErrorTolerance(
        [in] DWORD dwTolerance);

    HRESULT GetErrorTolerance(
        [out] DWORD *pdwTolerance);
}

typedef struct _AMCOPPSignature {
    BYTE Signature[256];
} AMCOPPSignature;

typedef struct _AMCOPPCommand {
    GUID macKDI;
    GUID guidCommandID;
    DWORD dwSequence;
    DWORD bSizeData;
    BYTE CommandData[4056];
} AMCOPPCommand, *LPAMCOPPCommand;

typedef struct _AMCOPPStatusInput {
    GUID rApp;
    GUID guidStatusRequestID;
    DWORD dwSequence;
    DWORD cbSizeData;
    BYTE StatusData[4056];
} AMCOPPStatusInput, *LPAMCOPPStatusInput;

typedef struct _AMCOPPStatusOutput {
    GUID macKDI;
    DWORD cbSizeData;
    BYTE COPPStatus[4076];
} AMCOPPStatusOutput, *LPAMCOPPStatusOutput;

[
    local,
    object,
    uuid(6feded3e-0ff1-4901-a2f1-43f7012c8515),
    pointer_default(unique)
]
interface IAMCertifiedOutputProtection : IUnknown
{
    HRESULT KeyExchange (
        [out] GUID* pRandom,
        [out] BYTE** VarLenCertGH,
        [out] DWORD* pdwLengthCertGH);

    HRESULT SessionSequenceStart(
        [in] AMCOPPSignature* pSig);

    HRESULT ProtectionCommand(
        [in] const AMCOPPCommand* cmd);

    HRESULT ProtectionStatus(
        [in] const AMCOPPStatusInput* pStatusInput,
        [out] AMCOPPStatusOutput* pStatusOutput);
};

enum _AM_RENSDEREXFLAGS
{
    AM_RENDEREX_RENDERTOEXISTINGRENDERERS = 0x01
};

[
    object,
    uuid(36b73882-c2c8-11cf-8b46-00805f6cef60),
    pointer_default(unique)
]
interface IFilterGraph2: IGraphBuilder
{
    HRESULT AddSourceFilterForMoniker(
          [in] IMoniker *pMoniker,
          [in] IBindCtx *pCtx,
          [in, unique] LPCWSTR lpcwstrFilterName,
          [out] IBaseFilter **ppFilter
    );

    HRESULT ReconnectEx
        ( [in] IPin * ppin,
          [in, unique] const AM_MEDIA_TYPE *pmt
        );

    HRESULT RenderEx( [in] IPin *pPinOut,
                      [in] DWORD dwFlags,
                      [in, out] DWORD *pvContext
                    );
}

[
    object,
    local,
    uuid(56a868bf-0ad4-11ce-b03a-0020af0ba770),
    pointer_default(unique)
]
interface IStreamBuilder : IUnknown
{
    HRESULT Render
        ( [in] IPin * ppinOut,
          [in] IGraphBuilder * pGraph
        );

    HRESULT Backout
        ( [in] IPin * ppinOut,
          [in] IGraphBuilder * pGraph
        );
}


/*****************************************************************************
 * IAMStreamConfig interface
 */
[
    object,
    uuid(c6e13340-30ac-11d0-a18c-00a0c9118956),
    pointer_default(unique)
]
interface IAMStreamConfig : IUnknown
{
    typedef struct _VIDEO_STREAM_CONFIG_CAPS {
        GUID  guid;
        ULONG VideoStandard;
        SIZE  InputSize;
        SIZE  MinCroppingSize;
        SIZE  MaxCroppingSize;
        int   CropGranularityX;
        int   CropGranularityY;
        int   CropAlignX;
        int   CropAlignY;
        SIZE  MinOutputSize;
        SIZE  MaxOutputSize;
        int   OutputGranularityX;
        int   OutputGranularityY;
        int   StretchTapsX;
        int   StretchTapsY;
        int   ShrinkTapsX;
        int   ShrinkTapsY;
        LONGLONG MinFrameInterval;
        LONGLONG MaxFrameInterval;
        LONG  MinBitsPerSecond;
        LONG  MaxBitsPerSecond;
    } VIDEO_STREAM_CONFIG_CAPS;

    typedef struct _AUDIO_STREAM_CONFIG_CAPS {
        GUID guid;
        ULONG MinimumChannels;
        ULONG MaximumChannels;
        ULONG ChannelsGranularity;
        ULONG MinimumBitsPerSample;
        ULONG MaximumBitsPerSample;
        ULONG BitsPerSampleGranularity;
        ULONG MinimumSampleFrequency;
        ULONG MaximumSampleFrequency;
        ULONG SampleFrequencyGranularity;
    } AUDIO_STREAM_CONFIG_CAPS;

    HRESULT SetFormat( [in] AM_MEDIA_TYPE *pmt);
    HRESULT GetFormat( [in] AM_MEDIA_TYPE **pmt);
    HRESULT GetNumberOfCapabilities( [out] int *piCount, [out] int *piSize);
    HRESULT GetStreamCaps( [in] int iIndex, [out] AM_MEDIA_TYPE **pmt,
                          [out] BYTE *pSCC);
}


typedef enum tagVideoProcAmpProperty
{
    VideoProcAmp_Brightness,
    VideoProcAmp_Contrast,
    VideoProcAmp_Hue,
    VideoProcAmp_Saturation,
    VideoProcAmp_Sharpness,
    VideoProcAmp_Gamma,
    VideoProcAmp_ColorEnable,
    VideoProcAmp_WhiteBalance,
    VideoProcAmp_BacklightCompensation,
    VideoProcAmp_Gain
} VideoProcAmpProperty;

typedef enum tagVideoProcAmpFlags
{
    VideoProcAmp_Flags_Auto   = 0x0001,
    VideoProcAmp_Flags_Manual = 0x0002,
} VideoProcAmpFlags;

/*****************************************************************************
 * IAMVideoProcAmp interface
 */
[
    object,
    uuid(c6e13360-30ac-11d0-a18c-00a0c9118956),
    pointer_default(unique)
]
interface IAMVideoProcAmp : IUnknown
{
    HRESULT GetRange( [in] LONG Property, [out] LONG *pMin, [out] LONG *pMax,
                     [out] LONG *pSteppingDelta, [out] LONG *pDefault,
                     [out] LONG *pCapsFlags);
    HRESULT Set( [in] LONG Property, [in] LONG lValue, [in] LONG Flags);
    HRESULT Get( [in] LONG Property, [out] LONG *lValue, [out] LONG *Flags);
}


[
        object,
        uuid(56a868aa-0ad4-11ce-b03a-0020af0ba770),
        pointer_default(unique)
]
interface IAsyncReader : IUnknown
{
    HRESULT RequestAllocator(
                [in]  IMemAllocator* pPreferred,
                [in]  ALLOCATOR_PROPERTIES* pProps,
                [out] IMemAllocator ** ppActual);

    HRESULT Request(
                [in] IMediaSample* pSample,
                [in] DWORD_PTR dwUser);

    HRESULT WaitForNext(
                [in]  DWORD dwTimeout,
                [out] IMediaSample** ppSample,
                [out] DWORD_PTR * pdwUser);

    HRESULT SyncReadAligned(
                [in] IMediaSample* pSample);

    HRESULT SyncRead(
                [in]  LONGLONG llPosition,
                [in]  LONG lLength,
                [out, size_is(lLength)]
                      BYTE* pBuffer);

    HRESULT Length(
                [out] LONGLONG* pTotal,
                [out] LONGLONG* pAvailable);

    HRESULT BeginFlush(void);

    HRESULT EndFlush(void);
}


[
    object,
    uuid(56a868ab-0ad4-11ce-b03a-0020af0ba770),
    pointer_default(unique)
]
interface IGraphVersion : IUnknown
{
    HRESULT QueryVersion(LONG* pVersion);
}

[
    object,
    uuid(56a868ad-0ad4-11ce-b03a-0020af0ba770),
    pointer_default(unique)
]
interface IResourceConsumer : IUnknown
{
    HRESULT AcquireResource(
        [in] LONG idResource);

    HRESULT ReleaseResource(
        [in] LONG idResource);
}


[
    object,
    uuid(56a868ac-0ad4-11ce-b03a-0020af0ba770),
    pointer_default(unique)
]
interface IResourceManager : IUnknown
{
    HRESULT Register(
        [in] LPCWSTR pName,
        [in] LONG   cResource,
        [out] LONG* plToken
        );

    HRESULT RegisterGroup(
        [in] LPCWSTR pName,
        [in] LONG cResource,
        [in, size_is(cResource)]
             LONG* palTokens,
        [out] LONG* plToken
        );

    HRESULT RequestResource(
        [in] LONG idResource,
        [in] IUnknown* pFocusObject,
        [in] IResourceConsumer* pConsumer
        );

    HRESULT NotifyAcquire(
        [in] LONG idResource,
        [in] IResourceConsumer* pConsumer,
        [in] HRESULT hr);

    HRESULT NotifyRelease(
        [in] LONG idResource,
        [in] IResourceConsumer* pConsumer,
        [in] BOOL bStillWant);

    HRESULT CancelRequest(
        [in] LONG idResource,
        [in] IResourceConsumer* pConsumer);

    HRESULT SetFocus(
        [in] IUnknown* pFocusObject);

    HRESULT ReleaseFocus(
        [in] IUnknown* pFocusObject);

}

typedef enum AM_STREAM_INFO_FLAGS
{
    AM_STREAM_INFO_START_DEFINED   = 0x01,
    AM_STREAM_INFO_STOP_DEFINED    = 0x02,
    AM_STREAM_INFO_DISCARDING      = 0x04,
    AM_STREAM_INFO_STOP_SEND_EXTRA = 0x10
} AM_STREAM_INFO_FLAGS;

typedef struct AM_STREAM_INFO
{
    REFERENCE_TIME tStart;
    REFERENCE_TIME tStop;
    DWORD dwStartCookie;
    DWORD dwStopCookie;
    DWORD dwFlags;
} AM_STREAM_INFO;

[
    local,
    object,
    uuid(36b73881-c2c8-11cf-8b46-00805f6cef60),
    pointer_default(unique)
]
interface IAMStreamControl : IUnknown
{
    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);
}

cpp_quote("#ifndef _IKsPropertySet_")
cpp_quote("#define _IKsPropertySet_")
cpp_quote("#define KSPROPERTY_SUPPORT_GET  1")
cpp_quote("#define KSPROPERTY_SUPPORT_SET  2")

typedef enum AMPROPERTY_PIN
{
    AMPROPERTY_PIN_CATEGORY,
    AMPROPERTY_PIN_MEDIUM,
} AMPROPERTY_PIN;

[
    object,
    uuid(31efac30-515c-11d0-a9aa-00aa0061be93),
    pointer_default(unique),
    local
]
interface IKsPropertySet : IUnknown
{
    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 );

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

    HRESULT QuerySupported( [in] REFGUID guidPropSet,
                            [in] DWORD dwPropID,
                            [out] DWORD *pTypeSupport);
}
cpp_quote("#endif /* _IKsPropertySet_ */")

[
    local,
    object,
    uuid(6025a880-c0d5-11d0-bd4e-00a0c911ce86),
    pointer_default(unique)
]
interface IMediaPropertyBag : IPropertyBag
{
    typedef IMediaPropertyBag *LPMEDIAPROPERTYBAG;

    HRESULT EnumProperty(
            [in]  ULONG iProperty,
            [in, out] VARIANT *pvarPropertyName,
            [in, out] VARIANT *pvarPropertyValue);
}


[
    local,
    object,
    uuid(5738e040-b67f-11d0-bd4d-00a0c911ce86),
    pointer_default(unique)
]
interface IPersistMediaPropertyBag : IPersist
{
    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;
}

[
    object,
    uuid(36b73883-c2c8-11cf-8b46-00805f6cef60),
    pointer_default(unique)
]
interface ISeekingPassThru : IUnknown
{
    HRESULT Init( [in] BOOL bSupportRendering, [in] IPin *pPin);
}

enum _AM_FILTER_MISC_FLAGS
{
    AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x1,
    AM_FILTER_MISC_FLAGS_IS_SOURCE = 0x2
};

[
    local,
    object,
    uuid(2dd74950-a890-11d1-abe8-00a0c905f375),
    pointer_default(unique)
]
interface IAMFilterMiscFlags : IUnknown
{
    ULONG GetMiscFlags();
}

[
    local,
    object,
    uuid(4995f511-9ddb-4f12-bd3b-f04611807b79),
    pointer_default(unique)
]
interface IAMGraphBuilderCallback : IUnknown
{
    HRESULT SelectedFilter(
        [in] IMoniker *pMon);

    HRESULT CreatedFilter(
        [in] IBaseFilter *pFil);
}

[
    local,
    object,
    uuid(d8d715a0-6e5e-11d0-b3f0-00aa003761c5),
    pointer_default(unique)
]
interface IAMVfwCaptureDialogs : IUnknown
{
    HRESULT HasDialog(
            [in] int dialog);
    HRESULT ShowDialog(
            [in] int dialog,
            [in] HWND hwnd);
    HRESULT SendDriverMessage(
            [in] int dialog,
            [in] int msg,
            [in] long data1,
            [in] long data2);
}

[
    local,
    object,
    uuid(c6e13370-30ac-11d0-a18c-00a0c9118956),
    pointer_default(unique)
]
interface IAMCameraControl : IUnknown
{
    HRESULT GetRange([in] long property, [out] long *min, [out] long *max,
        [out] long *stepping_delta, [out] long *default_value, [out] long *flags);
    HRESULT Set([in] long property, [in] long property_value, [in] long flags);
    HRESULT Get([in] long property, [out] long *property_value, [out] long *flags);
}

[
    local,
    object,
    uuid(6a2e0670-28e4-11d0-a18c-00a0c9118956),
    pointer_default(unique)
]
interface IAMVideoControl : IUnknown
{
    HRESULT GetCaps([in] IPin *pin, [out] long *flags);
    HRESULT SetMode([in] IPin *pin, long mode);
    HRESULT GetMode([in] IPin *pin, [out] long *mode);
    HRESULT GetCurrentActualFrameRate([in] IPin *pin, [out] LONGLONG *frame_rate);
    HRESULT GetMaxAvailableFrameRate([in] IPin *pin, [in] long index,
            [in] SIZE dimensions, [out] LONGLONG *frame_rate);
    HRESULT GetFrameRateList([in] IPin *pin, [in] long index, [in] SIZE dimensions,
            [out] long *list_size, [out] LONGLONG **frame_rate);
}

[
    local,
    object,
    uuid(56ed71a0-af5f-11d0-b3f0-00aa003761c5),
    pointer_default(unique)
]
interface IAMBufferNegotiation : IUnknown
{
    HRESULT SuggestAllocatorProperties([in] const ALLOCATOR_PROPERTIES *prop);
    HRESULT GetAllocatorProperties([out] ALLOCATOR_PROPERTIES *prop);
}

[
    local,
    object,
    uuid(c6e13344-30ac-11d0-a18c-00a0c9118956),
    pointer_default(unique)
]
interface IAMDroppedFrames : IUnknown
{
    HRESULT GetNumDropped([out] long *number);
    HRESULT GetNumNotDropped([out] long *number);
    HRESULT GetDroppedInfo([in] long size, [out] long *array, [out] long *copied);
    HRESULT GetAverageFrameSize([out] long *size);
}

[
    local,
    object,
    uuid(62ea93ba-ec62-11d2-b770-00c04fb6bd3d),
    pointer_default(unique)
]
interface IAMLatency : IUnknown
{
    HRESULT GetLatency([in, out] REFERENCE_TIME *latency);
}

[
    local,
    object,
    uuid(f185fe76-e64e-11d2-b76e-00c04fb6bd3d),
    pointer_default(unique)
]
interface IAMPushSource : IAMLatency
{
    HRESULT GetPushSourceFlags([out] ULONG *flags);
    HRESULT SetPushSourceFlags([in] ULONG flags);
    HRESULT SetStreamOffset([in] REFERENCE_TIME offset);
    HRESULT GetStreamOffset([out] REFERENCE_TIME *offset);
    HRESULT GetMaxStreamOffset([out] REFERENCE_TIME *offset);
    HRESULT SetMaxStreamOffset([in] REFERENCE_TIME offset);
}

[
    local,
    object,
    uuid(c6e13343-30ac-11d0-a18c-00a0c9118956),
    pointer_default(unique)
]
interface IAMVideoCompression : IUnknown
{
    HRESULT put_KeyFrameRate([in] long frame_rate);
    HRESULT get_KeyFrameRate([out] long *frame_rate);
    HRESULT put_PFramesPerKeyFrame([in] long frame);
    HRESULT get_PFramesPerKeyFrame([out] long *frame);
    HRESULT put_Quality([in] double quality);
    HRESULT get_Quality([out] double *quality);
    HRESULT put_WindowSize([in] DWORDLONG size);
    HRESULT get_WindowSize([out] DWORDLONG *size);
    HRESULT GetInfo([out, size_is(*version_size)] LPWSTR version, [in, out] int *version_size,
            [out, size_is(*description_size)] LPWSTR description, [in, out] int *description_size,
            [out] long *frame_rate, [out] long *key, [out] double *quality, [out] long *capabilities);
    HRESULT OverrideKeyFrame([in] long number);
    HRESULT OverrideFrameSize([in] long number, [in] long size);
}

[
    local,
    object,
    uuid(c6e13380-30ac-11d0-a18c-00a0c9118956),
    pointer_default(unique)
]
interface IAMCrossbar : IUnknown
{
    HRESULT get_PinCounts([out] long *output, [out] long *intput);
    HRESULT CanRoute([in] long output, [in] long input);
    HRESULT Route([in] long output, [in] long input);
    HRESULT get_IsRoutedTo([in] long output, [out] long *input);
    HRESULT get_CrossbarPinInfo([in] BOOL is_input, [in] long index,
            [out] long *related, [out] long *type);
}

typedef enum tagAMTunerEventType
{
    AMTUNER_EVENT_CHANGED = 0x0001,
} AMTunerEventType;

[
    local,
    object,
    uuid(211a8760-03ac-11d1-8d13-00aa00bd8339),
    pointer_default(unique)
]
interface IAMTunerNotification : IUnknown
{
    HRESULT OnEvent([in] AMTunerEventType event);
}

typedef enum tagAMTunerModeType
{
    AMTUNER_MODE_DEFAULT  = 0x0000,
    AMTUNER_MODE_TV       = 0x0001,
    AMTUNER_MODE_FM_RADIO = 0x0002,
    AMTUNER_MODE_AM_RADIO = 0x0004,
    AMTUNER_MODE_DSS      = 0x0008,
} AMTunerModeType;

[
    local,
    object,
    uuid(211a8761-03ac-11d1-8d13-00aa00bd8339),
    pointer_default(unique)
]
interface IAMTuner : IUnknown
{
    HRESULT put_Channel([in] long channel, [in] long video, [in] long audio);
    HRESULT get_Channel([out] long *channel, [out] long *video, [out] long *audio);
    HRESULT ChannelMinMax([out] long *min, [out] long *max);
    HRESULT put_CountryCode([in] long country);
    HRESULT get_CountryCode([out] long *country);
    HRESULT put_TuningSpace([in] long tuning_space);
    HRESULT get_TuningSpace([out] long *tuning_space);
    [local] HRESULT Logon([in] HANDLE user);
    HRESULT Logout();
    HRESULT SignalPresent([out] long *signal_strength);
    HRESULT put_Mode([in] AMTunerModeType mode);
    HRESULT get_Mode([out] AMTunerModeType *mode);
    HRESULT GetAvailableModes([out] long *modes);
    HRESULT RegisterNotificationCallBack([in] IAMTunerNotification *notify, [in] long events);
    HRESULT UnRegisterNotificationCallBack([in] IAMTunerNotification *notify);
}

[
    local,
    object,
    uuid(211a8766-03ac-11d1-8d13-00aa00bd8339),
    pointer_default(unique)
]
interface IAMTVTuner : IAMTuner
{
    HRESULT get_AvailableTVFormats([out] long *standard);
    HRESULT get_TVFormat([out] long *standard);
    HRESULT AutoTune([in] long channel, [out] long *signal);
    HRESULT StoreAutoTune();
    HRESULT get_NumInputConnections([out] long *number);
    HRESULT put_InputType([in] long index, [in] TunerInputType type);
    HRESULT get_InputType([in] long index, [out] TunerInputType *type);
    HRESULT put_ConnectInput([in] long index);
    HRESULT get_ConnectInput([out] long *index);
    HRESULT get_VideoFrequency([out] long *freq);
    HRESULT get_AudioFrequency([out] long *freq);
}

[
    local,
    object,
    uuid(e46a9787-2b71-444d-a4b5-1fab7b708d6a),
    pointer_default(unique),
]
interface IVideoFrameStep : IUnknown
{
    HRESULT Step(DWORD frame_count, [in] IUnknown *filter);
    HRESULT CanStep(long multiple, [in] IUnknown *filter);
    HRESULT CancelStep();
}

cpp_quote("#if (_WIN32_WINNT >= 0x0601)")
[
    local,
    object,
    uuid(cf7b26fc-9a00-485b-8147-3e789d5e8f67),
    pointer_default(unique)
]
interface IAMAsyncReaderTimestampScaling : IUnknown
{
    HRESULT GetTimestampMode(
            [out] BOOL *pfRaw);
    HRESULT SetTimestampMode(
            [in] BOOL fRaw);
}

[
    local,
    object,
    uuid(0e26a181-f40c-4635-8786-976284b52981),
    pointer_default(unique)
]
interface IAMPluginControl : IUnknown
{
    HRESULT GetPreferredClsid(
            [in] REFGUID subType,
            [out] CLSID *clsid);
    HRESULT GetPreferredClsidByIndex(
            [in] DWORD index,
            [out] GUID *subType,
            [out] CLSID *clsid);
    HRESULT SetPreferredClsid(
            [in] REFGUID subType,
            [in] const CLSID *clsid);
    HRESULT IsDisabled(
            [in] REFCLSID clsid);
    HRESULT GetDisabledByIndex(
            [in] DWORD index,
            [out] CLSID *clsid);
    HRESULT SetDisabled(
            [in] REFCLSID clsid,
            [in] BOOL disabled);
    HRESULT IsLegacyDisabled(
            [in] LPCWSTR dllName);
}
cpp_quote("#endif /*(_WIN32_WINNT >= 0x0601)*/")
