mf/evr: Return current device manager as a service.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-04-26 11:23:32 +03:00 committed by Alexandre Julliard
parent e7f60e39f6
commit b0118c7c7d
2 changed files with 35 additions and 8 deletions

View File

@ -591,19 +591,14 @@ static ULONG WINAPI video_stream_get_service_Release(IMFGetService *iface)
return IMFStreamSink_Release(&stream->IMFStreamSink_iface);
}
static HRESULT WINAPI video_stream_get_service_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj)
static HRESULT WINAPI video_stream_get_service(struct video_stream *stream, REFGUID service, REFIID riid, void **obj)
{
struct video_stream *stream = impl_from_stream_IMFGetService(iface);
HRESULT hr = S_OK;
TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj);
if (IsEqualGUID(service, &MR_VIDEO_ACCELERATION_SERVICE))
{
if (IsEqualIID(riid, &IID_IMFVideoSampleAllocator))
{
EnterCriticalSection(&stream->cs);
if (!stream->allocator)
{
hr = MFCreateVideoSampleAllocator(&IID_IMFVideoSampleAllocator, (void **)&stream->allocator);
@ -613,10 +608,12 @@ static HRESULT WINAPI video_stream_get_service_GetService(IMFGetService *iface,
if (SUCCEEDED(hr))
hr = IMFVideoSampleAllocator_QueryInterface(stream->allocator, riid, obj);
LeaveCriticalSection(&stream->cs);
return hr;
}
else if (IsEqualIID(riid, &IID_IDirect3DDeviceManager9) && stream->parent->device_manager)
{
return IUnknown_QueryInterface(stream->parent->device_manager, riid, obj);
}
return E_NOINTERFACE;
}
@ -626,6 +623,23 @@ static HRESULT WINAPI video_stream_get_service_GetService(IMFGetService *iface,
return E_NOTIMPL;
}
static HRESULT WINAPI video_stream_get_service_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj)
{
struct video_stream *stream = impl_from_stream_IMFGetService(iface);
HRESULT hr;
TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj);
EnterCriticalSection(&stream->cs);
if (!stream->parent)
hr = MF_E_STREAMSINK_REMOVED;
else
hr = video_stream_get_service(stream, service, riid, obj);
LeaveCriticalSection(&stream->cs);
return hr;
}
static const IMFGetServiceVtbl video_stream_get_service_vtbl =
{
video_stream_get_service_QueryInterface,
@ -1992,6 +2006,8 @@ static HRESULT WINAPI video_renderer_get_service_GetService(IMFGetService *iface
TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj);
EnterCriticalSection(&renderer->cs);
if (IsEqualGUID(service, &MR_VIDEO_MIXER_SERVICE))
{
hr = IMFTransform_QueryInterface(renderer->mixer, &IID_IMFGetService, (void **)&gs);
@ -2000,11 +2016,18 @@ static HRESULT WINAPI video_renderer_get_service_GetService(IMFGetService *iface
{
hr = IMFVideoPresenter_QueryInterface(renderer->presenter, &IID_IMFGetService, (void **)&gs);
}
else if (IsEqualGUID(service, &MR_VIDEO_ACCELERATION_SERVICE) && IsEqualIID(riid, &IID_IDirect3DDeviceManager9))
{
if (renderer->device_manager)
hr = IUnknown_QueryInterface(renderer->device_manager, riid, obj);
}
else
{
FIXME("Unsupported service %s.\n", debugstr_guid(service));
}
LeaveCriticalSection(&renderer->cs);
if (gs)
{
hr = IMFGetService_GetService(gs, service, riid, obj);

View File

@ -4269,6 +4269,7 @@ static void test_evr(void)
check_service_interface(sink, &MR_VIDEO_MIXER_SERVICE, &IID_IMFVideoMixerControl2, TRUE);
check_service_interface(sink, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl, TRUE);
check_service_interface(sink, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoPositionMapper, TRUE);
check_service_interface(sink, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IDirect3DDeviceManager9, TRUE);
hr = MFGetService((IUnknown *)sink, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl,
(void **)&display_control);
@ -4415,6 +4416,9 @@ static void test_evr(void)
IMFMediaTypeHandler_Release(type_handler);
/* Stream uses an allocator. */
check_service_interface(stream_sink, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IMFVideoSampleAllocator, TRUE);
check_service_interface(stream_sink, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IDirect3DDeviceManager9, TRUE);
hr = MFGetService((IUnknown *)stream_sink, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IMFVideoSampleAllocator,
(void **)&allocator);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);