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

amstream.c
Go to the documentation of this file.
00001 /*
00002  * Implementation of IAMMultiMediaStream Interface
00003  *
00004  * Copyright 2004 Christian Costa
00005  * Copyright 2006 Ivan Leo Puoti
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00020  */
00021 
00022 #include "wine/debug.h"
00023 
00024 #define COBJMACROS
00025 
00026 #include "winbase.h"
00027 #include "wingdi.h"
00028 
00029 #include "amstream_private.h"
00030 #include "amstream.h"
00031 
00032 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
00033 
00034 typedef struct {
00035     IAMMultiMediaStream IAMMultiMediaStream_iface;
00036     LONG ref;
00037     IGraphBuilder* pFilterGraph;
00038     IPin* ipin;
00039     IGraphBuilder* GraphBuilder;
00040     ULONG nbStreams;
00041     IMediaStream** pStreams;
00042     STREAM_TYPE StreamType;
00043 } IAMMultiMediaStreamImpl;
00044 
00045 static inline IAMMultiMediaStreamImpl *impl_from_IAMMultiMediaStream(IAMMultiMediaStream *iface)
00046 {
00047     return CONTAINING_RECORD(iface, IAMMultiMediaStreamImpl, IAMMultiMediaStream_iface);
00048 }
00049 
00050 static const struct IAMMultiMediaStreamVtbl AM_Vtbl;
00051 
00052 HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj)
00053 {
00054     IAMMultiMediaStreamImpl* object; 
00055 
00056     TRACE("(%p,%p)\n", pUnkOuter, ppObj);
00057 
00058     if( pUnkOuter )
00059         return CLASS_E_NOAGGREGATION;
00060 
00061     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAMMultiMediaStreamImpl));
00062     if (!object)
00063     {
00064         ERR("Out of memory\n");
00065         return E_OUTOFMEMORY;
00066     }
00067 
00068     object->IAMMultiMediaStream_iface.lpVtbl = &AM_Vtbl;
00069     object->ref = 1;
00070 
00071     *ppObj = object;
00072 
00073     return S_OK;
00074 }
00075 
00076 /*** IUnknown methods ***/
00077 static HRESULT WINAPI IAMMultiMediaStreamImpl_QueryInterface(IAMMultiMediaStream* iface, REFIID riid, void** ppvObject)
00078 {
00079     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00080 
00081     TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
00082 
00083     if (IsEqualGUID(riid, &IID_IUnknown) ||
00084         IsEqualGUID(riid, &IID_IMultiMediaStream) ||
00085         IsEqualGUID(riid, &IID_IAMMultiMediaStream))
00086     {
00087         IUnknown_AddRef(iface);
00088         *ppvObject = This;
00089         return S_OK;
00090     }
00091 
00092     ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
00093 
00094     return E_NOINTERFACE;
00095 }
00096 
00097 static ULONG WINAPI IAMMultiMediaStreamImpl_AddRef(IAMMultiMediaStream* iface)
00098 {
00099     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00100 
00101     TRACE("(%p/%p)\n", iface, This);
00102 
00103     return InterlockedIncrement(&This->ref);
00104 }
00105 
00106 static ULONG WINAPI IAMMultiMediaStreamImpl_Release(IAMMultiMediaStream* iface)
00107 {
00108     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00109     ULONG ref = InterlockedDecrement(&This->ref);
00110 
00111     TRACE("(%p/%p)\n", iface, This);
00112 
00113     if (!ref)
00114         HeapFree(GetProcessHeap(), 0, This);
00115 
00116     return ref;
00117 }
00118 
00119 /*** IMultiMediaStream methods ***/
00120 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetInformation(IAMMultiMediaStream* iface, DWORD* pdwFlags, STREAM_TYPE* pStreamType)
00121 {
00122     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00123 
00124     FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pdwFlags, pStreamType);
00125 
00126     return E_NOTIMPL;
00127 }
00128 
00129 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetMediaStream(IAMMultiMediaStream* iface, REFMSPID idPurpose, IMediaStream** ppMediaStream)
00130 {
00131     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00132     MSPID PurposeId;
00133     unsigned int i;
00134 
00135     TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(idPurpose), ppMediaStream);
00136 
00137     for (i = 0; i < This->nbStreams; i++)
00138     {
00139         IMediaStream_GetInformation(This->pStreams[i], &PurposeId, NULL);
00140         if (IsEqualIID(&PurposeId, idPurpose))
00141         {
00142             *ppMediaStream = This->pStreams[i];
00143             IMediaStream_AddRef(*ppMediaStream);
00144             return S_OK;
00145         }
00146     }
00147 
00148     return MS_E_NOSTREAM;
00149 }
00150 
00151 static HRESULT WINAPI IAMMultiMediaStreamImpl_EnumMediaStreams(IAMMultiMediaStream* iface, LONG Index, IMediaStream** ppMediaStream)
00152 {
00153     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00154 
00155     FIXME("(%p/%p)->(%d,%p) stub!\n", This, iface, Index, ppMediaStream);
00156 
00157     return E_NOTIMPL;
00158 }
00159 
00160 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetState(IAMMultiMediaStream* iface, STREAM_STATE* pCurrentState)
00161 {
00162     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00163 
00164     FIXME("(%p/%p)->(%p) stub!\n", This, iface, pCurrentState);
00165 
00166     return E_NOTIMPL;
00167 }
00168 
00169 static HRESULT WINAPI IAMMultiMediaStreamImpl_SetState(IAMMultiMediaStream* iface, STREAM_STATE NewState)
00170 {
00171     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00172 
00173     FIXME("(%p/%p)->() stub!\n", This, iface);
00174 
00175     return E_NOTIMPL;
00176 }
00177 
00178 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetTime(IAMMultiMediaStream* iface, STREAM_TIME* pCurrentTime)
00179 {
00180     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00181 
00182     FIXME("(%p/%p)->(%p) stub!\n", This, iface, pCurrentTime);
00183 
00184     return E_NOTIMPL;
00185 }
00186 
00187 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetDuration(IAMMultiMediaStream* iface, STREAM_TIME* pDuration)
00188 {
00189     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00190 
00191     FIXME("(%p/%p)->(%p) stub!\n", This, iface, pDuration);
00192 
00193     return E_NOTIMPL;
00194 }
00195 
00196 static HRESULT WINAPI IAMMultiMediaStreamImpl_Seek(IAMMultiMediaStream* iface, STREAM_TIME SeekTime)
00197 {
00198     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00199 
00200     FIXME("(%p/%p)->() stub!\n", This, iface);
00201 
00202     return E_NOTIMPL;
00203 }
00204 
00205 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetEndOfStream(IAMMultiMediaStream* iface, HANDLE* phEOS)
00206 {
00207     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00208 
00209     FIXME("(%p/%p)->(%p) stub!\n", This, iface, phEOS);
00210 
00211     return E_NOTIMPL;
00212 }
00213 
00214 /*** IAMMultiMediaStream methods ***/
00215 static HRESULT WINAPI IAMMultiMediaStreamImpl_Initialize(IAMMultiMediaStream* iface, STREAM_TYPE StreamType, DWORD dwFlags, IGraphBuilder* pFilterGraph)
00216 {
00217     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00218     HRESULT hr = S_OK;
00219 
00220     TRACE("(%p/%p)->(%x,%x,%p)\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph);
00221 
00222     if (pFilterGraph)
00223     {
00224         This->pFilterGraph = pFilterGraph;
00225         IGraphBuilder_AddRef(This->pFilterGraph);
00226     }
00227     else
00228     {
00229         hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (LPVOID*)&This->pFilterGraph);
00230     }
00231 
00232     if (SUCCEEDED(hr))
00233     {
00234         This->StreamType = StreamType;
00235     }
00236 
00237     return hr;
00238 }
00239 
00240 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilterGraph(IAMMultiMediaStream* iface, IGraphBuilder** ppGraphBuilder)
00241 {
00242     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00243 
00244     TRACE("(%p/%p)->(%p)\n", This, iface, ppGraphBuilder);
00245 
00246     if (!ppGraphBuilder)
00247         return E_POINTER;
00248 
00249     if (This->pFilterGraph)
00250         return IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)ppGraphBuilder);
00251     else
00252         *ppGraphBuilder = NULL;
00253 
00254     return S_OK;
00255 }
00256 
00257 static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilter(IAMMultiMediaStream* iface, IMediaStreamFilter** ppFilter)
00258 {
00259     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00260 
00261     FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppFilter); 
00262 
00263     return E_NOTIMPL;
00264 }
00265 
00266 static HRESULT WINAPI IAMMultiMediaStreamImpl_AddMediaStream(IAMMultiMediaStream* iface, IUnknown* pStreamObject, const MSPID* PurposeId,
00267                                           DWORD dwFlags, IMediaStream** ppNewStream)
00268 {
00269     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00270     HRESULT hr;
00271     IMediaStream* pStream;
00272     IMediaStream** pNewStreams;
00273 
00274     FIXME("(%p/%p)->(%p,%s,%x,%p) partial stub!\n", This, iface, pStreamObject, debugstr_guid(PurposeId), dwFlags, ppNewStream);
00275 
00276     hr = mediastream_create((IMultiMediaStream*)iface, PurposeId, This->StreamType, &pStream);
00277     if (SUCCEEDED(hr))
00278     {
00279         pNewStreams = CoTaskMemRealloc(This->pStreams, (This->nbStreams+1) * sizeof(IMediaStream*));
00280         if (!pNewStreams)
00281         {
00282             IMediaStream_Release(pStream);
00283             return E_OUTOFMEMORY;
00284         }
00285         This->pStreams = pNewStreams;
00286         This->pStreams[This->nbStreams] = pStream;
00287         This->nbStreams++;
00288 
00289         if (ppNewStream)
00290             *ppNewStream = pStream;
00291     }
00292 
00293     return hr;
00294 }
00295 
00296 static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenFile(IAMMultiMediaStream* iface, LPCWSTR pszFileName, DWORD dwFlags)
00297 {
00298     HRESULT ret;
00299     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00300     IFileSourceFilter *SourceFilter;
00301     IBaseFilter *BaseFilter;
00302     IEnumPins *EnumPins;
00303     IPin *ipin;
00304     PIN_DIRECTION pin_direction;
00305 
00306     TRACE("(%p/%p)->(%s,%x)\n", This, iface, debugstr_w(pszFileName), dwFlags);
00307 
00308     ret = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IFileSourceFilter, (void**)&SourceFilter);
00309     if(ret != S_OK)
00310         return ret;
00311 
00312     ret = IFileSourceFilter_Load(SourceFilter, pszFileName, NULL);
00313     if(ret != S_OK)
00314     {
00315         IFileSourceFilter_Release(SourceFilter);
00316         return ret;
00317     }
00318 
00319     ret = IFileSourceFilter_QueryInterface(SourceFilter, &IID_IBaseFilter, (void**)&BaseFilter);
00320     if(ret != S_OK)
00321     {
00322         IFileSourceFilter_Release(SourceFilter);
00323         return ret;
00324     }
00325 
00326     ret = IBaseFilter_EnumPins(BaseFilter, &EnumPins);
00327     if(ret != S_OK)
00328     {
00329         goto end;
00330     }
00331 
00332     ret = IEnumPins_Next(EnumPins, 1, &ipin, NULL);
00333     if(ret == S_OK)
00334     {
00335         ret = IPin_QueryDirection(ipin, &pin_direction);
00336         IEnumPins_Release(EnumPins);
00337         if(ret == S_OK && pin_direction == PINDIR_OUTPUT)
00338             This->ipin = ipin;
00339         else
00340             goto end;
00341     }
00342     else
00343     {
00344         IEnumPins_Release(EnumPins);
00345         goto end;
00346     }
00347 
00348     /* If Initialize was not called before, we do it here */
00349     if (!This->pFilterGraph)
00350     {
00351         ret = IAMMultiMediaStream_Initialize(iface, STREAMTYPE_READ, 0, NULL);
00352         if (FAILED(ret))
00353             goto end;
00354     }
00355 
00356     ret = IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)&This->GraphBuilder);
00357     if(ret != S_OK)
00358     {
00359         goto end;
00360     }
00361 
00362     ret = IGraphBuilder_AddSourceFilter(This->GraphBuilder, pszFileName, pszFileName, &BaseFilter);
00363 
00364 end:
00365     IBaseFilter_Release(BaseFilter);
00366     IFileSourceFilter_Release(SourceFilter);
00367     return ret;
00368 }
00369 
00370 static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenMoniker(IAMMultiMediaStream* iface, IBindCtx* pCtx, IMoniker* pMoniker, DWORD dwFlags)
00371 {
00372     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00373 
00374     FIXME("(%p/%p)->(%p,%p,%x) stub!\n", This, iface, pCtx, pMoniker, dwFlags);
00375 
00376     return E_NOTIMPL;
00377 }
00378 
00379 static HRESULT WINAPI IAMMultiMediaStreamImpl_Render(IAMMultiMediaStream* iface, DWORD dwFlags)
00380 {
00381     IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface);
00382 
00383     FIXME("(%p/%p)->(%x) partial stub!\n", This, iface, dwFlags);
00384 
00385     if(dwFlags != AMMSF_NOCLOCK)
00386         return E_INVALIDARG;
00387 
00388     return IGraphBuilder_Render(This->GraphBuilder, This->ipin);
00389 }
00390 
00391 static const IAMMultiMediaStreamVtbl AM_Vtbl =
00392 {
00393     IAMMultiMediaStreamImpl_QueryInterface,
00394     IAMMultiMediaStreamImpl_AddRef,
00395     IAMMultiMediaStreamImpl_Release,
00396     IAMMultiMediaStreamImpl_GetInformation,
00397     IAMMultiMediaStreamImpl_GetMediaStream,
00398     IAMMultiMediaStreamImpl_EnumMediaStreams,
00399     IAMMultiMediaStreamImpl_GetState,
00400     IAMMultiMediaStreamImpl_SetState,
00401     IAMMultiMediaStreamImpl_GetTime,
00402     IAMMultiMediaStreamImpl_GetDuration,
00403     IAMMultiMediaStreamImpl_Seek,
00404     IAMMultiMediaStreamImpl_GetEndOfStream,
00405     IAMMultiMediaStreamImpl_Initialize,
00406     IAMMultiMediaStreamImpl_GetFilterGraph,
00407     IAMMultiMediaStreamImpl_GetFilter,
00408     IAMMultiMediaStreamImpl_AddMediaStream,
00409     IAMMultiMediaStreamImpl_OpenFile,
00410     IAMMultiMediaStreamImpl_OpenMoniker,
00411     IAMMultiMediaStreamImpl_Render
00412 };

Generated on Fri May 25 2012 04:19:08 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.