Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/evr/Makefile.in | 3 ++- dlls/evr/evr.spec | 2 +- dlls/evr/mixer.c | 28 ++++++++++++++++++++ dlls/evr/tests/Makefile.in | 2 +- dlls/evr/tests/evr.c | 32 ++++++++++++++++++++++ include/evr.idl | 54 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 dlls/evr/mixer.c
diff --git a/dlls/evr/Makefile.in b/dlls/evr/Makefile.in index 053d80e61d7..b1db77e639f 100644 --- a/dlls/evr/Makefile.in +++ b/dlls/evr/Makefile.in @@ -5,6 +5,7 @@ EXTRADLLFLAGS = -mno-cygwin
C_SRCS = \ evr.c \ - main.c + main.c \ + mixer.c
IDL_SRCS = evr_classes.idl diff --git a/dlls/evr/evr.spec b/dlls/evr/evr.spec index c78900c5762..ea87f16da15 100644 --- a/dlls/evr/evr.spec +++ b/dlls/evr/evr.spec @@ -13,7 +13,7 @@ @ stub MFCreateVideoMediaTypeFromSubtype @ stub MFCreateVideoMediaTypeFromVideoInfoHeader2 @ stub MFCreateVideoMediaTypeFromVideoInfoHeader -@ stub MFCreateVideoMixer +@ stdcall MFCreateVideoMixer(ptr ptr ptr ptr) @ stub MFCreateVideoMixerAndPresenter @ stub MFCreateVideoOTA @ stub MFCreateVideoPresenter2 diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c new file mode 100644 index 00000000000..fe2f4bab1df --- /dev/null +++ b/dlls/evr/mixer.c @@ -0,0 +1,28 @@ +/* + * Copyright 2020 Nikolay Sivov + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/debug.h" +#include "evr.h" + +WINE_DEFAULT_DEBUG_CHANNEL(evr); + +HRESULT WINAPI MFCreateVideoMixer(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj) +{ + FIXME("%p, %s, %s, %p.\n", owner, debugstr_guid(riid_device), debugstr_guid(riid), obj); + return E_NOTIMPL; +} diff --git a/dlls/evr/tests/Makefile.in b/dlls/evr/tests/Makefile.in index 8dc11e5e558..529c5354508 100644 --- a/dlls/evr/tests/Makefile.in +++ b/dlls/evr/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = evr.dll -IMPORTS = mfuuid strmiids uuid ole32 oleaut32 +IMPORTS = mfuuid strmiids uuid dxguid ole32 oleaut32 evr
C_SRCS = \ evr.c diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index 489b7b949db..adb2b777a2e 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -22,6 +22,7 @@ #include "dshow.h" #include "wine/test.h" #include "d3d9.h" +#include "evr.h" #include "initguid.h" #include "dxva2api.h"
@@ -337,6 +338,36 @@ static void test_pin_info(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+static void test_default_mixer(void) +{ + IMFTransform *transform; + IUnknown *unk; + HRESULT hr; + + hr = MFCreateVideoMixer(NULL, &IID_IDirect3DDevice9, &IID_IMFTransform, (void **)&transform); +todo_wine + ok(hr == S_OK, "Failed to create default mixer, hr %#x.\n", hr); + if (FAILED(hr)) + return; + + hr = IMFTransform_QueryInterface(transform, &IID_IMFTopologyServiceLookupClient, (void **)&unk); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + IUnknown_Release(unk); + + hr = IMFTransform_QueryInterface(transform, &IID_IMFVideoDeviceID, (void **)&unk); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + IUnknown_Release(unk); + + IMFTransform_Release(transform); + + hr = MFCreateVideoMixer(NULL, &IID_IMFTransform, &IID_IMFTransform, (void **)&transform); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + + hr = CoCreateInstance(&CLSID_MFVideoMixer9, NULL, CLSCTX_INPROC_SERVER, &IID_IMFTransform, (void **)&transform); + ok(hr == S_OK, "Failed to create default mixer, hr %#x.\n", hr); + IMFTransform_Release(transform); +} + START_TEST(evr) { CoInitialize(NULL); @@ -346,6 +377,7 @@ START_TEST(evr) test_enum_pins(); test_find_pin(); test_pin_info(); + test_default_mixer();
CoUninitialize(); } diff --git a/include/evr.idl b/include/evr.idl index 3768b41b16e..39b4853b2e3 100644 --- a/include/evr.idl +++ b/include/evr.idl @@ -107,3 +107,57 @@ interface IMFVideoRenderer : IUnknown [in] IMFVideoPresenter *pVideoPresenter ); } + +typedef enum _MF_SERVICE_LOOKUP_TYPE +{ + MF_SERVICE_LOOKUP_UPSTREAM, + MF_SERVICE_LOOKUP_UPSTREAM_DIRECT, + MF_SERVICE_LOOKUP_DOWNSTREAM, + MF_SERVICE_LOOKUP_DOWNSTREAM_DIRECT, + MF_SERVICE_LOOKUP_ALL, + MF_SERVICE_LOOKUP_GLOBAL, +} MF_SERVICE_LOOKUP_TYPE; + +[ + object, + uuid(fa993889-4383-415a-a930-dd472a8cf6f7), + local +] +interface IMFTopologyServiceLookup : IUnknown +{ + HRESULT LookupService( + [in] MF_SERVICE_LOOKUP_TYPE lookup_type, + [in] DWORD index, + [in] REFGUID service, + [in] REFIID riid, + [out, iid_is(riid)] void **objects, + [in, out] DWORD *num_objects + ); +} + +[ + object, + uuid(fa99388a-4383-415a-a930-dd472a8cf6f7), + local +] +interface IMFTopologyServiceLookupClient : IUnknown +{ + HRESULT InitServicePointers( + [in] IMFTopologyServiceLookup *service_lookup + ); + HRESULT ReleaseServicePointers(); +} + +[ + object, + uuid(a38d9567-5a9c-4f3c-b293-8eb415b279ba), + local +] +interface IMFVideoDeviceID : IUnknown +{ + HRESULT GetDeviceID( + [out] IID *device_id + ); +} + +cpp_quote("HRESULT WINAPI MFCreateVideoMixer(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj);")