/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 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						\
	0x423c13a2,0x2070,0x11d0,0x9e,0xf7,0x00,0xaa,0x00,0xa2,0x16,0xa1

#define STATIC_IID_IKsPinEx						\
	0x7bb38260,0xd19c,0x11d2,0xb3,0x8a,0x00,0xa0,0xc9,0x5e,0xc2,0x2e

#define STATIC_IID_IKsPin						\
	0xb61178d1,0xa2d9,0x11cf,0x9e,0x53,0x00,0xaa,0x00,0xa2,0x16,0xa1

#define STATIC_IID_IKsPinPipe						\
	0xe539cd90,0xa8b4,0x11d1,0x81,0x89,0x00,0xa0,0xc9,0x06,0x28,0x02

#define STATIC_IID_IKsDataTypeHandler					\
	0x5ffbaa02,0x49a3,0x11d0,0x9f,0x36,0x00,0xaa,0x00,0xa2,0x16,0xa1

#define STATIC_IID_IKsDataTypeCompletion				\
	0x827D1A0E,0x0F73,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96

#define STATIC_IID_IKsInterfaceHandler					\
	0xD3ABC7E0,0x9A61,0x11D0,0xA4,0x0D,0x00,0xA0,0xC9,0x22,0x31,0x96

#define STATIC_IID_IKsClockPropertySet					\
	0x5C5CBD84,0xE755,0x11D0,0xAC,0x18,0x00,0xA0,0xC9,0x22,0x31,0x96

#define STATIC_IID_IKsAllocator						\
	0x8da64899,0xc0d9,0x11d0,0x84,0x13,0x00,0x00,0xf8,0x22,0xfe,0x8a

#define STATIC_IID_IKsAllocatorEx					\
	0x091bb63a,0x603f,0x11d1,0xb0,0x67,0x00,0xa0,0xc9,0x06,0x28,0x02

#ifndef STATIC_IID_IKsPropertySet
#define STATIC_IID_IKsPropertySet					\
	0x31EFAC30,0x515C,0x11d0,0xA9,0xAA,0x00,0xAA,0x00,0x61,0xBE,0x93
#endif

#define STATIC_IID_IKsTopology						\
	0x28F54683,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96

#ifndef STATIC_IID_IKsControl
#define STATIC_IID_IKsControl						\
	0x28F54685,0x06FD,0x11D2,0xB2,0x7A,0x00,0xA0,0xC9,0x22,0x31,0x96
#endif

#define STATIC_IID_IKsAggregateControl					\
	0x7F40EAC0,0x3947,0x11D2,0x87,0x4E,0x00,0xA0,0xC9,0x22,0x31,0x96

#define STATIC_CLSID_Proxy						\
	0x17CCA71B,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
{
  __LONG32 cBuffers;
  __LONG32 cbBuffer;
  __LONG32 cbAlign;
  __LONG32 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 /* __STREAMS__ */

#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 /* _KS_ */

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

DEFINE_GUID(CLSID_Proxy,STATIC_CLSID_Proxy);

#endif /* _KS_ */

#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 /* DECLARE_INTERFACE_ */
#endif /* _IKsPropertySet_ */

#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 /* DECLARE_INTERFACE_ */
#endif /* _IKsControl_ */

#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 /* DECLARE_INTERFACE_ */

#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 /* DECLARE_INTERFACE_ */
#endif /* _IKsTopology_ */

#ifdef __cplusplus
}
#endif

#endif /* __KSPROXY__ */