[PATCH v2 5/6] winegstreamer: Merge wg_*_parser_create functions.

Derek Lesho dlesho at codeweavers.com
Fri Sep 17 14:58:57 CDT 2021


Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
 dlls/winegstreamer/gst_private.h   | 13 +++++--
 dlls/winegstreamer/media_source.c  |  2 +-
 dlls/winegstreamer/quartz_parser.c | 12 +++---
 dlls/winegstreamer/wg_parser.c     | 62 ++++++++++--------------------
 4 files changed, 37 insertions(+), 52 deletions(-)

diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 22d9547ed72..a266984d969 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -156,12 +156,17 @@ struct wg_parser_event
 };
 C_ASSERT(sizeof(struct wg_parser_event) == 40);
 
+enum wg_parser_type
+{
+    WG_DECODEBIN_PARSER,
+    WG_AVI_PARSER,
+    WG_MPEG_AUDIO_PARSER,
+    WG_WAVE_PARSER,
+};
+
 struct unix_funcs
 {
-    struct wg_parser *(CDECL *wg_decodebin_parser_create)(void);
-    struct wg_parser *(CDECL *wg_avi_parser_create)(void);
-    struct wg_parser *(CDECL *wg_mpeg_audio_parser_create)(void);
-    struct wg_parser *(CDECL *wg_wave_parser_create)(void);
+    struct wg_parser *(CDECL *wg_parser_create)(enum wg_parser_type type);
     void (CDECL *wg_parser_destroy)(struct wg_parser *parser);
 
     HRESULT (CDECL *wg_parser_connect)(struct wg_parser *parser, uint64_t file_size);
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index 21e5f6c5d5b..efe8f7b45cb 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_decodebin_parser_create()))
+    if (!(parser = unix_funcs->wg_parser_create(WG_DECODEBIN_PARSER)))
     {
         hr = E_OUTOFMEMORY;
         goto fail;
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index 20000f63eb7..a89d3ec7baa 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -59,7 +59,7 @@ struct parser
 
     HANDLE read_thread;
 
-    struct wg_parser * (*parser_create)(void);
+    enum wg_parser_type parser_type;
     BOOL (*init_gst)(struct parser *filter);
     HRESULT (*source_query_accept)(struct parser_source *pin, const AM_MEDIA_TYPE *mt);
     HRESULT (*source_get_media_type)(struct parser_source *pin, unsigned int index, AM_MEDIA_TYPE *mt);
@@ -974,7 +974,7 @@ static HRESULT parser_sink_connect(struct strmbase_sink *iface, IPin *peer, cons
 
     IAsyncReader_Length(filter->reader, &file_size, &unused);
 
-    if (!(filter->wg_parser = filter->parser_create()))
+    if (!(filter->wg_parser = unix_funcs->wg_parser_create(filter->parser_type)))
     {
         hr = E_OUTOFMEMORY;
         goto err;
@@ -1120,7 +1120,7 @@ HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    object->parser_create = unix_funcs->wg_decodebin_parser_create;
+    object->parser_type = WG_DECODEBIN_PARSER;
 
     strmbase_filter_init(&object->filter, outer, &CLSID_decodebin_parser, &filter_ops);
     strmbase_sink_init(&object->sink, &object->filter, L"input pin", &sink_ops, NULL);
@@ -1648,7 +1648,7 @@ HRESULT wave_parser_create(IUnknown *outer, IUnknown **out)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    object->parser_create = unix_funcs->wg_wave_parser_create;
+    object->parser_type = WG_WAVE_PARSER;
 
     strmbase_filter_init(&object->filter, outer, &CLSID_WAVEParser, &filter_ops);
     strmbase_sink_init(&object->sink, &object->filter, L"input pin", &wave_parser_sink_ops, NULL);
@@ -1733,7 +1733,7 @@ HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    object->parser_create = unix_funcs->wg_avi_parser_create;
+    object->parser_type = WG_AVI_PARSER;
 
     strmbase_filter_init(&object->filter, outer, &CLSID_AviSplitter, &filter_ops);
     strmbase_sink_init(&object->sink, &object->filter, L"input pin", &avi_splitter_sink_ops, NULL);
@@ -1838,7 +1838,7 @@ HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    object->parser_create = unix_funcs->wg_mpeg_audio_parser_create;
+    object->parser_type = WG_MPEG_AUDIO_PARSER;
 
     strmbase_filter_init(&object->filter, outer, &CLSID_MPEG1Splitter, &mpeg_splitter_ops);
     strmbase_sink_init(&object->sink, &object->filter, L"Input", &mpeg_splitter_sink_ops, NULL);
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index f751463a548..a91fa3a3ed6 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -1622,13 +1622,32 @@ static BOOL wave_parser_init_gst(struct wg_parser *parser)
     return TRUE;
 }
 
-static struct wg_parser *wg_parser_create(void)
+static struct wg_parser * CDECL wg_parser_create(enum wg_parser_type type)
 {
     struct wg_parser *parser;
 
     if (!(parser = calloc(1, sizeof(*parser))))
         return NULL;
 
+    switch (type)
+    {
+        case WG_DECODEBIN_PARSER:
+            parser->init_gst = decodebin_parser_init_gst;
+            break;
+        case WG_AVI_PARSER:
+            parser->init_gst = avi_parser_init_gst;
+            break;
+        case WG_MPEG_AUDIO_PARSER:
+            parser->init_gst = mpeg_audio_parser_init_gst;
+            break;
+        case WG_WAVE_PARSER:
+            parser->init_gst = wave_parser_init_gst;
+            break;
+        default:
+            free(parser);
+            return NULL;
+    }
+
     pthread_mutex_init(&parser->mutex, NULL);
     pthread_cond_init(&parser->state_cond, NULL);
     pthread_cond_init(&parser->read_cond, NULL);
@@ -1638,42 +1657,6 @@ static struct wg_parser *wg_parser_create(void)
     return parser;
 }
 
-static struct wg_parser * CDECL wg_decodebin_parser_create(void)
-{
-    struct wg_parser *parser;
-
-    if ((parser = wg_parser_create()))
-        parser->init_gst = decodebin_parser_init_gst;
-    return parser;
-}
-
-static struct wg_parser * CDECL wg_avi_parser_create(void)
-{
-    struct wg_parser *parser;
-
-    if ((parser = wg_parser_create()))
-        parser->init_gst = avi_parser_init_gst;
-    return parser;
-}
-
-static struct wg_parser * CDECL wg_mpeg_audio_parser_create(void)
-{
-    struct wg_parser *parser;
-
-    if ((parser = wg_parser_create()))
-        parser->init_gst = mpeg_audio_parser_init_gst;
-    return parser;
-}
-
-static struct wg_parser * CDECL wg_wave_parser_create(void)
-{
-    struct wg_parser *parser;
-
-    if ((parser = wg_parser_create()))
-        parser->init_gst = wave_parser_init_gst;
-    return parser;
-}
-
 static void CDECL wg_parser_destroy(struct wg_parser *parser)
 {
     unsigned int i;
@@ -1722,10 +1705,7 @@ static void CDECL wg_parser_destroy(struct wg_parser *parser)
 
 static const struct unix_funcs funcs =
 {
-    wg_decodebin_parser_create,
-    wg_avi_parser_create,
-    wg_mpeg_audio_parser_create,
-    wg_wave_parser_create,
+    wg_parser_create,
     wg_parser_destroy,
 
     wg_parser_connect,
-- 
2.33.0




More information about the wine-devel mailing list