/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef __KSPROXY__
#define __KSPROXY__

#ifdef __cplusplus
extern "C" {
#endif

#undef KSDDKAPI
#ifdef _KSDDK_
#define KSDDKAPI
#else
#define KSDDKAPI DECLSPEC_IMPORT
#endif

#define STATIC_IID_IKsObject 0x423c13a2L,0x2070,0x11d0,0x9e,0xf7,0x00,0xaa,0x00,0xa2,0x16,0xa1
#define STATIC_IID_IKsPinEx 0x7bb38260L,0xd19c,0x11d2,0xb3,0x8a,0x00,0xa0,0xc9,0x5e,0xc2,0x2e
#define STATIC_IID_IKsPin 0xb61178d1L,0xa2d9,0x11cf,0x9e,0x53,0x00,0xaa,0x00,0xa2,0x16,0xa1
#define STATIC_IID_IKsPinPipe 0xe539cd90L,0xa8b4,0x11d1,0x81,0x89,0x00,0xa0,0xc9,0x06,0x28,0x02
#define STATIC_IID_IKsDataTypeHandler 0x5ffbaa02L,0x49a3,0x11d0,0x9f,0x36,0x00,0xaa,0x00,0xa2,0x16,0xa1
#define STATIC_IID_IKsDataTypeCompletion 0x827D1A0EL,0x0F73,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96
#define STATIC_IID_IKsInterfaceHandler 0xD3ABC7E0L,0x9A61,0x11D0,0xA4,0x0D,0x00,0xA0,0xC9,0x22,0x31,0x96
#define STATIC_IID_IKsClockPropertySet 0x5C5CBD84L,0xE755,0x11D0,0xAC,0x18,0x00,0xA0,0xC9,0x22,0x31,0x96
#define STATIC_IID_IKsAllocator 0x8da64899L,0xc0d9,0x11d0,0x84,0x13,0x00,0x00,0xf8,0x22,0xfe,0x8a
#define STATIC_IID_IKsAllocatorEx 0x091bb63aL,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02
#ifndef STATIC_IID_IKsPropertySet
#define STATIC_IID_IKsPropertySet 0x31EFAC30L,0x515C,0x11d0,0xA9,0xAA,0x00,0xAA,0x00,0x61,0xBE,0x93
#endif
#define STATIC_IID_IKsTopology 0x28F54683L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96
#ifndef STATIC_IID_IKsControl
#define STATIC_IID_IKsControl 0x28F54685L,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96
#endif
#define STATIC_IID_IKsAggregateControl 0x7F40EAC0L,0x3947,0x11D2,0x87,0x4E,0x00,0xA0,0xC9,0x22,0x31,0x96
#define STATIC_CLSID_Proxy 0x17CCA71BL,0xECD7,0x11D0,0xB9,0x08,0x00,0xA0,0xC9,0x22,0x31,0x96
#ifdef _KS_
  DEFINE_GUIDEX(IID_IKsObject);
  DEFINE_GUIDEX(IID_IKsPin);
  DEFINE_GUIDEX(IID_IKsPinEx);
  DEFINE_GUIDEX(IID_IKsPinPipe);
  DEFINE_GUIDEX(IID_IKsDataTypeHandler);
  DEFINE_GUIDEX(IID_IKsDataTypeCompletion);
  DEFINE_GUIDEX(IID_IKsInterfaceHandler);
  DEFINE_GUIDEX(IID_IKsClockPropertySet);
  DEFINE_GUIDEX(IID_IKsAllocator);
  DEFINE_GUIDEX(IID_IKsAllocatorEx);
#define IID_IKsQualityForwarder KSCATEGORY_QUALITY
#define STATIC_IID_IKsQualityForwarder STATIC_KSCATEGORY_QUALITY

  typedef enum {
    KsAllocatorMode_User,KsAllocatorMode_Kernel
  } KSALLOCATORMODE;

  typedef enum {
    FramingProp_Uninitialized,FramingProp_None,FramingProp_Old,FramingProp_Ex
  } FRAMING_PROP;

  typedef FRAMING_PROP *PFRAMING_PROP;

  typedef enum {
    Framing_Cache_Update,Framing_Cache_ReadLast,Framing_Cache_ReadOrig,Framing_Cache_Write
  } FRAMING_CACHE_OPS;

  typedef struct {
    LONGLONG MinTotalNominator;
    LONGLONG MaxTotalNominator;
    LONGLONG TotalDenominator;
  } OPTIMAL_WEIGHT_TOTALS;

  typedef struct IPin IPin;
  typedef struct IKsPin IKsPin;
  typedef struct IKsAllocator IKsAllocator;
  typedef struct IKsAllocatorEx IKsAllocatorEx;

#define AllocatorStrategy_DontCare 0
#define AllocatorStrategy_MinimizeNumberOfFrames 0x00000001
#define AllocatorStrategy_MinimizeFrameSize 0x00000002
#define AllocatorStrategy_MinimizeNumberOfAllocators 0x00000004
#define AllocatorStrategy_MaximizeSpeed 0x00000008

#define PipeFactor_None 0
#define PipeFactor_UserModeUpstream 0x00000001
#define PipeFactor_UserModeDownstream 0x00000002
#define PipeFactor_MemoryTypes 0x00000004
#define PipeFactor_Flags 0x00000008
#define PipeFactor_PhysicalRanges 0x00000010
#define PipeFactor_OptimalRanges 0x00000020
#define PipeFactor_FixedCompression 0x00000040
#define PipeFactor_UnknownCompression 0x00000080

#define PipeFactor_Buffers 0x00000100
#define PipeFactor_Align 0x00000200
#define PipeFactor_PhysicalEnd 0x00000400
#define PipeFactor_LogicalEnd 0x00000800

  typedef enum {
    PipeState_DontCare,PipeState_RangeNotFixed,PipeState_RangeFixed,PipeState_CompressionUnknown,PipeState_Finalized
  } PIPE_STATE;

  typedef struct _PIPE_DIMENSIONS {
    KS_COMPRESSION AllocatorPin;
    KS_COMPRESSION MaxExpansionPin;
    KS_COMPRESSION EndPin;
  } PIPE_DIMENSIONS,*PPIPE_DIMENSIONS;

  typedef enum {
    Pipe_Allocator_None,Pipe_Allocator_FirstPin,Pipe_Allocator_LastPin,Pipe_Allocator_MiddlePin
  } PIPE_ALLOCATOR_PLACE;

  typedef PIPE_ALLOCATOR_PLACE *PPIPE_ALLOCATOR_PLACE;

  typedef enum {
    KS_MemoryTypeDontCare = 0,KS_MemoryTypeKernelPaged,KS_MemoryTypeKernelNonPaged,KS_MemoryTypeDeviceHostMapped,KS_MemoryTypeDeviceSpecific,
    KS_MemoryTypeUser,KS_MemoryTypeAnyHost
  } KS_LogicalMemoryType;

  typedef KS_LogicalMemoryType *PKS_LogicalMemoryType;

  typedef struct _PIPE_TERMINATION {
    ULONG Flags;
    ULONG OutsideFactors;
    ULONG Weigth;
    KS_FRAMING_RANGE PhysicalRange;
    KS_FRAMING_RANGE_WEIGHTED OptimalRange;
    KS_COMPRESSION Compression;
  } PIPE_TERMINATION;

  typedef struct _ALLOCATOR_PROPERTIES_EX {
    long cBuffers;
    long cbBuffer;
    long cbAlign;
    long cbPrefix;

    GUID MemoryType;
    GUID BusType;
    PIPE_STATE State;
    PIPE_TERMINATION Input;
    PIPE_TERMINATION Output;
    ULONG Strategy;
    ULONG Flags;
    ULONG Weight;
    KS_LogicalMemoryType LogicalMemoryType;
    PIPE_ALLOCATOR_PLACE AllocatorPlace;
    PIPE_DIMENSIONS Dimensions;
    KS_FRAMING_RANGE PhysicalRange;
    IKsAllocatorEx *PrevSegment;
    ULONG CountNextSegments;
    IKsAllocatorEx **NextSegments;
    ULONG InsideFactors;
    ULONG NumberPins;
  } ALLOCATOR_PROPERTIES_EX;

  typedef ALLOCATOR_PROPERTIES_EX *PALLOCATOR_PROPERTIES_EX;

#ifdef __STREAMS__
  struct IKsClockPropertySet;
#undef INTERFACE
#define INTERFACE IKsClockPropertySet
  DECLARE_INTERFACE_(IKsClockPropertySet,IUnknown) {
    STDMETHOD(KsGetTime)(THIS_ LONGLONG *Time) PURE;
    STDMETHOD(KsSetTime)(THIS_ LONGLONG Time) PURE;
    STDMETHOD(KsGetPhysicalTime)(THIS_ LONGLONG *Time) PURE;
    STDMETHOD(KsSetPhysicalTime)(THIS_ LONGLONG Time) PURE;
    STDMETHOD(KsGetCorrelatedTime)(THIS_ KSCORRELATED_TIME *CorrelatedTime) PURE;
    STDMETHOD(KsSetCorrelatedTime)(THIS_ KSCORRELATED_TIME *CorrelatedTime) PURE;
    STDMETHOD(KsGetCorrelatedPhysicalTime)(THIS_ KSCORRELATED_TIME *CorrelatedTime) PURE;
    STDMETHOD(KsSetCorrelatedPhysicalTime)(THIS_ KSCORRELATED_TIME *CorrelatedTime) PURE;
    STDMETHOD(KsGetResolution)(THIS_ KSRESOLUTION *Resolution) PURE;
    STDMETHOD(KsGetState)(THIS_ KSSTATE *State) PURE;
  };

  struct IKsAllocator;
#undef INTERFACE
#define INTERFACE IKsAllocator
  DECLARE_INTERFACE_(IKsAllocator,IUnknown) {
    STDMETHOD_(HANDLE,KsGetAllocatorHandle)(THIS) PURE;
    STDMETHOD_(KSALLOCATORMODE,KsGetAllocatorMode)(THIS) PURE;
    STDMETHOD(KsGetAllocatorStatus)(THIS_ PKSSTREAMALLOCATOR_STATUS AllocatorStatus) PURE;
    STDMETHOD_(VOID,KsSetAllocatorMode)(THIS_ KSALLOCATORMODE Mode) PURE;
  };

  struct IKsAllocatorEx;
#undef INTERFACE
#define INTERFACE IKsAllocatorEx
  DECLARE_INTERFACE_(IKsAllocatorEx,IKsAllocator) {
    STDMETHOD_(PALLOCATOR_PROPERTIES_EX,KsGetProperties)(THIS) PURE;
    STDMETHOD_(VOID,KsSetProperties)(THIS_ PALLOCATOR_PROPERTIES_EX) PURE;
    STDMETHOD_(VOID,KsSetAllocatorHandle)(THIS_ HANDLE AllocatorHandle) PURE;
    STDMETHOD_(HANDLE,KsCreateAllocatorAndGetHandle)(THIS_ IKsPin *KsPin) PURE;
  };

  typedef enum {
    KsPeekOperation_PeekOnly,KsPeekOperation_AddRef
  } KSPEEKOPERATION;

  typedef struct _KSSTREAM_SEGMENT *PKSSTREAM_SEGMENT;
  struct IKsPin;

#undef INTERFACE
#define INTERFACE IKsPin
  DECLARE_INTERFACE_(IKsPin,IUnknown) {
    STDMETHOD(KsQueryMediums)(THIS_ PKSMULTIPLE_ITEM *MediumList) PURE;
    STDMETHOD(KsQueryInterfaces)(THIS_ PKSMULTIPLE_ITEM *InterfaceList) PURE;
    STDMETHOD(KsCreateSinkPinHandle)(THIS_ KSPIN_INTERFACE& Interface,KSPIN_MEDIUM& Medium) PURE;
    STDMETHOD(KsGetCurrentCommunication)(THIS_ KSPIN_COMMUNICATION *Communication,KSPIN_INTERFACE *Interface,KSPIN_MEDIUM *Medium) PURE;
    STDMETHOD(KsPropagateAcquire)(THIS) PURE;
    STDMETHOD(KsDeliver)(THIS_ IMediaSample *Sample,ULONG Flags) PURE;
    STDMETHOD(KsMediaSamplesCompleted)(THIS_ PKSSTREAM_SEGMENT StreamSegment) PURE;
    STDMETHOD_(IMemAllocator *,KsPeekAllocator)(THIS_ KSPEEKOPERATION Operation) PURE;
    STDMETHOD(KsReceiveAllocator)(THIS_ IMemAllocator *MemAllocator) PURE;
    STDMETHOD(KsRenegotiateAllocator)(THIS) PURE;
    STDMETHOD_(LONG,KsIncrementPendingIoCount)(THIS) PURE;
    STDMETHOD_(LONG,KsDecrementPendingIoCount)(THIS) PURE;
    STDMETHOD(KsQualityNotify)(THIS_ ULONG Proportion,REFERENCE_TIME TimeDelta) PURE;
  };

  struct IKsPinEx;
#undef INTERFACE
#define INTERFACE IKsPinEx
  DECLARE_INTERFACE_(IKsPinEx,IKsPin) {
    STDMETHOD_(VOID,KsNotifyError)(THIS_ IMediaSample *Sample,HRESULT hr) PURE;
  };

  struct IKsPinPipe;
#undef INTERFACE
#define INTERFACE IKsPinPipe
  DECLARE_INTERFACE_(IKsPinPipe,IUnknown) {
    STDMETHOD(KsGetPinFramingCache)(THIS_ PKSALLOCATOR_FRAMING_EX *FramingEx,PFRAMING_PROP FramingProp,FRAMING_CACHE_OPS Option) PURE;
    STDMETHOD(KsSetPinFramingCache)(THIS_ PKSALLOCATOR_FRAMING_EX FramingEx,PFRAMING_PROP FramingProp,FRAMING_CACHE_OPS Option) PURE;
    STDMETHOD_(IPin*,KsGetConnectedPin)(THIS) PURE;
    STDMETHOD_(IKsAllocatorEx*,KsGetPipe)(THIS_ KSPEEKOPERATION Operation) PURE;
    STDMETHOD(KsSetPipe)(THIS_ IKsAllocatorEx *KsAllocator) PURE;
    STDMETHOD_(ULONG,KsGetPipeAllocatorFlag)(THIS) PURE;
    STDMETHOD(KsSetPipeAllocatorFlag)(THIS_ ULONG Flag) PURE;
    STDMETHOD_(GUID,KsGetPinBusCache)(THIS) PURE;
    STDMETHOD(KsSetPinBusCache)(THIS_ GUID Bus) PURE;
    STDMETHOD_(PWCHAR,KsGetPinName)(THIS) PURE;
    STDMETHOD_(PWCHAR,KsGetFilterName)(THIS) PURE;
  };

  struct IKsPinFactory;
#undef INTERFACE
#define INTERFACE IKsPinFactory
  DECLARE_INTERFACE_(IKsPinFactory,IUnknown) {
    STDMETHOD(KsPinFactory)(THIS_ ULONG *PinFactory) PURE;
  };

  typedef enum {
    KsIoOperation_Write,KsIoOperation_Read
  } KSIOOPERATION;

  struct IKsDataTypeHandler;
#undef INTERFACE
#define INTERFACE IKsDataTypeHandler
  DECLARE_INTERFACE_(IKsDataTypeHandler,IUnknown) {
    STDMETHOD(KsCompleteIoOperation)(THIS_ IMediaSample *Sample,PVOID StreamHeader,KSIOOPERATION IoOperation,WINBOOL Cancelled) PURE;
    STDMETHOD(KsIsMediaTypeInRanges)(THIS_ PVOID DataRanges) PURE;
    STDMETHOD(KsPrepareIoOperation)(THIS_ IMediaSample *Sample,PVOID StreamHeader,KSIOOPERATION IoOperation) PURE;
    STDMETHOD(KsQueryExtendedSize)(THIS_ ULONG *ExtendedSize) PURE;
    STDMETHOD(KsSetMediaType)(THIS_ const AM_MEDIA_TYPE *AmMediaType) PURE;
  };

  struct IKsDataTypeCompletion;
#undef INTERFACE
#define INTERFACE IKsDataTypeCompletion
  DECLARE_INTERFACE_(IKsDataTypeCompletion,IUnknown) {
    STDMETHOD(KsCompleteMediaType)(THIS_ HANDLE FilterHandle,ULONG PinFactoryId,AM_MEDIA_TYPE *AmMediaType) PURE;
  };

  struct IKsInterfaceHandler;
#undef INTERFACE
#define INTERFACE IKsInterfaceHandler
  DECLARE_INTERFACE_(IKsInterfaceHandler,IUnknown) {
    STDMETHOD(KsSetPin)(THIS_ IKsPin *KsPin) PURE;
    STDMETHOD(KsProcessMediaSamples)(THIS_ IKsDataTypeHandler *KsDataTypeHandler,IMediaSample **SampleList,PLONG SampleCount,KSIOOPERATION IoOperation,PKSSTREAM_SEGMENT *StreamSegment) PURE;
    STDMETHOD(KsCompleteIo)(THIS_ PKSSTREAM_SEGMENT StreamSegment) PURE;
  };

  typedef struct _KSSTREAM_SEGMENT {
    IKsInterfaceHandler *KsInterfaceHandler;
    IKsDataTypeHandler *KsDataTypeHandler;
    KSIOOPERATION IoOperation;
    HANDLE CompletionEvent;
  } KSSTREAM_SEGMENT;

  struct IKsObject;
#undef INTERFACE
#define INTERFACE IKsObject
  DECLARE_INTERFACE_(IKsObject,IUnknown) {
    STDMETHOD_(HANDLE,KsGetObjectHandle)(THIS) PURE;
  };

  struct IKsQualityForwarder;
#undef INTERFACE
#define INTERFACE IKsQualityForwarder
  DECLARE_INTERFACE_(IKsQualityForwarder,IKsObject) {
    STDMETHOD_(VOID,KsFlushClient)(THIS_ IKsPin *Pin) PURE;
  };

  struct IKsNotifyEvent;
#undef INTERFACE
#define INTERFACE IKsNotifyEvent
  DECLARE_INTERFACE_(IKsNotifyEvent,IUnknown) {
    STDMETHOD(KsNotifyEvent)(THIS_ ULONG Event,ULONG_PTR lParam1,ULONG_PTR lParam2) PURE;
  };

  KSDDKAPI HRESULT WINAPI KsResolveRequiredAttributes(PKSDATARANGE DataRange,PKSMULTIPLE_ITEM Attributes);
  KSDDKAPI HRESULT WINAPI KsOpenDefaultDevice(REFGUID Category,ACCESS_MASK Access,PHANDLE DeviceHandle);
  KSDDKAPI HRESULT WINAPI KsSynchronousDeviceControl(HANDLE Handle,ULONG IoControl,PVOID InBuffer,ULONG InLength,PVOID OutBuffer,ULONG OutLength,PULONG BytesReturned);
  KSDDKAPI HRESULT WINAPI KsGetMultiplePinFactoryItems(HANDLE FilterHandle,ULONG PinFactoryId,ULONG PropertyId,PVOID *Items);
  KSDDKAPI HRESULT WINAPI KsGetMediaTypeCount(HANDLE FilterHandle,ULONG PinFactoryId,ULONG *MediaTypeCount);
  KSDDKAPI HRESULT WINAPI KsGetMediaType(int Position,AM_MEDIA_TYPE *AmMediaType,HANDLE FilterHandle,ULONG PinFactoryId);
#endif

#ifndef _IKsPropertySet_
  DEFINE_GUIDEX(IID_IKsPropertySet);
#endif

#ifndef _IKsControl_
  DEFINE_GUIDEX(IID_IKsControl);
#endif

  DEFINE_GUIDEX(IID_IKsAggregateControl);
#ifndef _IKsTopology_
  DEFINE_GUIDEX(IID_IKsTopology);
#endif
  DEFINE_GUIDSTRUCT("17CCA71B-ECD7-11D0-B908-00A0C9223196",CLSID_Proxy);
#define CLSID_Proxy DEFINE_GUIDNAMED(CLSID_Proxy)
#else

#ifndef _IKsPropertySet_
  DEFINE_GUID(IID_IKsPropertySet,STATIC_IID_IKsPropertySet);
#endif
  DEFINE_GUID(CLSID_Proxy,STATIC_CLSID_Proxy);
#endif

#ifndef _IKsPropertySet_
#define _IKsPropertySet_
#define KSPROPERTY_SUPPORT_GET 1
#define KSPROPERTY_SUPPORT_SET 2

#ifdef DECLARE_INTERFACE_
  struct IKsPropertySet;
#undef INTERFACE
#define INTERFACE IKsPropertySet
  DECLARE_INTERFACE_(IKsPropertySet,IUnknown) {
    STDMETHOD(Set)(THIS_ REFGUID PropSet,ULONG Id,LPVOID InstanceData,ULONG InstanceLength,LPVOID PropertyData,ULONG DataLength) PURE;
    STDMETHOD(Get)(THIS_ REFGUID PropSet,ULONG Id,LPVOID InstanceData,ULONG InstanceLength,LPVOID PropertyData,ULONG DataLength,ULONG *BytesReturned) PURE;
    STDMETHOD(QuerySupported)(THIS_ REFGUID PropSet,ULONG Id,ULONG *TypeSupport) PURE;
  };
#endif
#endif

#ifndef _IKsControl_
#define _IKsControl_
#ifdef DECLARE_INTERFACE_
  struct IKsControl;
#undef INTERFACE
#define INTERFACE IKsControl
  DECLARE_INTERFACE_(IKsControl,IUnknown) {
    STDMETHOD(KsProperty)(THIS_ PKSPROPERTY Property,ULONG PropertyLength,LPVOID PropertyData,ULONG DataLength,ULONG *BytesReturned) PURE;
    STDMETHOD(KsMethod)(THIS_ PKSMETHOD Method,ULONG MethodLength,LPVOID MethodData,ULONG DataLength,ULONG *BytesReturned) PURE;
    STDMETHOD(KsEvent)(THIS_ PKSEVENT Event,ULONG EventLength,LPVOID EventData,ULONG DataLength,ULONG *BytesReturned) PURE;
  };
#endif
#endif

#ifdef DECLARE_INTERFACE_
  struct IKsAggregateControl;
#undef INTERFACE
#define INTERFACE IKsAggregateControl
  DECLARE_INTERFACE_(IKsAggregateControl,IUnknown) {
    STDMETHOD(KsAddAggregate)(THIS_ REFGUID AggregateClass) PURE;
    STDMETHOD(KsRemoveAggregate)(THIS_ REFGUID AggregateClass) PURE;
  };
#endif

#ifndef _IKsTopology_
#define _IKsTopology_
#ifdef DECLARE_INTERFACE_
  struct IKsTopology;
#undef INTERFACE
#define INTERFACE IKsTopology
  DECLARE_INTERFACE_(IKsTopology,IUnknown) {
    STDMETHOD(CreateNodeInstance)(THIS_ ULONG NodeId,ULONG Flags,ACCESS_MASK DesiredAccess,IUnknown *UnkOuter,REFGUID InterfaceId,LPVOID *Interface) PURE;
  };
#endif
#endif

#ifdef __cplusplus
}
#endif
#endif
