2 * Implementation of IMediaStream Interface
4 * Copyright 2005, 2008 Christian Costa
6 * This file contains the (internal) driver registration functions,
7 * driver enumeration APIs and DirectDraw creation functions.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/debug.h"
31 #include "amstream_private.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(amstream
);
40 IMultiMediaStream
* Parent
;
42 STREAM_TYPE StreamType
;
46 IDirectDrawMediaStream lpVtbl
;
48 IMultiMediaStream
* Parent
;
50 STREAM_TYPE StreamType
;
51 } IDirectDrawMediaStreamImpl
;
53 static const struct IMediaStreamVtbl MediaStream_Vtbl
;
54 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl
;
56 HRESULT
MediaStream_create(IMultiMediaStream
* Parent
, const MSPID
* pPurposeId
, STREAM_TYPE StreamType
, IMediaStream
** ppMediaStream
)
58 IMediaStreamImpl
* object
;
60 TRACE("(%p,%p,%p)\n", Parent
, pPurposeId
, ppMediaStream
);
62 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IMediaStreamImpl
));
65 ERR("Out of memory\n");
69 object
->lpVtbl
.lpVtbl
= &MediaStream_Vtbl
;
72 object
->Parent
= Parent
;
73 object
->PurposeId
= *pPurposeId
;
74 object
->StreamType
= StreamType
;
76 *ppMediaStream
= (IMediaStream
*)object
;
81 /*** IUnknown methods ***/
82 static HRESULT WINAPI
IMediaStreamImpl_QueryInterface(IMediaStream
* iface
, REFIID riid
, void** ppvObject
)
84 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
86 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
88 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
89 IsEqualGUID(riid
, &IID_IMediaStream
))
91 IClassFactory_AddRef(iface
);
96 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
100 static ULONG WINAPI
IMediaStreamImpl_AddRef(IMediaStream
* iface
)
102 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
104 TRACE("(%p/%p)\n", iface
, This
);
106 return InterlockedIncrement(&This
->ref
);
109 static ULONG WINAPI
IMediaStreamImpl_Release(IMediaStream
* iface
)
111 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
112 ULONG ref
= InterlockedDecrement(&This
->ref
);
114 TRACE("(%p/%p)\n", iface
, This
);
117 HeapFree(GetProcessHeap(), 0, This
);
122 /*** IMediaStream methods ***/
123 static HRESULT WINAPI
IMediaStreamImpl_GetMultiMediaStream(IMediaStream
* iface
, IMultiMediaStream
** ppMultiMediaStream
)
125 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
127 FIXME("(%p/%p)->(%p) stub!\n", This
, iface
, ppMultiMediaStream
);
133 static HRESULT WINAPI
IMediaStreamImpl_GetInformation(IMediaStream
* iface
, MSPID
* pPurposeId
, STREAM_TYPE
* pType
)
135 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
137 TRACE("(%p/%p)->(%p,%p)\n", This
, iface
, pPurposeId
, pType
);
140 *pPurposeId
= This
->PurposeId
;
142 *pType
= This
->StreamType
;
147 static HRESULT WINAPI
IMediaStreamImpl_SetSameFormat(IMediaStream
* iface
, IMediaStream
* pStreamThatHasDesiredFormat
, DWORD dwFlags
)
149 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
151 FIXME("(%p/%p)->(%p,%x) stub!\n", This
, iface
, pStreamThatHasDesiredFormat
, dwFlags
);
156 static HRESULT WINAPI
IMediaStreamImpl_AllocateSample(IMediaStream
* iface
, DWORD dwFlags
, IStreamSample
** ppSample
)
158 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
160 FIXME("(%p/%p)->(%x,%p) stub!\n", This
, iface
, dwFlags
, ppSample
);
165 static HRESULT WINAPI
IMediaStreamImpl_CreateSharedSample(IMediaStream
* iface
, IStreamSample
* pExistingSample
, DWORD dwFlags
, IStreamSample
** ppSample
)
167 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
169 FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This
, iface
, pExistingSample
, dwFlags
, ppSample
);
174 static HRESULT WINAPI
IMediaStreamImpl_SendEndOfStream(IMediaStream
* iface
, DWORD dwFlags
)
176 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
178 FIXME("(%p/%p)->(%x) stub!\n", This
, iface
, dwFlags
);
183 static const struct IMediaStreamVtbl MediaStream_Vtbl
=
185 IMediaStreamImpl_QueryInterface
,
186 IMediaStreamImpl_AddRef
,
187 IMediaStreamImpl_Release
,
188 IMediaStreamImpl_GetMultiMediaStream
,
189 IMediaStreamImpl_GetInformation
,
190 IMediaStreamImpl_SetSameFormat
,
191 IMediaStreamImpl_AllocateSample
,
192 IMediaStreamImpl_CreateSharedSample
,
193 IMediaStreamImpl_SendEndOfStream
196 HRESULT
DirectDrawMediaStream_create(IMultiMediaStream
* Parent
, const MSPID
* pPurposeId
, STREAM_TYPE StreamType
, IMediaStream
** ppMediaStream
)
198 IDirectDrawMediaStreamImpl
* object
;
200 TRACE("(%p,%p,%p)\n", Parent
, pPurposeId
, ppMediaStream
);
202 object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IMediaStreamImpl
));
205 ERR("Out of memory\n");
206 return E_OUTOFMEMORY
;
209 object
->lpVtbl
.lpVtbl
= &DirectDrawMediaStream_Vtbl
;
212 object
->Parent
= Parent
;
213 object
->PurposeId
= *pPurposeId
;
214 object
->StreamType
= StreamType
;
216 *ppMediaStream
= (IMediaStream
*)object
;
221 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream
* iface
, REFIID riid
, void** ppvObject
)
223 IMediaStreamImpl
*This
= (IMediaStreamImpl
*)iface
;
225 TRACE("(%p/%p)->(%s,%p)\n", iface
, This
, debugstr_guid(riid
), ppvObject
);
227 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
228 IsEqualGUID(riid
, &IID_IMediaStream
) ||
229 IsEqualGUID(riid
, &IID_IDirectDrawMediaStream
))
231 IClassFactory_AddRef(iface
);
236 ERR("(%p)->(%s,%p),not found\n",This
,debugstr_guid(riid
),ppvObject
);
237 return E_NOINTERFACE
;
240 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream
* iface
, DDSURFACEDESC
*pDDSDCurrent
,
241 IDirectDrawPalette
**ppDirectDrawPalette
, DDSURFACEDESC
*pDDSDDesired
, DWORD
*pdwFlags
)
243 FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface
, pDDSDCurrent
, ppDirectDrawPalette
, pDDSDDesired
, pdwFlags
);
249 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream
* iface
, const DDSURFACEDESC
*pDDSurfaceDesc
,
250 IDirectDrawPalette
*pDirectDrawPalette
)
252 FIXME("(%p)->(%p,%p) stub!\n", iface
, pDDSurfaceDesc
, pDirectDrawPalette
);
257 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream
* iface
, IDirectDraw
**ppDirectDraw
)
259 FIXME("(%p)->(%p) stub!\n", iface
, ppDirectDraw
);
264 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream
* iface
, IDirectDraw
*pDirectDraw
)
266 FIXME("(%p)->(%p) stub!\n", iface
, pDirectDraw
);
271 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream
* iface
, IDirectDrawSurface
*pSurface
, const RECT
*pRect
,
272 DWORD dwFlags
, IDirectDrawStreamSample
**ppSample
)
274 FIXME("(%p)->(%p,%p,%x,%p) stub!\n", iface
, pSurface
, pRect
, dwFlags
, ppSample
);
279 static HRESULT WINAPI
IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream
* iface
, STREAM_TIME
*pFrameTime
)
281 FIXME("(%p)->(%p) stub!\n", iface
, pFrameTime
);
286 /* Note: Hack so we can reuse the old functions without compiler warnings */
287 #if !defined(__STRICT_ANSI__) && defined(__GNUC__)
288 # define XCAST(fun) (typeof(DirectDrawMediaStream_Vtbl.fun))
290 # define XCAST(fun) (void*)
293 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl
=
295 IDirectDrawMediaStreamImpl_QueryInterface
,
296 XCAST(AddRef
)IMediaStreamImpl_AddRef
,
297 XCAST(Release
)IMediaStreamImpl_Release
,
298 XCAST(GetMultiMediaStream
)IMediaStreamImpl_GetMultiMediaStream
,
299 XCAST(GetInformation
)IMediaStreamImpl_GetInformation
,
300 XCAST(SetSameFormat
)IMediaStreamImpl_SetSameFormat
,
301 XCAST(AllocateSample
)IMediaStreamImpl_AllocateSample
,
302 XCAST(CreateSharedSample
)IMediaStreamImpl_CreateSharedSample
,
303 XCAST(SendEndOfStream
)IMediaStreamImpl_SendEndOfStream
,
304 IDirectDrawMediaStreamImpl_GetFormat
,
305 IDirectDrawMediaStreamImpl_SetFormat
,
306 IDirectDrawMediaStreamImpl_GetDirectDraw
,
307 IDirectDrawMediaStreamImpl_SetDirectDraw
,
308 IDirectDrawMediaStreamImpl_CreateSample
,
309 IDirectDrawMediaStreamImpl_GetTimePerFrame