Nikolay Sivov : evr/presenter: Implement GetCurrentMediaType().

Alexandre Julliard julliard at winehq.org
Thu Nov 5 15:37:15 CST 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Nov  5 18:37:24 2020 +0300

evr/presenter: Implement GetCurrentMediaType().

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

---

 dlls/evr/presenter.c | 71 ++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 61 insertions(+), 10 deletions(-)

diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c
index 01623815dd3..1b98e63a49a 100644
--- a/dlls/evr/presenter.c
+++ b/dlls/evr/presenter.c
@@ -71,6 +71,7 @@ struct video_presenter
 
     IDirect3DDeviceManager9 *device_manager;
     struct streaming_thread thread;
+    IMFMediaType *media_type;
     UINT reset_token;
     HWND video_window;
     MFVideoNormalizedRect src_rect;
@@ -168,6 +169,38 @@ static void video_presenter_get_native_video_size(struct video_presenter *presen
     IMFMediaType_Release(media_type);
 }
 
+static void video_presenter_reset_media_type(struct video_presenter *presenter)
+{
+    if (presenter->media_type)
+        IMFMediaType_Release(presenter->media_type);
+    presenter->media_type = NULL;
+
+    /* FIXME: release samples pool */
+}
+
+static HRESULT video_presenter_set_media_type(struct video_presenter *presenter, IMFMediaType *media_type)
+{
+    unsigned int flags;
+
+    if (!media_type)
+    {
+        video_presenter_reset_media_type(presenter);
+        return S_OK;
+    }
+
+    if (presenter->media_type && IMFMediaType_IsEqual(presenter->media_type, media_type, &flags) == S_OK)
+        return S_OK;
+
+    video_presenter_reset_media_type(presenter);
+
+    /* FIXME: allocate samples pool */
+
+    presenter->media_type = media_type;
+    IMFMediaType_AddRef(presenter->media_type);
+
+    return S_OK;
+}
+
 static HRESULT video_presenter_invalidate_media_type(struct video_presenter *presenter)
 {
     IMFMediaType *media_type;
@@ -182,16 +215,16 @@ static HRESULT video_presenter_invalidate_media_type(struct video_presenter *pre
 
         /* FIXME: potentially adjust frame size */
 
-        if (SUCCEEDED(IMFTransform_SetOutputType(presenter->mixer, 0, media_type, MFT_SET_TYPE_TEST_ONLY)))
-        {
-            /* FIXME: should keep a copy internally too */
+        hr = IMFTransform_SetOutputType(presenter->mixer, 0, media_type, MFT_SET_TYPE_TEST_ONLY);
 
-            hr = IMFTransform_SetOutputType(presenter->mixer, 0, media_type, 0);
-            IMFMediaType_Release(media_type);
-            break;
-        }
+        if (SUCCEEDED(hr))
+            hr = video_presenter_set_media_type(presenter, media_type);
 
+        hr = IMFTransform_SetOutputType(presenter->mixer, 0, media_type, 0);
         IMFMediaType_Release(media_type);
+
+        if (SUCCEEDED(hr))
+            break;
     }
 
     return hr;
@@ -478,11 +511,29 @@ static HRESULT WINAPI video_presenter_ProcessMessage(IMFVideoPresenter *iface, M
     return hr;
 }
 
-static HRESULT WINAPI video_presenter_GetCurrentMediaType(IMFVideoPresenter *iface, IMFVideoMediaType **media_type)
+static HRESULT WINAPI video_presenter_GetCurrentMediaType(IMFVideoPresenter *iface,
+        IMFVideoMediaType **media_type)
 {
-    FIXME("%p, %p.\n", iface, media_type);
+    struct video_presenter *presenter = impl_from_IMFVideoPresenter(iface);
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, media_type);
+
+    EnterCriticalSection(&presenter->cs);
+
+    if (presenter->state == PRESENTER_STATE_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else if (!presenter->media_type)
+        hr = MF_E_NOT_INITIALIZED;
+    else
+    {
+        hr = IMFMediaType_QueryInterface(presenter->media_type, &IID_IMFVideoMediaType,
+                (void **)media_type);
+    }
+
+    LeaveCriticalSection(&presenter->cs);
+
+    return hr;
 }
 
 static const IMFVideoPresenterVtbl video_presenter_vtbl =




More information about the wine-cvs mailing list