wine-staging/patches/mfplat-reverts/0004-Revert-winegstreamer-Duplicate-source-shutdown-path-.patch
Alistair Leslie-Hughes fc40539f6d Re-enable mfplat-streaming-support
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.
2021-09-19 13:13:18 +10:00

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