From 054c1309965cd1eb2a36b296030b0f580fb36af7 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Mon, 28 Apr 2008 09:26:20 -0700 Subject: [PATCH] quartz: Fix bug in memallocator, with test --- dlls/quartz/memallocator.c | 6 +++--- dlls/quartz/tests/memallocator.c | 34 +++++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/dlls/quartz/memallocator.c b/dlls/quartz/memallocator.c index cd87a34..12effbb 100644 --- a/dlls/quartz/memallocator.c +++ b/dlls/quartz/memallocator.c @@ -237,13 +237,13 @@ static HRESULT WINAPI BaseMemAllocator_Commit(IMemAllocator * iface) { if (!This->pProps) hr = VFW_E_SIZENOTSET; - else if (This->bCommitted) - hr = S_OK; - else if (This->bDecommitQueued) + else if (This->bDecommitQueued && This->bCommitted) { This->bDecommitQueued = FALSE; hr = S_OK; } + else if (This->bCommitted) + hr = S_OK; else { if (!(This->hSemWaiting = CreateSemaphoreW(NULL, This->pProps->cBuffers, This->pProps->cBuffers, NULL))) diff --git a/dlls/quartz/tests/memallocator.c b/dlls/quartz/tests/memallocator.c index 0a01db9..b0638e8 100644 --- a/dlls/quartz/tests/memallocator.c +++ b/dlls/quartz/tests/memallocator.c @@ -37,13 +37,15 @@ static void CommitDecommitTest(void) if (hr == S_OK) { - ALLOCATOR_PROPERTIES RequestedProps; - ALLOCATOR_PROPERTIES ActualProps; + ALLOCATOR_PROPERTIES RequestedProps; + ALLOCATOR_PROPERTIES ActualProps; - RequestedProps.cBuffers = 1; - RequestedProps.cbBuffer = 65536; - RequestedProps.cbAlign = 1; - RequestedProps.cbPrefix = 0; + IMediaSample *sample = NULL, *sample2 = NULL; + + RequestedProps.cBuffers = 2; + RequestedProps.cbBuffer = 65536; + RequestedProps.cbAlign = 1; + RequestedProps.cbPrefix = 0; hr = IMemAllocator_SetProperties(pMemAllocator, &RequestedProps, &ActualProps); ok(hr==S_OK, "SetProperties returned: %x\n", hr); @@ -53,12 +55,30 @@ static void CommitDecommitTest(void) hr = IMemAllocator_Commit(pMemAllocator); ok(hr==S_OK, "Commit returned: %x\n", hr); + hr = IMemAllocator_GetBuffer(pMemAllocator, &sample, NULL, NULL, 0); + ok(hr==S_OK, "Could not get a buffer: %x\n", hr); + hr = IMemAllocator_Decommit(pMemAllocator); ok(hr==S_OK, "Decommit returned: %x\n", hr); hr = IMemAllocator_Decommit(pMemAllocator); ok(hr==S_OK, "Cecommit returned: %x\n", hr); - IMemAllocator_Release(pMemAllocator); + /* Decommit and recommit while holding a sample */ + if (sample) + { + hr = IMemAllocator_Commit(pMemAllocator); + ok(hr==S_OK, "Commit returned: %x\n", hr); + + hr = IMemAllocator_GetBuffer(pMemAllocator, &sample2, NULL, NULL, 0); + ok(hr==S_OK, "Could not get a buffer: %x\n", hr); + IUnknown_Release(sample); + if (sample2) + IUnknown_Release(sample2); + + hr = IMemAllocator_Decommit(pMemAllocator); + ok(hr==S_OK, "Cecommit returned: %x\n", hr); + } + IMemAllocator_Release(pMemAllocator); } } -- 1.5.4.1