From 11f0e141be08307dc524beffdda58de1186ff7eb Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Sat, 19 Apr 2008 15:19:32 -0700 Subject: [PATCH] quartz: Add some more tests and fix crashes they cause --- dlls/quartz/dsoundrender.c | 3 +- dlls/quartz/enumpins.c | 13 +++++++- dlls/quartz/nullrenderer.c | 3 +- dlls/quartz/tests/filtergraph.c | 15 +++++++- dlls/quartz/tests/videorenderer.c | 64 +++++++++++++++++++++++++++++++++++++ dlls/quartz/transform.c | 3 +- dlls/quartz/videorenderer.c | 3 +- 7 files changed, 97 insertions(+), 7 deletions(-) diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index 4a90bb3..c20c5e8 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -599,7 +599,8 @@ static HRESULT WINAPI DSoundRender_GetSyncSource(IBaseFilter * iface, IReference EnterCriticalSection(&This->csFilter); { *ppClock = This->pClock; - IReferenceClock_AddRef(This->pClock); + if (This->pClock) + IReferenceClock_AddRef(This->pClock); } LeaveCriticalSection(&This->csFilter); diff --git a/dlls/quartz/enumpins.c b/dlls/quartz/enumpins.c index 61e42b0..675ef5c 100644 --- a/dlls/quartz/enumpins.c +++ b/dlls/quartz/enumpins.c @@ -36,7 +36,12 @@ static const struct IEnumPinsVtbl IEnumPinsImpl_Vtbl; HRESULT IEnumPinsImpl_Construct(const ENUMPINDETAILS * pDetails, IEnumPins ** ppEnum) { - IEnumPinsImpl * pEnumPins = CoTaskMemAlloc(sizeof(IEnumPinsImpl)); + IEnumPinsImpl * pEnumPins; + + if (!ppEnum) + return E_POINTER; + + pEnumPins = CoTaskMemAlloc(sizeof(IEnumPinsImpl)); if (!pEnumPins) { *ppEnum = NULL; @@ -109,6 +114,12 @@ static HRESULT WINAPI IEnumPinsImpl_Next(IEnumPins * iface, ULONG cPins, IPin ** TRACE("(%u, %p, %p)\n", cPins, ppPins, pcFetched); + if (!ppPins) + return E_POINTER; + + if (cPins > 1 && !pcFetched) + return E_INVALIDARG; + if (cFetched > 0) { ULONG i; diff --git a/dlls/quartz/nullrenderer.c b/dlls/quartz/nullrenderer.c index d871e67..f511a7b 100644 --- a/dlls/quartz/nullrenderer.c +++ b/dlls/quartz/nullrenderer.c @@ -463,7 +463,8 @@ static HRESULT WINAPI NullRenderer_GetSyncSource(IBaseFilter * iface, IReference EnterCriticalSection(&This->csFilter); { *ppClock = This->pClock; - IReferenceClock_AddRef(This->pClock); + if (This->pClock) + IReferenceClock_AddRef(This->pClock); } LeaveCriticalSection(&This->csFilter); diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index d72b7b3..2d649a0 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -50,11 +50,21 @@ static void rungraph(void) HRESULT hr; IMediaControl* pmc; IMediaEvent* pme; + IMediaFilter* pmf; HANDLE hEvent; + IMediaControl_Stop(pmc); + hr = IGraphBuilder_QueryInterface(pgraph, &IID_IMediaControl, (LPVOID*)&pmc); ok(hr==S_OK, "Cannot get IMediaControl interface returned: %x\n", hr); + hr = IGraphBuilder_QueryInterface(pgraph, &IID_IMediaFilter, (LPVOID*)&pmf); + ok(hr==S_OK, "Cannot get IMediaFilter interface returned: %x\n", hr); + + IMediaFilter_SetSyncSource(pmf, NULL); + + IMediaFilter_Release(pmf); + hr = IMediaControl_Run(pmc); ok(hr==S_FALSE, "Cannot run the graph returned: %x\n", hr); @@ -64,6 +74,8 @@ static void rungraph(void) hr = IMediaControl_Stop(pmc); ok(hr==S_OK || hr == S_FALSE, "Cannot stop the graph returned: %x\n", hr); + IGraphBuilder_SetDefaultSyncSource(pgraph); + Sleep(10); trace("stop -> pause\n"); hr = IMediaControl_Pause(pmc); @@ -97,7 +109,6 @@ static void rungraph(void) hr = IMediaControl_Run(pmc); ok(hr==S_OK || hr == S_FALSE, "Cannot start the graph returned: %x\n", hr); - hr = IGraphBuilder_QueryInterface(pgraph, &IID_IMediaEvent, (LPVOID*)&pme); ok(hr==S_OK, "Cannot get IMediaEvent interface returned: %x\n", hr); @@ -107,7 +118,7 @@ static void rungraph(void) /* WaitForSingleObject(hEvent, INFINITE); */ Sleep(20000); - hr = IMediaControl_Release(pme); + hr = IMediaEvent_Release(pme); ok(hr==2, "Releasing mediaevent returned: %x\n", hr); hr = IMediaControl_Stop(pmc); diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c index ca119e7..378e019 100644 --- a/dlls/quartz/tests/videorenderer.c +++ b/dlls/quartz/tests/videorenderer.c @@ -86,6 +86,69 @@ static void test_query_interface(void) RELEASE_EXPECT(pVideoWindow, 1); } +static void test_pin(IPin *pin) +{ + IMemInputPin *mpin = NULL; + + IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&mpin); + + ok(mpin != NULL, "No IMemInputPin found!\n"); + if (mpin) + { + ok(IMemInputPin_ReceiveCanBlock(mpin) == S_OK, "Receive can't block for pin!\n"); + IMemInputPin_Release(mpin); + } + /* TODO */ +} + +static void test_basefilter(void) +{ + IEnumPins *pin_enum = NULL; + IBaseFilter *base = NULL; + IPin *pins[2]; + ULONG ref; + HRESULT hr; + + IUnknown_QueryInterface(pVideoRenderer, &IID_IBaseFilter, (void *)&base); + if (base == NULL) + { + /* test_query_interface handles this case */ + skip("No IBaseFilter\n"); + return; + } + + hr = IBaseFilter_EnumPins(base, NULL); + ok(hr == E_POINTER, "hr = %08x and not E_POINTER\n", hr); + + hr= IBaseFilter_EnumPins(base, &pin_enum); + ok(hr == S_OK, "hr = %08x and not S_OK\n", hr); + + hr = IEnumPins_Next(pin_enum, 1, NULL, NULL); + ok(hr == E_POINTER, "hr = %08x and not E_POINTER\n", hr); + + hr = IEnumPins_Next(pin_enum, 2, pins, NULL); + ok(hr == E_INVALIDARG, "hr = %08x and not E_INVALIDARG\n", hr); + + pins[0] = (void *)0xdead; + pins[1] = (void *)0xdeed; + + hr = IEnumPins_Next(pin_enum, 2, pins, &ref); + ok(hr == S_FALSE, "hr = %08x instead of S_FALSE\n", hr); + ok(pins[0] != (void *)0xdead && pins[0] != NULL, "pins[0] = %p\n", pins[0]); + if (pins[0] != (void *)0xdead && pins[0] != NULL) + { + test_pin(pins[0]); + IPin_Release(pins[0]); + } + + ok(pins[1] == (void *)0xdeed, "pins[1] = %p\n", pins[1]); + + ref = IEnumPins_Release(pin_enum); + ok(ref == 0, "ref is %u and not 0!\n", ref); + + IBaseFilter_Release(base); +} + START_TEST(videorenderer) { CoInitialize(NULL); @@ -93,6 +156,7 @@ START_TEST(videorenderer) return; test_query_interface(); + test_basefilter(); release_video_renderer(); } diff --git a/dlls/quartz/transform.c b/dlls/quartz/transform.c index b090e5b..2596f63 100644 --- a/dlls/quartz/transform.c +++ b/dlls/quartz/transform.c @@ -424,7 +424,8 @@ static HRESULT WINAPI TransformFilter_GetSyncSource(IBaseFilter * iface, IRefere EnterCriticalSection(&This->csFilter); { *ppClock = This->pClock; - IReferenceClock_AddRef(This->pClock); + if (This->pClock) + IReferenceClock_AddRef(This->pClock); } LeaveCriticalSection(&This->csFilter); diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index 5179bd0..f49f8fb 100644 --- a/dlls/quartz/videorenderer.c +++ b/dlls/quartz/videorenderer.c @@ -754,7 +754,8 @@ static HRESULT WINAPI VideoRenderer_GetSyncSource(IBaseFilter * iface, IReferenc EnterCriticalSection(&This->csFilter); { *ppClock = This->pClock; - IReferenceClock_AddRef(This->pClock); + if (This->pClock) + IReferenceClock_AddRef(This->pClock); } LeaveCriticalSection(&This->csFilter); -- 1.5.4.1