From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/unix_private.h | 1 + dlls/winegstreamer/unixlib.c | 24 ++++++++++++++++ dlls/winegstreamer/wg_parser.c | 47 +++++++++++-------------------- dlls/winegstreamer/wg_transform.c | 24 ---------------- 4 files changed, 41 insertions(+), 55 deletions(-)
diff --git a/dlls/winegstreamer/unix_private.h b/dlls/winegstreamer/unix_private.h index 81db1728aa8..cb4e5910ebf 100644 --- a/dlls/winegstreamer/unix_private.h +++ b/dlls/winegstreamer/unix_private.h @@ -34,6 +34,7 @@ extern NTSTATUS wg_init_gstreamer(void *args) DECLSPEC_HIDDEN;
extern GstElement *create_element(const char *name, const char *plugin_set) DECLSPEC_HIDDEN; extern GstElement *find_element(GstElementFactoryListType type, GstCaps *src_caps, GstCaps *sink_caps) DECLSPEC_HIDDEN; +extern bool append_element(GstElement *container, GstElement *element, GstElement **first, GstElement **last) DECLSPEC_HIDDEN;
/* wg_format.c */
diff --git a/dlls/winegstreamer/unixlib.c b/dlls/winegstreamer/unixlib.c index cba6d4adf00..8869b092eaa 100644 --- a/dlls/winegstreamer/unixlib.c +++ b/dlls/winegstreamer/unixlib.c @@ -101,6 +101,30 @@ done: return element; }
+bool append_element(GstElement *container, GstElement *element, GstElement **first, GstElement **last) +{ + gchar *name = gst_element_get_name(element); + bool success = false; + + if (!gst_bin_add(GST_BIN(container), element) || + !gst_element_sync_state_with_parent(element) || + (*last && !gst_element_link(*last, element))) + { + GST_ERROR("Failed to link %s element.", name); + } + else + { + GST_DEBUG("Linked %s element %p.", name, element); + if (!*first) + *first = element; + *last = element; + success = true; + } + + g_free(name); + return success; +} + NTSTATUS wg_init_gstreamer(void *arg) { char arg0[] = "wine"; diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 49db4f3118e..37fa14ab1ce 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -787,6 +787,7 @@ static void free_stream(struct wg_parser_stream *stream)
static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user) { + GstElement *first = NULL, *last = NULL; struct wg_parser *parser = user; struct wg_parser_stream *stream; const char *name; @@ -806,62 +807,46 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user)
if (!strcmp(name, "video/x-raw")) { - GstElement *deinterlace, *vconv, *flip, *vconv2; - /* DirectShow can express interlaced video, but downstream filters can't * necessarily consume it. In particular, the video renderer can't. */ - if (!(deinterlace = create_element("deinterlace", "good"))) + if (!(element = create_element("deinterlace", "good")) + || !append_element(parser->container, element, &first, &last)) goto out;
/* decodebin considers many YUV formats to be "raw", but some quartz * filters can't handle those. Also, videoflip can't handle all "raw" * formats either. Add a videoconvert to swap color spaces. */ - if (!(vconv = create_element("videoconvert", "base"))) + if (!(element = create_element("videoconvert", "base")) + || !append_element(parser->container, element, &first, &last)) goto out;
/* GStreamer outputs RGB video top-down, but DirectShow expects bottom-up. */ - if (!(flip = create_element("videoflip", "good"))) + if (!(element = create_element("videoflip", "good")) + || !append_element(parser->container, element, &first, &last)) goto out; + stream->flip = element;
/* videoflip does not support 15 and 16-bit RGB so add a second videoconvert * to do the final conversion. */ - if (!(vconv2 = create_element("videoconvert", "base"))) + if (!(element = create_element("videoconvert", "base")) + || !append_element(parser->container, element, &first, &last)) goto out;
- /* The bin takes ownership of these elements. */ - gst_bin_add(GST_BIN(parser->container), deinterlace); - gst_element_sync_state_with_parent(deinterlace); - gst_bin_add(GST_BIN(parser->container), vconv); - gst_element_sync_state_with_parent(vconv); - gst_bin_add(GST_BIN(parser->container), flip); - gst_element_sync_state_with_parent(flip); - gst_bin_add(GST_BIN(parser->container), vconv2); - gst_element_sync_state_with_parent(vconv2); - - gst_element_link(deinterlace, vconv); - gst_element_link(vconv, flip); - gst_element_link(flip, vconv2); - - stream->post_sink = gst_element_get_static_pad(deinterlace, "sink"); - stream->post_src = gst_element_get_static_pad(vconv2, "src"); - stream->flip = flip; + stream->post_sink = gst_element_get_static_pad(first, "sink"); + stream->post_src = gst_element_get_static_pad(last, "src"); } else if (!strcmp(name, "audio/x-raw")) { - GstElement *convert; - /* Currently our dsound can't handle 64-bit formats or all * surround-sound configurations. Native dsound can't always handle * 64-bit formats either. Add an audioconvert to allow changing bit * depth and channel count. */ - if (!(convert = create_element("audioconvert", "base"))) + if (!(element = create_element("audioconvert", "base")) + || !append_element(parser->container, element, &first, &last)) goto out;
- gst_bin_add(GST_BIN(parser->container), convert); - gst_element_sync_state_with_parent(convert); - - stream->post_sink = gst_element_get_static_pad(convert, "sink"); - stream->post_src = gst_element_get_static_pad(convert, "src"); + stream->post_sink = gst_element_get_static_pad(first, "sink"); + stream->post_src = gst_element_get_static_pad(last, "src"); }
if (stream->post_sink) diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 7977c818b42..30f191c4132 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -267,30 +267,6 @@ NTSTATUS wg_transform_destroy(void *args) return STATUS_SUCCESS; }
-static bool append_element(GstElement *container, GstElement *element, GstElement **first, GstElement **last) -{ - gchar *name = gst_element_get_name(element); - bool success = false; - - if (!gst_bin_add(GST_BIN(container), element) || - !gst_element_sync_state_with_parent(element) || - (*last && !gst_element_link(*last, element))) - { - GST_ERROR("Failed to link %s element.", name); - } - else - { - GST_DEBUG("Linked %s element %p.", name, element); - if (!*first) - *first = element; - *last = element; - success = true; - } - - g_free(name); - return success; -} - static struct wg_sample *transform_request_sample(gsize size, void *context) { struct wg_transform *transform = context;