Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenamstream.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
1.7.6.1
|