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
;
106 OutputDebugStringW(L
"CKsDataTypeHandler::KsIsMediaTypeInRanges\n");
108 DataList
= (PKSMULTIPLE_ITEM
)DataRanges
;
109 DataRange
= (PKSDATARANGE
)(DataList
+ 1);
111 for(Index
= 0; Index
< DataList
->Count
; Index
++)
115 if (DataRange
->FormatSize
>= sizeof(KSDATARANGE
))
117 bMatch
= IsEqualGUID(DataRange
->MajorFormat
, GUID_NULL
);
120 if (!bMatch
&& DataRange
->FormatSize
>= sizeof(KSDATARANGE_AUDIO
))
122 bMatch
= IsEqualGUID(DataRange
->MajorFormat
, MEDIATYPE_Audio
);
127 if (IsEqualGUID(DataRange
->SubFormat
, m_Type
->subtype
) ||
128 IsEqualGUID(DataRange
->SubFormat
, GUID_NULL
))
130 if (IsEqualGUID(DataRange
->Specifier
, m_Type
->formattype
) ||
131 IsEqualGUID(DataRange
->Specifier
, GUID_NULL
))
133 if (!IsEqualGUID(m_Type
->formattype
, FORMAT_WaveFormatEx
) && !IsEqualGUID(DataRange
->Specifier
, FORMAT_WaveFormatEx
))
140 if (DataRange
->FormatSize
>= sizeof(KSDATARANGE_AUDIO
) && m_Type
->cbFormat
>= sizeof(WAVEFORMATEX
))
142 LPWAVEFORMATEX Format
= (LPWAVEFORMATEX
)m_Type
->pbFormat
;
143 PKSDATARANGE_AUDIO AudioRange
= (PKSDATARANGE_AUDIO
)DataRange
;
145 if (Format
->nSamplesPerSec
>= AudioRange
->MinimumSampleFrequency
&&
146 Format
->nSamplesPerSec
<= AudioRange
->MaximumSampleFrequency
&&
147 Format
->wBitsPerSample
>= AudioRange
->MinimumSampleFrequency
&&
148 Format
->wBitsPerSample
<= AudioRange
->MaximumBitsPerSample
&&
149 Format
->nChannels
<= AudioRange
->MaximumChannels
)
160 DataRange
= (PKSDATARANGE
)(((ULONG_PTR
)DataRange
+ DataRange
->FormatSize
+ 7) & ~7);
167 CKsDataTypeHandler::KsPrepareIoOperation(
168 IN OUT IMediaSample
*Sample
,
169 IN OUT PVOID StreamHeader
,
170 IN KSIOOPERATION IoOperation
)
177 CKsDataTypeHandler::KsQueryExtendedSize(
178 OUT ULONG
* ExtendedSize
)
180 /* no header extension required */
187 CKsDataTypeHandler::KsSetMediaType(
188 IN
const AM_MEDIA_TYPE
* AmMediaType
)
190 OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n");
194 /* media type can only be set once */
198 m_Type
= (AM_MEDIA_TYPE
*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE
));
200 return E_OUTOFMEMORY
;
202 CopyMemory(m_Type
, AmMediaType
, sizeof(AM_MEDIA_TYPE
));
204 if (m_Type
->cbFormat
)
206 m_Type
->pbFormat
= (BYTE
*)CoTaskMemAlloc(m_Type
->cbFormat
);
208 if (!m_Type
->pbFormat
)
210 CoTaskMemFree(m_Type
);
211 return E_OUTOFMEMORY
;
214 CopyMemory(m_Type
->pbFormat
, AmMediaType
->pbFormat
, m_Type
->cbFormat
);
218 m_Type
->pUnk
->AddRef();
226 CKsDataTypeHandler_Constructor (
227 IUnknown
* pUnkOuter
,
231 OutputDebugStringW(L
"CKsDataTypeHandler_Constructor\n");
232 CKsDataTypeHandler
* handler
= new CKsDataTypeHandler();
235 return E_OUTOFMEMORY
;
237 if (FAILED(handler
->QueryInterface(riid
, ppv
)))
241 return E_NOINTERFACE
;