| /* | |
| * Unit test suite for mfplat. | |
| * | |
| * Copyright 2015 Michael Müller | |
| * | |
| * 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 <stdarg.h> | |
| #include <string.h> | |
| #define COBJMACROS | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "winuser.h" | |
| #include "winreg.h" | |
| #include "initguid.h" | |
| #include "mfapi.h" | |
| #include "mfidl.h" | |
| #include "mferror.h" | |
| #include "mfreadwrite.h" | |
| #include "wine/test.h" | |
| static HRESULT (WINAPI *pMFCreateSourceResolver)(IMFSourceResolver **resolver); | |
| DEFINE_GUID(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 0xa634a91c, 0x822b, 0x41b9, 0xa4, 0x94, 0x4d, 0xe4, 0x64, 0x36, 0x12, 0xb0); | |
| DEFINE_GUID(MFT_CATEGORY_OTHER, 0x90175d57,0xb7ea,0x4901,0xae,0xb3,0x93,0x3a,0x87,0x47,0x75,0x6f); | |
| DEFINE_GUID(DUMMY_CLSID, 0x12345678,0x1234,0x1234,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19); | |
| DEFINE_GUID(DUMMY_GUID1, 0x12345678,0x1234,0x1234,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21); | |
| DEFINE_GUID(DUMMY_GUID2, 0x12345678,0x1234,0x1234,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22); | |
| static BOOL check_clsid(CLSID *clsids, UINT32 count) | |
| { | |
| int i; | |
| for (i = 0; i < count; i++) | |
| { | |
| if (IsEqualGUID(&clsids[i], &DUMMY_CLSID)) | |
| return TRUE; | |
| } | |
| return FALSE; | |
| } | |
| static void test_register(void) | |
| { | |
| static WCHAR name[] = {'W','i','n','e',' ','t','e','s','t',0}; | |
| MFT_REGISTER_TYPE_INFO input[] = | |
| { | |
| { DUMMY_CLSID, DUMMY_GUID1 } | |
| }; | |
| MFT_REGISTER_TYPE_INFO output[] = | |
| { | |
| { DUMMY_CLSID, DUMMY_GUID2 } | |
| }; | |
| CLSID *clsids; | |
| UINT32 count; | |
| HRESULT ret; | |
| ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, name, 0, 1, input, 1, output, NULL); | |
| ok(ret == S_OK, "Failed to register dummy filter: %x\n", ret); | |
| if (FAILED(ret)) | |
| return; | |
| if(0) | |
| { | |
| /* NULL name crashes on windows */ | |
| ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, NULL, 0, 1, input, 1, output, NULL); | |
| ok(ret == E_INVALIDARG, "got %x\n", ret); | |
| } | |
| ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, name, 0, 0, NULL, 0, NULL, NULL); | |
| ok(ret == S_OK, "Failed to register dummy filter: %x\n", ret); | |
| ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, name, 0, 1, NULL, 0, NULL, NULL); | |
| ok(ret == S_OK, "Failed to register dummy filter: %x\n", ret); | |
| ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, name, 0, 0, NULL, 1, NULL, NULL); | |
| ok(ret == S_OK, "Failed to register dummy filter: %x\n", ret); | |
| if(0) | |
| { | |
| /* NULL clsids/count crashes on windows (vista) */ | |
| count = 0; | |
| ret = MFTEnum(MFT_CATEGORY_OTHER, 0, NULL, NULL, NULL, NULL, &count); | |
| ok(ret == E_POINTER, "Failed to enumerate filters: %x\n", ret); | |
| ok(count == 0, "Expected count > 0\n"); | |
| clsids = NULL; | |
| ret = MFTEnum(MFT_CATEGORY_OTHER, 0, NULL, NULL, NULL, &clsids, NULL); | |
| ok(ret == E_POINTER, "Failed to enumerate filters: %x\n", ret); | |
| ok(count == 0, "Expected count > 0\n"); | |
| } | |
| count = 0; | |
| clsids = NULL; | |
| ret = MFTEnum(MFT_CATEGORY_OTHER, 0, NULL, NULL, NULL, &clsids, &count); | |
| ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); | |
| ok(count > 0, "Expected count > 0\n"); | |
| ok(clsids != NULL, "Expected clsids != NULL\n"); | |
| ok(check_clsid(clsids, count), "Filter was not part of enumeration\n"); | |
| CoTaskMemFree(clsids); | |
| count = 0; | |
| clsids = NULL; | |
| ret = MFTEnum(MFT_CATEGORY_OTHER, 0, input, NULL, NULL, &clsids, &count); | |
| ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); | |
| ok(count > 0, "Expected count > 0\n"); | |
| ok(clsids != NULL, "Expected clsids != NULL\n"); | |
| ok(check_clsid(clsids, count), "Filter was not part of enumeration\n"); | |
| CoTaskMemFree(clsids); | |
| count = 0; | |
| clsids = NULL; | |
| ret = MFTEnum(MFT_CATEGORY_OTHER, 0, NULL, output, NULL, &clsids, &count); | |
| ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); | |
| ok(count > 0, "Expected count > 0\n"); | |
| ok(clsids != NULL, "Expected clsids != NULL\n"); | |
| ok(check_clsid(clsids, count), "Filter was not part of enumeration\n"); | |
| CoTaskMemFree(clsids); | |
| count = 0; | |
| clsids = NULL; | |
| ret = MFTEnum(MFT_CATEGORY_OTHER, 0, input, output, NULL, &clsids, &count); | |
| ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); | |
| ok(count > 0, "Expected count > 0\n"); | |
| ok(clsids != NULL, "Expected clsids != NULL\n"); | |
| ok(check_clsid(clsids, count), "Filter was not part of enumeration\n"); | |
| CoTaskMemFree(clsids); | |
| /* exchange input and output */ | |
| count = 0; | |
| clsids = NULL; | |
| ret = MFTEnum(MFT_CATEGORY_OTHER, 0, output, input, NULL, &clsids, &count); | |
| ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); | |
| ok(!count, "got %d\n", count); | |
| ok(clsids == NULL, "Expected clsids == NULL\n"); | |
| ret = MFTUnregister(DUMMY_CLSID); | |
| ok(ret == S_OK || | |
| /* w7pro64 */ | |
| broken(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)), "got %x\n", ret); | |
| ret = MFTUnregister(DUMMY_CLSID); | |
| ok(ret == S_OK || broken(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)), "got %x\n", ret); | |
| } | |
| static void test_source_resolver(void) | |
| { | |
| IMFSourceResolver *resolver, *resolver2; | |
| HRESULT hr; | |
| if (!pMFCreateSourceResolver) | |
| { | |
| win_skip("MFCreateSourceResolver() not found\n"); | |
| return; | |
| } | |
| hr = pMFCreateSourceResolver(NULL); | |
| ok(hr == E_POINTER, "got %#x\n", hr); | |
| hr = pMFCreateSourceResolver(&resolver); | |
| ok(hr == S_OK, "got %#x\n", hr); | |
| hr = pMFCreateSourceResolver(&resolver2); | |
| ok(hr == S_OK, "got %#x\n", hr); | |
| ok(resolver != resolver2, "Expected new instance\n"); | |
| IMFSourceResolver_Release(resolver); | |
| IMFSourceResolver_Release(resolver2); | |
| } | |
| static void init_functions(void) | |
| { | |
| HMODULE mod = GetModuleHandleA("mfplat.dll"); | |
| #define X(f) if (!(p##f = (void*)GetProcAddress(mod, #f))) return; | |
| X(MFCreateSourceResolver); | |
| #undef X | |
| } | |
| static void test_MFCreateMediaType(void) | |
| { | |
| HRESULT hr; | |
| IMFMediaType *mediatype; | |
| hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); | |
| todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); | |
| if(0) | |
| { | |
| /* Crash on Windows Vista/7 */ | |
| hr = MFCreateMediaType(NULL); | |
| ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); | |
| } | |
| hr = MFCreateMediaType(&mediatype); | |
| ok(hr == S_OK, "got 0x%08x\n", hr); | |
| hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); | |
| todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); | |
| IMFMediaType_Release(mediatype); | |
| MFShutdown(); | |
| } | |
| static void test_MFCreateAttributes(void) | |
| { | |
| IMFAttributes *attributes; | |
| HRESULT hr; | |
| UINT32 count; | |
| hr = MFCreateAttributes( &attributes, 3 ); | |
| ok(hr == S_OK, "got 0x%08x\n", hr); | |
| count = 88; | |
| hr = IMFAttributes_GetCount(attributes, &count); | |
| todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); | |
| ok(count == 0, "got %d\n", count); | |
| hr = IMFAttributes_SetUINT32(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 0); | |
| todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); | |
| hr = IMFAttributes_GetCount(attributes, &count); | |
| todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); | |
| todo_wine ok(count == 1, "got %d\n", count); | |
| IMFAttributes_Release(attributes); | |
| } | |
| START_TEST(mfplat) | |
| { | |
| CoInitialize(NULL); | |
| init_functions(); | |
| test_register(); | |
| test_source_resolver(); | |
| test_MFCreateMediaType(); | |
| test_MFCreateAttributes(); | |
| CoUninitialize(); | |
| } |