quartz: Update null renderer to use the BaseRenderer from strmbase.
[wine.git] / dlls / quartz / nullrenderer.c
blob3172dcaf95369e368c73ad0d7bd136765acf65c6
1 /*
2 * Null Renderer (Promiscuous, not rendering anything at all!)
4 * Copyright 2004 Christian Costa
5 * Copyright 2008 Maarten Lankhorst
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "config.h"
24 #define NONAMELESSSTRUCT
25 #define NONAMELESSUNION
26 #include "quartz_private.h"
27 #include "pin.h"
29 #include "uuids.h"
30 #include "vfwmsgs.h"
31 #include "amvideo.h"
32 #include "windef.h"
33 #include "winbase.h"
34 #include "dshow.h"
35 #include "evcode.h"
36 #include "strmif.h"
37 #include "ddraw.h"
39 #include "wine/unicode.h"
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
44 static const IBaseFilterVtbl NullRenderer_Vtbl;
45 static const IUnknownVtbl IInner_VTable;
46 static const IAMFilterMiscFlagsVtbl IAMFilterMiscFlags_Vtbl;
48 typedef struct NullRendererImpl
50 BaseRenderer renderer;
52 const IUnknownVtbl * IInner_vtbl;
53 const IAMFilterMiscFlagsVtbl *IAMFilterMiscFlags_vtbl;
55 IUnknown * pUnkOuter;
56 BOOL bUnkOuterValid;
57 BOOL bAggregatable;
58 } NullRendererImpl;
60 static HRESULT WINAPI NullRenderer_DoRenderSample(BaseRenderer *iface, IMediaSample *pMediaSample)
62 return S_OK;
65 static HRESULT WINAPI NullRenderer_CheckMediaType(BaseRenderer *iface, const AM_MEDIA_TYPE * pmt)
67 TRACE("Not a stub!\n");
68 return S_OK;
71 static const BaseRendererFuncTable RendererFuncTable = {
72 NullRenderer_CheckMediaType,
73 NullRenderer_DoRenderSample,
74 NULL,
75 NULL,
76 NULL,
77 NULL,
78 NULL,
79 NULL,
80 NULL,
81 NULL,
82 NULL,
83 NULL,
84 NULL,
85 NULL,
88 HRESULT NullRenderer_create(IUnknown * pUnkOuter, LPVOID * ppv)
90 HRESULT hr;
91 NullRendererImpl * pNullRenderer;
93 TRACE("(%p, %p)\n", pUnkOuter, ppv);
95 *ppv = NULL;
97 pNullRenderer = CoTaskMemAlloc(sizeof(NullRendererImpl));
98 pNullRenderer->pUnkOuter = pUnkOuter;
99 pNullRenderer->bUnkOuterValid = FALSE;
100 pNullRenderer->bAggregatable = FALSE;
101 pNullRenderer->IInner_vtbl = &IInner_VTable;
102 pNullRenderer->IAMFilterMiscFlags_vtbl = &IAMFilterMiscFlags_Vtbl;
104 hr = BaseRenderer_Init(&pNullRenderer->renderer, &NullRenderer_Vtbl, pUnkOuter, &CLSID_NullRenderer, (DWORD_PTR)(__FILE__ ": NullRendererImpl.csFilter"), &RendererFuncTable);
106 if (FAILED(hr))
108 BaseRendererImpl_Release(&pNullRenderer->renderer.filter.IBaseFilter_iface);
109 CoTaskMemFree(pNullRenderer);
111 else
112 *ppv = pNullRenderer;
114 return hr;
117 static HRESULT WINAPI NullRendererInner_QueryInterface(IUnknown * iface, REFIID riid, LPVOID * ppv)
119 ICOM_THIS_MULTI(NullRendererImpl, IInner_vtbl, iface);
120 TRACE("(%p/%p)->(%s, %p)\n", This, iface, qzdebugstr_guid(riid), ppv);
122 if (This->bAggregatable)
123 This->bUnkOuterValid = TRUE;
125 *ppv = NULL;
127 if (IsEqualIID(riid, &IID_IUnknown))
128 *ppv = &This->IInner_vtbl;
129 else if (IsEqualIID(riid, &IID_IAMFilterMiscFlags))
130 *ppv = &This->IAMFilterMiscFlags_vtbl;
131 else
133 HRESULT hr;
134 hr = BaseRendererImpl_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv);
135 if (SUCCEEDED(hr))
136 return hr;
139 if (*ppv)
141 IUnknown_AddRef((IUnknown *)(*ppv));
142 return S_OK;
145 if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IVideoWindow))
146 FIXME("No interface for %s!\n", qzdebugstr_guid(riid));
148 return E_NOINTERFACE;
151 static ULONG WINAPI NullRendererInner_AddRef(IUnknown * iface)
153 ICOM_THIS_MULTI(NullRendererImpl, IInner_vtbl, iface);
154 return BaseFilterImpl_AddRef(&This->renderer.filter.IBaseFilter_iface);
157 static ULONG WINAPI NullRendererInner_Release(IUnknown * iface)
159 ICOM_THIS_MULTI(NullRendererImpl, IInner_vtbl, iface);
160 ULONG refCount = BaseRendererImpl_Release(&This->renderer.filter.IBaseFilter_iface);
162 if (!refCount)
164 TRACE("Destroying Null Renderer\n");
165 CoTaskMemFree(This);
166 return 0;
168 else
169 return refCount;
172 static const IUnknownVtbl IInner_VTable =
174 NullRendererInner_QueryInterface,
175 NullRendererInner_AddRef,
176 NullRendererInner_Release
179 static HRESULT WINAPI NullRenderer_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
181 NullRendererImpl *This = (NullRendererImpl *)iface;
183 if (This->bAggregatable)
184 This->bUnkOuterValid = TRUE;
186 if (This->pUnkOuter)
188 if (This->bAggregatable)
189 return IUnknown_QueryInterface(This->pUnkOuter, riid, ppv);
191 if (IsEqualIID(riid, &IID_IUnknown))
193 HRESULT hr;
195 IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
196 hr = IUnknown_QueryInterface((IUnknown *)&(This->IInner_vtbl), riid, ppv);
197 IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
198 This->bAggregatable = TRUE;
199 return hr;
202 *ppv = NULL;
203 return E_NOINTERFACE;
206 return IUnknown_QueryInterface((IUnknown *)&(This->IInner_vtbl), riid, ppv);
209 static ULONG WINAPI NullRenderer_AddRef(IBaseFilter * iface)
211 NullRendererImpl *This = (NullRendererImpl *)iface;
213 if (This->pUnkOuter && This->bUnkOuterValid)
214 return IUnknown_AddRef(This->pUnkOuter);
215 return IUnknown_AddRef((IUnknown *)&(This->IInner_vtbl));
218 static ULONG WINAPI NullRenderer_Release(IBaseFilter * iface)
220 NullRendererImpl *This = (NullRendererImpl *)iface;
222 if (This->pUnkOuter && This->bUnkOuterValid)
223 return IUnknown_Release(This->pUnkOuter);
224 return IUnknown_Release((IUnknown *)&(This->IInner_vtbl));
227 static const IBaseFilterVtbl NullRenderer_Vtbl =
229 NullRenderer_QueryInterface,
230 NullRenderer_AddRef,
231 NullRenderer_Release,
232 BaseFilterImpl_GetClassID,
233 BaseRendererImpl_Stop,
234 BaseRendererImpl_Pause,
235 BaseRendererImpl_Run,
236 BaseFilterImpl_GetState,
237 BaseFilterImpl_SetSyncSource,
238 BaseFilterImpl_GetSyncSource,
239 BaseFilterImpl_EnumPins,
240 BaseRendererImpl_FindPin,
241 BaseFilterImpl_QueryFilterInfo,
242 BaseFilterImpl_JoinFilterGraph,
243 BaseFilterImpl_QueryVendorInfo
246 static NullRendererImpl *from_IAMFilterMiscFlags(IAMFilterMiscFlags *iface) {
247 return (NullRendererImpl*)((char*)iface - offsetof(NullRendererImpl, IAMFilterMiscFlags_vtbl));
250 static HRESULT WINAPI AMFilterMiscFlags_QueryInterface(IAMFilterMiscFlags *iface, REFIID riid, void **ppv) {
251 NullRendererImpl *This = from_IAMFilterMiscFlags(iface);
252 return IUnknown_QueryInterface((IUnknown*)This, riid, ppv);
255 static ULONG WINAPI AMFilterMiscFlags_AddRef(IAMFilterMiscFlags *iface) {
256 NullRendererImpl *This = from_IAMFilterMiscFlags(iface);
257 return IUnknown_AddRef((IUnknown*)This);
260 static ULONG WINAPI AMFilterMiscFlags_Release(IAMFilterMiscFlags *iface) {
261 NullRendererImpl *This = from_IAMFilterMiscFlags(iface);
262 return IUnknown_Release((IUnknown*)This);
265 static ULONG WINAPI AMFilterMiscFlags_GetMiscFlags(IAMFilterMiscFlags *iface) {
266 return AM_FILTER_MISC_FLAGS_IS_RENDERER;
269 static const IAMFilterMiscFlagsVtbl IAMFilterMiscFlags_Vtbl = {
270 AMFilterMiscFlags_QueryInterface,
271 AMFilterMiscFlags_AddRef,
272 AMFilterMiscFlags_Release,
273 AMFilterMiscFlags_GetMiscFlags