Zebediah Figura : qedit/samplegrabber: Use the strmbase_passthrough object directly.
Alexandre Julliard
julliard at winehq.org
Mon Mar 30 16:24:25 CDT 2020
Module: wine
Branch: master
Commit: 9829385c3881b67bc2eb1ac32afa56c8d532b07e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9829385c3881b67bc2eb1ac32afa56c8d532b07e
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Sat Mar 28 12:02:06 2020 -0500
qedit/samplegrabber: Use the strmbase_passthrough object directly.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/qedit/samplegrabber.c | 28 ++++++++++++----------------
1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index 7e29154762..afb48bf84d 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -39,8 +39,7 @@ typedef struct _SG_Impl {
ISampleGrabber ISampleGrabber_iface;
struct strmbase_source source;
- /* IMediaSeeking and IMediaPosition are implemented by ISeekingPassThru */
- IUnknown *seekthru_unk;
+ struct strmbase_passthrough passthrough;
struct strmbase_sink sink;
AM_MEDIA_TYPE filter_mt;
@@ -86,8 +85,6 @@ static void SampleGrabber_cleanup(SG_Impl *This)
ISampleGrabberCB_Release(This->grabberIface);
FreeMediaType(&This->filter_mt);
CoTaskMemFree(This->bufferData);
- if(This->seekthru_unk)
- IUnknown_Release(This->seekthru_unk);
}
static struct strmbase_pin *sample_grabber_get_pin(struct strmbase_filter *iface, unsigned int index)
@@ -108,6 +105,7 @@ static void sample_grabber_destroy(struct strmbase_filter *iface)
SampleGrabber_cleanup(filter);
strmbase_sink_cleanup(&filter->sink);
strmbase_source_cleanup(&filter->source);
+ strmbase_passthrough_cleanup(&filter->passthrough);
strmbase_filter_cleanup(&filter->filter);
CoTaskMemFree(filter);
}
@@ -550,10 +548,15 @@ static HRESULT sample_grabber_source_query_interface(struct strmbase_pin *iface,
{
SG_Impl *filter = impl_from_source_pin(iface);
- if (IsEqualGUID(iid, &IID_IMediaPosition) || IsEqualGUID(iid, &IID_IMediaSeeking))
- return IUnknown_QueryInterface(filter->seekthru_unk, iid, out);
+ if (IsEqualGUID(iid, &IID_IMediaPosition))
+ *out = &filter->passthrough.IMediaPosition_iface;
+ else if (IsEqualGUID(iid, &IID_IMediaSeeking))
+ *out = &filter->passthrough.IMediaSeeking_iface;
else
return E_NOINTERFACE;
+
+ IUnknown_AddRef((IUnknown *)*out);
+ return S_OK;
}
static HRESULT sample_grabber_source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
@@ -637,8 +640,6 @@ static const struct strmbase_source_ops source_ops =
HRESULT sample_grabber_create(IUnknown *outer, IUnknown **out)
{
SG_Impl* obj = NULL;
- ISeekingPassThru *passthru;
- HRESULT hr;
obj = CoTaskMemAlloc(sizeof(SG_Impl));
if (NULL == obj) {
@@ -652,7 +653,10 @@ HRESULT sample_grabber_create(IUnknown *outer, IUnknown **out)
obj->IMemInputPin_iface.lpVtbl = &IMemInputPin_VTable;
strmbase_sink_init(&obj->sink, &obj->filter, L"In", &sink_ops, NULL);
+
strmbase_source_init(&obj->source, &obj->filter, L"Out", &source_ops);
+ strmbase_passthrough_init(&obj->passthrough, (IUnknown *)&obj->source.pin.IPin_iface);
+ ISeekingPassThru_Init(&obj->passthrough.ISeekingPassThru_iface, FALSE, &obj->sink.pin.IPin_iface);
obj->allocator = NULL;
obj->grabberIface = NULL;
@@ -661,14 +665,6 @@ HRESULT sample_grabber_create(IUnknown *outer, IUnknown **out)
obj->bufferLen = -1;
obj->bufferData = NULL;
- 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->sink.pin.IPin_iface);
- ISeekingPassThru_Release(passthru);
-
*out = &obj->filter.IUnknown_inner;
return S_OK;
}
More information about the wine-cvs
mailing list