[PATCH v2 6/6] winegstreamer: Merge wg_parser_create and wg_parser_connect.
Derek Lesho
dlesho at codeweavers.com
Fri Sep 17 14:58:58 CDT 2021
Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
v2: Split patch three into patches 3-6.
---
dlls/winegstreamer/gst_private.h | 4 +-
dlls/winegstreamer/media_source.c | 5 +-
dlls/winegstreamer/quartz_parser.c | 12 ++--
dlls/winegstreamer/wg_parser.c | 111 +++++++++++++++--------------
4 files changed, 64 insertions(+), 68 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index a266984d969..1d0160cab2f 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -166,11 +166,9 @@ enum wg_parser_type
struct unix_funcs
{
- struct wg_parser *(CDECL *wg_parser_create)(enum wg_parser_type type);
+ struct wg_parser *(CDECL *wg_parser_create)(enum wg_parser_type type, uint64_t file_size);
void (CDECL *wg_parser_destroy)(struct wg_parser *parser);
- HRESULT (CDECL *wg_parser_connect)(struct wg_parser *parser, uint64_t file_size);
-
void (CDECL *wg_parser_begin_flush)(struct wg_parser *parser);
void (CDECL *wg_parser_end_flush)(struct wg_parser *parser);
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index efe8f7b45cb..fa1ed002404 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -1324,7 +1324,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
if (FAILED(hr = MFAllocateWorkQueue(&object->async_commands_queue)))
goto fail;
- if (!(parser = unix_funcs->wg_parser_create(WG_DECODEBIN_PARSER)))
+ if (!(parser = unix_funcs->wg_parser_create(WG_DECODEBIN_PARSER, file_size)))
{
hr = E_OUTOFMEMORY;
goto fail;
@@ -1335,9 +1335,6 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
object->state = SOURCE_OPENING;
- if (FAILED(hr = unix_funcs->wg_parser_connect(parser, file_size)))
- goto fail;
-
/* In Media Foundation, sources may read from any media source stream
* without fear of blocking due to buffering limits on another. Trailmakers,
* a Unity3D Engine game, only reads one sample from the audio stream (and
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index a89d3ec7baa..63da8b656ed 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -974,18 +974,14 @@ static HRESULT parser_sink_connect(struct strmbase_sink *iface, IPin *peer, cons
IAsyncReader_Length(filter->reader, &file_size, &unused);
- if (!(filter->wg_parser = unix_funcs->wg_parser_create(filter->parser_type)))
+ if (!(filter->wg_parser = unix_funcs->wg_parser_create(filter->parser_type, file_size)))
{
hr = E_OUTOFMEMORY;
goto err;
}
- filter->sink_connected = true;
filter->read_thread = CreateThread(NULL, 0, read_thread, filter, 0, NULL);
- if (FAILED(hr = unix_funcs->wg_parser_connect(filter->wg_parser, file_size)))
- goto err;
-
if (!filter->init_gst(filter))
{
hr = E_FAIL;
@@ -1000,6 +996,8 @@ static HRESULT parser_sink_connect(struct strmbase_sink *iface, IPin *peer, cons
pin->seek.llCurrent = 0;
}
+ filter->sink_connected = true;
+
return S_OK;
err:
GST_RemoveOutputPins(filter);
@@ -1553,9 +1551,6 @@ static HRESULT GST_RemoveOutputPins(struct parser *This)
unix_funcs->wg_parser_destroy(This->wg_parser);
- /* read_thread() needs to stay alive to service any read requests GStreamer
- * sends, so we can only shut it down after GStreamer stops. */
- This->sink_connected = false;
WaitForSingleObject(This->read_thread, INFINITE);
CloseHandle(This->read_thread);
@@ -1568,6 +1563,7 @@ static HRESULT GST_RemoveOutputPins(struct parser *This)
This->source_count = 0;
free(This->sources);
This->sources = NULL;
+ This->sink_connected = false;
BaseFilterImpl_IncrementPinVersion(&This->filter);
return S_OK;
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index a91fa3a3ed6..f6ee16c5c21 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -45,8 +45,6 @@ GST_DEBUG_CATEGORY_STATIC(wine);
struct wg_parser
{
- BOOL (*init_gst)(struct wg_parser *parser);
-
struct wg_parser_stream **streams;
unsigned int stream_count;
@@ -1470,37 +1468,6 @@ static GstBusSyncReply bus_handler_cb(GstBus *bus, GstMessage *msg, gpointer use
return GST_BUS_DROP;
}
-static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_size)
-{
- if (!parser->bus)
- {
- parser->bus = gst_bus_new();
- gst_bus_set_sync_handler(parser->bus, bus_handler_cb, parser, NULL);
- }
-
- parser->container = gst_bin_new(NULL);
- gst_element_set_bus(parser->container, parser->bus);
-
- if (!(parser->appsrc = create_element("appsrc", "base")))
- return E_FAIL;
- gst_bin_add(GST_BIN(parser->container), parser->appsrc);
-
- g_object_set(parser->appsrc, "stream-type", GST_APP_STREAM_TYPE_RANDOM_ACCESS, NULL);
- g_object_set(parser->appsrc, "size", file_size, NULL);
- g_signal_connect(parser->appsrc, "need-data", G_CALLBACK(src_need_data), parser);
- g_signal_connect(parser->appsrc, "seek-data", G_CALLBACK(src_seek_data), parser);
-
- parser->read_request.offset = 0;
- parser->error = false;
-
- if (!parser->init_gst(parser))
- return E_FAIL;
-
- gst_element_set_state(parser->container, GST_STATE_PAUSED);
-
- return S_OK;
-}
-
static BOOL decodebin_parser_init_gst(struct wg_parser *parser)
{
GstElement *element;
@@ -1622,36 +1589,80 @@ static BOOL wave_parser_init_gst(struct wg_parser *parser)
return TRUE;
}
-static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type)
+static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type, uint64_t file_size)
{
struct wg_parser *parser;
+ BOOL ret;
if (!(parser = calloc(1, sizeof(*parser))))
return NULL;
+ if (!(parser->appsrc = create_element("appsrc", "base")))
+ {
+ free(parser);
+ return NULL;
+ }
+
+ pthread_mutex_init(&parser->mutex, NULL);
+ pthread_cond_init(&parser->state_cond, NULL);
+ pthread_cond_init(&parser->read_cond, NULL);
+ parser->flushing = true;
+
+ if (!parser->bus)
+ {
+ parser->bus = gst_bus_new();
+ gst_bus_set_sync_handler(parser->bus, bus_handler_cb, parser, NULL);
+ }
+
+ parser->container = gst_bin_new(NULL);
+ gst_element_set_bus(parser->container, parser->bus);
+
+ gst_bin_add(GST_BIN(parser->container), parser->appsrc);
+
+ g_object_set(parser->appsrc, "stream-type", GST_APP_STREAM_TYPE_RANDOM_ACCESS, NULL);
+ g_object_set(parser->appsrc, "size", file_size, NULL);
+ g_signal_connect(parser->appsrc, "need-data", G_CALLBACK(src_need_data), parser);
+ g_signal_connect(parser->appsrc, "seek-data", G_CALLBACK(src_seek_data), parser);
+
+ parser->read_request.offset = 0;
+ parser->error = false;
+
switch (type)
{
case WG_DECODEBIN_PARSER:
- parser->init_gst = decodebin_parser_init_gst;
+ ret = decodebin_parser_init_gst(parser);
break;
case WG_AVI_PARSER:
- parser->init_gst = avi_parser_init_gst;
+ ret = avi_parser_init_gst(parser);
break;
case WG_MPEG_AUDIO_PARSER:
- parser->init_gst = mpeg_audio_parser_init_gst;
+ ret = mpeg_audio_parser_init_gst(parser);
break;
case WG_WAVE_PARSER:
- parser->init_gst = wave_parser_init_gst;
+ ret = wave_parser_init_gst(parser);
break;
default:
- free(parser);
- return NULL;
+ ret = FALSE;
+ break;
}
- pthread_mutex_init(&parser->mutex, NULL);
- pthread_cond_init(&parser->state_cond, NULL);
- pthread_cond_init(&parser->read_cond, NULL);
- parser->flushing = true;
+ if (!ret)
+ {
+ gst_element_set_bus(parser->container, NULL);
+ gst_object_unref(parser->container);
+
+ gst_bus_set_sync_handler(parser->bus, NULL, NULL, NULL);
+ gst_object_unref(parser->bus);
+
+ pthread_mutex_destroy(&parser->mutex);
+ pthread_cond_destroy(&parser->state_cond);
+ pthread_cond_destroy(&parser->read_cond);
+
+ free(parser);
+ return NULL;
+ }
+
+ gst_element_set_state(parser->container, GST_STATE_PAUSED);
GST_DEBUG("Created winegstreamer parser %p.\n", parser);
return parser;
@@ -1679,19 +1690,15 @@ static void CDECL wg_parser_destroy(struct wg_parser *parser)
}
pthread_mutex_unlock(&parser->mutex);
- if (parser->container)
- gst_element_set_state(parser->container, GST_STATE_NULL);
+ gst_element_set_state(parser->container, GST_STATE_NULL);
for (i = 0; i < parser->stream_count; ++i)
free_stream(parser->streams[i]);
free(parser->streams);
- if (parser->container)
- {
- gst_element_set_bus(parser->container, NULL);
- gst_object_unref(parser->container);
- }
+ gst_element_set_bus(parser->container, NULL);
+ gst_object_unref(parser->container);
gst_bus_set_sync_handler(parser->bus, NULL, NULL, NULL);
gst_object_unref(parser->bus);
@@ -1708,8 +1715,6 @@ static const struct unix_funcs funcs =
wg_parser_create,
wg_parser_destroy,
- wg_parser_connect,
-
wg_parser_begin_flush,
wg_parser_end_flush,
--
2.33.0
More information about the wine-devel
mailing list