From: Paul Gofman pgofman@codeweavers.com
--- dlls/winegstreamer/h264_decoder.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c index 7d9c38837d3..aa776326e19 100644 --- a/dlls/winegstreamer/h264_decoder.c +++ b/dlls/winegstreamer/h264_decoder.c @@ -61,6 +61,8 @@ struct h264_decoder struct wg_format wg_format; struct wg_transform *wg_transform; struct wg_sample_queue *wg_sample_queue; + + IMFDXGIDeviceManager *dxgi_manager; };
static struct h264_decoder *impl_from_IMFTransform(IMFTransform *iface) @@ -251,6 +253,8 @@ static ULONG WINAPI transform_Release(IMFTransform *iface) IMFAttributes_Release(decoder->output_attributes); if (decoder->attributes) IMFAttributes_Release(decoder->attributes); + if (decoder->dxgi_manager) + IMFDXGIDeviceManager_Release(decoder->dxgi_manager);
wg_sample_queue_destroy(decoder->wg_sample_queue); free(decoder); @@ -580,7 +584,29 @@ static HRESULT WINAPI transform_ProcessEvent(IMFTransform *iface, DWORD id, IMFM
static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) { - FIXME("iface %p, message %#x, param %Ix stub!\n", iface, message, param); + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + HRESULT hr; + + TRACE("iface %p, message %#x, param %Ix.\n", iface, message, param); + + if (message == MFT_MESSAGE_SET_D3D_MANAGER) + { + IMFDXGIDeviceManager *dxgi_manager = NULL; + IUnknown *unk = (IUnknown *)param; + + FIXME("MFT_MESSAGE_SET_D3D_MANAGER.\n"); + + if (unk && FAILED(hr = IUnknown_QueryInterface(unk, &IID_IMFDXGIDeviceManager, (void **)&dxgi_manager))) + { + FIXME("Query IMFDXGIDeviceManager failed.\n"); + return hr; + } + if (decoder->dxgi_manager) + IMFDXGIDeviceManager_Release(decoder->dxgi_manager); + decoder->dxgi_manager = dxgi_manager; + } + + FIXME("Ignoring message %#x.\n", message); return S_OK; }