mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
222 lines
7.8 KiB
Diff
222 lines
7.8 KiB
Diff
From 7ef1cf5893b686861b1704c9b87e2aa7ae29ce11 Mon Sep 17 00:00:00 2001
|
|
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
|
Date: Sun, 19 Sep 2021 13:08:03 +1000
|
|
Subject: [PATCH 15/17] Revert "winegstreamer: Duplicate source shutdown path
|
|
into constructor with leak fixes."
|
|
|
|
This reverts commit 67734bfce31d6032cee1a8980a9022665e9e18fa.
|
|
---
|
|
dlls/winegstreamer/gst_private.h | 1 -
|
|
dlls/winegstreamer/media_source.c | 102 +++++++++++-------------------
|
|
2 files changed, 37 insertions(+), 66 deletions(-)
|
|
|
|
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
|
|
index c5e4367811f..9a753a01b46 100644
|
|
--- a/dlls/winegstreamer/gst_private.h
|
|
+++ b/dlls/winegstreamer/gst_private.h
|
|
@@ -22,7 +22,6 @@
|
|
#define __GST_PRIVATE_INCLUDED__
|
|
|
|
#include <assert.h>
|
|
-#include <limits.h>
|
|
#include <stdarg.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
|
|
index 87959546a7c..64d40fd6fb6 100644
|
|
--- a/dlls/winegstreamer/media_source.c
|
|
+++ b/dlls/winegstreamer/media_source.c
|
|
@@ -817,12 +817,6 @@ static HRESULT new_media_stream(struct media_source *source,
|
|
object->IMFMediaStream_iface.lpVtbl = &media_stream_vtbl;
|
|
object->ref = 1;
|
|
|
|
- if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
|
|
- {
|
|
- free(object);
|
|
- return hr;
|
|
- }
|
|
-
|
|
IMFMediaSource_AddRef(&source->IMFMediaSource_iface);
|
|
object->parent_source = source;
|
|
object->stream_id = stream_id;
|
|
@@ -831,11 +825,20 @@ static HRESULT new_media_stream(struct media_source *source,
|
|
object->eos = FALSE;
|
|
object->wg_stream = wg_stream;
|
|
|
|
+ if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
|
|
+ goto fail;
|
|
+
|
|
TRACE("Created stream object %p.\n", object);
|
|
|
|
*out_stream = object;
|
|
|
|
return S_OK;
|
|
+
|
|
+fail:
|
|
+ WARN("Failed to construct media stream, hr %#x.\n", hr);
|
|
+
|
|
+ IMFMediaStream_Release(&object->IMFMediaStream_iface);
|
|
+ return hr;
|
|
}
|
|
|
|
static HRESULT media_stream_init_desc(struct media_stream *stream)
|
|
@@ -928,16 +931,10 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
|
|
goto done;
|
|
|
|
if (FAILED(hr = IMFStreamDescriptor_GetMediaTypeHandler(stream->descriptor, &type_handler)))
|
|
- {
|
|
- IMFStreamDescriptor_Release(stream->descriptor);
|
|
goto done;
|
|
- }
|
|
|
|
if (FAILED(hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, stream_types[0])))
|
|
- {
|
|
- IMFStreamDescriptor_Release(stream->descriptor);
|
|
goto done;
|
|
- }
|
|
|
|
done:
|
|
if (type_handler)
|
|
@@ -1309,13 +1306,19 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
|
|
|
|
unix_funcs->wg_parser_disconnect(source->wg_parser);
|
|
|
|
- source->read_thread_shutdown = true;
|
|
- WaitForSingleObject(source->read_thread, INFINITE);
|
|
- CloseHandle(source->read_thread);
|
|
+ if (source->read_thread)
|
|
+ {
|
|
+ source->read_thread_shutdown = true;
|
|
+ WaitForSingleObject(source->read_thread, INFINITE);
|
|
+ CloseHandle(source->read_thread);
|
|
+ }
|
|
|
|
- IMFPresentationDescriptor_Release(source->pres_desc);
|
|
- IMFMediaEventQueue_Shutdown(source->event_queue);
|
|
- IMFByteStream_Release(source->byte_stream);
|
|
+ if (source->pres_desc)
|
|
+ IMFPresentationDescriptor_Release(source->pres_desc);
|
|
+ if (source->event_queue)
|
|
+ IMFMediaEventQueue_Shutdown(source->event_queue);
|
|
+ if (source->byte_stream)
|
|
+ IMFByteStream_Release(source->byte_stream);
|
|
|
|
for (i = 0; i < source->stream_count; i++)
|
|
{
|
|
@@ -1323,18 +1326,23 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface)
|
|
|
|
stream->state = STREAM_SHUTDOWN;
|
|
|
|
- IMFMediaEventQueue_Shutdown(stream->event_queue);
|
|
- IMFStreamDescriptor_Release(stream->descriptor);
|
|
- IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
|
|
+ if (stream->event_queue)
|
|
+ IMFMediaEventQueue_Shutdown(stream->event_queue);
|
|
+ if (stream->descriptor)
|
|
+ IMFStreamDescriptor_Release(stream->descriptor);
|
|
+ if (stream->parent_source)
|
|
+ IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
|
|
|
|
IMFMediaStream_Release(&stream->IMFMediaStream_iface);
|
|
}
|
|
|
|
unix_funcs->wg_parser_destroy(source->wg_parser);
|
|
|
|
- free(source->streams);
|
|
+ if (source->stream_count)
|
|
+ free(source->streams);
|
|
|
|
- MFUnlockWorkQueue(source->async_commands_queue);
|
|
+ if (source->async_commands_queue)
|
|
+ MFUnlockWorkQueue(source->async_commands_queue);
|
|
|
|
return S_OK;
|
|
}
|
|
@@ -1359,7 +1367,6 @@ static const IMFMediaSourceVtbl IMFMediaSource_vtbl =
|
|
static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_source **out_media_source)
|
|
{
|
|
IMFStreamDescriptor **descriptors = NULL;
|
|
- unsigned int stream_count = UINT_MAX;
|
|
struct media_source *object;
|
|
UINT64 total_pres_time = 0;
|
|
struct wg_parser *parser;
|
|
@@ -1423,15 +1430,15 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
|
* leak occurs with native. */
|
|
unix_funcs->wg_parser_set_unlimited_buffering(parser);
|
|
|
|
- stream_count = unix_funcs->wg_parser_get_stream_count(parser);
|
|
+ object->stream_count = unix_funcs->wg_parser_get_stream_count(parser);
|
|
|
|
- if (!(object->streams = calloc(stream_count, sizeof(*object->streams))))
|
|
+ if (!(object->streams = calloc(object->stream_count, sizeof(*object->streams))))
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto fail;
|
|
}
|
|
|
|
- for (i = 0; i < stream_count; ++i)
|
|
+ for (i = 0; i < object->stream_count; ++i)
|
|
{
|
|
if (FAILED(hr = new_media_stream(object, unix_funcs->wg_parser_get_stream(parser, i), i, &object->streams[i])))
|
|
goto fail;
|
|
@@ -1439,13 +1446,9 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
|
if (FAILED(hr = media_stream_init_desc(object->streams[i])))
|
|
{
|
|
ERR("Failed to finish initialization of media stream %p, hr %x.\n", object->streams[i], hr);
|
|
- IMFMediaSource_Release(&object->streams[i]->parent_source->IMFMediaSource_iface);
|
|
- IMFMediaEventQueue_Release(object->streams[i]->event_queue);
|
|
- free(object->streams[i]);
|
|
+ IMFMediaStream_Release(&object->streams[i]->IMFMediaStream_iface);
|
|
goto fail;
|
|
}
|
|
-
|
|
- object->stream_count++;
|
|
}
|
|
|
|
/* init presentation descriptor */
|
|
@@ -1482,39 +1485,8 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
|
|
fail:
|
|
WARN("Failed to construct MFMediaSource, hr %#x.\n", hr);
|
|
|
|
- if (descriptors)
|
|
- {
|
|
- for (i = 0; i < object->stream_count; i++)
|
|
- IMFStreamDescriptor_Release(descriptors[i]);
|
|
- free(descriptors);
|
|
- }
|
|
- for (i = 0; i < object->stream_count; i++)
|
|
- {
|
|
- struct media_stream *stream = object->streams[i];
|
|
-
|
|
- IMFMediaEventQueue_Release(stream->event_queue);
|
|
- IMFStreamDescriptor_Release(stream->descriptor);
|
|
- IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface);
|
|
-
|
|
- free(stream);
|
|
- }
|
|
- free(object->streams);
|
|
- if (stream_count != UINT_MAX)
|
|
- unix_funcs->wg_parser_disconnect(object->wg_parser);
|
|
- if (object->read_thread)
|
|
- {
|
|
- object->read_thread_shutdown = true;
|
|
- WaitForSingleObject(object->read_thread, INFINITE);
|
|
- CloseHandle(object->read_thread);
|
|
- }
|
|
- if (object->wg_parser)
|
|
- unix_funcs->wg_parser_destroy(object->wg_parser);
|
|
- if (object->async_commands_queue)
|
|
- MFUnlockWorkQueue(object->async_commands_queue);
|
|
- if (object->event_queue)
|
|
- IMFMediaEventQueue_Release(object->event_queue);
|
|
- IMFByteStream_Release(object->byte_stream);
|
|
- free(object);
|
|
+ free(descriptors);
|
|
+ IMFMediaSource_Release(&object->IMFMediaSource_iface);
|
|
return hr;
|
|
}
|
|
|
|
--
|
|
2.33.0
|
|
|