Nikolay Sivov : evr/presenter: Initialize aspect ratio mode.

Alexandre Julliard julliard at winehq.org
Wed Oct 7 16:04:11 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Oct  7 11:40:22 2020 +0300

evr/presenter: Initialize aspect ratio mode.

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

---

 dlls/evr/presenter.c | 28 ++++++++++++++++++++++++----
 dlls/evr/tests/evr.c | 32 ++++++++++++++++++++++++++++++++
 include/evr.idl      |  9 +++++++++
 3 files changed, 65 insertions(+), 4 deletions(-)

diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index ecfa923442..8fcd6d58b3 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -64,6 +64,7 @@ struct video_presenter
     DWORD rendering_prefs;
     SIZE native_size;
     SIZE native_ratio;
+    unsigned int ar_mode;
     unsigned int state;
     CRITICAL_SECTION cs;
 };
@@ -669,16 +670,34 @@ static HRESULT WINAPI video_presenter_control_GetVideoPosition(IMFVideoDisplayCo
 
 static HRESULT WINAPI video_presenter_control_SetAspectRatioMode(IMFVideoDisplayControl *iface, DWORD mode)
 {
-    FIXME("%p, %d.\n", iface, mode);
+    struct video_presenter *presenter = impl_from_IMFVideoDisplayControl(iface);
 
-    return E_NOTIMPL;
+    TRACE("%p, %#x.\n", iface, mode);
+
+    if (mode & ~MFVideoARMode_Mask)
+        return E_INVALIDARG;
+
+    EnterCriticalSection(&presenter->cs);
+    presenter->ar_mode = mode;
+    LeaveCriticalSection(&presenter->cs);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI video_presenter_control_GetAspectRatioMode(IMFVideoDisplayControl *iface, DWORD *mode)
 {
-    FIXME("%p, %p.\n", iface, mode);
+    struct video_presenter *presenter = impl_from_IMFVideoDisplayControl(iface);
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, mode);
+
+    if (!mode)
+        return E_POINTER;
+
+    EnterCriticalSection(&presenter->cs);
+    *mode = presenter->ar_mode;
+    LeaveCriticalSection(&presenter->cs);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI video_presenter_control_SetVideoWindow(IMFVideoDisplayControl *iface, HWND window)
@@ -969,6 +988,7 @@ HRESULT evr_presenter_create(IUnknown *outer, void **out)
     object->outer_unk = outer ? outer : &object->IUnknown_inner;
     object->refcount = 1;
     object->src_rect.right = object->src_rect.bottom = 1.0f;
+    object->ar_mode = MFVideoARMode_PreservePicture | MFVideoARMode_PreservePixel;
     InitializeCriticalSection(&object->cs);
 
     if (FAILED(hr = DXVA2CreateDirect3DDeviceManager9(&object->reset_token, &object->device_manager)))
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index e7eabc5971..3ae36d9b5d 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -1654,6 +1654,37 @@ static void test_presenter_native_video_size(void)
     IMFTransform_Release(mixer);
 }
 
+static void test_presenter_ar_mode(void)
+{
+    IMFVideoDisplayControl *display_control;
+    HRESULT hr;
+    DWORD mode;
+
+    hr = MFCreateVideoPresenter(NULL, &IID_IDirect3DDevice9, &IID_IMFVideoDisplayControl, (void **)&display_control);
+    ok(hr == S_OK, "Failed to create default presenter, hr %#x.\n", hr);
+
+    hr = IMFVideoDisplayControl_GetAspectRatioMode(display_control, NULL);
+    ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+    mode = 0;
+    hr = IMFVideoDisplayControl_GetAspectRatioMode(display_control, &mode);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(mode == (MFVideoARMode_PreservePicture | MFVideoARMode_PreservePixel), "Unexpected mode %#x.\n", mode);
+
+    hr = IMFVideoDisplayControl_SetAspectRatioMode(display_control, 0x100);
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFVideoDisplayControl_SetAspectRatioMode(display_control, MFVideoARMode_Mask);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    mode = 0;
+    hr = IMFVideoDisplayControl_GetAspectRatioMode(display_control, &mode);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(mode == MFVideoARMode_Mask, "Unexpected mode %#x.\n", mode);
+
+    IMFVideoDisplayControl_Release(display_control);
+}
+
 static void test_mixer_output_rectangle(void)
 {
     IMFVideoMixerControl *mixer_control;
@@ -1836,6 +1867,7 @@ START_TEST(evr)
     test_MFCreateVideoSampleAllocator();
     test_presenter_video_position();
     test_presenter_native_video_size();
+    test_presenter_ar_mode();
     test_mixer_output_rectangle();
     test_mixer_zorder();
 
diff --git a/include/evr.idl b/include/evr.idl
index c217883538..413f5af1d4 100644
--- a/include/evr.idl
+++ b/include/evr.idl
@@ -228,6 +228,15 @@ interface IMFDesiredSample : IUnknown
     void Clear();
 }
 
+typedef enum MFVideoAspectRatioMode
+{
+    MFVideoARMode_None             = 0x00000000,
+    MFVideoARMode_PreservePicture  = 0x00000001,
+    MFVideoARMode_PreservePixel    = 0x00000002,
+    MFVideoARMode_NonLinearStretch = 0x00000004,
+    MFVideoARMode_Mask             = 0x00000007,
+} MFVideoAspectRatioMode;
+
 [
     object,
     uuid(a490b1e4-ab84-4d31-a1b2-181e03b1077a),




More information about the wine-cvs mailing list