Nikolay Sivov : mfmediaengine: Implement GetPresentationAttribute().

Alexandre Julliard julliard at winehq.org
Fri Feb 18 15:14:58 CST 2022


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Feb 18 10:47:42 2022 +0300

mfmediaengine: Implement GetPresentationAttribute().

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

---

 dlls/mfmediaengine/main.c                | 23 +++++++++++++++++++----
 dlls/mfmediaengine/tests/mfmediaengine.c |  8 ++++++++
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 01ce8cd6437..bb338a4423f 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -143,6 +143,7 @@ struct media_engine
     struct
     {
         IMFMediaSource *source;
+        IMFPresentationDescriptor *pd;
     } presentation;
     struct
     {
@@ -1079,9 +1080,11 @@ static void media_engine_clear_presentation(struct media_engine *engine)
 {
     if (engine->presentation.source)
     {
-         IMFMediaSource_Shutdown(engine->presentation.source);
-         IMFMediaSource_Release(engine->presentation.source);
+        IMFMediaSource_Shutdown(engine->presentation.source);
+        IMFMediaSource_Release(engine->presentation.source);
     }
+    if (engine->presentation.pd)
+        IMFPresentationDescriptor_Release(engine->presentation.pd);
     memset(&engine->presentation, 0, sizeof(engine->presentation));
 }
 
@@ -1151,6 +1154,8 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi
 
     engine->presentation.source = source;
     IMFMediaSource_AddRef(engine->presentation.source);
+    engine->presentation.pd = pd;
+    IMFPresentationDescriptor_AddRef(engine->presentation.pd);
 
     media_engine_set_flag(engine, FLAGS_ENGINE_HAS_VIDEO, !!sd_video);
     media_engine_set_flag(engine, FLAGS_ENGINE_HAS_AUDIO, !!sd_audio);
@@ -2474,9 +2479,19 @@ static HRESULT WINAPI media_engine_GetResourceCharacteristics(IMFMediaEngineEx *
 static HRESULT WINAPI media_engine_GetPresentationAttribute(IMFMediaEngineEx *iface, REFGUID attribute,
         PROPVARIANT *value)
 {
-    FIXME("%p, %s, %p stub.\n", iface, debugstr_guid(attribute), value);
+    struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
+    HRESULT hr = E_FAIL;
 
-    return E_NOTIMPL;
+    TRACE("%p, %s, %p.\n", iface, debugstr_guid(attribute), value);
+
+    EnterCriticalSection(&engine->cs);
+    if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+        hr = MF_E_SHUTDOWN;
+    else if (engine->presentation.pd)
+        hr = IMFPresentationDescriptor_GetItem(engine->presentation.pd, attribute, value);
+    LeaveCriticalSection(&engine->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI media_engine_GetNumberOfStreams(IMFMediaEngineEx *iface, DWORD *stream_count)
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index e4d9d752f20..0eaf614fc66 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -321,6 +321,7 @@ static void test_Shutdown(void)
     IMFMediaEngineEx *media_engine_ex;
     IMFMediaTimeRange *time_range;
     IMFMediaEngine *media_engine;
+    PROPVARIANT propvar;
     DWORD flags, cx, cy;
     unsigned int state;
     UINT32 value;
@@ -493,6 +494,9 @@ static void test_Shutdown(void)
         hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, TRUE);
         ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
 
+        hr = IMFMediaEngineEx_GetPresentationAttribute(media_engine_ex, &MF_PD_DURATION, &propvar);
+        ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
+
         IMFMediaEngineEx_Release(media_engine_ex);
     }
 
@@ -905,6 +909,7 @@ static void test_SetSourceFromByteStream(void)
 {
     struct media_engine_notify *notify;
     IMFMediaEngineEx *media_engine;
+    PROPVARIANT propvar;
     DWORD flags;
     HRESULT hr;
 
@@ -927,6 +932,9 @@ static void test_SetSourceFromByteStream(void)
     hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine, &flags);
     ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
 
+    hr = IMFMediaEngineEx_GetPresentationAttribute(media_engine, &MF_PD_DURATION, &propvar);
+    ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
+
     IMFMediaEngineEx_Release(media_engine);
     IMFMediaEngineNotify_Release(&notify->IMFMediaEngineNotify_iface);
 }




More information about the wine-cvs mailing list