Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47258 Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/vmr9.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 847dc40b04a..0178f36e635 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -1831,13 +1831,13 @@ static HRESULT WINAPI VMR7WindowlessControl_SetAspectRatioMode(IVMRWindowlessCon return E_NOTIMPL; }
-static HRESULT WINAPI VMR7WindowlessControl_SetVideoClippingWindow(IVMRWindowlessControl *iface, - HWND hwnd) +static HRESULT WINAPI VMR7WindowlessControl_SetVideoClippingWindow(IVMRWindowlessControl *iface, HWND window) { - struct quartz_vmr *This = impl_from_IVMRWindowlessControl(iface); + struct quartz_vmr *filter = impl_from_IVMRWindowlessControl(iface);
- FIXME("(%p/%p)->(...) stub\n", iface, This); - return E_NOTIMPL; + TRACE("iface %p, window %p.\n", iface, window); + + return IVMRWindowlessControl9_SetVideoClippingWindow(&filter->IVMRWindowlessControl9_iface, window); }
static HRESULT WINAPI VMR7WindowlessControl_RepaintVideo(IVMRWindowlessControl *iface,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/transform.c | 71 +++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 40 deletions(-)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index 6a7636c6e48..04ef23e23a3 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -139,8 +139,38 @@ static IPin *transform_get_pin(BaseFilter *iface, unsigned int index) return filter->ppPins[index]; }
+static void transform_destroy(BaseFilter *iface) +{ + TransformFilter *filter = impl_from_BaseFilter(iface); + ULONG i; + + for (i = 0; i < 2; ++i) + { + IPin *peer; + + if (SUCCEEDED(IPin_ConnectedTo(filter->ppPins[i], &peer))) + { + IPin_Disconnect(peer); + IPin_Release(peer); + } + IPin_Disconnect(filter->ppPins[i]); + IPin_Release(filter->ppPins[i]); + } + + CoTaskMemFree(filter->ppPins); + + filter->csReceive.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&filter->csReceive); + FreeMediaType(&filter->pmt); + QualityControlImpl_Destroy(filter->qcimpl); + IUnknown_Release(filter->seekthru_unk); + strmbase_filter_cleanup(&filter->filter); + CoTaskMemFree(filter); +} + static const BaseFilterFuncTable tfBaseFuncTable = { .filter_get_pin = transform_get_pin, + .filter_destroy = transform_destroy, };
static const BaseInputPinFuncTable tf_input_BaseInputFuncTable = { @@ -161,45 +191,6 @@ static const BaseOutputPinFuncTable tf_output_BaseOutputFuncTable = { BaseOutputPinImpl_DecideAllocator, };
-static ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) -{ - TransformFilter *This = impl_from_IBaseFilter(iface); - ULONG refCount = InterlockedDecrement(&This->filter.refCount); - - TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1); - - if (!refCount) - { - ULONG i; - - for (i = 0; i < 2; i++) - { - IPin *pConnectedTo; - - if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[i], &pConnectedTo))) - { - IPin_Disconnect(pConnectedTo); - IPin_Release(pConnectedTo); - } - IPin_Disconnect(This->ppPins[i]); - - IPin_Release(This->ppPins[i]); - } - - CoTaskMemFree(This->ppPins); - - TRACE("Destroying transform filter\n"); - This->csReceive.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->csReceive); - FreeMediaType(&This->pmt); - QualityControlImpl_Destroy(This->qcimpl); - IUnknown_Release(This->seekthru_unk); - strmbase_filter_cleanup(&This->filter); - CoTaskMemFree(This); - } - return refCount; -} - static HRESULT WINAPI TransformFilterImpl_Stop(IBaseFilter *iface) { TransformFilter *This = impl_from_IBaseFilter(iface); @@ -275,7 +266,7 @@ static const IBaseFilterVtbl transform_vtbl = { BaseFilterImpl_QueryInterface, BaseFilterImpl_AddRef, - TransformFilterImpl_Release, + BaseFilterImpl_Release, BaseFilterImpl_GetClassID, TransformFilterImpl_Stop, TransformFilterImpl_Pause,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/avico.c | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c index e2f21d08fc4..67e7f50d987 100644 --- a/dlls/qcap/avico.c +++ b/dlls/qcap/avico.c @@ -147,28 +147,6 @@ static HRESULT WINAPI AVICompressor_QueryInterface(IBaseFilter *iface, REFIID ri
}
-static ULONG WINAPI AVICompressor_Release(IBaseFilter *iface) -{ - AVICompressor *This = impl_from_IBaseFilter(iface); - ULONG ref = InterlockedDecrement(&This->filter.refCount); - - TRACE("(%p) ref=%d\n", This, ref); - - if(!ref) { - if(This->hic) - ICClose(This->hic); - heap_free(This->videoinfo); - if(This->in) - BaseInputPinImpl_Release(&This->in->pin.IPin_iface); - if(This->out) - BaseOutputPinImpl_Release(&This->out->pin.IPin_iface); - strmbase_filter_cleanup(&This->filter); - heap_free(This); - } - - return ref; -} - static HRESULT WINAPI AVICompressor_Stop(IBaseFilter *iface) { AVICompressor *This = impl_from_IBaseFilter(iface); @@ -229,7 +207,7 @@ static HRESULT WINAPI AVICompressor_QueryVendorInfo(IBaseFilter *iface, LPWSTR * static const IBaseFilterVtbl AVICompressorVtbl = { AVICompressor_QueryInterface, BaseFilterImpl_AddRef, - AVICompressor_Release, + BaseFilterImpl_Release, BaseFilterImpl_GetClassID, AVICompressor_Stop, AVICompressor_Pause, @@ -260,8 +238,24 @@ static IPin *avi_compressor_get_pin(BaseFilter *iface, unsigned int index) return ret; }
+static void avi_compressor_destroy(BaseFilter *iface) +{ + AVICompressor *filter = impl_from_BaseFilter(iface); + + if (filter->hic) + ICClose(filter->hic); + heap_free(filter->videoinfo); + if (filter->in) + BaseInputPinImpl_Release(&filter->in->pin.IPin_iface); + if (filter->out) + BaseOutputPinImpl_Release(&filter->out->pin.IPin_iface); + strmbase_filter_cleanup(&filter->filter); + heap_free(filter); +} + static const BaseFilterFuncTable filter_func_table = { .filter_get_pin = avi_compressor_get_pin, + .filter_destroy = avi_compressor_destroy, };
static AVICompressor *impl_from_IPersistPropertyBag(IPersistPropertyBag *iface)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 92 ++++++++++++++++------------------- 1 file changed, 41 insertions(+), 51 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index c347b896849..8bb22981fd5 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -1209,8 +1209,48 @@ static IPin *gstdemux_get_pin(BaseFilter *base, unsigned int index) return pin; }
+static void gstdemux_destroy(BaseFilter *iface) +{ + GSTImpl *filter = impl_from_IBaseFilter(&iface->IBaseFilter_iface); + IPin *connected = NULL; + ULONG pinref; + HRESULT hr; + + CloseHandle(filter->no_more_pads_event); + CloseHandle(filter->push_event); + + /* Don't need to clean up output pins, disconnecting input pin will do that */ + IPin_ConnectedTo((IPin *)&filter->pInputPin, &connected); + if (connected) + { + hr = IPin_Disconnect(connected); + assert(hr == S_OK); + IPin_Release(connected); + hr = IPin_Disconnect(&filter->pInputPin.pin.IPin_iface); + assert(hr == S_OK); + } + pinref = IPin_Release(&filter->pInputPin.pin.IPin_iface); + if (pinref) + { + /* Valgrind could find this, if I kill it here */ + 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->bus) + { + gst_bus_set_sync_handler(filter->bus, NULL, NULL, NULL); + gst_object_unref(filter->bus); + } + strmbase_filter_cleanup(&filter->filter); + CoTaskMemFree(filter); +} + static const BaseFilterFuncTable BaseFuncTable = { .filter_get_pin = gstdemux_get_pin, + .filter_destroy = gstdemux_destroy, };
IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *pUnkOuter, HRESULT *phr) @@ -1263,43 +1303,6 @@ IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *pUnkOuter, HRESULT *phr) return obj; }
-static void GST_Destroy(GSTImpl *This) -{ - IPin *connected = NULL; - ULONG pinref; - HRESULT hr; - - TRACE("Destroying %p\n", This); - - CloseHandle(This->no_more_pads_event); - CloseHandle(This->push_event); - - /* Don't need to clean up output pins, disconnecting input pin will do that */ - IPin_ConnectedTo((IPin *)&This->pInputPin, &connected); - if (connected) { - hr = IPin_Disconnect(connected); - assert(hr == S_OK); - IPin_Release(connected); - hr = IPin_Disconnect(&This->pInputPin.pin.IPin_iface); - assert(hr == S_OK); - } - pinref = IPin_Release(&This->pInputPin.pin.IPin_iface); - if (pinref) { - /* Valgrind could find this, if I kill it here */ - 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->bus) { - gst_bus_set_sync_handler(This->bus, NULL, NULL, NULL); - gst_object_unref(This->bus); - } - strmbase_filter_cleanup(&This->filter); - CoTaskMemFree(This); -} - static HRESULT WINAPI GST_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID *ppv) { GSTImpl *This = impl_from_IBaseFilter(iface); @@ -1328,19 +1331,6 @@ static HRESULT WINAPI GST_QueryInterface(IBaseFilter *iface, REFIID riid, LPVOID return E_NOINTERFACE; }
-static ULONG WINAPI GST_Release(IBaseFilter *iface) -{ - GSTImpl *This = impl_from_IBaseFilter(iface); - ULONG refCount = InterlockedDecrement(&This->filter.refCount); - - TRACE("(%p)->() Release from %d\n", This, refCount + 1); - - if (!refCount) - GST_Destroy(This); - - return refCount; -} - static HRESULT WINAPI GST_Stop(IBaseFilter *iface) { GSTImpl *This = impl_from_IBaseFilter(iface); @@ -1464,7 +1454,7 @@ static HRESULT WINAPI GST_GetState(IBaseFilter *iface, DWORD dwMilliSecsTimeout, static const IBaseFilterVtbl GST_Vtbl = { GST_QueryInterface, BaseFilterImpl_AddRef, - GST_Release, + BaseFilterImpl_Release, BaseFilterImpl_GetClassID, GST_Stop, GST_Pause,
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52842
Your paranoid android.
=== debian9 (32 bit report) ===
quartz: systemclock.c:92: Test failed: Expected about 186f04f150, but got 186f04f150.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- 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 e900b91b418..11ff874b2ca 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,
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52843
Your paranoid android.
=== debian9 (32 bit Chinese:China report) ===
qcap: smartteefilter: Timeout