/* * Implementation of IMediaStream Interface * * Copyright 2005 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 "config.h" #include "wine/debug.h" #define COBJMACROS #include "winbase.h" #include "wingdi.h" #include "amstream_private.h" #include "amstream.h" WINE_DEFAULT_DEBUG_CHANNEL(amstream); typedef struct { IMediaStream lpVtbl; LONG ref; IMultiMediaStream* Parent; MSPID PurposeId; STREAM_TYPE StreamType; } IMediaStreamImpl; static struct IMediaStreamVtbl MediaStream_Vtbl; HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, STREAM_TYPE StreamType, IMediaStream** ppMediaStream) { IMediaStreamImpl* object; TRACE("(%p,%p,%p)\n", Parent, pPurposeId, ppMediaStream); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl)); object->lpVtbl.lpVtbl = &MediaStream_Vtbl; object->ref = 1; object->Parent = Parent; object->PurposeId = *pPurposeId; object->StreamType = StreamType; *ppMediaStream = (IMediaStream*)object; return S_OK; } /*** IUnknown methods ***/ static HRESULT WINAPI IMediaStreamImpl_QueryInterface(IMediaStream* iface, REFIID riid, void** ppvObject) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IAMMultiMediaStream)) { IClassFactory_AddRef(iface); *ppvObject = This; return S_OK; } ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject); return E_NOINTERFACE; } static ULONG WINAPI IMediaStreamImpl_AddRef(IMediaStream* iface) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; TRACE("(%p/%p)\n", iface, This); return InterlockedIncrement(&This->ref); } static ULONG WINAPI IMediaStreamImpl_Release(IMediaStream* iface) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p/%p)\n", iface, This); if (!ref) HeapFree(GetProcessHeap(), 0, This); return ref; } /*** IMediaStream methods ***/ static HRESULT WINAPI IMediaStreamImpl_GetMultiMediaStream(IMediaStream* iface, IMultiMediaStream** ppMultiMediaStream) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppMultiMediaStream); return S_FALSE; } static HRESULT WINAPI IMediaStreamImpl_GetInformation(IMediaStream* iface, MSPID* pPurposeId, STREAM_TYPE* pType) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; TRACE("(%p/%p)->(%p,%p)\n", This, iface, pPurposeId, pType); if (pPurposeId) *pPurposeId = This->PurposeId; if (pType) *pType = This->StreamType; return S_OK; } static HRESULT WINAPI IMediaStreamImpl_SetSameFormat(IMediaStream* iface, IMediaStream* pStreamThatHasDesiredFormat, DWORD dwFlags) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; FIXME("(%p/%p)->(%p,%lx) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags); return S_FALSE; } static HRESULT WINAPI IMediaStreamImpl_AllocateSample(IMediaStream* iface, DWORD dwFlags, IStreamSample** ppSample) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; FIXME("(%p/%p)->(%lx,%p) stub!\n", This, iface, dwFlags, ppSample); return S_FALSE; } static HRESULT WINAPI IMediaStreamImpl_CreateSharedSample(IMediaStream* iface, IStreamSample* pExistingSample, DWORD dwFlags, IStreamSample** ppSample) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; FIXME("(%p/%p)->(%p,%lx,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample); return S_FALSE; } static HRESULT WINAPI IMediaStreamImpl_SendEndOfStream(IMediaStream* iface, DWORD dwFlags) { IMediaStreamImpl *This = (IMediaStreamImpl *)iface; FIXME("(%p/%p)->(%lx) stub!\n", This, iface, dwFlags); return S_FALSE; } static IMediaStreamVtbl MediaStream_Vtbl = { IMediaStreamImpl_QueryInterface, IMediaStreamImpl_AddRef, IMediaStreamImpl_Release, IMediaStreamImpl_GetMultiMediaStream, IMediaStreamImpl_GetInformation, IMediaStreamImpl_SetSameFormat, IMediaStreamImpl_AllocateSample, IMediaStreamImpl_CreateSharedSample, IMediaStreamImpl_SendEndOfStream };