usp10: Sinhala, while behaving like a base Indic, does not set GlyphProps based on...
[wine] / dlls / amstream / mediastream.c
1 /*
2  * Implementation of IMediaStream Interface
3  *
4  * Copyright 2005, 2008 Christian Costa
5  *
6  * This file contains the (internal) driver registration functions,
7  * driver enumeration APIs and DirectDraw creation functions.
8  *
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.
13  *
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.
18  *
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
22  */
23
24 #include "wine/debug.h"
25
26 #define COBJMACROS
27
28 #include "winbase.h"
29 #include "wingdi.h"
30
31 #include "amstream_private.h"
32 #include "amstream.h"
33
34 #include "ddstream.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(amstream);
37
38 typedef struct {
39     IDirectDrawMediaStream IDirectDrawMediaStream_iface;
40     LONG ref;
41     IMultiMediaStream* Parent;
42     MSPID PurposeId;
43     STREAM_TYPE StreamType;
44 } IDirectDrawMediaStreamImpl;
45
46 static inline IDirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface)
47 {
48     return CONTAINING_RECORD(iface, IDirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface);
49 }
50
51 static HRESULT WINAPI IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream *iface,
52         REFIID riid, void **ppv)
53 {
54     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
55
56     TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppv);
57
58     if (IsEqualGUID(riid, &IID_IUnknown) ||
59         IsEqualGUID(riid, &IID_IMediaStream) ||
60         IsEqualGUID(riid, &IID_IDirectDrawMediaStream))
61     {
62         IUnknown_AddRef(iface);
63         *ppv = This;
64         return S_OK;
65     }
66
67     ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv);
68     return E_NOINTERFACE;
69 }
70
71 static ULONG WINAPI IDirectDrawMediaStreamImpl_AddRef(IDirectDrawMediaStream *iface)
72 {
73     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
74
75     TRACE("(%p/%p)\n", iface, This);
76
77     return InterlockedIncrement(&This->ref);
78 }
79
80 static ULONG WINAPI IDirectDrawMediaStreamImpl_Release(IDirectDrawMediaStream *iface)
81 {
82     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
83     ULONG ref = InterlockedDecrement(&This->ref);
84
85     TRACE("(%p/%p)\n", iface, This);
86
87     if (!ref)
88         HeapFree(GetProcessHeap(), 0, This);
89
90     return ref;
91 }
92
93 /*** IMediaStream methods ***/
94 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetMultiMediaStream(IDirectDrawMediaStream *iface,
95         IMultiMediaStream** ppMultiMediaStream)
96 {
97     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
98
99     FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppMultiMediaStream);
100
101     return S_FALSE;
102 }
103
104 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetInformation(IDirectDrawMediaStream *iface,
105         MSPID *pPurposeId, STREAM_TYPE *pType)
106 {
107     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
108
109     TRACE("(%p/%p)->(%p,%p)\n", This, iface, pPurposeId, pType);
110
111     if (pPurposeId)
112         *pPurposeId = This->PurposeId;
113     if (pType)
114         *pType = This->StreamType;
115
116     return S_OK;
117 }
118
119 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetSameFormat(IDirectDrawMediaStream *iface,
120         IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags)
121 {
122     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
123
124     FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags);
125
126     return S_FALSE;
127 }
128
129 static HRESULT WINAPI IDirectDrawMediaStreamImpl_AllocateSample(IDirectDrawMediaStream *iface,
130         DWORD dwFlags, IStreamSample **ppSample)
131 {
132     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
133
134     FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample);
135
136     return S_FALSE;
137 }
138
139 static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSharedSample(IDirectDrawMediaStream *iface,
140         IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample)
141 {
142     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
143
144     FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample);
145
146     return S_FALSE;
147 }
148
149 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SendEndOfStream(IDirectDrawMediaStream *iface,
150         DWORD dwFlags)
151 {
152     IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
153
154     FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags);
155
156     return S_FALSE;
157 }
158
159 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream *iface,
160         DDSURFACEDESC *pDDSDCurrent, IDirectDrawPalette **ppDirectDrawPalette,
161         DDSURFACEDESC *pDDSDDesired, DWORD *pdwFlags)
162 {
163     FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, pDDSDCurrent, ppDirectDrawPalette, pDDSDDesired,
164             pdwFlags);
165
166     return E_NOTIMPL;
167
168 }
169
170 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream *iface,
171         const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette)
172 {
173     FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette);
174
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream *iface,
179         IDirectDraw **ppDirectDraw)
180 {
181     FIXME("(%p)->(%p) stub!\n", iface, ppDirectDraw);
182
183     return E_NOTIMPL;
184 }
185
186 static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream *iface,
187         IDirectDraw *pDirectDraw)
188 {
189     FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw);
190
191     return E_NOTIMPL;
192 }
193
194 static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream *iface,
195         IDirectDrawSurface *pSurface, const RECT *pRect, DWORD dwFlags,
196         IDirectDrawStreamSample **ppSample)
197 {
198     FIXME("(%p)->(%p,%p,%x,%p) stub!\n", iface, pSurface, pRect, dwFlags, ppSample);
199
200     return E_NOTIMPL;
201 }
202
203 static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream *iface,
204         STREAM_TIME *pFrameTime)
205 {
206     FIXME("(%p)->(%p) stub!\n", iface, pFrameTime);
207
208     return E_NOTIMPL;
209 }
210
211 static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl =
212 {
213     IDirectDrawMediaStreamImpl_QueryInterface,
214     IDirectDrawMediaStreamImpl_AddRef,
215     IDirectDrawMediaStreamImpl_Release,
216     IDirectDrawMediaStreamImpl_GetMultiMediaStream,
217     IDirectDrawMediaStreamImpl_GetInformation,
218     IDirectDrawMediaStreamImpl_SetSameFormat,
219     IDirectDrawMediaStreamImpl_AllocateSample,
220     IDirectDrawMediaStreamImpl_CreateSharedSample,
221     IDirectDrawMediaStreamImpl_SendEndOfStream,
222     IDirectDrawMediaStreamImpl_GetFormat,
223     IDirectDrawMediaStreamImpl_SetFormat,
224     IDirectDrawMediaStreamImpl_GetDirectDraw,
225     IDirectDrawMediaStreamImpl_SetDirectDraw,
226     IDirectDrawMediaStreamImpl_CreateSample,
227     IDirectDrawMediaStreamImpl_GetTimePerFrame
228 };
229
230 HRESULT mediastream_create(IMultiMediaStream *Parent, const MSPID *pPurposeId,
231         STREAM_TYPE StreamType, IMediaStream **ppMediaStream)
232 {
233     IDirectDrawMediaStreamImpl *object;
234
235     TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream);
236
237     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawMediaStreamImpl));
238     if (!object)
239     {
240         ERR("Out of memory\n");
241         return E_OUTOFMEMORY;
242     }
243
244     object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStream_Vtbl;
245     object->ref = 1;
246
247     object->Parent = Parent;
248     object->PurposeId = *pPurposeId;
249     object->StreamType = StreamType;
250
251     *ppMediaStream = (IMediaStream*)&object->IDirectDrawMediaStream_iface;
252
253     return S_OK;
254 }