Supersedes https://gitlab.winehq.org/wine/wine/-/merge_requests/5090
-- v2: winegstreamer: Append an optional parser before decoders.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wg_transform.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 516b28e82e2..c252142d13d 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -338,7 +338,7 @@ NTSTATUS wg_transform_create(void *args) struct wg_format output_format = *params->output_format; struct wg_format input_format = *params->input_format; GstElement *first = NULL, *last = NULL, *element; - GstCaps *raw_caps = NULL, *src_caps = NULL; + GstCaps *sink_caps = NULL, *src_caps = NULL; NTSTATUS status = STATUS_UNSUCCESSFUL; GstPadTemplate *template = NULL; struct wg_transform *transform; @@ -395,7 +395,7 @@ NTSTATUS wg_transform_create(void *args) * raw output media type should be enough. */ media_type = gst_structure_get_name(gst_caps_get_structure(transform->output_caps, 0)); - if (!(raw_caps = gst_caps_new_empty_simple(media_type))) + if (!(sink_caps = gst_caps_new_empty_simple(media_type))) goto out;
switch (input_format.major_type) @@ -408,12 +408,9 @@ NTSTATUS wg_transform_create(void *args) case WG_MAJOR_TYPE_VIDEO_INDEO: case WG_MAJOR_TYPE_VIDEO_WMV: case WG_MAJOR_TYPE_VIDEO_MPEG1: - if (!(element = find_element(GST_ELEMENT_FACTORY_TYPE_DECODER, src_caps, raw_caps)) + if (!(element = find_element(GST_ELEMENT_FACTORY_TYPE_DECODER, src_caps, sink_caps)) || !append_element(transform->container, element, &first, &last)) - { - gst_caps_unref(raw_caps); goto out; - } break;
case WG_MAJOR_TYPE_AUDIO: @@ -421,12 +418,9 @@ NTSTATUS wg_transform_create(void *args) break; case WG_MAJOR_TYPE_UNKNOWN: GST_FIXME("Format %u not implemented!", input_format.major_type); - gst_caps_unref(raw_caps); goto out; }
- gst_caps_unref(raw_caps); - switch (output_format.major_type) { case WG_MAJOR_TYPE_AUDIO: @@ -507,6 +501,7 @@ NTSTATUS wg_transform_create(void *args) goto out;
gst_caps_unref(src_caps); + gst_caps_unref(sink_caps);
GST_INFO("Created winegstreamer transform %p.", transform); params->transform = (wg_transform_t)(ULONG_PTR)transform; @@ -521,6 +516,8 @@ out: gst_object_unref(transform->my_src); if (src_caps) gst_caps_unref(src_caps); + if (sink_caps) + gst_caps_unref(sink_caps); if (transform->allocator) wg_allocator_destroy(transform->allocator); if (transform->drain_query)
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/quartz_transform.c | 3 ++- dlls/winegstreamer/unixlib.h | 1 + dlls/winegstreamer/wg_transform.c | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/dlls/winegstreamer/quartz_transform.c b/dlls/winegstreamer/quartz_transform.c index 5189c0b22d3..760b46950bc 100644 --- a/dlls/winegstreamer/quartz_transform.c +++ b/dlls/winegstreamer/quartz_transform.c @@ -99,7 +99,8 @@ static HRESULT transform_init_stream(struct strmbase_filter *iface) { struct transform *filter = impl_from_strmbase_filter(iface); struct wg_format input_format, output_format; - struct wg_transform_attrs attrs = {0}; + /* FIXME: GStreamer mpegvideoparse causes some test failures when inserted */ + struct wg_transform_attrs attrs = {.no_parser = TRUE}; HRESULT hr;
if (filter->source.pin.peer) diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index 4ec9fce515e..b1975bae182 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -338,6 +338,7 @@ struct wg_transform_attrs UINT32 input_queue_length; BOOL allow_size_change; BOOL low_latency; + BOOL no_parser; };
struct wg_transform_create_params diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index c252142d13d..8d56f05b7aa 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -338,7 +338,7 @@ NTSTATUS wg_transform_create(void *args) struct wg_format output_format = *params->output_format; struct wg_format input_format = *params->input_format; GstElement *first = NULL, *last = NULL, *element; - GstCaps *sink_caps = NULL, *src_caps = NULL; + GstCaps *sink_caps = NULL, *src_caps = NULL, *parsed_caps = NULL; NTSTATUS status = STATUS_UNSUCCESSFUL; GstPadTemplate *template = NULL; struct wg_transform *transform; @@ -390,6 +390,11 @@ NTSTATUS wg_transform_create(void *args) gst_pad_set_query_function(transform->my_sink, transform_sink_query_cb); gst_pad_set_chain_function(transform->my_sink, transform_sink_chain_cb);
+ media_type = gst_structure_get_name(gst_caps_get_structure(src_caps, 0)); + if (!(parsed_caps = gst_caps_new_empty_simple(media_type))) + goto out; + gst_caps_set_simple(parsed_caps, "parsed", G_TYPE_BOOLEAN, true, NULL); + /* Since we append conversion elements, we don't want to filter decoders * based on the actual output caps now. Matching decoders with the * raw output media type should be enough. @@ -408,6 +413,14 @@ NTSTATUS wg_transform_create(void *args) case WG_MAJOR_TYPE_VIDEO_INDEO: case WG_MAJOR_TYPE_VIDEO_WMV: case WG_MAJOR_TYPE_VIDEO_MPEG1: + if (!transform->attrs.no_parser && (element = find_element(GST_ELEMENT_FACTORY_TYPE_PARSER, src_caps, parsed_caps))) + { + if (!append_element(transform->container, element, &first, &last)) + goto out; + gst_caps_unref(src_caps); + src_caps = gst_caps_ref(parsed_caps); + } + if (!(element = find_element(GST_ELEMENT_FACTORY_TYPE_DECODER, src_caps, sink_caps)) || !append_element(transform->container, element, &first, &last)) goto out; @@ -500,6 +513,7 @@ NTSTATUS wg_transform_create(void *args) || !push_event(transform->my_src, event)) goto out;
+ gst_caps_unref(parsed_caps); gst_caps_unref(src_caps); gst_caps_unref(sink_caps);
@@ -516,6 +530,8 @@ out: gst_object_unref(transform->my_src); if (src_caps) gst_caps_unref(src_caps); + if (parsed_caps) + gst_caps_unref(parsed_caps); if (sink_caps) gst_caps_unref(sink_caps); if (transform->allocator)
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=143830
Your paranoid android.
=== debian11b (64 bit WoW report) ===
mf: transform.c:2481: Test failed: aacdec: got 0 output samples Unhandled exception: divide by zero in 64-bit code (0x000000004313cc).
=== debian11b (build log) ===
0624:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0624:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0624:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0624:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0140:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 05e8:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0758:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0758:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 02a0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0228:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins.
v2: Make sure we don't fail to find the decoder because of some mismatching caps attributes.