winegstreamer: Share source pin and filter reference counts.

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-17 20:41:58 -05:00 committed by Alexandre Julliard
parent 8d249e1863
commit 8983528f60
1 changed files with 44 additions and 55 deletions

View File

@ -1688,41 +1688,16 @@ static HRESULT WINAPI GSTOutPin_QueryInterface(IPin *iface, REFIID riid, void **
return E_NOINTERFACE;
}
static ULONG WINAPI GSTOutPin_AddRef(IPin *iface)
{
GSTOutPin *pin = impl_source_from_IPin(iface);
return IBaseFilter_AddRef(pin->pin.pin.pinInfo.pFilter);
}
static ULONG WINAPI GSTOutPin_Release(IPin *iface)
{
GSTOutPin *This = impl_source_from_IPin(iface);
ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
TRACE("(%p)->() Release from %d\n", This, refCount + 1);
mark_wine_thread();
if (!refCount) {
if (This->their_src) {
if (This->flipfilter) {
gst_pad_unlink(This->their_src, This->flip_sink);
gst_pad_unlink(This->flip_src, This->my_sink);
gst_object_unref(This->flip_src);
gst_object_unref(This->flip_sink);
This->flipfilter = NULL;
This->flip_src = This->flip_sink = NULL;
} else
gst_pad_unlink(This->their_src, This->my_sink);
gst_object_unref(This->their_src);
}
gst_object_unref(This->my_sink);
CloseHandle(This->caps_event);
DeleteMediaType(This->pmt);
FreeMediaType(&This->pin.pin.mtCurrent);
gst_segment_free(This->segment);
if(This->gstpool)
gst_object_unref(This->gstpool);
if (This->pin.pAllocator)
IMemAllocator_Release(This->pin.pAllocator);
CoTaskMemFree(This);
return 0;
}
return refCount;
GSTOutPin *pin = impl_source_from_IPin(iface);
return IBaseFilter_Release(pin->pin.pin.pinInfo.pFilter);
}
static HRESULT WINAPI GSTOutPin_CheckMediaType(BasePin *base, const AM_MEDIA_TYPE *amt)
@ -1780,30 +1755,47 @@ static HRESULT WINAPI GSTOutPin_DecideAllocator(BaseOutputPin *base, IMemInputPi
return hr;
}
static HRESULT break_source_connection(BaseOutputPin *This)
static void free_source_pin(GSTOutPin *pin)
{
HRESULT hr;
TRACE("(%p)->()\n", This);
EnterCriticalSection(This->pin.pCritSec);
if (!This->pin.pConnectedTo || !This->pMemInputPin)
hr = VFW_E_NOT_CONNECTED;
else
EnterCriticalSection(pin->pin.pin.pCritSec);
if (pin->pin.pin.pConnectedTo)
{
hr = IMemAllocator_Decommit(This->pAllocator);
if (SUCCEEDED(hr))
hr = IPin_Disconnect(This->pin.pConnectedTo);
IPin_Disconnect((IPin *)This);
if (SUCCEEDED(IMemAllocator_Decommit(pin->pin.pAllocator)))
IPin_Disconnect(pin->pin.pin.pConnectedTo);
IPin_Disconnect(&pin->pin.pin.IPin_iface);
}
LeaveCriticalSection(This->pin.pCritSec);
LeaveCriticalSection(pin->pin.pin.pCritSec);
return hr;
if (pin->their_src)
{
if (pin->flipfilter)
{
gst_pad_unlink(pin->their_src, pin->flip_sink);
gst_pad_unlink(pin->flip_src, pin->my_sink);
gst_object_unref(pin->flip_src);
gst_object_unref(pin->flip_sink);
pin->flipfilter = NULL;
pin->flip_src = pin->flip_sink = NULL;
}
else
gst_pad_unlink(pin->their_src, pin->my_sink);
gst_object_unref(pin->their_src);
}
gst_object_unref(pin->my_sink);
CloseHandle(pin->caps_event);
DeleteMediaType(pin->pmt);
FreeMediaType(&pin->pin.pin.mtCurrent);
gst_segment_free(pin->segment);
if (pin->gstpool)
gst_object_unref(pin->gstpool);
if (pin->pin.pAllocator)
IMemAllocator_Release(pin->pin.pAllocator);
CoTaskMemFree(pin);
}
static const IPinVtbl GST_OutputPin_Vtbl = {
GSTOutPin_QueryInterface,
BasePinImpl_AddRef,
GSTOutPin_AddRef,
GSTOutPin_Release,
BaseOutputPinImpl_Connect,
BaseOutputPinImpl_ReceiveConnection,
@ -1857,7 +1849,6 @@ static HRESULT GST_AddPin(GSTImpl *This, const PIN_INFO *piOutput, const AM_MEDI
static HRESULT GST_RemoveOutputPins(GSTImpl *This)
{
HRESULT hr;
ULONG i;
TRACE("(%p)\n", This);
@ -1871,11 +1862,9 @@ static HRESULT GST_RemoveOutputPins(GSTImpl *This)
gst_object_unref(This->their_sink);
This->my_src = This->their_sink = NULL;
for (i = 0; i < This->cStreams; i++) {
hr = break_source_connection(&This->ppPins[i]->pin);
TRACE("Disconnect: %08x\n", hr);
IPin_Release(&This->ppPins[i]->pin.pin.IPin_iface);
}
for (i = 0; i < This->cStreams; ++i)
free_source_pin(This->ppPins[i]);
This->cStreams = 0;
CoTaskMemFree(This->ppPins);
This->ppPins = NULL;