From 1f45516d91bb743241a18b1280f898e0f740eab7 Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Sat, 6 Dec 2008 18:58:11 +0100 Subject: [PATCH] quartz: Accept null clsMinorType for pins when registering filters + tests. --- dlls/quartz/filtermapper.c | 6 +-- dlls/quartz/tests/filtermapper.c | 81 ++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/dlls/quartz/filtermapper.c b/dlls/quartz/filtermapper.c index ce296ea0821..b4c090055cc 100644 --- a/dlls/quartz/filtermapper.c +++ b/dlls/quartz/filtermapper.c @@ -560,20 +560,20 @@ static HRESULT FM2_WriteFilterData(const REGFILTER2 * prf2, BYTE **ppData, ULONG for (j = 0; j < rgPin2.nMediaTypes; j++) { struct REG_TYPE rt; + const CLSID * clsMinorType = rgPin2.lpMediaType[j].clsMinorType ? rgPin2.lpMediaType[j].clsMinorType : &MEDIASUBTYPE_NULL; rt.signature[0] = '0'; rt.signature[1] = 't'; rt.signature[2] = 'y'; rt.signature[3] = '3'; rt.signature[0] += j; - rt.dwUnused = 0; rt.dwOffsetMajor = find_data(&clsidStore, (const BYTE*)rgPin2.lpMediaType[j].clsMajorType, sizeof(CLSID)); if (rt.dwOffsetMajor == -1) rt.dwOffsetMajor = add_data(&clsidStore, (const BYTE*)rgPin2.lpMediaType[j].clsMajorType, sizeof(CLSID)); rt.dwOffsetMajor += size; - rt.dwOffsetMinor = find_data(&clsidStore, (const BYTE*)rgPin2.lpMediaType[j].clsMinorType, sizeof(CLSID)); + rt.dwOffsetMinor = find_data(&clsidStore, (const BYTE*)clsMinorType, sizeof(CLSID)); if (rt.dwOffsetMinor == -1) - rt.dwOffsetMinor = add_data(&clsidStore, (const BYTE*)rgPin2.lpMediaType[j].clsMinorType, sizeof(CLSID)); + rt.dwOffsetMinor = add_data(&clsidStore, (const BYTE*)clsMinorType, sizeof(CLSID)); rt.dwOffsetMinor += size; add_data(&mainStore, (LPBYTE)&rt, sizeof(rt)); diff --git a/dlls/quartz/tests/filtermapper.c b/dlls/quartz/tests/filtermapper.c index 5a139025c66..122c2ee5706 100644 --- a/dlls/quartz/tests/filtermapper.c +++ b/dlls/quartz/tests/filtermapper.c @@ -343,6 +343,86 @@ static void test_ifiltermapper_from_filtergraph(void) if (pgraph2) IFilterGraph2_Release(pgraph2); } +static void test_register_filter_with_null_clsMinorType(void) +{ + IFilterMapper2 *pMapper = NULL; + HRESULT hr; + REGFILTER2 rgf2; + REGFILTERPINS rgPins; + REGFILTERPINS2 rgPins2; + REGPINTYPES rgPinType; + static WCHAR wszPinName[] = {'P', 'i', 'n', 0 }; + static const WCHAR wszFilterName1[] = {'T', 'e', 's', 't', 'f', 'i', 'l', 't', 'e', 'r', '1', 0 }; + static const WCHAR wszFilterName2[] = {'T', 'e', 's', 't', 'f', 'i', 'l', 't', 'e', 'r', '2', 0 }; + CLSID clsidFilter1; + CLSID clsidFilter2; + + hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, + &IID_IFilterMapper2, (LPVOID*)&pMapper); + ok(hr == S_OK, "CoCreateInstance failed with %x\n", hr); + if (FAILED(hr)) goto out; + + hr = CoCreateGuid(&clsidFilter1); + ok(hr == S_OK, "CoCreateGuid failed with %x\n", hr); + hr = CoCreateGuid(&clsidFilter2); + ok(hr == S_OK, "CoCreateGuid failed with %x\n", hr); + + rgPinType.clsMajorType = &GUID_NULL; + /* Make sure quartz accepts it without crashing */ + rgPinType.clsMinorType = NULL; + + /* Test with pin descript version 1 */ + ZeroMemory(&rgf2, sizeof(rgf2)); + rgf2.dwVersion = 1; + rgf2.dwMerit = MERIT_UNLIKELY; + S(U(rgf2)).cPins = 1; + S(U(rgf2)).rgPins = &rgPins; + + rgPins.strName = wszPinName; + rgPins.bRendered = 1; + rgPins.bOutput = 0; + rgPins.bZero = 0; + rgPins.bMany = 0; + rgPins.clsConnectsToFilter = NULL; + rgPins.strConnectsToPin = NULL; + rgPins.nMediaTypes = 1; + rgPins.lpMediaType = &rgPinType; + + hr = IFilterMapper2_RegisterFilter(pMapper, &clsidFilter1, wszFilterName1, NULL, + &CLSID_LegacyAmFilterCategory, NULL, &rgf2); + ok(hr == S_OK, "IFilterMapper2_RegisterFilter failed with %x\n", hr); + + hr = IFilterMapper2_UnregisterFilter(pMapper, &CLSID_LegacyAmFilterCategory, NULL, &clsidFilter1); + ok(hr == S_OK, "FilterMapper_UnregisterFilter failed with %x\n", hr); + + /* Test with pin descript version 2 */ + ZeroMemory(&rgf2, sizeof(rgf2)); + rgf2.dwVersion = 2; + rgf2.dwMerit = MERIT_UNLIKELY; + S1(U(rgf2)).cPins2 = 1; + S1(U(rgf2)).rgPins2 = &rgPins2; + + rgPins2.dwFlags = REG_PINFLAG_B_RENDERER; + rgPins2.cInstances = 1; + rgPins2.nMediaTypes = 1; + rgPins2.lpMediaType = &rgPinType; + rgPins2.nMediums = 0; + rgPins2.lpMedium = NULL; + rgPins2.clsPinCategory = NULL; + + hr = IFilterMapper2_RegisterFilter(pMapper, &clsidFilter2, wszFilterName2, NULL, + &CLSID_LegacyAmFilterCategory, NULL, &rgf2); + ok(hr == S_OK, "IFilterMapper2_RegisterFilter failed with %x\n", hr); + + hr = IFilterMapper2_UnregisterFilter(pMapper, &CLSID_LegacyAmFilterCategory, NULL, &clsidFilter2); + ok(hr == S_OK, "FilterMapper_UnregisterFilter failed with %x\n", hr); + + out: + + if (pMapper) IFilterMapper2_Release(pMapper); +} + + START_TEST(filtermapper) { CoInitialize(NULL); @@ -350,6 +430,7 @@ START_TEST(filtermapper) test_fm2_enummatchingfilters(); test_legacy_filter_registration(); test_ifiltermapper_from_filtergraph(); + test_register_filter_with_null_clsMinorType(); CoUninitialize(); }