From: Yuxuan Shui yshui@codeweavers.com
Also, make sure if SetOutputType with DMO_SET_TYPEF_TEST_ONLY succeeds then it's guaranteed to succeed without it too. --- dlls/winegstreamer/video_decoder.c | 18 ++++++++++-------- dlls/winegstreamer/wma_decoder.c | 19 +++++++++++-------- 2 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/dlls/winegstreamer/video_decoder.c b/dlls/winegstreamer/video_decoder.c index be540876aa0..f2bef5ee959 100644 --- a/dlls/winegstreamer/video_decoder.c +++ b/dlls/winegstreamer/video_decoder.c @@ -1269,6 +1269,7 @@ static HRESULT WINAPI media_object_SetOutputType(IMediaObject *iface, DWORD inde const DMO_MEDIA_TYPE *type, DWORD flags) { struct video_decoder *decoder = impl_from_IMediaObject(iface); + wg_transform_t new_transform = 0; IMFMediaType *media_type; unsigned int i; HRESULT hr; @@ -1311,21 +1312,22 @@ static HRESULT WINAPI media_object_SetOutputType(IMediaObject *iface, DWORD inde return DMO_E_TYPE_NOT_ACCEPTED; IMFMediaType_Release(media_type);
+ if (FAILED(hr = wg_transform_create_quartz(&decoder->dmo_input_type, type, + &decoder->wg_transform_attrs, &new_transform))) + return DMO_E_TYPE_NOT_ACCEPTED; + if (flags & DMO_SET_TYPEF_TEST_ONLY) + { + wg_transform_destroy(new_transform); return S_OK; + }
FreeMediaType(&decoder->dmo_output_type); CopyMediaType(&decoder->dmo_output_type, type);
/* Set up wg_transform. */ - if (decoder->wg_transform) - { - wg_transform_destroy(decoder->wg_transform); - decoder->wg_transform = 0; - } - if (FAILED(hr = wg_transform_create_quartz(&decoder->dmo_input_type, type, - &decoder->wg_transform_attrs, &decoder->wg_transform))) - return hr; + if (decoder->wg_transform) wg_transform_destroy(decoder->wg_transform); + decoder->wg_transform = new_transform;
return S_OK; } diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c index ddb77724db5..951a50f7164 100644 --- a/dlls/winegstreamer/wma_decoder.c +++ b/dlls/winegstreamer/wma_decoder.c @@ -759,6 +759,7 @@ static HRESULT WINAPI media_object_SetOutputType(IMediaObject *iface, DWORD inde { struct wma_decoder *decoder = impl_from_IMediaObject(iface); struct wg_transform_attrs attrs = {0}; + wg_transform_t new_transform = 0; unsigned int i; HRESULT hr;
@@ -796,22 +797,24 @@ static HRESULT WINAPI media_object_SetOutputType(IMediaObject *iface, DWORD inde
if (IsEqualGUID(&decoder->input_type.majortype, &GUID_NULL)) return DMO_E_TYPE_NOT_SET; + + if (FAILED(hr = wg_transform_create_quartz(&decoder->input_type, &decoder->output_type, + &attrs, &new_transform))) + return hr; + if (flags & DMO_SET_TYPEF_TEST_ONLY) + { + wg_transform_destroy(new_transform); return S_OK; + }
MoFreeMediaType(&decoder->output_type); memset(&decoder->output_type, 0, sizeof(decoder->output_type)); MoCopyMediaType(&decoder->output_type, type);
/* Set up wg_transform. */ - if (decoder->wg_transform) - { - wg_transform_destroy(decoder->wg_transform); - decoder->wg_transform = 0; - } - if (FAILED(hr = wg_transform_create_quartz(&decoder->input_type, &decoder->output_type, - &attrs, &decoder->wg_transform))) - return hr; + if (decoder->wg_transform) wg_transform_destroy(decoder->wg_transform); + decoder->wg_transform = new_transform;
return S_OK; }