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
24 #define NONAMELESSSTRUCT
25 #define NONAMELESSUNION
26 #include "quartz_private.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
;
60 static HRESULT WINAPI
NullRenderer_DoRenderSample(BaseRenderer
*iface
, IMediaSample
*pMediaSample
)
65 static HRESULT WINAPI
NullRenderer_CheckMediaType(BaseRenderer
*iface
, const AM_MEDIA_TYPE
* pmt
)
67 TRACE("Not a stub!\n");
71 static const BaseRendererFuncTable RendererFuncTable
= {
72 NullRenderer_CheckMediaType
,
73 NullRenderer_DoRenderSample
,
88 HRESULT
NullRenderer_create(IUnknown
* pUnkOuter
, LPVOID
* ppv
)
91 NullRendererImpl
* pNullRenderer
;
93 TRACE("(%p, %p)\n", pUnkOuter
, ppv
);
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
);
108 BaseRendererImpl_Release(&pNullRenderer
->renderer
.filter
.IBaseFilter_iface
);
109 CoTaskMemFree(pNullRenderer
);
112 *ppv
= pNullRenderer
;
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
;
127 if (IsEqualIID(riid
, &IID_IUnknown
))
128 *ppv
= &This
->IInner_vtbl
;
129 else if (IsEqualIID(riid
, &IID_IAMFilterMiscFlags
))
130 *ppv
= &This
->IAMFilterMiscFlags_vtbl
;
134 hr
= BaseRendererImpl_QueryInterface(&This
->renderer
.filter
.IBaseFilter_iface
, riid
, ppv
);
141 IUnknown_AddRef((IUnknown
*)(*ppv
));
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
);
164 TRACE("Destroying Null Renderer\n");
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
;
188 if (This
->bAggregatable
)
189 return IUnknown_QueryInterface(This
->pUnkOuter
, riid
, ppv
);
191 if (IsEqualIID(riid
, &IID_IUnknown
))
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
;
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
,
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