Nikolay Sivov : mfplat/allocator: Reduce duplication by returning ready-to-queue structure from allocation helper.

Alexandre Julliard julliard at winehq.org
Fri Sep 17 16:03:09 CDT 2021


Module: wine
Branch: master
Commit: 12f72681da3ab4a8499233fc4b9e244a1ea3f311
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=12f72681da3ab4a8499233fc4b9e244a1ea3f311

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Sep 17 14:15:41 2021 +0300

mfplat/allocator: Reduce duplication by returning ready-to-queue structure from allocation helper.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfplat/sample.c | 53 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 31 insertions(+), 22 deletions(-)

diff --git a/dlls/mfplat/sample.c b/dlls/mfplat/sample.c
index d99e2b046a6..04c68c87199 100644
--- a/dlls/mfplat/sample.c
+++ b/dlls/mfplat/sample.c
@@ -1305,20 +1305,18 @@ static void sample_allocator_release_surface_service(struct sample_allocator *al
 }
 
 static HRESULT sample_allocator_allocate_sample(struct sample_allocator *allocator, const struct surface_service *service,
-        IMFSample **sample)
+        struct queued_sample **queued_sample)
 {
-    struct queued_sample *queued_sample = malloc(sizeof(*queued_sample));
     IMFTrackedSample *tracked_sample;
     IMFMediaBuffer *buffer;
+    IMFSample *sample;
     unsigned int i;
     HRESULT hr;
 
     if (FAILED(hr = MFCreateTrackedSample(&tracked_sample)))
-    {
         return hr;
-    }
 
-    IMFTrackedSample_QueryInterface(tracked_sample, &IID_IMFSample, (void **)sample);
+    IMFTrackedSample_QueryInterface(tracked_sample, &IID_IMFSample, (void **)&sample);
     IMFTrackedSample_Release(tracked_sample);
 
     for (i = 0; i < allocator->frame_desc.buffer_count; ++i)
@@ -1369,11 +1367,24 @@ static HRESULT sample_allocator_allocate_sample(struct sample_allocator *allocat
 
         if (SUCCEEDED(hr))
         {
-            hr = IMFSample_AddBuffer(*sample, buffer);
+            hr = IMFSample_AddBuffer(sample, buffer);
             IMFMediaBuffer_Release(buffer);
         }
     }
 
+    if (FAILED(hr))
+    {
+        IMFSample_Release(sample);
+        return hr;
+    }
+
+    if (!(*queued_sample = malloc(sizeof(**queued_sample))))
+    {
+        IMFSample_Release(sample);
+        return E_OUTOFMEMORY;
+    }
+    (*queued_sample)->sample = sample;
+
     return hr;
 }
 
@@ -1381,11 +1392,11 @@ static HRESULT sample_allocator_initialize(struct sample_allocator *allocator, u
         unsigned int max_sample_count, IMFAttributes *attributes, IMFMediaType *media_type)
 {
     struct surface_service service;
+    struct queued_sample *sample;
     DXGI_FORMAT dxgi_format;
     unsigned int i, value;
     GUID major, subtype;
     UINT64 frame_size;
-    IMFSample *sample;
     D3D11_USAGE usage;
     HRESULT hr;
 
@@ -1458,13 +1469,9 @@ static HRESULT sample_allocator_initialize(struct sample_allocator *allocator, u
 
     for (i = 0; i < sample_count; ++i)
     {
-        struct queued_sample *queued_sample;
-
         if (SUCCEEDED(hr = sample_allocator_allocate_sample(allocator, &service, &sample)))
         {
-            queued_sample = malloc(sizeof(*queued_sample));
-            queued_sample->sample = sample;
-            list_add_tail(&allocator->free_samples, &queued_sample->entry);
+            list_add_tail(&allocator->free_samples, &sample->entry);
             allocator->free_sample_count++;
         }
     }
@@ -1512,7 +1519,7 @@ static HRESULT sample_allocator_track_sample(struct sample_allocator *allocator,
 static HRESULT WINAPI sample_allocator_AllocateSample(IMFVideoSampleAllocatorEx *iface, IMFSample **out)
 {
     struct sample_allocator *allocator = impl_from_IMFVideoSampleAllocatorEx(iface);
-    IMFSample *sample;
+    struct queued_sample *sample;
     HRESULT hr;
 
     TRACE("%p, %p.\n", iface, out);
@@ -1527,9 +1534,9 @@ static HRESULT WINAPI sample_allocator_AllocateSample(IMFVideoSampleAllocatorEx
     {
         struct list *head = list_head(&allocator->free_samples);
 
-        sample = LIST_ENTRY(head, struct queued_sample, entry)->sample;
+        sample = LIST_ENTRY(head, struct queued_sample, entry);
 
-        if (SUCCEEDED(hr = sample_allocator_track_sample(allocator, sample)))
+        if (SUCCEEDED(hr = sample_allocator_track_sample(allocator, sample->sample)))
         {
             list_remove(head);
             list_add_tail(&allocator->used_samples, head);
@@ -1538,7 +1545,7 @@ static HRESULT WINAPI sample_allocator_AllocateSample(IMFVideoSampleAllocatorEx
             /* 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;
+            *out = sample->sample;
         }
     }
     else /* allocator->cold_sample_count != 0 */
@@ -1549,15 +1556,17 @@ static HRESULT WINAPI sample_allocator_AllocateSample(IMFVideoSampleAllocatorEx
         {
             if (SUCCEEDED(hr = sample_allocator_allocate_sample(allocator, &service, &sample)))
             {
-                if (SUCCEEDED(hr = sample_allocator_track_sample(allocator, sample)))
+                if (SUCCEEDED(hr = sample_allocator_track_sample(allocator, sample->sample)))
                 {
-                    struct queued_sample *queued_sample = malloc(sizeof(*queued_sample));
-
-                    queued_sample->sample = sample;
-                    list_add_tail(&allocator->used_samples, &queued_sample->entry);
+                    list_add_tail(&allocator->used_samples, &sample->entry);
                     allocator->cold_sample_count--;
 
-                    *out = queued_sample->sample;
+                    *out = sample->sample;
+                }
+                else
+                {
+                    IMFSample_Release(sample->sample);
+                    free(sample);
                 }
             }
 




More information about the wine-cvs mailing list