Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy * FILE: dll/directx/ksproxy/datatype.cpp * PURPOSE: IKsDataTypeHandler interface * * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org) */#include "precomp.h"
/* FIXME guid mess */const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
class CKsDataTypeHandler : public IKsDataTypeHandler{public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
STDMETHODIMP_(ULONG) AddRef() { InterlockedIncrement(&m_Ref); return m_Ref; } STDMETHODIMP_(ULONG) Release() { InterlockedDecrement(&m_Ref);
if (!m_Ref) { delete this; return 0; } return m_Ref; }
HRESULT STDMETHODCALLTYPE KsCompleteIoOperation(IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation, IN BOOL Cancelled); HRESULT STDMETHODCALLTYPE KsIsMediaTypeInRanges(IN PVOID DataRanges); HRESULT STDMETHODCALLTYPE KsPrepareIoOperation(IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation); HRESULT STDMETHODCALLTYPE KsQueryExtendedSize(OUT ULONG* ExtendedSize); HRESULT STDMETHODCALLTYPE KsSetMediaType(IN const AM_MEDIA_TYPE* AmMediaType);
CKsDataTypeHandler() : m_Ref(0), m_Type(0){}; virtual ~CKsDataTypeHandler() { if (m_Type) { if (m_Type->pbFormat) CoTaskMemFree(m_Type->pbFormat);
if (m_Type->pUnk) m_Type->pUnk->Release();
CoTaskMemFree(m_Type); }
};
protected: LONG m_Ref; AM_MEDIA_TYPE * m_Type;};
HRESULTSTDMETHODCALLTYPECKsDataTypeHandler::QueryInterface( IN REFIID refiid, OUT PVOID* Output){ if (IsEqualGUID(refiid, IID_IUnknown) || IsEqualGUID(refiid, IID_IKsDataTypeHandler)) { *Output = PVOID(this); reinterpret_cast<IUnknown*>(*Output)->AddRef(); return NOERROR; } return E_NOINTERFACE;}
HRESULTSTDMETHODCALLTYPECKsDataTypeHandler::KsCompleteIoOperation( IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation, IN BOOL Cancelled){ return NOERROR;}
HRESULTSTDMETHODCALLTYPECKsDataTypeHandler::KsIsMediaTypeInRanges( IN PVOID DataRanges){ PKSMULTIPLE_ITEM DataList; PKSDATARANGE DataRange; ULONG Index; //HRESULT hr = S_FALSE;
#ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsDataTypeHandler::KsIsMediaTypeInRanges\n");#endif
DataList = (PKSMULTIPLE_ITEM)DataRanges; DataRange = (PKSDATARANGE)(DataList + 1);
for(Index = 0; Index < DataList->Count; Index++) { BOOL bMatch = FALSE;
if (DataRange->FormatSize >= sizeof(KSDATARANGE)) { bMatch = IsEqualGUID(DataRange->MajorFormat, GUID_NULL); }
if (!bMatch && DataRange->FormatSize >= sizeof(KSDATARANGE_AUDIO)) { bMatch = IsEqualGUID(DataRange->MajorFormat, MEDIATYPE_Audio); }
if (bMatch) { if (IsEqualGUID(DataRange->SubFormat, m_Type->subtype) || IsEqualGUID(DataRange->SubFormat, GUID_NULL)) { if (IsEqualGUID(DataRange->Specifier, m_Type->formattype) || IsEqualGUID(DataRange->Specifier, GUID_NULL)) { if (!IsEqualGUID(m_Type->formattype, FORMAT_WaveFormatEx) && !IsEqualGUID(DataRange->Specifier, FORMAT_WaveFormatEx)) { //found match //hr = S_OK; break; }
if (DataRange->FormatSize >= sizeof(KSDATARANGE_AUDIO) && m_Type->cbFormat >= sizeof(WAVEFORMATEX)) { LPWAVEFORMATEX Format = (LPWAVEFORMATEX)m_Type->pbFormat; PKSDATARANGE_AUDIO AudioRange = (PKSDATARANGE_AUDIO)DataRange;
if (Format->nSamplesPerSec >= AudioRange->MinimumSampleFrequency && Format->nSamplesPerSec <= AudioRange->MaximumSampleFrequency && Format->wBitsPerSample >= AudioRange->MinimumSampleFrequency && Format->wBitsPerSample <= AudioRange->MaximumBitsPerSample && Format->nChannels <= AudioRange->MaximumChannels) { // found match //hr = S_OK; break; } } } } }
DataRange = (PKSDATARANGE)(((ULONG_PTR)DataRange + DataRange->FormatSize + 7) & ~7); } return S_OK;}
HRESULTSTDMETHODCALLTYPECKsDataTypeHandler::KsPrepareIoOperation( IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation){ return NOERROR;}
HRESULTSTDMETHODCALLTYPECKsDataTypeHandler::KsQueryExtendedSize( OUT ULONG* ExtendedSize){ /* no header extension required */ *ExtendedSize = 0; return NOERROR;}
HRESULTSTDMETHODCALLTYPECKsDataTypeHandler::KsSetMediaType( IN const AM_MEDIA_TYPE* AmMediaType){#ifdef KSPROXY_TRACE OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n");#endif
if (m_Type) { /* media type can only be set once */ return E_FAIL; }
m_Type = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); if (!m_Type) return E_OUTOFMEMORY;
CopyMemory(m_Type, AmMediaType, sizeof(AM_MEDIA_TYPE));
if (m_Type->cbFormat) { m_Type->pbFormat = (BYTE*)CoTaskMemAlloc(m_Type->cbFormat);
if (!m_Type->pbFormat) { CoTaskMemFree(m_Type); return E_OUTOFMEMORY; }
CopyMemory(m_Type->pbFormat, AmMediaType->pbFormat, m_Type->cbFormat); }
if (m_Type->pUnk) m_Type->pUnk->AddRef();
return S_OK;}
HRESULTWINAPICKsDataTypeHandler_Constructor ( IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv){#ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsDataTypeHandler_Constructor\n");#endif
CKsDataTypeHandler * handler = new CKsDataTypeHandler();
if (!handler) return E_OUTOFMEMORY;
if (FAILED(handler->QueryInterface(riid, ppv))) { /* not supported */ delete handler; return E_NOINTERFACE; }
return NOERROR;}