Christian Costa : quartz: Accept null clsMinorType for pins when registering filters + tests.

Alexandre Julliard julliard at winehq.org
Mon Dec 8 09:45:58 CST 2008


Module: wine
Branch: master
Commit: 1f45516d91bb743241a18b1280f898e0f740eab7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1f45516d91bb743241a18b1280f898e0f740eab7

Author: Christian Costa <titan.costa at wanadoo.fr>
Date:   Sat Dec  6 18:58:11 2008 +0100

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 ce296ea..b4c0900 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 5a13902..122c2ee 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();
 }




More information about the wine-cvs mailing list