Store the current decoder caps so that we know what the expected input format is.
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/winegstreamer/wg_parser.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 0d59297a026..1653701506c 100644 --- a/dlls/winegstreamer/wg_parser.c +++ b/dlls/winegstreamer/wg_parser.c @@ -49,6 +49,7 @@ struct wg_parser GstElement *container, *decodebin; GstBus *bus; GstPad *my_src, *their_sink; + GstCaps *decoder_caps;
guint64 file_size, start_offset, next_offset, stop_offset; guint64 next_pull_offset; @@ -720,8 +721,12 @@ static GstAutoplugSelectResult autoplug_select_cb(GstElement *bin, GstPad *pad, GstCaps *caps, GstElementFactory *fact, gpointer user) { const char *name = gst_element_factory_get_longname(fact); + struct wg_parser *parser = user;
GST_TRACE("Using "%s".", name); + if (parser->decoder_caps) + gst_caps_unref(parser->decoder_caps); + parser->decoder_caps = NULL;
if (strstr(name, "Player protection")) { @@ -733,6 +738,9 @@ static GstAutoplugSelectResult autoplug_select_cb(GstElement *bin, GstPad *pad, GST_WARNING("Disabled video acceleration since it breaks in wine."); return GST_AUTOPLUG_SELECT_SKIP; } + if (caps) + parser->decoder_caps = gst_caps_ref(caps); + return GST_AUTOPLUG_SELECT_TRY; }
@@ -1520,10 +1528,12 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s { GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("quartz_src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); + struct wg_format input_format; unsigned int i;
parser->file_size = file_size; parser->sink_connected = true; + memset(&input_format, 0, sizeof(input_format));
if (!parser->bus) { @@ -1547,6 +1557,13 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s if (!parser->init_gst(parser)) return E_FAIL;
+ if (parser->decoder_caps) + { + wg_format_from_caps(&input_format, parser->decoder_caps); + gst_caps_unref(parser->decoder_caps); + parser->decoder_caps = NULL; + } + pthread_mutex_lock(&parser->mutex);
for (i = 0; i < parser->stream_count; ++i)