Zebediah Figura : quartz/vmr9: Allocate the surface array in allocate_surfaces().

Alexandre Julliard julliard at winehq.org
Wed May 13 16:29:53 CDT 2020


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue May 12 21:25:02 2020 -0500

quartz/vmr9: Allocate the surface array in allocate_surfaces().

Avoid allocating it twice if we try multiple formats.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/quartz/vmr9.c | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index 73119431a6..81e265f104 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -339,25 +339,19 @@ static HRESULT WINAPI VMR9_CheckMediaType(struct strmbase_renderer *iface, const
     return S_OK;
 }
 
-static HRESULT initialize_device(struct quartz_vmr *filter, VMR9AllocationInfo *info)
+static HRESULT initialize_device(struct quartz_vmr *filter, VMR9AllocationInfo *info, DWORD count)
 {
-    DWORD buffer_count = 1, i;
     HRESULT hr;
+    DWORD i;
 
     if (FAILED(hr = IVMRSurfaceAllocatorEx9_InitializeDevice(filter->allocator,
-            filter->cookie, info, &buffer_count)))
+            filter->cookie, info, &count)))
     {
         WARN("Failed to initialize device (flags %#x), hr %#x.\n", info->dwFlags, hr);
         return hr;
     }
 
-    if (!(filter->surfaces = calloc(buffer_count, sizeof(IDirect3DSurface9 *))))
-    {
-        IVMRSurfaceAllocatorEx9_TerminateDevice(filter->allocator, filter->cookie);
-        return E_OUTOFMEMORY;
-    }
-
-    for (i = 0; i < buffer_count; ++i)
+    for (i = 0; i < count; ++i)
     {
         if (FAILED(hr = IVMRSurfaceAllocatorEx9_GetSurface(filter->allocator,
                 filter->cookie, i, 0, &filter->surfaces[i])))
@@ -370,7 +364,6 @@ static HRESULT initialize_device(struct quartz_vmr *filter, VMR9AllocationInfo *
         }
     }
 
-    filter->num_surfaces = buffer_count;
     return hr;
 }
 
@@ -378,6 +371,7 @@ static HRESULT allocate_surfaces(struct quartz_vmr *filter, const AM_MEDIA_TYPE
 {
     VMR9AllocationInfo info = {};
     HRESULT hr = E_FAIL;
+    DWORD count = 1;
     unsigned int i;
 
     static const struct
@@ -410,10 +404,13 @@ static HRESULT allocate_surfaces(struct quartz_vmr *filter, const AM_MEDIA_TYPE
         return S_OK;
 
     info.Pool = D3DPOOL_DEFAULT;
-    info.MinBuffers = 1;
+    info.MinBuffers = count;
     info.dwWidth = info.szAspectRatio.cx = info.szNativeSize.cx = filter->bmiheader.biWidth;
     info.dwHeight = info.szAspectRatio.cy = info.szNativeSize.cy = filter->bmiheader.biHeight;
 
+    if (!(filter->surfaces = calloc(count, sizeof(IDirect3DSurface9 *))))
+        return E_OUTOFMEMORY;
+    filter->num_surfaces = count;
     filter->cur_surface = 0;
 
     if (!is_vmr9(filter))
@@ -431,7 +428,7 @@ static HRESULT allocate_surfaces(struct quartz_vmr *filter, const AM_MEDIA_TYPE
         }
 
         info.dwFlags = VMR9AllocFlag_TextureSurface;
-        return initialize_device(filter, &info);
+        return initialize_device(filter, &info, count);
     }
 
     for (i = 0; i < ARRAY_SIZE(formats); ++i)
@@ -443,14 +440,14 @@ static HRESULT allocate_surfaces(struct quartz_vmr *filter, const AM_MEDIA_TYPE
             if (formats[i].flags & VMR9AllocFlag_TextureSurface)
             {
                 info.dwFlags = VMR9AllocFlag_TextureSurface;
-                if (SUCCEEDED(hr = initialize_device(filter, &info)))
+                if (SUCCEEDED(hr = initialize_device(filter, &info, count)))
                     return hr;
             }
 
             if (formats[i].flags & VMR9AllocFlag_OffscreenSurface)
             {
                 info.dwFlags = VMR9AllocFlag_OffscreenSurface;
-                if (SUCCEEDED(hr = initialize_device(filter, &info)))
+                if (SUCCEEDED(hr = initialize_device(filter, &info, count)))
                     return hr;
             }
         }




More information about the wine-cvs mailing list