Nikolay Sivov : evr/mixer: Keep per-stream zorder configuration.

Alexandre Julliard julliard at winehq.org
Tue Oct 6 15:33:11 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Oct  6 14:49:01 2020 +0300

evr/mixer: Keep per-stream zorder configuration.

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

---

 dlls/evr/mixer.c     |  59 ++++++++++++++++++++++++++---
 dlls/evr/tests/evr.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 158 insertions(+), 6 deletions(-)

diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c
index da0bcb0a2d..107438b1f1 100644
--- a/dlls/evr/mixer.c
+++ b/dlls/evr/mixer.c
@@ -42,6 +42,7 @@ struct input_stream
     IMFAttributes *attributes;
     IMFVideoMediaType *media_type;
     MFVideoNormalizedRect rect;
+    unsigned int zorder;
 };
 
 struct output_stream
@@ -510,6 +511,8 @@ static HRESULT WINAPI video_mixer_transform_AddInputStreams(IMFTransform *iface,
 
         if (SUCCEEDED(hr))
         {
+            unsigned int zorder = mixer->input_count;
+
             for (i = 0; i < count; ++i)
             {
                 if ((input = bsearch(&ids[i], inputs, len, sizeof(*inputs), video_mixer_compare_input_id)))
@@ -518,6 +521,13 @@ static HRESULT WINAPI video_mixer_transform_AddInputStreams(IMFTransform *iface,
             memcpy(&mixer->input_ids[mixer->input_count], ids, count * sizeof(*ids));
             memcpy(mixer->inputs, inputs, len * sizeof(*inputs));
             mixer->input_count += count;
+
+            for (i = 0; i < count; ++i)
+            {
+                if (SUCCEEDED(video_mixer_get_input(mixer, ids[i], &input)))
+                    input->zorder = zorder;
+                zorder++;
+            }
         }
     }
     LeaveCriticalSection(&mixer->cs);
@@ -1016,18 +1026,55 @@ static ULONG WINAPI video_mixer_control_Release(IMFVideoMixerControl2 *iface)
     return IMFTransform_Release(&mixer->IMFTransform_iface);
 }
 
-static HRESULT WINAPI video_mixer_control_SetStreamZOrder(IMFVideoMixerControl2 *iface, DWORD stream_id, DWORD zorder)
+static HRESULT WINAPI video_mixer_control_SetStreamZOrder(IMFVideoMixerControl2 *iface, DWORD id, DWORD zorder)
 {
-    FIXME("%p, %u, %u.\n", iface, stream_id, zorder);
+    struct video_mixer *mixer = impl_from_IMFVideoMixerControl2(iface);
+    struct input_stream *stream;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %u, %u.\n", iface, id, zorder);
+
+    /* Can't change reference stream. */
+    if (!id && zorder)
+        return E_INVALIDARG;
+
+    EnterCriticalSection(&mixer->cs);
+
+    if (zorder >= mixer->input_count)
+        hr = E_INVALIDARG;
+    else if (SUCCEEDED(hr = video_mixer_get_input(mixer, id, &stream)))
+    {
+        /* Lowest zorder only applies to reference stream. */
+        if (id && !zorder)
+            hr = MF_E_INVALIDREQUEST;
+        else
+            stream->zorder = zorder;
+    }
+
+    LeaveCriticalSection(&mixer->cs);
+
+    return hr;
 }
 
-static HRESULT WINAPI video_mixer_control_GetStreamZOrder(IMFVideoMixerControl2 *iface, DWORD stream_id, DWORD *zorder)
+static HRESULT WINAPI video_mixer_control_GetStreamZOrder(IMFVideoMixerControl2 *iface, DWORD id, DWORD *zorder)
 {
-    FIXME("%p, %u, %p.\n", iface, stream_id, zorder);
+    struct video_mixer *mixer = impl_from_IMFVideoMixerControl2(iface);
+    struct input_stream *stream;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %u, %p.\n", iface, id, zorder);
+
+    if (!zorder)
+        return E_POINTER;
+
+    EnterCriticalSection(&mixer->cs);
+
+    if (SUCCEEDED(hr = video_mixer_get_input(mixer, id, &stream)))
+        *zorder = stream->zorder;
+
+    LeaveCriticalSection(&mixer->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI video_mixer_control_SetStreamOutputRect(IMFVideoMixerControl2 *iface, DWORD id,
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index fbefe5e02f..70c7053efd 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -1669,6 +1669,110 @@ static void test_mixer_output_rectangle(void)
     IMFTransform_Release(mixer);
 }
 
+static void test_mixer_zorder(void)
+{
+    IMFVideoMixerControl *mixer_control;
+    IMFTransform *mixer;
+    DWORD ids[2];
+    DWORD value;
+    HRESULT hr;
+
+    hr = MFCreateVideoMixer(NULL, &IID_IDirect3DDevice9, &IID_IMFTransform, (void **)&mixer);
+    ok(hr == S_OK, "Failed to create a mixer, hr %#x.\n", hr);
+
+    hr = IMFTransform_QueryInterface(mixer, &IID_IMFVideoMixerControl, (void **)&mixer_control);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 0, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 1, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    value = 1;
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 0, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!value, "Unexpected value %u.\n", value);
+
+    value = 1;
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 1, &value);
+    ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFVideoMixerControl_SetStreamZOrder(mixer_control, 0, 1);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFVideoMixerControl_SetStreamZOrder(mixer_control, 1, 1);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    /* Exceeds maximum stream number. */
+    hr = IMFVideoMixerControl_SetStreamZOrder(mixer_control, 0, 20);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    value = 1;
+    hr = IMFTransform_AddInputStreams(mixer, 1, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    value = 0;
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 1, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(value == 1, "Unexpected zorder %u.\n", value);
+
+    hr = IMFVideoMixerControl_SetStreamZOrder(mixer_control, 1, 0);
+    ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFVideoMixerControl_SetStreamZOrder(mixer_control, 1, 2);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFVideoMixerControl_SetStreamZOrder(mixer_control, 0, 0);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    value = 2;
+    hr = IMFTransform_AddInputStreams(mixer, 1, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    value = 0;
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 2, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(value == 2, "Unexpected zorder %u.\n", value);
+
+    hr = IMFVideoMixerControl_SetStreamZOrder(mixer_control, 2, 1);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    value = 3;
+    hr = IMFTransform_AddInputStreams(mixer, 1, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    value = 0;
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 3, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(value == 3, "Unexpected zorder %u.\n", value);
+
+    hr = IMFTransform_DeleteInputStream(mixer, 1);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFTransform_DeleteInputStream(mixer, 2);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IMFTransform_DeleteInputStream(mixer, 3);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    ids[0] = 2;
+    ids[1] = 1;
+    hr = IMFTransform_AddInputStreams(mixer, 2, ids);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    value = 0;
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 1, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(value == 2, "Unexpected zorder %u.\n", value);
+
+    value = 0;
+    hr = IMFVideoMixerControl_GetStreamZOrder(mixer_control, 2, &value);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(value == 1, "Unexpected zorder %u.\n", value);
+
+    IMFVideoMixerControl_Release(mixer_control);
+    IMFTransform_Release(mixer);
+}
+
 START_TEST(evr)
 {
     CoInitialize(NULL);
@@ -1689,6 +1793,7 @@ START_TEST(evr)
     test_presenter_video_position();
     test_presenter_native_video_size();
     test_mixer_output_rectangle();
+    test_mixer_zorder();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list