ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

datatype.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.