Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/acmwrapper.c | 4 ++-- dlls/quartz/tests/avidec.c | 4 ++-- dlls/strmbase/transform.c | 25 ++++++++++++++++++++++--- 3 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/dlls/quartz/tests/acmwrapper.c b/dlls/quartz/tests/acmwrapper.c index a543893d79..5acc91e722 100644 --- a/dlls/quartz/tests/acmwrapper.c +++ b/dlls/quartz/tests/acmwrapper.c @@ -74,7 +74,7 @@ static void test_interfaces(void) check_interface(filter, &IID_IBasicVideo, FALSE); check_interface(filter, &IID_IKsPropertySet, FALSE); todo_wine check_interface(filter, &IID_IMediaPosition, FALSE); - todo_wine check_interface(filter, &IID_IMediaSeeking, FALSE); + check_interface(filter, &IID_IMediaSeeking, FALSE); check_interface(filter, &IID_IPin, FALSE); todo_wine check_interface(filter, &IID_IQualityControl, FALSE); check_interface(filter, &IID_IQualProp, FALSE); @@ -89,7 +89,7 @@ static void test_interfaces(void) check_interface(pin, &IID_IUnknown, TRUE);
check_interface(pin, &IID_IMediaPosition, FALSE); - todo_wine check_interface(pin, &IID_IMediaSeeking, FALSE); + check_interface(pin, &IID_IMediaSeeking, FALSE);
IPin_Release(pin);
diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c index e897af434f..ffea059232 100644 --- a/dlls/quartz/tests/avidec.c +++ b/dlls/quartz/tests/avidec.c @@ -98,7 +98,7 @@ static void test_interfaces(void) check_interface(filter, &IID_IBasicVideo, FALSE); check_interface(filter, &IID_IKsPropertySet, FALSE); todo_wine check_interface(filter, &IID_IMediaPosition, FALSE); - todo_wine check_interface(filter, &IID_IMediaSeeking, FALSE); + check_interface(filter, &IID_IMediaSeeking, FALSE); check_interface(filter, &IID_IPersistPropertyBag, FALSE); check_interface(filter, &IID_IPin, FALSE); todo_wine check_interface(filter, &IID_IQualityControl, FALSE); @@ -114,7 +114,7 @@ static void test_interfaces(void) check_interface(pin, &IID_IUnknown, TRUE);
check_interface(pin, &IID_IMediaPosition, FALSE); - todo_wine check_interface(pin, &IID_IMediaSeeking, FALSE); + check_interface(pin, &IID_IMediaSeeking, FALSE);
IPin_Release(pin);
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index df16b67cb3..fa9abb0fda 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -172,8 +172,7 @@ static HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, RE IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } - else if (IsEqualIID(riid, &IID_IMediaSeeking) || - IsEqualIID(riid, &IID_IMediaPosition)) + else if (IsEqualIID(riid, &IID_IMediaPosition)) { return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv); } @@ -558,9 +557,29 @@ static const IPinVtbl TransformFilter_InputPin_Vtbl = TransformFilter_InputPin_NewSegment };
+static HRESULT WINAPI transform_source_QueryInterface(IPin *iface, REFIID iid, void **out) +{ + TransformFilter *filter = impl_from_IBaseFilter(impl_BaseOutputPin_from_IPin(iface)->pin.pinInfo.pFilter); + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IPin)) + *out = iface; + else if (IsEqualGUID(iid, &IID_IQualityControl)) + *out = &filter->qcimpl->IQualityControl_iface; + else if (IsEqualGUID(iid, &IID_IMediaSeeking)) + return IUnknown_QueryInterface(filter->seekthru_unk, iid, out); + else + { + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + *out = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + static const IPinVtbl TransformFilter_OutputPin_Vtbl = { - BaseOutputPinImpl_QueryInterface, + transform_source_QueryInterface, BasePinImpl_AddRef, BaseOutputPinImpl_Release, BaseOutputPinImpl_Connect,