Nikolay Sivov : mfmediaengine: Add shut down state.
Alexandre Julliard
julliard at winehq.org
Thu May 28 17:11:09 CDT 2020
Module: wine
Branch: master
Commit: 5007c2bd365a62db4d804738b214bffbd84fd5cc
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5007c2bd365a62db4d804738b214bffbd84fd5cc
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu May 28 18:54:19 2020 +0300
mfmediaengine: Add shut down state.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mfmediaengine/main.c | 38 ++++++++++++++++++++++++--------
dlls/mfmediaengine/tests/mfmediaengine.c | 2 --
2 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 050743e7e3..0c082a87f5 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -54,16 +54,24 @@ enum media_engine_mode
MEDIA_ENGINE_FRAME_SERVER_MODE,
};
+/* Used with create flags. */
+enum media_engine_flags
+{
+ /* MF_MEDIA_ENGINE_CREATEFLAGS_MASK is 0x1f. */
+ FLAGS_ENGINE_SHUT_DOWN = 0x20,
+};
+
struct media_engine
{
IMFMediaEngine IMFMediaEngine_iface;
LONG refcount;
- DWORD flags;
IMFMediaEngineNotify *callback;
UINT64 playback_hwnd;
DXGI_FORMAT output_format;
IMFDXGIDeviceManager *dxgi_manager;
enum media_engine_mode mode;
+ unsigned int flags;
+ CRITICAL_SECTION cs;
};
static inline struct media_engine *impl_from_IMFMediaEngine(IMFMediaEngine *iface)
@@ -104,6 +112,7 @@ static void free_media_engine(struct media_engine *engine)
IMFMediaEngineNotify_Release(engine->callback);
if (engine->dxgi_manager)
IMFDXGIDeviceManager_Release(engine->dxgi_manager);
+ DeleteCriticalSection(&engine->cs);
heap_free(engine);
}
@@ -395,9 +404,19 @@ static HRESULT WINAPI media_engine_GetVideoAspectRatio(IMFMediaEngine *iface, DW
static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngine *iface)
{
+ struct media_engine *engine = impl_from_IMFMediaEngine(iface);
+ HRESULT hr = S_OK;
+
FIXME("(%p): stub.\n", iface);
- return E_NOTIMPL;
+ EnterCriticalSection(&engine->cs);
+ if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
+ hr = MF_E_SHUTDOWN;
+ else
+ engine->flags |= FLAGS_ENGINE_SHUT_DOWN;
+ LeaveCriticalSection(&engine->cs);
+
+ return hr;
}
static HRESULT WINAPI media_engine_TransferVideoFrame(IMFMediaEngine *iface, IUnknown *surface,
@@ -490,10 +509,15 @@ static ULONG WINAPI media_engine_factory_Release(IMFMediaEngineClassFactory *ifa
return 1;
}
-static HRESULT init_media_engine(IMFAttributes *attributes, struct media_engine *engine)
+static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct media_engine *engine)
{
HRESULT hr;
+ engine->IMFMediaEngine_iface.lpVtbl = &media_engine_vtbl;
+ engine->refcount = 1;
+ engine->flags = flags & MF_MEDIA_ENGINE_CREATEFLAGS_MASK;
+ InitializeCriticalSection(&engine->cs);
+
hr = IMFAttributes_GetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, &IID_IMFMediaEngineNotify,
(void **)&engine->callback);
if (FAILED(hr))
@@ -522,7 +546,7 @@ static HRESULT WINAPI media_engine_factory_CreateInstance(IMFMediaEngineClassFac
struct media_engine *object;
HRESULT hr;
- TRACE("(%p, %#x, %p, %p).\n", iface, flags, attributes, engine);
+ TRACE("%p, %#x, %p, %p.\n", iface, flags, attributes, engine);
if (!attributes || !engine)
return E_POINTER;
@@ -531,17 +555,13 @@ static HRESULT WINAPI media_engine_factory_CreateInstance(IMFMediaEngineClassFac
if (!object)
return E_OUTOFMEMORY;
- hr = init_media_engine(attributes, object);
+ hr = init_media_engine(flags, attributes, object);
if (FAILED(hr))
{
free_media_engine(object);
return hr;
}
- object->IMFMediaEngine_iface.lpVtbl = &media_engine_vtbl;
- object->refcount = 1;
- object->flags = flags;
-
*engine = &object->IMFMediaEngine_iface;
return S_OK;
diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c
index 07bd8c81e6..d3c15566a4 100644
--- a/dlls/mfmediaengine/tests/mfmediaengine.c
+++ b/dlls/mfmediaengine/tests/mfmediaengine.c
@@ -247,11 +247,9 @@ static void test_Shutdown(void)
media_engine = create_media_engine(callback);
hr = IMFMediaEngine_Shutdown(media_engine);
-todo_wine
ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
hr = IMFMediaEngine_Shutdown(media_engine);
-todo_wine
ok(hr == MF_E_SHUTDOWN || broken(hr == S_OK) /* before win10 */, "Unexpected hr %#x.\n", hr);
hr = IMFMediaEngine_SetSource(media_engine, NULL);
More information about the wine-cvs
mailing list