[PATCH v4 3/5] strmbase: Add callbacks for sink (dis)connection.
Zebediah Figura
z.figura12 at gmail.com
Tue Dec 10 10:35:13 CST 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/qcap/avico.c | 4 +--
dlls/qcap/avimux.c | 4 +--
dlls/qcap/smartteefilter.c | 2 +-
dlls/qedit/samplegrabber.c | 2 +-
dlls/strmbase/pin.c | 56 +++++++++++++++++++++-----------------
dlls/strmbase/renderer.c | 2 +-
dlls/strmbase/transform.c | 2 +-
include/wine/strmbase.h | 9 +++---
8 files changed, 44 insertions(+), 37 deletions(-)
diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c
index debe6bca38..f822d4e461 100644
--- a/dlls/qcap/avico.c
+++ b/dlls/qcap/avico.c
@@ -291,7 +291,7 @@ static HRESULT WINAPI AVICompressorIn_ReceiveConnection(IPin *iface,
hres = fill_format_info(This, (VIDEOINFOHEADER*)pmt->pbFormat);
if(FAILED(hres))
- BasePinImpl_Disconnect(iface);
+ BaseInputPinImpl_Disconnect(iface);
return hres;
}
@@ -302,7 +302,7 @@ static HRESULT WINAPI AVICompressorIn_Disconnect(IPin *iface)
TRACE("(%p)\n", This);
- hres = BasePinImpl_Disconnect(iface);
+ hres = BaseInputPinImpl_Disconnect(iface);
if(FAILED(hres))
return hres;
diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c
index c344ab4726..63e98e8877 100644
--- a/dlls/qcap/avimux.c
+++ b/dlls/qcap/avimux.c
@@ -1469,7 +1469,7 @@ static HRESULT WINAPI AviMuxIn_ReceiveConnection(IPin *iface,
if(SUCCEEDED(hr))
hr = IMemAllocator_Commit(avimuxin->samples_allocator);
if(FAILED(hr)) {
- BasePinImpl_Disconnect(iface);
+ BaseInputPinImpl_Disconnect(iface);
return hr;
}
@@ -1497,7 +1497,7 @@ static HRESULT WINAPI AviMuxIn_Disconnect(IPin *iface)
TRACE("pin %p.\n", avimuxin);
- hr = BasePinImpl_Disconnect(iface);
+ hr = BaseInputPinImpl_Disconnect(iface);
if(FAILED(hr))
return hr;
diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c
index 929929632f..e1fcea55f9 100644
--- a/dlls/qcap/smartteefilter.c
+++ b/dlls/qcap/smartteefilter.c
@@ -87,7 +87,7 @@ static const IPinVtbl SmartTeeFilterInputVtbl = {
BasePinImpl_Release,
BaseInputPinImpl_Connect,
BaseInputPinImpl_ReceiveConnection,
- BasePinImpl_Disconnect,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index f8d90a5c0d..c65ab9caa7 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -523,7 +523,7 @@ static const IPinVtbl sink_vtbl =
BasePinImpl_Release,
BaseInputPinImpl_Connect,
SampleGrabber_In_IPin_ReceiveConnection,
- BasePinImpl_Disconnect,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c
index bcac22eb3c..5255a6c7b0 100644
--- a/dlls/strmbase/pin.c
+++ b/dlls/strmbase/pin.c
@@ -119,31 +119,6 @@ ULONG WINAPI BasePinImpl_Release(IPin *iface)
return IBaseFilter_Release(&pin->filter->IBaseFilter_iface);
}
-HRESULT WINAPI BasePinImpl_Disconnect(IPin * iface)
-{
- struct strmbase_pin *This = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("(%p)->()\n", This);
-
- EnterCriticalSection(&This->filter->csFilter);
- {
- if (This->peer)
- {
- IPin_Release(This->peer);
- This->peer = NULL;
- FreeMediaType(&This->mt);
- ZeroMemory(&This->mt, sizeof(This->mt));
- hr = S_OK;
- }
- else
- hr = S_FALSE;
- }
- LeaveCriticalSection(&This->filter->csFilter);
-
- return hr;
-}
-
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin * iface, IPin ** ppPin)
{
struct strmbase_pin *This = impl_from_IPin(iface);
@@ -685,6 +660,9 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP
}
}
+ if (SUCCEEDED(hr) && This->pFuncsTable->sink_connect)
+ hr = This->pFuncsTable->sink_connect(This, pReceivePin, pmt);
+
if (SUCCEEDED(hr))
{
CopyMediaType(&This->pin.mt, pmt);
@@ -697,6 +675,34 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP
return hr;
}
+HRESULT WINAPI BaseInputPinImpl_Disconnect(IPin *iface)
+{
+ struct strmbase_sink *pin = impl_sink_from_IPin(iface);
+ HRESULT hr;
+
+ TRACE("pin %p.\n", pin);
+
+ EnterCriticalSection(&pin->pin.filter->csFilter);
+
+ if (pin->pin.peer)
+ {
+ if (pin->pFuncsTable->sink_disconnect)
+ pin->pFuncsTable->sink_disconnect(pin);
+
+ IPin_Release(pin->pin.peer);
+ pin->pin.peer = NULL;
+ FreeMediaType(&pin->pin.mt);
+ memset(&pin->pin.mt, 0, sizeof(AM_MEDIA_TYPE));
+ hr = S_OK;
+ }
+ else
+ hr = S_FALSE;
+
+ LeaveCriticalSection(&pin->pin.filter->csFilter);
+
+ return hr;
+}
+
static HRESULT deliver_endofstream(IPin* pin, LPVOID unused)
{
return IPin_EndOfStream( pin );
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index cedcd9a62a..7d8dbdfa93 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -68,7 +68,7 @@ static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
TRACE("iface %p.\n", iface);
EnterCriticalSection(&filter->filter.csFilter);
- hr = BasePinImpl_Disconnect(iface);
+ hr = BaseInputPinImpl_Disconnect(iface);
if (SUCCEEDED(hr))
{
if (filter->pFuncsTable->pfnBreakConnect)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 30ed0006cb..bf74ad0f49 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -427,7 +427,7 @@ static HRESULT WINAPI TransformFilter_InputPin_Disconnect(IPin * iface)
if (pTransform->pFuncsTable->pfnBreakConnect)
pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
- return BasePinImpl_Disconnect(iface);
+ return BaseInputPinImpl_Disconnect(iface);
}
static HRESULT WINAPI TransformFilter_InputPin_BeginFlush(IPin * iface)
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 461214cf08..83ad2e0bd6 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -91,9 +91,10 @@ typedef HRESULT (WINAPI *BaseInputPin_Receive)(struct strmbase_sink *This, IMedi
struct strmbase_sink_ops
{
- BasePinFuncTable base;
- /* Optional */
- BaseInputPin_Receive pfnReceive;
+ BasePinFuncTable base;
+ BaseInputPin_Receive pfnReceive;
+ HRESULT (*sink_connect)(struct strmbase_sink *pin, IPin *peer, const AM_MEDIA_TYPE *mt);
+ void (*sink_disconnect)(struct strmbase_sink *pin);
};
/* Base Pin */
@@ -102,7 +103,7 @@ LONG WINAPI BasePinImpl_GetMediaTypeVersion(struct strmbase_pin *pin);
HRESULT WINAPI BasePinImpl_QueryInterface(IPin *iface, REFIID iid, void **out);
ULONG WINAPI BasePinImpl_AddRef(IPin *iface);
ULONG WINAPI BasePinImpl_Release(IPin *iface);
-HRESULT WINAPI BasePinImpl_Disconnect(IPin * iface);
+HRESULT WINAPI BaseInputPinImpl_Disconnect(IPin * iface);
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin * iface, IPin ** ppPin);
HRESULT WINAPI BasePinImpl_ConnectionMediaType(IPin * iface, AM_MEDIA_TYPE * pmt);
HRESULT WINAPI BasePinImpl_QueryPinInfo(IPin * iface, PIN_INFO * pInfo);
--
2.24.0
More information about the wine-devel
mailing list