From: Zebediah Figura zfigura@codeweavers.com
Windows always deals in Annex B, aka stream-format=byte-stream, but GStreamer decoders may not be able to handle that. In particular, the AppleMedia decoder (vtdec) only accepts AVC.
Add a parser before the decoder in order to convert between the two formats. --- dlls/winegstreamer/wg_transform.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 516b28e82e2..a7b166224f3 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -343,6 +343,7 @@ NTSTATUS wg_transform_create(void *args) GstPadTemplate *template = NULL; struct wg_transform *transform; const gchar *media_type; + GstCaps *parsed_caps; GstEvent *event;
if (!(transform = calloc(1, sizeof(*transform)))) @@ -398,9 +399,31 @@ NTSTATUS wg_transform_create(void *args) if (!(raw_caps = gst_caps_new_empty_simple(media_type))) goto out;
+ parsed_caps = gst_caps_ref(src_caps); + switch (input_format.major_type) { case WG_MAJOR_TYPE_VIDEO_H264: + if ((element = find_element(GST_ELEMENT_FACTORY_TYPE_PARSER, src_caps, NULL))) + { + GstPad *parser_src; + + if ((parser_src = gst_element_get_static_pad(element, "src"))) + { + if (append_element(transform->container, element, &first, &last)) + parsed_caps = gst_pad_query_caps(parser_src, NULL); + else + gst_object_unref(element); + gst_object_unref(parser_src); + } + else + { + GST_WARNING("Parser found, but has no src pad."); + gst_object_unref(element); + } + } + + /* fall through */ case WG_MAJOR_TYPE_AUDIO_MPEG1: case WG_MAJOR_TYPE_AUDIO_MPEG4: case WG_MAJOR_TYPE_AUDIO_WMA: @@ -408,9 +431,10 @@ 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, parsed_caps, raw_caps)) || !append_element(transform->container, element, &first, &last)) { + gst_caps_unref(parsed_caps); gst_caps_unref(raw_caps); goto out; } @@ -425,6 +449,7 @@ NTSTATUS wg_transform_create(void *args) goto out; }
+ gst_caps_unref(parsed_caps); gst_caps_unref(raw_caps);
switch (output_format.major_type)