Zebediah Figura : strmbase/transform: Share pin and filter reference counts.
Alexandre Julliard
julliard at winehq.org
Mon Jun 17 15:54:19 CDT 2019
Module: wine
Branch: master
Commit: 7f3d463b4578a33a983fbc693c7f429f608f0a09
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7f3d463b4578a33a983fbc693c7f429f608f0a09
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Sun Jun 16 19:35:03 2019 -0500
strmbase/transform: Share pin and filter reference counts.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/quartz/tests/acmwrapper.c | 10 +++-------
dlls/quartz/tests/avidec.c | 10 +++-------
dlls/strmbase/transform.c | 36 ++++++++++++++++++++++++++++++------
3 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/dlls/quartz/tests/acmwrapper.c b/dlls/quartz/tests/acmwrapper.c
index 1c41872..1f07e50 100644
--- a/dlls/quartz/tests/acmwrapper.c
+++ b/dlls/quartz/tests/acmwrapper.c
@@ -229,10 +229,8 @@ static void test_enum_pins(void)
hr = IEnumPins_Next(enum1, 1, pins, NULL);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ref = get_refcount(filter);
-todo_wine
ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(pins[0]);
-todo_wine
ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(enum1);
ok(ref == 1, "Got unexpected refcount %d.\n", ref);
@@ -243,10 +241,8 @@ todo_wine
hr = IEnumPins_Next(enum1, 1, pins, NULL);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ref = get_refcount(filter);
-todo_wine
ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(pins[0]);
-todo_wine
ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(enum1);
ok(ref == 1, "Got unexpected refcount %d.\n", ref);
@@ -383,7 +379,7 @@ static void test_pin_info(void)
hr = IBaseFilter_FindPin(filter, sink_id, &pin);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ref = get_refcount(filter);
- todo_wine ok(ref == 2, "Got unexpected refcount %d.\n", ref);
+ ok(ref == 2, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(pin);
ok(ref == 2, "Got unexpected refcount %d.\n", ref);
@@ -394,9 +390,9 @@ static void test_pin_info(void)
todo_wine
ok(!lstrcmpW(info.achName, sink_name), "Got name %s.\n", wine_dbgstr_w(info.achName));
ref = get_refcount(filter);
- todo_wine ok(ref == 3, "Got unexpected refcount %d.\n", ref);
+ ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(pin);
- todo_wine ok(ref == 3, "Got unexpected refcount %d.\n", ref);
+ ok(ref == 3, "Got unexpected refcount %d.\n", ref);
IBaseFilter_Release(info.pFilter);
hr = IPin_QueryDirection(pin, &dir);
diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c
index 0183e0b..3f92876 100644
--- a/dlls/quartz/tests/avidec.c
+++ b/dlls/quartz/tests/avidec.c
@@ -254,10 +254,8 @@ static void test_enum_pins(void)
hr = IEnumPins_Next(enum1, 1, pins, NULL);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ref = get_refcount(filter);
-todo_wine
ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(pins[0]);
-todo_wine
ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(enum1);
ok(ref == 1, "Got unexpected refcount %d.\n", ref);
@@ -268,10 +266,8 @@ todo_wine
hr = IEnumPins_Next(enum1, 1, pins, NULL);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ref = get_refcount(filter);
-todo_wine
ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(pins[0]);
-todo_wine
ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(enum1);
ok(ref == 1, "Got unexpected refcount %d.\n", ref);
@@ -408,7 +404,7 @@ static void test_pin_info(void)
hr = IBaseFilter_FindPin(filter, sink_id, &pin);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ref = get_refcount(filter);
- todo_wine ok(ref == 2, "Got unexpected refcount %d.\n", ref);
+ ok(ref == 2, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(pin);
ok(ref == 2, "Got unexpected refcount %d.\n", ref);
@@ -418,9 +414,9 @@ static void test_pin_info(void)
ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir);
todo_wine ok(!lstrcmpW(info.achName, sink_name), "Got name %s.\n", wine_dbgstr_w(info.achName));
ref = get_refcount(filter);
- todo_wine ok(ref == 3, "Got unexpected refcount %d.\n", ref);
+ ok(ref == 3, "Got unexpected refcount %d.\n", ref);
ref = get_refcount(pin);
- todo_wine ok(ref == 3, "Got unexpected refcount %d.\n", ref);
+ ok(ref == 3, "Got unexpected refcount %d.\n", ref);
IBaseFilter_Release(info.pFilter);
hr = IPin_QueryDirection(pin, &dir);
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index fe54ebe..4c32d67 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -153,9 +153,11 @@ static void transform_destroy(BaseFilter *iface)
IPin_Release(peer);
}
IPin_Disconnect(filter->ppPins[i]);
- IPin_Release(filter->ppPins[i]);
}
+ BaseInputPin_Destroy(impl_BaseInputPin_from_IPin(filter->ppPins[0]));
+ BaseOutputPin_Destroy(impl_BaseOutputPin_from_IPin(filter->ppPins[1]));
+
CoTaskMemFree(filter->ppPins);
filter->csReceive.DebugInfo->Spare[0] = 0;
@@ -379,7 +381,17 @@ HRESULT WINAPI TransformFilterImpl_Notify(TransformFilter *iface, IBaseFilter *s
return QualityControlImpl_Notify((IQualityControl*)iface->qcimpl, sender, qm);
}
-/** IBaseFilter implementation **/
+static ULONG WINAPI TransformFilter_InputPin_AddRef(IPin *iface)
+{
+ BaseInputPin *pin = impl_BaseInputPin_from_IPin(iface);
+ return IBaseFilter_AddRef(pin->pin.pinInfo.pFilter);
+}
+
+static ULONG WINAPI TransformFilter_InputPin_Release(IPin *iface)
+{
+ BaseInputPin *pin = impl_BaseInputPin_from_IPin(iface);
+ return IBaseFilter_Release(pin->pin.pinInfo.pFilter);
+}
static HRESULT WINAPI TransformFilter_InputPin_EndOfStream(IPin * iface)
{
@@ -504,8 +516,8 @@ static HRESULT WINAPI TransformFilter_InputPin_NewSegment(IPin * iface, REFERENC
static const IPinVtbl TransformFilter_InputPin_Vtbl =
{
BaseInputPinImpl_QueryInterface,
- BasePinImpl_AddRef,
- BaseInputPinImpl_Release,
+ TransformFilter_InputPin_AddRef,
+ TransformFilter_InputPin_Release,
BaseInputPinImpl_Connect,
TransformFilter_InputPin_ReceiveConnection,
TransformFilter_InputPin_Disconnect,
@@ -543,11 +555,23 @@ static HRESULT WINAPI transform_source_QueryInterface(IPin *iface, REFIID iid, v
return S_OK;
}
+static ULONG WINAPI transform_source_AddRef(IPin *iface)
+{
+ BaseOutputPin *pin = impl_BaseOutputPin_from_IPin(iface);
+ return IBaseFilter_AddRef(pin->pin.pinInfo.pFilter);
+}
+
+static ULONG WINAPI transform_source_Release(IPin *iface)
+{
+ BaseOutputPin *pin = impl_BaseOutputPin_from_IPin(iface);
+ return IBaseFilter_Release(pin->pin.pinInfo.pFilter);
+}
+
static const IPinVtbl TransformFilter_OutputPin_Vtbl =
{
transform_source_QueryInterface,
- BasePinImpl_AddRef,
- BaseOutputPinImpl_Release,
+ transform_source_AddRef,
+ transform_source_Release,
BaseOutputPinImpl_Connect,
BaseOutputPinImpl_ReceiveConnection,
BaseOutputPinImpl_Disconnect,
More information about the wine-cvs
mailing list