Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendatatype.cpp
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy 00004 * FILE: dll/directx/ksproxy/datatype.cpp 00005 * PURPOSE: IKsDataTypeHandler interface 00006 * 00007 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) 00008 */ 00009 #include "precomp.h" 00010 00011 /* FIXME guid mess */ 00012 #ifndef _MSC_VER 00013 const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; 00014 #endif 00015 const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; 00016 00017 class CKsDataTypeHandler : public IKsDataTypeHandler 00018 { 00019 public: 00020 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); 00021 00022 STDMETHODIMP_(ULONG) AddRef() 00023 { 00024 InterlockedIncrement(&m_Ref); 00025 return m_Ref; 00026 } 00027 STDMETHODIMP_(ULONG) Release() 00028 { 00029 InterlockedDecrement(&m_Ref); 00030 00031 if (!m_Ref) 00032 { 00033 delete this; 00034 return 0; 00035 } 00036 return m_Ref; 00037 } 00038 00039 HRESULT STDMETHODCALLTYPE KsCompleteIoOperation(IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation, IN BOOL Cancelled); 00040 HRESULT STDMETHODCALLTYPE KsIsMediaTypeInRanges(IN PVOID DataRanges); 00041 HRESULT STDMETHODCALLTYPE KsPrepareIoOperation(IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation); 00042 HRESULT STDMETHODCALLTYPE KsQueryExtendedSize(OUT ULONG* ExtendedSize); 00043 HRESULT STDMETHODCALLTYPE KsSetMediaType(IN const AM_MEDIA_TYPE* AmMediaType); 00044 00045 CKsDataTypeHandler() : m_Ref(0), m_Type(0){}; 00046 virtual ~CKsDataTypeHandler() 00047 { 00048 if (m_Type) 00049 { 00050 if (m_Type->pbFormat) 00051 CoTaskMemFree(m_Type->pbFormat); 00052 00053 if (m_Type->pUnk) 00054 m_Type->pUnk->Release(); 00055 00056 CoTaskMemFree(m_Type); 00057 } 00058 00059 }; 00060 00061 protected: 00062 LONG m_Ref; 00063 AM_MEDIA_TYPE * m_Type; 00064 }; 00065 00066 00067 HRESULT 00068 STDMETHODCALLTYPE 00069 CKsDataTypeHandler::QueryInterface( 00070 IN REFIID refiid, 00071 OUT PVOID* Output) 00072 { 00073 if (IsEqualGUID(refiid, IID_IUnknown) || 00074 IsEqualGUID(refiid, IID_IKsDataTypeHandler)) 00075 { 00076 *Output = PVOID(this); 00077 reinterpret_cast<IUnknown*>(*Output)->AddRef(); 00078 return NOERROR; 00079 } 00080 return E_NOINTERFACE; 00081 } 00082 00083 00084 HRESULT 00085 STDMETHODCALLTYPE 00086 CKsDataTypeHandler::KsCompleteIoOperation( 00087 IN OUT IMediaSample *Sample, 00088 IN OUT PVOID StreamHeader, 00089 IN KSIOOPERATION IoOperation, 00090 IN BOOL Cancelled) 00091 { 00092 return NOERROR; 00093 } 00094 00095 00096 HRESULT 00097 STDMETHODCALLTYPE 00098 CKsDataTypeHandler::KsIsMediaTypeInRanges( 00099 IN PVOID DataRanges) 00100 { 00101 PKSMULTIPLE_ITEM DataList; 00102 PKSDATARANGE DataRange; 00103 ULONG Index; 00104 //HRESULT hr = S_FALSE; 00105 00106 #ifdef KSPROXY_TRACE 00107 OutputDebugStringW(L"CKsDataTypeHandler::KsIsMediaTypeInRanges\n"); 00108 #endif 00109 00110 DataList = (PKSMULTIPLE_ITEM)DataRanges; 00111 DataRange = (PKSDATARANGE)(DataList + 1); 00112 00113 for(Index = 0; Index < DataList->Count; Index++) 00114 { 00115 BOOL bMatch = FALSE; 00116 00117 if (DataRange->FormatSize >= sizeof(KSDATARANGE)) 00118 { 00119 bMatch = IsEqualGUID(DataRange->MajorFormat, GUID_NULL); 00120 } 00121 00122 if (!bMatch && DataRange->FormatSize >= sizeof(KSDATARANGE_AUDIO)) 00123 { 00124 bMatch = IsEqualGUID(DataRange->MajorFormat, MEDIATYPE_Audio); 00125 } 00126 00127 if (bMatch) 00128 { 00129 if (IsEqualGUID(DataRange->SubFormat, m_Type->subtype) || 00130 IsEqualGUID(DataRange->SubFormat, GUID_NULL)) 00131 { 00132 if (IsEqualGUID(DataRange->Specifier, m_Type->formattype) || 00133 IsEqualGUID(DataRange->Specifier, GUID_NULL)) 00134 { 00135 if (!IsEqualGUID(m_Type->formattype, FORMAT_WaveFormatEx) && !IsEqualGUID(DataRange->Specifier, FORMAT_WaveFormatEx)) 00136 { 00137 //found match 00138 //hr = S_OK; 00139 break; 00140 } 00141 00142 if (DataRange->FormatSize >= sizeof(KSDATARANGE_AUDIO) && m_Type->cbFormat >= sizeof(WAVEFORMATEX)) 00143 { 00144 LPWAVEFORMATEX Format = (LPWAVEFORMATEX)m_Type->pbFormat; 00145 PKSDATARANGE_AUDIO AudioRange = (PKSDATARANGE_AUDIO)DataRange; 00146 00147 if (Format->nSamplesPerSec >= AudioRange->MinimumSampleFrequency && 00148 Format->nSamplesPerSec <= AudioRange->MaximumSampleFrequency && 00149 Format->wBitsPerSample >= AudioRange->MinimumSampleFrequency && 00150 Format->wBitsPerSample <= AudioRange->MaximumBitsPerSample && 00151 Format->nChannels <= AudioRange->MaximumChannels) 00152 { 00153 // found match 00154 //hr = S_OK; 00155 break; 00156 } 00157 } 00158 } 00159 } 00160 } 00161 00162 DataRange = (PKSDATARANGE)(((ULONG_PTR)DataRange + DataRange->FormatSize + 7) & ~7); 00163 } 00164 return S_OK; 00165 } 00166 00167 HRESULT 00168 STDMETHODCALLTYPE 00169 CKsDataTypeHandler::KsPrepareIoOperation( 00170 IN OUT IMediaSample *Sample, 00171 IN OUT PVOID StreamHeader, 00172 IN KSIOOPERATION IoOperation) 00173 { 00174 return NOERROR; 00175 } 00176 00177 HRESULT 00178 STDMETHODCALLTYPE 00179 CKsDataTypeHandler::KsQueryExtendedSize( 00180 OUT ULONG* ExtendedSize) 00181 { 00182 /* no header extension required */ 00183 *ExtendedSize = 0; 00184 return NOERROR; 00185 } 00186 00187 HRESULT 00188 STDMETHODCALLTYPE 00189 CKsDataTypeHandler::KsSetMediaType( 00190 IN const AM_MEDIA_TYPE* AmMediaType) 00191 { 00192 #ifdef KSPROXY_TRACE 00193 OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n"); 00194 #endif 00195 00196 if (m_Type) 00197 { 00198 /* media type can only be set once */ 00199 return E_FAIL; 00200 } 00201 00202 m_Type = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); 00203 if (!m_Type) 00204 return E_OUTOFMEMORY; 00205 00206 CopyMemory(m_Type, AmMediaType, sizeof(AM_MEDIA_TYPE)); 00207 00208 if (m_Type->cbFormat) 00209 { 00210 m_Type->pbFormat = (BYTE*)CoTaskMemAlloc(m_Type->cbFormat); 00211 00212 if (!m_Type->pbFormat) 00213 { 00214 CoTaskMemFree(m_Type); 00215 return E_OUTOFMEMORY; 00216 } 00217 00218 CopyMemory(m_Type->pbFormat, AmMediaType->pbFormat, m_Type->cbFormat); 00219 } 00220 00221 if (m_Type->pUnk) 00222 m_Type->pUnk->AddRef(); 00223 00224 00225 return S_OK; 00226 } 00227 00228 HRESULT 00229 WINAPI 00230 CKsDataTypeHandler_Constructor ( 00231 IUnknown * pUnkOuter, 00232 REFIID riid, 00233 LPVOID * ppv) 00234 { 00235 #ifdef KSPROXY_TRACE 00236 OutputDebugStringW(L"CKsDataTypeHandler_Constructor\n"); 00237 #endif 00238 00239 CKsDataTypeHandler * handler = new CKsDataTypeHandler(); 00240 00241 if (!handler) 00242 return E_OUTOFMEMORY; 00243 00244 if (FAILED(handler->QueryInterface(riid, ppv))) 00245 { 00246 /* not supported */ 00247 delete handler; 00248 return E_NOINTERFACE; 00249 } 00250 00251 return NOERROR; 00252 } Generated on Fri May 25 2012 04:19:42 for ReactOS by
1.7.6.1
|