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