Nikolay Sivov : evr: Create and initialize mixer transform attributes.

Alexandre Julliard julliard at winehq.org
Fri Sep 4 15:47:33 CDT 2020


Module: wine
Branch: master
Commit: f949087624c970d3b32969d10a49640b1d4bbea5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f949087624c970d3b32969d10a49640b1d4bbea5

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Sep  4 18:52:51 2020 +0300

evr: Create and initialize mixer transform attributes.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/evr/mixer.c     | 28 +++++++++++++++++++++++-----
 dlls/evr/tests/evr.c | 24 ++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c
index d92bb6c170..d9f86a7fc9 100644
--- a/dlls/evr/mixer.c
+++ b/dlls/evr/mixer.c
@@ -70,11 +70,9 @@ struct video_mixer
     struct output_stream output;
 
     COLORREF bkgnd_color;
-
     IDirect3DDeviceManager9 *device_manager;
-
     IMediaEventSink *event_sink;
-
+    IMFAttributes *attributes;
     CRITICAL_SECTION cs;
 };
 
@@ -246,6 +244,8 @@ static ULONG WINAPI video_mixer_inner_Release(IUnknown *iface)
         video_mixer_clear_types(mixer);
         if (mixer->device_manager)
             IDirect3DDeviceManager9_Release(mixer->device_manager);
+        if (mixer->attributes)
+            IMFAttributes_Release(mixer->attributes);
         DeleteCriticalSection(&mixer->cs);
         free(mixer);
     }
@@ -360,9 +360,17 @@ static HRESULT WINAPI video_mixer_transform_GetOutputStreamInfo(IMFTransform *if
 
 static HRESULT WINAPI video_mixer_transform_GetAttributes(IMFTransform *iface, IMFAttributes **attributes)
 {
-    FIXME("%p, %p.\n", iface, attributes);
+    struct video_mixer *mixer = impl_from_IMFTransform(iface);
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, attributes);
+
+    if (!attributes)
+        return E_POINTER;
+
+    *attributes = mixer->attributes;
+    IMFAttributes_AddRef(*attributes);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI video_mixer_transform_GetInputStreamAttributes(IMFTransform *iface, DWORD id,
@@ -1317,6 +1325,8 @@ HRESULT WINAPI MFCreateVideoMixer(IUnknown *owner, REFIID riid_device, REFIID ri
 HRESULT evr_mixer_create(IUnknown *outer, void **out)
 {
     struct video_mixer *object;
+    MFVideoNormalizedRect rect;
+    HRESULT hr;
 
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
@@ -1335,6 +1345,14 @@ HRESULT evr_mixer_create(IUnknown *outer, void **out)
     object->input_count = 1;
     video_mixer_init_input(&object->inputs[0]);
     InitializeCriticalSection(&object->cs);
+    if (FAILED(hr = MFCreateAttributes(&object->attributes, 0)))
+    {
+        IUnknown_Release(&object->IUnknown_inner);
+        return hr;
+    }
+    rect.left = rect.top = 0.0f;
+    rect.right = rect.bottom = 1.0f;
+    IMFAttributes_SetBlob(object->attributes, &VIDEO_ZOOM_RECT, (const UINT8 *)&rect, sizeof(rect));
 
     *out = &object->IUnknown_inner;
 
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index 6a5d80df41..ba97eba53d 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -419,6 +419,7 @@ static void test_default_mixer(void)
     DWORD input_count, output_count;
     IMFVideoProcessor *processor;
     IMFVideoDeviceID *deviceid;
+    MFVideoNormalizedRect rect;
     DWORD input_id, output_id;
     IMFTransform *transform;
     DXVA2_ValueRange range;
@@ -508,6 +509,29 @@ todo_wine
     hr = IMFTransform_QueryInterface(transform, &IID_IMFVideoDeviceID, (void **)&deviceid);
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
+    hr = IMFTransform_GetAttributes(transform, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFTransform_GetAttributes(transform, &attributes);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFTransform_GetAttributes(transform, &attributes2);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(attributes == attributes2, "Unexpected attributes instance.\n");
+    IMFAttributes_Release(attributes2);
+
+    hr = IMFAttributes_GetCount(attributes, &count);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(count == 1, "Unexpected attribute count %u.\n", count);
+
+    memset(&rect, 0, sizeof(rect));
+    hr = IMFAttributes_GetBlob(attributes, &VIDEO_ZOOM_RECT, (UINT8 *)&rect, sizeof(rect), NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(rect.left == 0.0f && rect.top == 0.0f && rect.right == 1.0f && rect.bottom == 1.0f,
+            "Unexpected zoom rect (%f, %f) - (%f, %f).\n", rect.left, rect.top, rect.right, rect.bottom);
+
+    IMFAttributes_Release(attributes);
+
     hr = IMFVideoDeviceID_GetDeviceID(deviceid, NULL);
     ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
 




More information about the wine-cvs mailing list