[PATCH 3/3] mf/evr: Derive stream attributes from mixer input attributes.
Nikolay Sivov
nsivov at codeweavers.com
Wed Nov 18 00:48:30 CST 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mf/evr.c | 42 +++++++++++++++++++++++++++++++-----------
dlls/mf/tests/mf.c | 3 +--
2 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index 4be59331b6b..47a506a94c6 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -942,10 +942,26 @@ static const IMFAttributesVtbl video_stream_attributes_vtbl =
video_stream_attributes_CopyAllItems,
};
+static BOOL video_renderer_is_mixer_d3d_aware(const struct video_renderer *renderer)
+{
+ IMFAttributes *attributes;
+ unsigned int value = 0;
+ BOOL ret;
+
+ if (FAILED(IMFTransform_QueryInterface(renderer->mixer, &IID_IMFAttributes, (void **)&attributes)))
+ return FALSE;
+
+ ret = SUCCEEDED(IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &value)) && value;
+ IMFAttributes_Release(attributes);
+ return ret;
+}
+
static HRESULT video_renderer_stream_create(struct video_renderer *renderer, unsigned int id,
struct video_stream **ret)
{
struct video_stream *stream;
+ IMFAttributes *attributes;
+ unsigned int value;
HRESULT hr;
if (!(stream = heap_alloc_zero(sizeof(*stream))))
@@ -968,6 +984,16 @@ static HRESULT video_renderer_stream_create(struct video_renderer *renderer, uns
IMFMediaSink_AddRef(&stream->parent->IMFMediaSink_iface);
stream->id = id;
+ if (video_renderer_is_mixer_d3d_aware(renderer))
+ IMFAttributes_SetUINT32(stream->attributes, &MF_SA_D3D_AWARE, 1);
+
+ if (SUCCEEDED(IMFTransform_GetInputStreamAttributes(renderer->mixer, id, &attributes)))
+ {
+ if (SUCCEEDED(IMFAttributes_GetUINT32(attributes, &MF_SA_REQUIRED_SAMPLE_COUNT, &value)))
+ IMFAttributes_SetUINT32(stream->attributes, &MF_SA_REQUIRED_SAMPLE_COUNT, value);
+ IMFAttributes_Release(attributes);
+ }
+
*ret = stream;
return S_OK;
@@ -1491,7 +1517,6 @@ static HRESULT video_renderer_create_presenter(struct video_renderer *renderer,
static HRESULT video_renderer_configure_mixer(struct video_renderer *renderer)
{
IMFTopologyServiceLookupClient *lookup_client;
- IMFAttributes *attributes;
HRESULT hr;
if (SUCCEEDED(hr = IMFTransform_QueryInterface(renderer->mixer, &IID_IMFTopologyServiceLookupClient,
@@ -1537,21 +1562,16 @@ static HRESULT video_renderer_configure_mixer(struct video_renderer *renderer)
}
/* Set device manager that presenter should have created. */
- if (SUCCEEDED(IMFTransform_QueryInterface(renderer->mixer, &IID_IMFAttributes, (void **)&attributes)))
+ if (video_renderer_is_mixer_d3d_aware(renderer))
{
IDirect3DDeviceManager9 *device_manager;
- unsigned int value;
- if (SUCCEEDED(IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &value)) && value)
+ if (SUCCEEDED(MFGetService((IUnknown *)renderer->presenter, &MR_VIDEO_ACCELERATION_SERVICE,
+ &IID_IDirect3DDeviceManager9, (void **)&device_manager)))
{
- if (SUCCEEDED(MFGetService((IUnknown *)renderer->presenter, &MR_VIDEO_ACCELERATION_SERVICE,
- &IID_IDirect3DDeviceManager9, (void **)&device_manager)))
- {
- IMFTransform_ProcessMessage(renderer->mixer, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)device_manager);
- IDirect3DDeviceManager9_Release(device_manager);
- }
+ IMFTransform_ProcessMessage(renderer->mixer, MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)device_manager);
+ IDirect3DDeviceManager9_Release(device_manager);
}
- IMFAttributes_Release(attributes);
}
return hr;
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index aabdc51e577..78a3d75e0a7 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -3341,7 +3341,6 @@ static void test_evr(void)
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFAttributes_GetCount(attributes, &count);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-todo_wine {
ok(count == 2, "Unexpected count %u.\n", count);
value = 0;
hr = IMFAttributes_GetUINT32(attributes, &MF_SA_REQUIRED_SAMPLE_COUNT, &value);
@@ -3351,7 +3350,7 @@ todo_wine {
hr = IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &value);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(value == 1, "Unexpected attribute value %u.\n", value);
-}
+
hr = IMFAttributes_QueryInterface(attributes, &IID_IMFStreamSink, (void **)&unk);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
IUnknown_Release(unk);
--
2.29.2
More information about the wine-devel
mailing list