[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