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