qedit/samplegrabber: Use strmbase filter aggregation support.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2019-06-04 17:54:26 -05:00 committed by Alexandre Julliard
parent 70df614244
commit 9f3e724161
1 changed files with 36 additions and 112 deletions

View File

@ -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;
}