2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy
4 * FILE: dll/directx/ksproxy/datatype.cpp
5 * PURPOSE: IKsDataTypeHandler interface
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
13 const GUID IID_IUnknown
= {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
15 const GUID IID_IKsDataTypeHandler
= {0x5FFBAA02L
, 0x49A3, 0x11D0, {0x9F, 0x36, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xA1}};
17 const GUID IID_IClassFactory
= {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
19 class CKsDataTypeHandler
: public IKsDataTypeHandler
22 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
24 STDMETHODIMP_(ULONG
) AddRef()
26 InterlockedIncrement(&m_Ref
);
29 STDMETHODIMP_(ULONG
) Release()
31 InterlockedDecrement(&m_Ref
);
41 HRESULT STDMETHODCALLTYPE
KsCompleteIoOperation(IN OUT IMediaSample
*Sample
, IN OUT PVOID StreamHeader
, IN KSIOOPERATION IoOperation
, IN BOOL Cancelled
);
42 HRESULT STDMETHODCALLTYPE
KsIsMediaTypeInRanges(IN PVOID DataRanges
);
43 HRESULT STDMETHODCALLTYPE
KsPrepareIoOperation(IN OUT IMediaSample
*Sample
, IN OUT PVOID StreamHeader
, IN KSIOOPERATION IoOperation
);
44 HRESULT STDMETHODCALLTYPE
KsQueryExtendedSize(OUT ULONG
* ExtendedSize
);
45 HRESULT STDMETHODCALLTYPE
KsSetMediaType(IN
const AM_MEDIA_TYPE
* AmMediaType
);
47 CKsDataTypeHandler() : m_Ref(0), m_Type(0){};
48 virtual ~CKsDataTypeHandler()
53 CoTaskMemFree(m_Type
->pbFormat
);
56 m_Type
->pUnk
->Release();
58 CoTaskMemFree(m_Type
);
65 AM_MEDIA_TYPE
* m_Type
;
71 CKsDataTypeHandler::QueryInterface(
75 if (IsEqualGUID(refiid
, IID_IUnknown
) ||
76 IsEqualGUID(refiid
, IID_IKsDataTypeHandler
))
78 *Output
= PVOID(this);
79 reinterpret_cast<IUnknown
*>(*Output
)->AddRef();
88 CKsDataTypeHandler::KsCompleteIoOperation(
89 IN OUT IMediaSample
*Sample
,
90 IN OUT PVOID StreamHeader
,
91 IN KSIOOPERATION IoOperation
,
100 CKsDataTypeHandler::KsIsMediaTypeInRanges(
103 PKSMULTIPLE_ITEM DataList
;
104 PKSDATARANGE DataRange
;
106 HRESULT hr
= S_FALSE
;
109 OutputDebugStringW(L
"CKsDataTypeHandler::KsIsMediaTypeInRanges\n");
112 DataList
= (PKSMULTIPLE_ITEM
)DataRanges
;
113 DataRange
= (PKSDATARANGE
)(DataList
+ 1);
115 for(Index
= 0; Index
< DataList
->Count
; Index
++)
119 if (DataRange
->FormatSize
>= sizeof(KSDATARANGE
))
121 bMatch
= IsEqualGUID(DataRange
->MajorFormat
, GUID_NULL
);
124 if (!bMatch
&& DataRange
->FormatSize
>= sizeof(KSDATARANGE_AUDIO
))
126 bMatch
= IsEqualGUID(DataRange
->MajorFormat
, MEDIATYPE_Audio
);
131 if (IsEqualGUID(DataRange
->SubFormat
, m_Type
->subtype
) ||
132 IsEqualGUID(DataRange
->SubFormat
, GUID_NULL
))
134 if (IsEqualGUID(DataRange
->Specifier
, m_Type
->formattype
) ||
135 IsEqualGUID(DataRange
->Specifier
, GUID_NULL
))
137 if (!IsEqualGUID(m_Type
->formattype
, FORMAT_WaveFormatEx
) && !IsEqualGUID(DataRange
->Specifier
, FORMAT_WaveFormatEx
))
144 if (DataRange
->FormatSize
>= sizeof(KSDATARANGE_AUDIO
) && m_Type
->cbFormat
>= sizeof(WAVEFORMATEX
))
146 LPWAVEFORMATEX Format
= (LPWAVEFORMATEX
)m_Type
->pbFormat
;
147 PKSDATARANGE_AUDIO AudioRange
= (PKSDATARANGE_AUDIO
)DataRange
;
149 if (Format
->nSamplesPerSec
>= AudioRange
->MinimumSampleFrequency
&&
150 Format
->nSamplesPerSec
<= AudioRange
->MaximumSampleFrequency
&&
151 Format
->wBitsPerSample
>= AudioRange
->MinimumSampleFrequency
&&
152 Format
->wBitsPerSample
<= AudioRange
->MaximumBitsPerSample
&&
153 Format
->nChannels
<= AudioRange
->MaximumChannels
)
164 DataRange
= (PKSDATARANGE
)(((ULONG_PTR
)DataRange
+ DataRange
->FormatSize
+ 7) & ~7);
171 CKsDataTypeHandler::KsPrepareIoOperation(
172 IN OUT IMediaSample
*Sample
,
173 IN OUT PVOID StreamHeader
,
174 IN KSIOOPERATION IoOperation
)
181 CKsDataTypeHandler::KsQueryExtendedSize(
182 OUT ULONG
* ExtendedSize
)
184 /* no header extension required */
191 CKsDataTypeHandler::KsSetMediaType(
192 IN
const AM_MEDIA_TYPE
* AmMediaType
)
195 OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n");
200 /* media type can only be set once */
204 m_Type
= (AM_MEDIA_TYPE
*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE
));
206 return E_OUTOFMEMORY
;
208 CopyMemory(m_Type
, AmMediaType
, sizeof(AM_MEDIA_TYPE
));
210 if (m_Type
->cbFormat
)
212 m_Type
->pbFormat
= (BYTE
*)CoTaskMemAlloc(m_Type
->cbFormat
);
214 if (!m_Type
->pbFormat
)
216 CoTaskMemFree(m_Type
);
217 return E_OUTOFMEMORY
;
220 CopyMemory(m_Type
->pbFormat
, AmMediaType
->pbFormat
, m_Type
->cbFormat
);
224 m_Type
->pUnk
->AddRef();
232 CKsDataTypeHandler_Constructor (
233 IUnknown
* pUnkOuter
,
238 OutputDebugStringW(L
"CKsDataTypeHandler_Constructor\n");
241 CKsDataTypeHandler
* handler
= new CKsDataTypeHandler();
244 return E_OUTOFMEMORY
;
246 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
250 return E_NOINTERFACE
;