Zebediah Figura : wineqtdecoder/qtsplitter: Use BaseFilterImpl_Release().
Alexandre Julliard
julliard at winehq.org
Mon May 27 14:50:19 CDT 2019
Module: wine
Branch: master
Commit: fefdc3232a3e68b512e5e8f097786a238be0dbe2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=fefdc3232a3e68b512e5e8f097786a238be0dbe2
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Sat May 25 15:21:25 2019 -0500
wineqtdecoder/qtsplitter: Use BaseFilterImpl_Release().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wineqtdecoder/qtsplitter.c | 133 ++++++++++++++++++----------------------
1 file changed, 60 insertions(+), 73 deletions(-)
diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c
index e900b91..11ff874 100644
--- a/dlls/wineqtdecoder/qtsplitter.c
+++ b/dlls/wineqtdecoder/qtsplitter.c
@@ -233,8 +233,67 @@ static IPin *qt_splitter_get_pin(BaseFilter *base, unsigned int index)
return NULL;
}
+static void qt_splitter_destroy(BaseFilter *iface)
+{
+ QTSplitter *filter = impl_from_BaseFilter(iface);
+ IPin *peer = NULL;
+ ULONG pinref;
+
+ EnterCriticalSection(&filter->csReceive);
+ /* Don't need to clean up output pins, disconnecting input pin will do that */
+ IPin_ConnectedTo(&filter->pInputPin.pin.IPin_iface, &peer);
+ if (peer)
+ {
+ IPin_Disconnect(peer);
+ IPin_Release(peer);
+ }
+ pinref = IPin_Release(&filter->pInputPin.pin.IPin_iface);
+ if (pinref)
+ {
+ ERR("pinref should be null, is %u, destroying anyway\n", pinref);
+ assert((LONG)pinref > 0);
+
+ while (pinref)
+ pinref = IPin_Release(&filter->pInputPin.pin.IPin_iface);
+ }
+
+ if (filter->pQTMovie)
+ {
+ DisposeMovie(filter->pQTMovie);
+ filter->pQTMovie = NULL;
+ }
+ if (filter->vContext)
+ QTVisualContextRelease(filter->vContext);
+ if (filter->aSession)
+ MovieAudioExtractionEnd(filter->aSession);
+
+ ExitMoviesOnThread();
+ LeaveCriticalSection(&filter->csReceive);
+
+ if (filter->loaderThread)
+ {
+ WaitForSingleObject(filter->loaderThread, INFINITE);
+ CloseHandle(filter->loaderThread);
+ }
+ if (filter->splitterThread)
+ {
+ SetEvent(filter->runEvent);
+ WaitForSingleObject(filter->splitterThread, INFINITE);
+ CloseHandle(filter->splitterThread);
+ }
+
+ CloseHandle(filter->runEvent);
+
+ filter->csReceive.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&filter->csReceive);
+ strmbase_filter_cleanup(&filter->filter);
+
+ CoTaskMemFree(filter);
+}
+
static const BaseFilterFuncTable BaseFuncTable = {
.filter_get_pin = qt_splitter_get_pin,
+ .filter_destroy = qt_splitter_destroy,
};
IUnknown * CALLBACK QTSplitter_create(IUnknown *punkout, HRESULT *phr)
@@ -283,65 +342,6 @@ IUnknown * CALLBACK QTSplitter_create(IUnknown *punkout, HRESULT *phr)
return obj;
}
-static void QT_Destroy(QTSplitter *This)
-{
- IPin *connected = NULL;
- ULONG pinref;
-
- TRACE("Destroying\n");
-
- EnterCriticalSection(&This->csReceive);
- /* Don't need to clean up output pins, disconnecting input pin will do that */
- IPin_ConnectedTo(&This->pInputPin.pin.IPin_iface, &connected);
- if (connected)
- {
- IPin_Disconnect(connected);
- IPin_Release(connected);
- }
- pinref = IPin_Release(&This->pInputPin.pin.IPin_iface);
- if (pinref)
- {
- ERR("pinref should be null, is %u, destroying anyway\n", pinref);
- assert((LONG)pinref > 0);
-
- while (pinref)
- pinref = IPin_Release(&This->pInputPin.pin.IPin_iface);
- }
-
- if (This->pQTMovie)
- {
- DisposeMovie(This->pQTMovie);
- This->pQTMovie = NULL;
- }
- if (This->vContext)
- QTVisualContextRelease(This->vContext);
- if (This->aSession)
- MovieAudioExtractionEnd(This->aSession);
-
- ExitMoviesOnThread();
- LeaveCriticalSection(&This->csReceive);
-
- if (This->loaderThread)
- {
- WaitForSingleObject(This->loaderThread, INFINITE);
- CloseHandle(This->loaderThread);
- }
- if (This->splitterThread)
- {
- SetEvent(This->runEvent);
- WaitForSingleObject(This->splitterThread, INFINITE);
- CloseHandle(This->splitterThread);
- }
-
- CloseHandle(This->runEvent);
-
- This->csReceive.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection(&This->csReceive);
- strmbase_filter_cleanup(&This->filter);
-
- CoTaskMemFree(This);
-}
-
static HRESULT WINAPI QT_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv)
{
QTSplitter *This = impl_from_IBaseFilter(iface);
@@ -373,19 +373,6 @@ static HRESULT WINAPI QT_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID
return E_NOINTERFACE;
}
-static ULONG WINAPI QT_Release(IBaseFilter *iface)
-{
- QTSplitter *This = impl_from_IBaseFilter(iface);
- ULONG refCount = InterlockedDecrement(&This->filter.refCount);
-
- TRACE("(%p)->() Release from %d\n", This, refCount + 1);
-
- if (!refCount)
- QT_Destroy(This);
-
- return refCount;
-}
-
static HRESULT WINAPI QT_Stop(IBaseFilter *iface)
{
QTSplitter *This = impl_from_IBaseFilter(iface);
@@ -791,7 +778,7 @@ static HRESULT WINAPI QT_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout,
static const IBaseFilterVtbl QT_Vtbl = {
QT_QueryInterface,
BaseFilterImpl_AddRef,
- QT_Release,
+ BaseFilterImpl_Release,
BaseFilterImpl_GetClassID,
QT_Stop,
QT_Pause,
More information about the wine-cvs
mailing list