Nikolay Sivov : mf: Add IMFGetService stub for media session.

Alexandre Julliard julliard at winehq.org
Wed May 8 18:22:47 CDT 2019


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed May  8 14:46:43 2019 +0300

mf: Add IMFGetService stub for media session.

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

---

 dlls/mf/session.c  | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/mf/tests/mf.c |  5 +++++
 2 files changed, 51 insertions(+)

diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index 7f8a283..a433a30 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -36,6 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
 struct media_session
 {
     IMFMediaSession IMFMediaSession_iface;
+    IMFGetService IMFGetService_iface;
     LONG refcount;
     IMFMediaEventQueue *event_queue;
 };
@@ -92,6 +93,11 @@ static inline struct media_session *impl_from_IMFMediaSession(IMFMediaSession *i
     return CONTAINING_RECORD(iface, struct media_session, IMFMediaSession_iface);
 }
 
+static struct media_session *impl_from_IMFGetService(IMFGetService *iface)
+{
+    return CONTAINING_RECORD(iface, struct media_session, IMFGetService_iface);
+}
+
 static struct presentation_clock *impl_from_IMFPresentationClock(IMFPresentationClock *iface)
 {
     return CONTAINING_RECORD(iface, struct presentation_clock, IMFPresentationClock_iface);
@@ -136,6 +142,12 @@ static HRESULT WINAPI mfsession_QueryInterface(IMFMediaSession *iface, REFIID ri
         IMFMediaSession_AddRef(iface);
         return S_OK;
     }
+    else if (IsEqualIID(riid, &IID_IMFGetService))
+    {
+        *out = &session->IMFGetService_iface;
+        IMFMediaSession_AddRef(iface);
+        return S_OK;
+    }
 
     WARN("Unsupported %s.\n", debugstr_guid(riid));
     *out = NULL;
@@ -301,6 +313,39 @@ static const IMFMediaSessionVtbl mfmediasessionvtbl =
     mfsession_GetFullTopology,
 };
 
+static HRESULT WINAPI session_get_service_QueryInterface(IMFGetService *iface, REFIID riid, void **obj)
+{
+    struct media_session *session = impl_from_IMFGetService(iface);
+    return IMFMediaSession_QueryInterface(&session->IMFMediaSession_iface, riid, obj);
+}
+
+static ULONG WINAPI session_get_service_AddRef(IMFGetService *iface)
+{
+    struct media_session *session = impl_from_IMFGetService(iface);
+    return IMFMediaSession_AddRef(&session->IMFMediaSession_iface);
+}
+
+static ULONG WINAPI session_get_service_Release(IMFGetService *iface)
+{
+    struct media_session *session = impl_from_IMFGetService(iface);
+    return IMFMediaSession_Release(&session->IMFMediaSession_iface);
+}
+
+static HRESULT WINAPI session_get_service_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj)
+{
+    FIXME("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj);
+
+    return E_NOTIMPL;
+}
+
+static const IMFGetServiceVtbl session_get_service_vtbl =
+{
+    session_get_service_QueryInterface,
+    session_get_service_AddRef,
+    session_get_service_Release,
+    session_get_service_GetService,
+};
+
 /***********************************************************************
  *      MFCreateMediaSession (mf.@)
  */
@@ -319,6 +364,7 @@ HRESULT WINAPI MFCreateMediaSession(IMFAttributes *config, IMFMediaSession **ses
         return E_OUTOFMEMORY;
 
     object->IMFMediaSession_iface.lpVtbl = &mfmediasessionvtbl;
+    object->IMFGetService_iface.lpVtbl = &session_get_service_vtbl;
     object->refcount = 1;
     if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
     {
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index ff3290a..fc068a9 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -944,6 +944,7 @@ todo_wine
 static void test_media_session(void)
 {
     IMFMediaSession *session;
+    IMFGetService *gs;
     IUnknown *unk;
     HRESULT hr;
 
@@ -956,6 +957,10 @@ static void test_media_session(void)
     hr = IMFMediaSession_QueryInterface(session, &IID_IMFAttributes, (void **)&unk);
     ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
 
+    hr = IMFMediaSession_QueryInterface(session, &IID_IMFGetService, (void **)&gs);
+    ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr);
+    IMFGetService_Release(gs);
+
     test_session_events(session);
 
     IMFMediaSession_Release(session);




More information about the wine-cvs mailing list