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