amstream: Use 'Source' filter name for file source filter as in native.
[wine] / dlls / amstream / mediastreamfilter.c
1 /*
2  * Implementation of MediaStream Filter
3  *
4  * Copyright 2008 Christian Costa
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "wine/debug.h"
22
23 #define COBJMACROS
24
25 #include "winbase.h"
26 #include "wingdi.h"
27 #include "dshow.h"
28
29 #include "wine/strmbase.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     BaseFilter filter;
40
41 } IMediaStreamFilterImpl;
42
43 static inline IMediaStreamFilterImpl *impl_from_IMediaStreamFilter(IMediaStreamFilter *iface)
44 {
45     return CONTAINING_RECORD(iface, IMediaStreamFilterImpl, filter);
46 }
47
48 /*** IUnknown methods ***/
49
50 static HRESULT WINAPI MediaStreamFilterImpl_QueryInterface(IMediaStreamFilter *iface, REFIID riid,
51         void **ppv)
52 {
53     IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface);
54
55     TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
56
57     *ppv = NULL;
58
59     if (IsEqualIID(riid, &IID_IUnknown))
60         *ppv = This;
61     else if (IsEqualIID(riid, &IID_IPersist))
62         *ppv = This;
63     else if (IsEqualIID(riid, &IID_IMediaFilter))
64         *ppv = This;
65     else if (IsEqualIID(riid, &IID_IBaseFilter))
66         *ppv = This;
67     else if (IsEqualIID(riid, &IID_IMediaStreamFilter))
68         *ppv = This;
69
70     if (*ppv)
71     {
72         IUnknown_AddRef((IUnknown *)(*ppv));
73         return S_OK;
74     }
75
76     return E_NOINTERFACE;
77 }
78
79 static ULONG WINAPI MediaStreamFilterImpl_AddRef(IMediaStreamFilter *iface)
80 {
81     return BaseFilterImpl_AddRef((IBaseFilter*)iface);
82 }
83
84 static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter *iface)
85 {
86     IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface);
87     ULONG refCount = BaseFilterImpl_Release((IBaseFilter*)iface);
88
89     TRACE("(%p)->() Release from %d\n", iface, refCount + 1);
90
91     if (!refCount)
92         HeapFree(GetProcessHeap(), 0, This);
93
94     return refCount;
95 }
96
97 /*** IPersist methods ***/
98
99 static HRESULT WINAPI MediaStreamFilterImpl_GetClassID(IMediaStreamFilter * iface, CLSID * pClsid)
100 {
101     return BaseFilterImpl_GetClassID((IBaseFilter*)iface, pClsid);
102 }
103
104 /*** IBaseFilter methods ***/
105
106 static HRESULT WINAPI MediaStreamFilterImpl_Stop(IMediaStreamFilter * iface)
107 {
108     FIXME("(%p)->(): Stub!\n", iface);
109
110     return E_NOTIMPL;
111 }
112
113 static HRESULT WINAPI MediaStreamFilterImpl_Pause(IMediaStreamFilter * iface)
114 {
115     FIXME("(%p)->(): Stub!\n", iface);
116
117     return E_NOTIMPL;
118 }
119
120 static HRESULT WINAPI MediaStreamFilterImpl_Run(IMediaStreamFilter * iface, REFERENCE_TIME tStart)
121 {
122     FIXME("(%p)->(%s): Stub!\n", iface, wine_dbgstr_longlong(tStart));
123
124     return E_NOTIMPL;
125 }
126
127 static HRESULT WINAPI MediaStreamFilterImpl_GetState(IMediaStreamFilter * iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
128 {
129     return BaseFilterImpl_GetState((IBaseFilter*)iface, dwMilliSecsTimeout, pState);
130 }
131
132 static HRESULT WINAPI MediaStreamFilterImpl_SetSyncSource(IMediaStreamFilter * iface, IReferenceClock *pClock)
133 {
134     return BaseFilterImpl_SetSyncSource((IBaseFilter*)iface, pClock);
135 }
136
137 static HRESULT WINAPI MediaStreamFilterImpl_GetSyncSource(IMediaStreamFilter * iface, IReferenceClock **ppClock)
138 {
139     return BaseFilterImpl_GetSyncSource((IBaseFilter*)iface, ppClock);
140 }
141
142 static HRESULT WINAPI MediaStreamFilterImpl_EnumPins(IMediaStreamFilter * iface, IEnumPins **ppEnum)
143 {
144     return BaseFilterImpl_EnumPins((IBaseFilter*)iface, ppEnum);
145 }
146
147 static HRESULT WINAPI MediaStreamFilterImpl_FindPin(IMediaStreamFilter * iface, LPCWSTR Id, IPin **ppPin)
148 {
149     FIXME("(%p)->(%s,%p): Stub!\n", iface, debugstr_w(Id), ppPin);
150
151     return E_NOTIMPL;
152 }
153
154 static HRESULT WINAPI MediaStreamFilterImpl_QueryFilterInfo(IMediaStreamFilter * iface, FILTER_INFO *pInfo)
155 {
156     return BaseFilterImpl_QueryFilterInfo((IBaseFilter*)iface, pInfo);
157 }
158
159 static HRESULT WINAPI MediaStreamFilterImpl_JoinFilterGraph(IMediaStreamFilter * iface, IFilterGraph *pGraph, LPCWSTR pName)
160 {
161     return BaseFilterImpl_JoinFilterGraph((IBaseFilter*)iface, pGraph, pName);
162 }
163
164 static HRESULT WINAPI MediaStreamFilterImpl_QueryVendorInfo(IMediaStreamFilter * iface, LPWSTR *pVendorInfo)
165 {
166     return BaseFilterImpl_QueryVendorInfo((IBaseFilter*)iface, pVendorInfo);
167 }
168
169 /*** IMediaStreamFilter methods ***/
170
171 static HRESULT WINAPI MediaStreamFilterImpl_AddMediaStream(IMediaStreamFilter* iface, IAMMediaStream *pAMMediaStream)
172 {
173     FIXME("(%p)->(%p): Stub!\n", iface, pAMMediaStream);
174
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI MediaStreamFilterImpl_GetMediaStream(IMediaStreamFilter* iface, REFMSPID idPurpose, IMediaStream **ppMediaStream)
179 {
180     FIXME("(%p)->(%s,%p): Stub!\n", iface, debugstr_guid(idPurpose), ppMediaStream);
181
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI MediaStreamFilterImpl_EnumMediaStreams(IMediaStreamFilter* iface, LONG Index, IMediaStream **ppMediaStream)
186 {
187     FIXME("(%p)->(%d,%p): Stub!\n", iface, Index, ppMediaStream);
188
189     return E_NOTIMPL;
190 }
191
192 static HRESULT WINAPI MediaStreamFilterImpl_SupportSeeking(IMediaStreamFilter* iface, BOOL bRenderer)
193 {
194     FIXME("(%p)->(%d): Stub!\n", iface, bRenderer);
195
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI MediaStreamFilterImpl_ReferenceTimeToStreamTime(IMediaStreamFilter* iface, REFERENCE_TIME *pTime)
200 {
201     FIXME("(%p)->(%p): Stub!\n", iface, pTime);
202
203     return E_NOTIMPL;
204 }
205
206 static HRESULT WINAPI MediaStreamFilterImpl_GetCurrentStreamTime(IMediaStreamFilter* iface, REFERENCE_TIME *pCurrentStreamTime)
207 {
208     FIXME("(%p)->(%p): Stub!\n", iface, pCurrentStreamTime);
209
210     return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI MediaStreamFilterImpl_WaitUntil(IMediaStreamFilter* iface, REFERENCE_TIME WaitStreamTime)
214 {
215     FIXME("(%p)->(%s): Stub!\n", iface, wine_dbgstr_longlong(WaitStreamTime));
216
217     return E_NOTIMPL;
218 }
219
220 static HRESULT WINAPI MediaStreamFilterImpl_Flush(IMediaStreamFilter* iface, BOOL bCancelEOS)
221 {
222     FIXME("(%p)->(%d): Stub!\n", iface, bCancelEOS);
223
224     return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI MediaStreamFilterImpl_EndOfStream(IMediaStreamFilter* iface)
228 {
229     FIXME("(%p)->(): Stub!\n",  iface);
230
231     return E_NOTIMPL;
232 }
233
234 static const IMediaStreamFilterVtbl MediaStreamFilter_Vtbl =
235 {
236     MediaStreamFilterImpl_QueryInterface,
237     MediaStreamFilterImpl_AddRef,
238     MediaStreamFilterImpl_Release,
239     MediaStreamFilterImpl_GetClassID,
240     MediaStreamFilterImpl_Stop,
241     MediaStreamFilterImpl_Pause,
242     MediaStreamFilterImpl_Run,
243     MediaStreamFilterImpl_GetState,
244     MediaStreamFilterImpl_SetSyncSource,
245     MediaStreamFilterImpl_GetSyncSource,
246     MediaStreamFilterImpl_EnumPins,
247     MediaStreamFilterImpl_FindPin,
248     MediaStreamFilterImpl_QueryFilterInfo,
249     MediaStreamFilterImpl_JoinFilterGraph,
250     MediaStreamFilterImpl_QueryVendorInfo,
251     MediaStreamFilterImpl_AddMediaStream,
252     MediaStreamFilterImpl_GetMediaStream,
253     MediaStreamFilterImpl_EnumMediaStreams,
254     MediaStreamFilterImpl_SupportSeeking,
255     MediaStreamFilterImpl_ReferenceTimeToStreamTime,
256     MediaStreamFilterImpl_GetCurrentStreamTime,
257     MediaStreamFilterImpl_WaitUntil,
258     MediaStreamFilterImpl_Flush,
259     MediaStreamFilterImpl_EndOfStream
260 };
261
262 static IPin* WINAPI MediaStreamFilterImpl_GetPin(BaseFilter *iface, int pos)
263 {
264     /* No pins */
265     return NULL;
266 }
267
268 static LONG WINAPI MediaStreamFilterImpl_GetPinCount(BaseFilter *iface)
269 {
270     /* No pins */
271     return 0;
272 }
273
274 static const BaseFilterFuncTable BaseFuncTable = {
275     MediaStreamFilterImpl_GetPin,
276     MediaStreamFilterImpl_GetPinCount
277 };
278
279 HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, void **ppObj)
280 {
281     IMediaStreamFilterImpl* object;
282
283     TRACE("(%p,%p)\n", pUnkOuter, ppObj);
284
285     if( pUnkOuter )
286         return CLASS_E_NOAGGREGATION;
287
288     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamFilterImpl));
289     if (!object)
290     {
291         ERR("Out of memory\n");
292         return E_OUTOFMEMORY;
293     }
294
295     BaseFilter_Init(&object->filter, (IBaseFilterVtbl*)&MediaStreamFilter_Vtbl, &CLSID_MediaStreamFilter, (DWORD_PTR)(__FILE__ ": MediaStreamFilterImpl.csFilter"), &BaseFuncTable);
296
297     *ppObj = object;
298
299     return S_OK;
300 }