From: Alfred Agrell floating@muncher.se
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56491 --- dlls/winegstreamer/quartz_parser.c | 71 ++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+)
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 6c126fa13e2..7e8fc6f6098 100644 --- a/dlls/winegstreamer/quartz_parser.c +++ b/dlls/winegstreamer/quartz_parser.c @@ -1402,6 +1402,8 @@ static void parser_destroy(struct strmbase_filter *iface) free(filter); }
+static HRESULT parser_reinit_stream(struct parser *filter, bool compressed); + static HRESULT parser_init_stream(struct strmbase_filter *iface) { struct parser *filter = impl_from_strmbase_filter(iface); @@ -1414,6 +1416,25 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface)
filter->streaming = true;
+ for (i = 0; i < filter->source_count; ++i) + { + struct parser_source *source = filter->sources[i]; + struct wg_format format; + bool ret; + + if (source->pin.pin.peer) + { + ret = amt_to_wg_format(&source->pin.pin.mt, &format); + assert(ret); + if (format.major_type != WG_MAJOR_TYPE_VIDEO && format.major_type != WG_MAJOR_TYPE_AUDIO) + { + HRESULT hr = parser_reinit_stream(filter, true); + if (FAILED(hr)) + return hr; + break; + } + } + } for (i = 0; i < filter->source_count; ++i) { struct parser_source *source = filter->sources[i]; @@ -1461,6 +1482,45 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface) return S_OK; }
+static HRESULT parser_reinit_stream(struct parser *filter, bool compressed) +{ + LONGLONG file_size, unused; + unsigned int i; + HRESULT hr; + + wg_parser_disconnect(filter->wg_parser); + + /* read_thread() needs to stay alive to service any read requests GStreamer + * sends, so we can only shut it down after GStreamer stops. */ + filter->sink_connected = false; + WaitForSingleObject(filter->read_thread, INFINITE); + CloseHandle(filter->read_thread); + + wg_parser_destroy(filter->wg_parser); + filter->wg_parser = 0; + + if (!(filter->wg_parser = wg_parser_create(WG_PARSER_DECODEBIN, compressed))) + return E_OUTOFMEMORY; + + filter->sink_connected = true; + filter->read_thread = CreateThread(NULL, 0, read_thread, filter, 0, NULL); + + IAsyncReader_Length(filter->reader, &file_size, &unused); + + if (FAILED(hr = wg_parser_connect(filter->wg_parser, file_size))) + return hr; + + assert(wg_parser_get_stream_count(filter->wg_parser) ==filter->source_count); + + for (i = 0; i < filter->source_count; ++i) + { + struct parser_source *source = filter->sources[i]; + source->wg_stream = wg_parser_get_stream(filter->wg_parser, i); + } + + return S_OK; +} + static HRESULT parser_cleanup_stream(struct strmbase_filter *iface) { struct parser *filter = impl_from_strmbase_filter(iface); @@ -1618,6 +1678,17 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, WG_VIDEO_FORMAT_RGB15, };
+ wg_parser_stream_get_codec_format(pin->wg_stream, &format); + + memset(mt, 0, sizeof(AM_MEDIA_TYPE)); + + if (amt_from_wg_format(mt, &format, false)) + { + if (!index--) + return S_OK; + FreeMediaType(mt); + } + wg_parser_stream_get_preferred_format(pin->wg_stream, &format);
memset(mt, 0, sizeof(AM_MEDIA_TYPE));