Module: wine Branch: master Commit: dfb161624f8b159e8b37b68682db58910675b876 URL: https://gitlab.winehq.org/wine/wine/-/commit/dfb161624f8b159e8b37b68682db589...
Author: Anton Baskanov baskanov@gmail.com Date: Sat Oct 29 18:30:07 2022 +0700
winegstreamer: Destroy the sample queue when stopping the quartz transform.
This releases the samples wg_transform might have referenced before destruction.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53342
---
dlls/winegstreamer/quartz_transform.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/dlls/winegstreamer/quartz_transform.c b/dlls/winegstreamer/quartz_transform.c index ccdec9454a6..09ad4862410 100644 --- a/dlls/winegstreamer/quartz_transform.c +++ b/dlls/winegstreamer/quartz_transform.c @@ -78,7 +78,6 @@ static void transform_destroy(struct strmbase_filter *iface) strmbase_sink_cleanup(&filter->sink); strmbase_filter_cleanup(&filter->filter);
- wg_sample_queue_destroy(filter->sample_queue); free(filter); }
@@ -109,9 +108,15 @@ static HRESULT transform_init_stream(struct strmbase_filter *iface) if (!amt_to_wg_format(&filter->source.pin.mt, &output_format)) return E_FAIL;
+ if (FAILED(hr = wg_sample_queue_create(&filter->sample_queue))) + return hr; + filter->transform = wg_transform_create(&input_format, &output_format); if (!filter->transform) + { + wg_sample_queue_destroy(filter->sample_queue); return E_FAIL; + }
hr = IMemAllocator_Commit(filter->source.pAllocator); if (FAILED(hr)) @@ -131,6 +136,7 @@ static HRESULT transform_cleanup_stream(struct strmbase_filter *iface)
EnterCriticalSection(&filter->filter.stream_cs); wg_transform_destroy(filter->transform); + wg_sample_queue_destroy(filter->sample_queue); LeaveCriticalSection(&filter->filter.stream_cs); }
@@ -538,18 +544,11 @@ static const IQualityControlVtbl source_quality_control_vtbl = static HRESULT transform_create(IUnknown *outer, const CLSID *clsid, const struct transform_ops *ops, struct transform **out) { struct transform *object; - HRESULT hr;
object = calloc(1, sizeof(*object)); if (!object) return E_OUTOFMEMORY;
- if (FAILED(hr = wg_sample_queue_create(&object->sample_queue))) - { - free(object); - return hr; - } - strmbase_filter_init(&object->filter, outer, clsid, &filter_ops); strmbase_sink_init(&object->sink, &object->filter, L"In", &sink_ops, NULL); strmbase_source_init(&object->source, &object->filter, L"Out", &source_ops);