mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
We had reverted the current upstream winegreamer commits to allow mfplat-streaming-support to be used within staging. Hopefully the patchset in question will be upstream shortly.
222 lines
7.8 KiB
Diff
222 lines
7.8 KiB
Diff
From ca25389c3980c848dc6094f84160079a4cf805f7 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 4/6] 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 c29fc4a2437..c6c99b1dd55 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 95bdb9b488e..01ab626254a 100644
|
|
--- a/dlls/winegstreamer/media_source.c
|
|
+++ b/dlls/winegstreamer/media_source.c
|
|
@@ -733,12 +733,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;
|
|
@@ -747,11 +741,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)
|
|
@@ -844,16 +847,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)
|
|
@@ -1216,13 +1213,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++)
|
|
{
|
|
@@ -1230,18 +1233,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;
|
|
}
|
|
@@ -1266,7 +1274,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;
|
|
@@ -1330,15 +1337,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;
|
|
@@ -1346,13 +1353,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 */
|
|
@@ -1389,39 +1392,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
|
|
|