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_IClassFactory
= {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
17 class CKsDataTypeHandler
: public IKsDataTypeHandler
20 STDMETHODIMP
QueryInterface( REFIID InterfaceId
, PVOID
* Interface
);
22 STDMETHODIMP_(ULONG
) AddRef()
24 InterlockedIncrement(&m_Ref
);
27 STDMETHODIMP_(ULONG
) Release()
29 InterlockedDecrement(&m_Ref
);
39 HRESULT STDMETHODCALLTYPE
KsCompleteIoOperation(IN OUT IMediaSample
*Sample
, IN OUT PVOID StreamHeader
, IN KSIOOPERATION IoOperation
, IN BOOL Cancelled
);
40 HRESULT STDMETHODCALLTYPE
KsIsMediaTypeInRanges(IN PVOID DataRanges
);
41 HRESULT STDMETHODCALLTYPE
KsPrepareIoOperation(IN OUT IMediaSample
*Sample
, IN OUT PVOID StreamHeader
, IN KSIOOPERATION IoOperation
);
42 HRESULT STDMETHODCALLTYPE
KsQueryExtendedSize(OUT ULONG
* ExtendedSize
);
43 HRESULT STDMETHODCALLTYPE
KsSetMediaType(IN
const AM_MEDIA_TYPE
* AmMediaType
);
45 CKsDataTypeHandler() : m_Ref(0), m_Type(0){};
46 virtual ~CKsDataTypeHandler()
51 CoTaskMemFree(m_Type
->pbFormat
);
54 m_Type
->pUnk
->Release();
56 CoTaskMemFree(m_Type
);
63 AM_MEDIA_TYPE
* m_Type
;
69 CKsDataTypeHandler::QueryInterface(
73 if (IsEqualGUID(refiid
, IID_IUnknown
) ||
74 IsEqualGUID(refiid
, IID_IKsDataTypeHandler
))
76 *Output
= PVOID(this);
77 reinterpret_cast<IUnknown
*>(*Output
)->AddRef();
86 CKsDataTypeHandler::KsCompleteIoOperation(
87 IN OUT IMediaSample
*Sample
,
88 IN OUT PVOID StreamHeader
,
89 IN KSIOOPERATION IoOperation
,
98 CKsDataTypeHandler::KsIsMediaTypeInRanges(
101 PKSMULTIPLE_ITEM DataList
;
102 PKSDATARANGE DataRange
;
104 HRESULT hr
= S_FALSE
;
107 OutputDebugStringW(L
"CKsDataTypeHandler::KsIsMediaTypeInRanges\n");
110 DataList
= (PKSMULTIPLE_ITEM
)DataRanges
;
111 DataRange
= (PKSDATARANGE
)(DataList
+ 1);
113 for(Index
= 0; Index
< DataList
->Count
; Index
++)
117 if (DataRange
->FormatSize
>= sizeof(KSDATARANGE
))
119 bMatch
= IsEqualGUID(DataRange
->MajorFormat
, GUID_NULL
);
122 if (!bMatch
&& DataRange
->FormatSize
>= sizeof(KSDATARANGE_AUDIO
))
124 bMatch
= IsEqualGUID(DataRange
->MajorFormat
, MEDIATYPE_Audio
);
129 if (IsEqualGUID(DataRange
->SubFormat
, m_Type
->subtype
) ||
130 IsEqualGUID(DataRange
->SubFormat
, GUID_NULL
))
132 if (IsEqualGUID(DataRange
->Specifier
, m_Type
->formattype
) ||
133 IsEqualGUID(DataRange
->Specifier
, GUID_NULL
))
135 if (!IsEqualGUID(m_Type
->formattype
, FORMAT_WaveFormatEx
) && !IsEqualGUID(DataRange
->Specifier
, FORMAT_WaveFormatEx
))
142 if (DataRange
->FormatSize
>= sizeof(KSDATARANGE_AUDIO
) && m_Type
->cbFormat
>= sizeof(WAVEFORMATEX
))
144 LPWAVEFORMATEX Format
= (LPWAVEFORMATEX
)m_Type
->pbFormat
;
145 PKSDATARANGE_AUDIO AudioRange
= (PKSDATARANGE_AUDIO
)DataRange
;
147 if (Format
->nSamplesPerSec
>= AudioRange
->MinimumSampleFrequency
&&
148 Format
->nSamplesPerSec
<= AudioRange
->MaximumSampleFrequency
&&
149 Format
->wBitsPerSample
>= AudioRange
->MinimumSampleFrequency
&&
150 Format
->wBitsPerSample
<= AudioRange
->MaximumBitsPerSample
&&
151 Format
->nChannels
<= AudioRange
->MaximumChannels
)
162 DataRange
= (PKSDATARANGE
)(((ULONG_PTR
)DataRange
+ DataRange
->FormatSize
+ 7) & ~7);
169 CKsDataTypeHandler::KsPrepareIoOperation(
170 IN OUT IMediaSample
*Sample
,
171 IN OUT PVOID StreamHeader
,
172 IN KSIOOPERATION IoOperation
)
179 CKsDataTypeHandler::KsQueryExtendedSize(
180 OUT ULONG
* ExtendedSize
)
182 /* no header extension required */
189 CKsDataTypeHandler::KsSetMediaType(
190 IN
const AM_MEDIA_TYPE
* AmMediaType
)
193 OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n");
198 /* media type can only be set once */
202 m_Type
= (AM_MEDIA_TYPE
*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE
));
204 return E_OUTOFMEMORY
;
206 CopyMemory(m_Type
, AmMediaType
, sizeof(AM_MEDIA_TYPE
));
208 if (m_Type
->cbFormat
)
210 m_Type
->pbFormat
= (BYTE
*)CoTaskMemAlloc(m_Type
->cbFormat
);
212 if (!m_Type
->pbFormat
)
214 CoTaskMemFree(m_Type
);
215 return E_OUTOFMEMORY
;
218 CopyMemory(m_Type
->pbFormat
, AmMediaType
->pbFormat
, m_Type
->cbFormat
);
222 m_Type
->pUnk
->AddRef();
230 CKsDataTypeHandler_Constructor (
231 IUnknown
* pUnkOuter
,
236 OutputDebugStringW(L
"CKsDataTypeHandler_Constructor\n");
239 CKsDataTypeHandler
* handler
= new CKsDataTypeHandler();
242 return E_OUTOFMEMORY
;
244 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
248 return E_NOINTERFACE
;