[PATCH 4/6] qedit/samplegrabber: Use strmbase filter aggregation support.
Zebediah Figura
zfigura at codeweavers.com
Tue Jun 4 17:54:26 CDT 2019
From: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/qedit/samplegrabber.c | 148 +++++++++++----------------------------------
1 file changed, 36 insertions(+), 112 deletions(-)
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index 27e08c4..0385ebb 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -212,12 +212,10 @@ static inline SG_Pin *impl_from_IPin(IPin *iface)
/* Sample Grabber filter implementation */
typedef struct _SG_Impl {
- IUnknown IUnknown_inner;
BaseFilter filter;
ISampleGrabber ISampleGrabber_iface;
/* IMediaSeeking and IMediaPosition are implemented by ISeekingPassThru */
IUnknown* seekthru_unk;
- IUnknown *outer_unk;
AM_MEDIA_TYPE mtype;
SG_Pin pin_in;
SG_Pin pin_out;
@@ -237,11 +235,6 @@ enum {
OneShot_Past,
};
-static inline SG_Impl *impl_from_IUnknown(IUnknown *iface)
-{
- return CONTAINING_RECORD(iface, SG_Impl, IUnknown_inner);
-}
-
static inline SG_Impl *impl_from_BaseFilter(BaseFilter *iface)
{
return CONTAINING_RECORD(iface, SG_Impl, filter);
@@ -281,64 +274,6 @@ static void SampleGrabber_cleanup(SG_Impl *This)
IUnknown_Release(This->seekthru_unk);
}
-/* SampleGrabber inner IUnknown */
-static HRESULT WINAPI SampleGrabber_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
-{
- SG_Impl *This = impl_from_IUnknown(iface);
-
- TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
-
- *ppv = NULL;
- if (IsEqualIID(riid, &IID_IUnknown))
- *ppv = &This->IUnknown_inner;
- else if (IsEqualIID(riid, &IID_IPersist) || IsEqualIID(riid, &IID_IMediaFilter) ||
- IsEqualIID(riid, &IID_IBaseFilter))
- *ppv = &This->filter.IBaseFilter_iface;
- else if (IsEqualIID(riid, &IID_ISampleGrabber))
- *ppv = &This->ISampleGrabber_iface;
- else
- WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppv);
-
- if (!*ppv)
- return E_NOINTERFACE;
-
- IUnknown_AddRef((IUnknown*)*ppv);
- return S_OK;
-}
-
-static ULONG WINAPI SampleGrabber_AddRef(IUnknown *iface)
-{
- SG_Impl *This = impl_from_IUnknown(iface);
- ULONG ref = BaseFilterImpl_AddRef(&This->filter.IBaseFilter_iface);
-
- TRACE("(%p) ref=%d\n", This, ref);
-
- return ref;
-}
-
-static ULONG WINAPI SampleGrabber_Release(IUnknown *iface)
-{
- SG_Impl *This = impl_from_IUnknown(iface);
- ULONG ref = InterlockedDecrement(&This->filter.refcount);
-
- TRACE("(%p) ref=%d\n", This, ref);
-
- if (ref == 0)
- {
- SampleGrabber_cleanup(This);
- strmbase_filter_cleanup(&This->filter);
- CoTaskMemFree(This);
- }
- return ref;
-}
-
-static const IUnknownVtbl samplegrabber_vtbl =
-{
- SampleGrabber_QueryInterface,
- SampleGrabber_AddRef,
- SampleGrabber_Release,
-};
-
static IPin *sample_grabber_get_pin(BaseFilter *iface, unsigned int index)
{
SG_Impl *This = impl_from_BaseFilter(iface);
@@ -355,8 +290,32 @@ static IPin *sample_grabber_get_pin(BaseFilter *iface, unsigned int index)
return pin;
}
+static void sample_grabber_destroy(BaseFilter *iface)
+{
+ SG_Impl *filter = impl_from_BaseFilter(iface);
+
+ SampleGrabber_cleanup(filter);
+ strmbase_filter_cleanup(&filter->filter);
+ CoTaskMemFree(filter);
+}
+
+static HRESULT sample_grabber_query_interface(BaseFilter *iface, REFIID iid, void **out)
+{
+ SG_Impl *filter = impl_from_BaseFilter(iface);
+
+ if (IsEqualGUID(iid, &IID_ISampleGrabber))
+ *out = &filter->ISampleGrabber_iface;
+ else
+ return E_NOINTERFACE;
+
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
+}
+
static const BaseFilterFuncTable basefunc_vtbl = {
.filter_get_pin = sample_grabber_get_pin,
+ .filter_destroy = sample_grabber_destroy,
+ .filter_query_interface = sample_grabber_query_interface,
};
/* Helper that buffers data and/or calls installed sample callbacks */
@@ -417,33 +376,6 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
}
}
-
-/* SampleGrabber implementation of IBaseFilter interface */
-
-/* IUnknown */
-static HRESULT WINAPI
-SampleGrabber_IBaseFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppv)
-{
- SG_Impl *This = impl_from_IBaseFilter(iface);
- return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
-}
-
-/* IUnknown */
-static ULONG WINAPI
-SampleGrabber_IBaseFilter_AddRef(IBaseFilter *iface)
-{
- SG_Impl *This = impl_from_IBaseFilter(iface);
- return IUnknown_AddRef(This->outer_unk);
-}
-
-/* IUnknown */
-static ULONG WINAPI
-SampleGrabber_IBaseFilter_Release(IBaseFilter *iface)
-{
- SG_Impl *This = impl_from_IBaseFilter(iface);
- return IUnknown_Release(This->outer_unk);
-}
-
/* IMediaFilter */
static HRESULT WINAPI
SampleGrabber_IBaseFilter_Stop(IBaseFilter *iface)
@@ -532,7 +464,7 @@ static HRESULT WINAPI
SampleGrabber_ISampleGrabber_QueryInterface(ISampleGrabber *iface, REFIID riid, void **ppv)
{
SG_Impl *This = impl_from_ISampleGrabber(iface);
- return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
+ return IUnknown_QueryInterface(This->filter.outer_unk, riid, ppv);
}
/* IUnknown */
@@ -540,7 +472,7 @@ static ULONG WINAPI
SampleGrabber_ISampleGrabber_AddRef(ISampleGrabber *iface)
{
SG_Impl *This = impl_from_ISampleGrabber(iface);
- return IUnknown_AddRef(This->outer_unk);
+ return IUnknown_AddRef(This->filter.outer_unk);
}
/* IUnknown */
@@ -548,7 +480,7 @@ static ULONG WINAPI
SampleGrabber_ISampleGrabber_Release(ISampleGrabber *iface)
{
SG_Impl *This = impl_from_ISampleGrabber(iface);
- return IUnknown_Release(This->outer_unk);
+ return IUnknown_Release(This->filter.outer_unk);
}
/* ISampleGrabber */
@@ -1139,9 +1071,9 @@ SampleGrabber_IPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME
static const IBaseFilterVtbl IBaseFilter_VTable =
{
- SampleGrabber_IBaseFilter_QueryInterface,
- SampleGrabber_IBaseFilter_AddRef,
- SampleGrabber_IBaseFilter_Release,
+ BaseFilterImpl_QueryInterface,
+ BaseFilterImpl_AddRef,
+ BaseFilterImpl_Release,
BaseFilterImpl_GetClassID,
SampleGrabber_IBaseFilter_Stop,
SampleGrabber_IBaseFilter_Pause,
@@ -1252,24 +1184,21 @@ static const IPinVtbl IPin_Out_VTable =
SampleGrabber_IPin_NewSegment,
};
-HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
+HRESULT SampleGrabber_create(IUnknown *outer, void **out)
{
SG_Impl* obj = NULL;
ISeekingPassThru *passthru;
HRESULT hr;
- TRACE("(%p,%p)\n", pUnkOuter, ppv);
-
obj = CoTaskMemAlloc(sizeof(SG_Impl));
if (NULL == obj) {
- *ppv = NULL;
+ *out = NULL;
return E_OUTOFMEMORY;
}
ZeroMemory(obj, sizeof(SG_Impl));
- strmbase_filter_init(&obj->filter, &IBaseFilter_VTable, NULL, &CLSID_SampleGrabber,
+ strmbase_filter_init(&obj->filter, &IBaseFilter_VTable, outer, &CLSID_SampleGrabber,
(DWORD_PTR)(__FILE__ ": SG_Impl.csFilter"), &basefunc_vtbl);
- obj->IUnknown_inner.lpVtbl = &samplegrabber_vtbl;
obj->ISampleGrabber_iface.lpVtbl = &ISampleGrabber_VTable;
obj->IMemInputPin_iface.lpVtbl = &IMemInputPin_VTable;
obj->pin_in.IPin_iface.lpVtbl = &IPin_In_VTable;
@@ -1293,19 +1222,14 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
obj->bufferLen = -1;
obj->bufferData = NULL;
- if (pUnkOuter)
- obj->outer_unk = pUnkOuter;
- else
- obj->outer_unk = &obj->IUnknown_inner;
-
- hr = CoCreateInstance(&CLSID_SeekingPassThru, &obj->IUnknown_inner, CLSCTX_INPROC_SERVER,
- &IID_IUnknown, (void**)&obj->seekthru_unk);
+ hr = CoCreateInstance(&CLSID_SeekingPassThru, &obj->filter.IUnknown_inner,
+ CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&obj->seekthru_unk);
if(hr)
return hr;
IUnknown_QueryInterface(obj->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
ISeekingPassThru_Init(passthru, FALSE, &obj->pin_in.IPin_iface);
ISeekingPassThru_Release(passthru);
- *ppv = &obj->IUnknown_inner;
+ *out = &obj->filter.IUnknown_inner;
return S_OK;
}
--
2.7.4
More information about the wine-devel
mailing list