/* * Implementation of IMediaStream Interface * * Copyright 2005, 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 { IMediaStream lpVtbl; LONG ref; IMultiMediaStream* Parent; MSPID PurposeId; STREAM_TYPE StreamType; } IMediaStreamImpl; typedef struct { IDirectDrawMediaStream lpVtbl; LONG ref; IMultiMediaStream* Parent; MSPID PurposeId; STREAM_TYPE StreamType; } IDirectDrawMediaStreamImpl; static const struct IMediaStreamVtbl MediaStream_Vtbl; static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl; HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, STREAM_TYPE StreamType, IMediaStream** ppMediaStream) { IMediaStreamImpl* object; TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl)); if (!object) { ERR("Out of memory\n"); return E_OUTOFMEMORY; } 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_IMediaStream)) { 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,%x) 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)->(%x,%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,%x,%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)->(%x) stub!\n", This, iface, dwFlags); return S_FALSE; } static const struct IMediaStreamVtbl MediaStream_Vtbl = { IMediaStreamImpl_QueryInterface, IMediaStreamImpl_AddRef, IMediaStreamImpl_Release, IMediaStreamImpl_GetMultiMediaStream, IMediaStreamImpl_GetInformation, IMediaStreamImpl_SetSameFormat, IMediaStreamImpl_AllocateSample, IMediaStreamImpl_CreateSharedSample, IMediaStreamImpl_SendEndOfStream }; HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, STREAM_TYPE StreamType, IMediaStream** ppMediaStream) { IDirectDrawMediaStreamImpl* object; TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl)); if (!object) { ERR("Out of memory\n"); return E_OUTOFMEMORY; } object->lpVtbl.lpVtbl = &DirectDrawMediaStream_Vtbl; object->ref = 1; object->Parent = Parent; object->PurposeId = *pPurposeId; object->StreamType = StreamType; *ppMediaStream = (IMediaStream*)object; return S_OK; } static HRESULT WINAPI IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream* 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_IMediaStream) || IsEqualGUID(riid, &IID_IDirectDrawMediaStream)) { IClassFactory_AddRef(iface); *ppvObject = This; return S_OK; } ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject); return E_NOINTERFACE; } static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream* iface, DDSURFACEDESC *pDDSDCurrent, IDirectDrawPalette **ppDirectDrawPalette, DDSURFACEDESC *pDDSDDesired, DWORD *pdwFlags) { FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, pDDSDCurrent, ppDirectDrawPalette, pDDSDDesired, pdwFlags); return E_NOTIMPL; } static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream* iface, const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette) { FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette); return E_NOTIMPL; } static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream* iface, IDirectDraw **ppDirectDraw) { FIXME("(%p)->(%p) stub!\n", iface, ppDirectDraw); return E_NOTIMPL; } static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream* iface, IDirectDraw *pDirectDraw) { FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw); return E_NOTIMPL; } static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream* iface, IDirectDrawSurface *pSurface, const RECT *pRect, DWORD dwFlags, IDirectDrawStreamSample **ppSample) { FIXME("(%p)->(%p,%p,%x,%p) stub!\n", iface, pSurface, pRect, dwFlags, ppSample); return E_NOTIMPL; } static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream* iface, STREAM_TIME *pFrameTime) { FIXME("(%p)->(%p) stub!\n", iface, pFrameTime); return E_NOTIMPL; } /* Note: Hack so we can reuse the old functions without compiler warnings */ #if !defined(__STRICT_ANSI__) && defined(__GNUC__) # define XCAST(fun) (typeof(DirectDrawMediaStream_Vtbl.fun)) #else # define XCAST(fun) (void*) #endif static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl = { IDirectDrawMediaStreamImpl_QueryInterface, XCAST(AddRef)IMediaStreamImpl_AddRef, XCAST(Release)IMediaStreamImpl_Release, XCAST(GetMultiMediaStream)IMediaStreamImpl_GetMultiMediaStream, XCAST(GetInformation)IMediaStreamImpl_GetInformation, XCAST(SetSameFormat)IMediaStreamImpl_SetSameFormat, XCAST(AllocateSample)IMediaStreamImpl_AllocateSample, XCAST(CreateSharedSample)IMediaStreamImpl_CreateSharedSample, XCAST(SendEndOfStream)IMediaStreamImpl_SendEndOfStream, IDirectDrawMediaStreamImpl_GetFormat, IDirectDrawMediaStreamImpl_SetFormat, IDirectDrawMediaStreamImpl_GetDirectDraw, IDirectDrawMediaStreamImpl_SetDirectDraw, IDirectDrawMediaStreamImpl_CreateSample, IDirectDrawMediaStreamImpl_GetTimePerFrame }; #undef XCAST