[PATCH] mfplat: Implement MFInvokeCallback().

Nikolay Sivov nsivov at codeweavers.com
Thu Feb 21 04:32:00 CST 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfplat/mfplat.spec |  6 ++---
 dlls/mfplat/queue.c     | 54 +++++++++++++++++++++++++++++++++++++++++
 include/mfapi.h         |  2 ++
 3 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec
index 8f5ee77406..e55cfb9a5a 100644
--- a/dlls/mfplat/mfplat.spec
+++ b/dlls/mfplat/mfplat.spec
@@ -116,12 +116,12 @@
 @ stub MFInitMediaTypeFromWaveFormatEx
 @ stub MFInitVideoFormat
 @ stub MFInitVideoFormat_RGB
-@ stub MFInvokeCallback
+@ stdcall MFInvokeCallback(ptr)
 @ stub MFJoinIoPort
 @ stdcall MFLockPlatform()
 @ stdcall MFLockWorkQueue(long)
-@ stub MFPutWorkItem
-@ stub MFPutWorkItemEx
+@ stdcall MFPutWorkItem(long ptr ptr)
+@ stdcall MFPutWorkItemEx(long ptr)
 @ stub MFRecordError
 @ stub MFRemovePeriodicCallback
 @ stub MFScheduleWorkItem
diff --git a/dlls/mfplat/queue.c b/dlls/mfplat/queue.c
index 65f111ba41..ebc2ad487b 100644
--- a/dlls/mfplat/queue.c
+++ b/dlls/mfplat/queue.c
@@ -331,3 +331,57 @@ HRESULT WINAPI MFUnlockWorkQueue(DWORD queue)
 
     return unlock_user_queue(queue);
 }
+
+/***********************************************************************
+ *      MFPutWorkItem (mfplat.@)
+ */
+HRESULT WINAPI MFPutWorkItem(DWORD queue, IMFAsyncCallback *callback, IUnknown *state)
+{
+    IMFAsyncResult *result;
+    HRESULT hr;
+
+    TRACE("%#x, %p, %p.\n", queue, callback, state);
+
+    if (FAILED(hr = MFCreateAsyncResult(NULL, callback, state, &result)))
+        return hr;
+
+    hr = MFPutWorkItemEx(queue, result);
+
+    IMFAsyncResult_Release(result);
+
+    return hr;
+}
+
+/***********************************************************************
+ *      MFPutWorkItemEx (mfplat.@)
+ */
+HRESULT WINAPI MFPutWorkItemEx(DWORD queue, IMFAsyncResult *result)
+{
+    FIXME("%#x, %p\n", queue, result);
+
+    return E_NOTIMPL;
+}
+
+/***********************************************************************
+ *      MFInvokeCallback (mfplat.@)
+ */
+HRESULT WINAPI MFInvokeCallback(IMFAsyncResult *result)
+{
+    MFASYNCRESULT *result_data = (MFASYNCRESULT *)result;
+    DWORD queue = MFASYNC_CALLBACK_QUEUE_STANDARD, flags;
+    HRESULT hr;
+
+    TRACE("%p.\n", result);
+
+    if (FAILED(IMFAsyncCallback_GetParameters(result_data->pCallback, &flags, &queue)))
+        queue = MFASYNC_CALLBACK_QUEUE_STANDARD;
+
+    if (FAILED(MFLockWorkQueue(queue)))
+        queue = MFASYNC_CALLBACK_QUEUE_STANDARD;
+
+    hr = MFPutWorkItemEx(queue, result);
+
+    MFUnlockWorkQueue(queue);
+
+    return hr;
+}
diff --git a/include/mfapi.h b/include/mfapi.h
index d70a300a3c..d85f7408b0 100644
--- a/include/mfapi.h
+++ b/include/mfapi.h
@@ -102,6 +102,8 @@ HRESULT WINAPI MFTEnumEx(GUID category, UINT32 flags, const MFT_REGISTER_TYPE_IN
                          UINT32 *pcount);
 HRESULT WINAPI MFInvokeCallback(IMFAsyncResult *result);
 HRESULT WINAPI MFLockPlatform(void);
+HRESULT WINAPI MFPutWorkItem(DWORD queue, IMFAsyncCallback *callback, IUnknown *state);
+HRESULT WINAPI MFPutWorkItemEx(DWORD queue, IMFAsyncResult *result);
 HRESULT WINAPI MFTRegister(CLSID clsid, GUID category, LPWSTR name, UINT32 flags, UINT32 cinput,
                            MFT_REGISTER_TYPE_INFO *input_types, UINT32 coutput,
                            MFT_REGISTER_TYPE_INFO *output_types, IMFAttributes *attributes);
-- 
2.20.1




More information about the wine-devel mailing list