|  | /* | 
|  | * Implementation of MediaStream Filter | 
|  | * | 
|  | * Copyright 2008 Christian Costa | 
|  | * | 
|  | * This file contains the (internal) driver registration functions, | 
|  | * driver enumeration APIs and DirectDraw creation functions. | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
|  | */ | 
|  |  | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | #define COBJMACROS | 
|  |  | 
|  | #include "winbase.h" | 
|  | #include "wingdi.h" | 
|  |  | 
|  | #include "amstream_private.h" | 
|  | #include "amstream.h" | 
|  |  | 
|  | #include "ddstream.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(amstream); | 
|  |  | 
|  | typedef struct { | 
|  | const IMediaStreamFilterVtbl *lpVtbl; | 
|  | LONG ref; | 
|  | CRITICAL_SECTION csFilter; | 
|  | FILTER_STATE state; | 
|  | REFERENCE_TIME rtStreamStart; | 
|  | IReferenceClock * pClock; | 
|  | FILTER_INFO filterInfo; | 
|  | } IMediaStreamFilterImpl; | 
|  |  | 
|  | static const struct IMediaStreamFilterVtbl MediaStreamFilter_Vtbl; | 
|  |  | 
|  | HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj) | 
|  | { | 
|  | IMediaStreamFilterImpl* object; | 
|  |  | 
|  | TRACE("(%p,%p)\n", pUnkOuter, ppObj); | 
|  |  | 
|  | if( pUnkOuter ) | 
|  | return CLASS_E_NOAGGREGATION; | 
|  |  | 
|  | object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamFilterImpl)); | 
|  | if (!object) | 
|  | { | 
|  | ERR("Out of memory\n"); | 
|  | return E_OUTOFMEMORY; | 
|  | } | 
|  |  | 
|  | object->lpVtbl = &MediaStreamFilter_Vtbl; | 
|  | object->ref = 1; | 
|  |  | 
|  | *ppObj = object; | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | /*** IUnknown methods ***/ | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_QueryInterface(IMediaStreamFilter * iface, REFIID riid, LPVOID * ppv) | 
|  | { | 
|  | IMediaStreamFilterImpl *This = (IMediaStreamFilterImpl *)iface; | 
|  |  | 
|  | TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); | 
|  |  | 
|  | *ppv = NULL; | 
|  |  | 
|  | if (IsEqualIID(riid, &IID_IUnknown)) | 
|  | *ppv = This; | 
|  | else if (IsEqualIID(riid, &IID_IPersist)) | 
|  | *ppv = This; | 
|  | else if (IsEqualIID(riid, &IID_IMediaFilter)) | 
|  | *ppv = This; | 
|  | else if (IsEqualIID(riid, &IID_IBaseFilter)) | 
|  | *ppv = This; | 
|  | else if (IsEqualIID(riid, &IID_IMediaStreamFilter)) | 
|  | *ppv = This; | 
|  |  | 
|  | if (*ppv) | 
|  | { | 
|  | IUnknown_AddRef((IUnknown *)(*ppv)); | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI MediaStreamFilterImpl_AddRef(IMediaStreamFilter * iface) | 
|  | { | 
|  | IMediaStreamFilterImpl *This = (IMediaStreamFilterImpl *)iface; | 
|  | ULONG refCount = InterlockedIncrement(&This->ref); | 
|  |  | 
|  | TRACE("(%p)->() AddRef from %d\n", iface, refCount - 1); | 
|  |  | 
|  | return refCount; | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter * iface) | 
|  | { | 
|  | IMediaStreamFilterImpl *This = (IMediaStreamFilterImpl *)iface; | 
|  | ULONG refCount = InterlockedDecrement(&This->ref); | 
|  |  | 
|  | TRACE("(%p)->() Release from %d\n", iface, refCount + 1); | 
|  |  | 
|  | if (!refCount) | 
|  | { | 
|  | This->lpVtbl = NULL; | 
|  | HeapFree(GetProcessHeap(), 0, This); | 
|  | } | 
|  |  | 
|  | return refCount; | 
|  | } | 
|  |  | 
|  | /*** IPersist methods ***/ | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_GetClassID(IMediaStreamFilter * iface, CLSID * pClsid) | 
|  | { | 
|  | TRACE("(%p)->(%p)\n", iface, pClsid); | 
|  |  | 
|  | *pClsid = CLSID_MediaStreamFilter; | 
|  |  | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | /*** IMediaFilter methods ***/ | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_Stop(IMediaStreamFilter * iface) | 
|  | { | 
|  | FIXME("(%p)->(): Stub!\n", iface); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_Pause(IMediaStreamFilter * iface) | 
|  | { | 
|  | FIXME("(%p)->(): Stub!\n", iface); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_Run(IMediaStreamFilter * iface, REFERENCE_TIME tStart) | 
|  | { | 
|  | FIXME("(%p)->(%s): Stub!\n", iface, wine_dbgstr_longlong(tStart)); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_GetState(IMediaStreamFilter * iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState) | 
|  | { | 
|  | FIXME("(%p)->(%d,%p): Stub!\n", iface, dwMilliSecsTimeout, pState); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_SetSyncSource(IMediaStreamFilter * iface, IReferenceClock *pClock) | 
|  | { | 
|  | TRACE("(%p)->(%p): Stub!\n", iface, pClock); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_GetSyncSource(IMediaStreamFilter * iface, IReferenceClock **ppClock) | 
|  | { | 
|  | FIXME("(%p)->(%p): Stub!\n", iface, ppClock); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | /*** IBaseFilter methods ***/ | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_EnumPins(IMediaStreamFilter * iface, IEnumPins **ppEnum) | 
|  | { | 
|  | FIXME("(%p)->(%p): Stub!\n", iface, ppEnum); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_FindPin(IMediaStreamFilter * iface, LPCWSTR Id, IPin **ppPin) | 
|  | { | 
|  | FIXME("(%p)->(%s,%p): Stub!\n", iface, debugstr_w(Id), ppPin); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_QueryFilterInfo(IMediaStreamFilter * iface, FILTER_INFO *pInfo) | 
|  | { | 
|  | FIXME("(%p)->(%p): Stub!\n", iface, pInfo); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_JoinFilterGraph(IMediaStreamFilter * iface, IFilterGraph *pGraph, LPCWSTR pName) | 
|  | { | 
|  | FIXME("(%p)->(%p, %s): Stub!\n", iface, pGraph, debugstr_w(pName)); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_QueryVendorInfo(IMediaStreamFilter * iface, LPWSTR *pVendorInfo) | 
|  | { | 
|  | FIXME("(%p)->(%p): Stub!\n", iface, pVendorInfo); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | /*** IMediaStreamFilter methods ***/ | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_AddMediaStream(IMediaStreamFilter* iface, IAMMediaStream *pAMMediaStream) | 
|  | { | 
|  | FIXME("(%p)->(%p): Stub!\n", iface, pAMMediaStream); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_GetMediaStream(IMediaStreamFilter* iface, REFMSPID idPurpose, IMediaStream **ppMediaStream) | 
|  | { | 
|  | FIXME("(%p)->(%s,%p): Stub!\n", iface, debugstr_guid(idPurpose), ppMediaStream); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_EnumMediaStreams(IMediaStreamFilter* iface, LONG Index, IMediaStream **ppMediaStream) | 
|  | { | 
|  | FIXME("(%p)->(%d,%p): Stub!\n", iface, Index, ppMediaStream); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_SupportSeeking(IMediaStreamFilter* iface, BOOL bRenderer) | 
|  | { | 
|  | FIXME("(%p)->(%d): Stub!\n", iface, bRenderer); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_ReferenceTimeToStreamTime(IMediaStreamFilter* iface, REFERENCE_TIME *pTime) | 
|  | { | 
|  | FIXME("(%p)->(%p): Stub!\n", iface, pTime); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_GetCurrentStreamTime(IMediaStreamFilter* iface, REFERENCE_TIME *pCurrentStreamTime) | 
|  | { | 
|  | FIXME("(%p)->(%p): Stub!\n", iface, pCurrentStreamTime); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_WaitUntil(IMediaStreamFilter* iface, REFERENCE_TIME WaitStreamTime) | 
|  | { | 
|  | FIXME("(%p)->(%s): Stub!\n", iface, wine_dbgstr_longlong(WaitStreamTime)); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_Flush(IMediaStreamFilter* iface, BOOL bCancelEOS) | 
|  | { | 
|  | FIXME("(%p)->(%d): Stub!\n", iface, bCancelEOS); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI MediaStreamFilterImpl_EndOfStream(IMediaStreamFilter* iface) | 
|  | { | 
|  | FIXME("(%p)->(): Stub!\n",  iface); | 
|  |  | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static const IMediaStreamFilterVtbl MediaStreamFilter_Vtbl = | 
|  | { | 
|  | MediaStreamFilterImpl_QueryInterface, | 
|  | MediaStreamFilterImpl_AddRef, | 
|  | MediaStreamFilterImpl_Release, | 
|  | MediaStreamFilterImpl_GetClassID, | 
|  | MediaStreamFilterImpl_Stop, | 
|  | MediaStreamFilterImpl_Pause, | 
|  | MediaStreamFilterImpl_Run, | 
|  | MediaStreamFilterImpl_GetState, | 
|  | MediaStreamFilterImpl_SetSyncSource, | 
|  | MediaStreamFilterImpl_GetSyncSource, | 
|  | MediaStreamFilterImpl_EnumPins, | 
|  | MediaStreamFilterImpl_FindPin, | 
|  | MediaStreamFilterImpl_QueryFilterInfo, | 
|  | MediaStreamFilterImpl_JoinFilterGraph, | 
|  | MediaStreamFilterImpl_QueryVendorInfo, | 
|  | MediaStreamFilterImpl_AddMediaStream, | 
|  | MediaStreamFilterImpl_GetMediaStream, | 
|  | MediaStreamFilterImpl_EnumMediaStreams, | 
|  | MediaStreamFilterImpl_SupportSeeking, | 
|  | MediaStreamFilterImpl_ReferenceTimeToStreamTime, | 
|  | MediaStreamFilterImpl_GetCurrentStreamTime, | 
|  | MediaStreamFilterImpl_WaitUntil, | 
|  | MediaStreamFilterImpl_Flush, | 
|  | MediaStreamFilterImpl_EndOfStream | 
|  | }; |