Nikolay Sivov : evr/allocator: Fix reference counting for returned samples.
Alexandre Julliard
julliard at winehq.org
Thu Nov 12 15:17:45 CST 2020
Module: wine
Branch: master
Commit: 0066be78ae7ef93c86de254d358b4ce3935d3de2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0066be78ae7ef93c86de254d358b4ce3935d3de2
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Thu Nov 12 13:36:36 2020 +0300
evr/allocator: Fix reference counting for returned samples.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/evr/sample.c | 6 ++++--
dlls/evr/tests/evr.c | 7 +++----
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/dlls/evr/sample.c b/dlls/evr/sample.c
index e84d7450c7f..7764ec945d2 100644
--- a/dlls/evr/sample.c
+++ b/dlls/evr/sample.c
@@ -459,7 +459,6 @@ static void sample_allocator_release_samples(struct sample_allocator *allocator)
LIST_FOR_EACH_ENTRY_SAFE(iter, iter2, &allocator->used_samples, struct queued_sample, entry)
{
list_remove(&iter->entry);
- IMFSample_Release(iter->sample);
heap_free(iter);
}
}
@@ -676,8 +675,10 @@ static HRESULT WINAPI sample_allocator_AllocateSample(IMFVideoSampleAllocator *i
list_add_tail(&allocator->used_samples, head);
allocator->free_sample_count--;
+ /* Reference counter is not increased when sample is returned, so next release could trigger
+ tracking condition. This is balanced by incremented reference counter when sample is returned
+ back to the free list. */
*out = sample;
- IMFSample_AddRef(*out);
}
}
@@ -816,6 +817,7 @@ static HRESULT WINAPI sample_allocator_tracking_callback_Invoke(IMFAsyncCallback
{
list_remove(&iter->entry);
list_add_tail(&allocator->free_samples, &iter->entry);
+ IMFSample_AddRef(iter->sample);
allocator->free_sample_count++;
break;
}
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index a1d7b7109d9..b8a16fc7cc9 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -1326,13 +1326,13 @@ static void test_MFCreateVideoSampleAllocator(void)
IDirect3DSurface9 *surface;
IDirect3DDevice9 *device;
IMFMediaBuffer *buffer;
+ LONG refcount, count;
unsigned int token;
IMFGetService *gs;
IDirect3D9 *d3d;
IUnknown *unk;
HWND window;
HRESULT hr;
- LONG count;
BYTE *data;
hr = MFCreateVideoSampleAllocator(&IID_IUnknown, (void **)&unk);
@@ -1397,7 +1397,7 @@ todo_wine
sample = NULL;
hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- ok(get_refcount(sample) == 3, "Unexpected refcount %u.\n", get_refcount(sample));
+ refcount = get_refcount(sample);
hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample2);
ok(hr == MF_E_SAMPLEALLOCATOR_EMPTY, "Unexpected hr %#x.\n", hr);
@@ -1405,8 +1405,7 @@ todo_wine
/* Reinitialize with active sample. */
hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 4, video_type);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
-todo_wine
- ok(get_refcount(sample) == 3, "Unexpected refcount %u.\n", get_refcount(sample));
+ ok(refcount == get_refcount(sample), "Unexpected refcount %u.\n", get_refcount(sample));
hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, &count);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
More information about the wine-cvs
mailing list