[PATCH 02/11] mfplat: Initialize attribute array.
Nikolay Sivov
nsivov at codeweavers.com
Thu Mar 14 03:03:07 CDT 2019
From: Jactry Zeng <jzeng at codeweavers.com>
Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mfplat/buffer.c | 9 +++-
dlls/mfplat/main.c | 80 ++++++++++++++++++++++++++++--------
dlls/mfplat/mediatype.c | 30 ++++++++++----
dlls/mfplat/mfplat_private.h | 13 +++++-
4 files changed, 107 insertions(+), 25 deletions(-)
diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c
index f6eecb68cb..b07ec875f9 100644
--- a/dlls/mfplat/buffer.c
+++ b/dlls/mfplat/buffer.c
@@ -271,6 +271,7 @@ static ULONG WINAPI sample_Release(IMFSample *iface)
{
for (i = 0; i < sample->buffer_count; ++i)
IMFMediaBuffer_Release(sample->buffers[i]);
+ clear_attributes_object(&sample->attributes);
DeleteCriticalSection(&sample->cs);
heap_free(sample->buffers);
heap_free(sample);
@@ -704,6 +705,7 @@ static const IMFSampleVtbl samplevtbl =
HRESULT WINAPI MFCreateSample(IMFSample **sample)
{
struct sample *object;
+ HRESULT hr;
TRACE("%p.\n", sample);
@@ -711,7 +713,12 @@ HRESULT WINAPI MFCreateSample(IMFSample **sample)
if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return hr;
+ }
+
object->IMFSample_iface.lpVtbl = &samplevtbl;
InitializeCriticalSection(&object->cs);
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index c8c19aa404..9d8a3ae2fe 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -628,17 +628,18 @@ static ULONG WINAPI mfattributes_AddRef(IMFAttributes *iface)
static ULONG WINAPI mfattributes_Release(IMFAttributes *iface)
{
- mfattributes *This = impl_from_IMFAttributes(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
+ struct attributes *attributes = impl_from_IMFAttributes(iface);
+ ULONG refcount = InterlockedDecrement(&attributes->ref);
- TRACE("(%p) ref=%u\n", This, ref);
+ TRACE("%p, refcount %d.\n", iface, refcount);
- if (!ref)
+ if (!refcount)
{
- HeapFree(GetProcessHeap(), 0, This);
+ clear_attributes_object(attributes);
+ heap_free(attributes);
}
- return ref;
+ return refcount;
}
static HRESULT WINAPI mfattributes_GetItem(IMFAttributes *iface, REFGUID key, PROPVARIANT *value)
@@ -909,10 +910,34 @@ static const IMFAttributesVtbl mfattributes_vtbl =
mfattributes_CopyAllItems
};
-void init_attribute_object(mfattributes *object, UINT32 size)
+HRESULT init_attributes_object(struct attributes *object, UINT32 size)
{
- object->ref = 1;
object->IMFAttributes_iface.lpVtbl = &mfattributes_vtbl;
+ object->ref = 1;
+ InitializeCriticalSection(&object->cs);
+
+ object->attributes = NULL;
+ object->count = 0;
+ object->capacity = 0;
+ if (!mf_array_reserve((void **)&object->attributes, &object->capacity, size,
+ sizeof(*object->attributes)))
+ {
+ DeleteCriticalSection(&object->cs);
+ return E_OUTOFMEMORY;
+ }
+
+ return S_OK;
+}
+
+void clear_attributes_object(struct attributes *object)
+{
+ size_t i;
+
+ for (i = 0; i < object->count; i++)
+ PropVariantClear(&object->attributes[i].value);
+ heap_free(object->attributes);
+
+ DeleteCriticalSection(&object->cs);
}
/***********************************************************************
@@ -920,15 +945,20 @@ void init_attribute_object(mfattributes *object, UINT32 size)
*/
HRESULT WINAPI MFCreateAttributes(IMFAttributes **attributes, UINT32 size)
{
- mfattributes *object;
+ struct attributes *object;
+ HRESULT hr;
TRACE("%p, %d\n", attributes, size);
- object = HeapAlloc( GetProcessHeap(), 0, sizeof(*object) );
- if(!object)
+ object = heap_alloc_zero(sizeof(*object));
+ if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(object, size);
+ if (FAILED(hr = init_attributes_object(object, size)))
+ {
+ heap_free(object);
+ return hr;
+ }
*attributes = &object->IMFAttributes_iface;
return S_OK;
@@ -990,6 +1020,7 @@ static ULONG WINAPI mfbytestream_Release(IMFByteStream *iface)
if (!ref)
{
+ clear_attributes_object(&This->attributes);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -1223,6 +1254,7 @@ static const IMFAttributesVtbl mfbytestream_attributes_vtbl =
HRESULT WINAPI MFCreateMFByteStreamOnStream(IStream *stream, IMFByteStream **bytestream)
{
mfbytestream *object;
+ HRESULT hr;
TRACE("(%p, %p): stub\n", stream, bytestream);
@@ -1230,7 +1262,11 @@ HRESULT WINAPI MFCreateMFByteStreamOnStream(IStream *stream, IMFByteStream **byt
if(!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return hr;
+ }
object->IMFByteStream_iface.lpVtbl = &mfbytestream_vtbl;
object->attributes.IMFAttributes_iface.lpVtbl = &mfbytestream_attributes_vtbl;
@@ -1248,6 +1284,7 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open
DWORD filecreation_disposition = 0;
DWORD fileattributes = 0;
HANDLE file;
+ HRESULT hr;
FIXME("(%d, %d, %d, %s, %p): stub\n", accessmode, openmode, flags, debugstr_w(url), bytestream);
@@ -1301,7 +1338,11 @@ HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE open
if(!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return hr;
+ }
object->IMFByteStream_iface.lpVtbl = &mfbytestream_vtbl;
object->attributes.IMFAttributes_iface.lpVtbl = &mfbytestream_attributes_vtbl;
@@ -1457,6 +1498,7 @@ static ULONG WINAPI mfpresentationdescriptor_Release(IMFPresentationDescriptor *
if (!ref)
{
+ clear_attributes_object(&This->attributes);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -1855,7 +1897,7 @@ static HRESULT WINAPI mfsource_CreatePresentationDescriptor(IMFMediaSource *ifac
if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ init_attributes_object(&object->attributes, 0);
object->IMFPresentationDescriptor_iface.lpVtbl = &mfpresentationdescriptor_vtbl;
*descriptor = &object->IMFPresentationDescriptor_iface;
@@ -2754,6 +2796,7 @@ static ULONG WINAPI mfmediaevent_Release(IMFMediaEvent *iface)
if (!ref)
{
+ clear_attributes_object(&event->attributes);
PropVariantClear(&event->value);
heap_free(event);
}
@@ -3035,6 +3078,7 @@ HRESULT WINAPI MFCreateMediaEvent(MediaEventType type, REFGUID extended_type, HR
const PROPVARIANT *value, IMFMediaEvent **event)
{
mfmediaevent *object;
+ HRESULT hr;
TRACE("%#x, %s, %08x, %p, %p\n", type, debugstr_guid(extended_type), status, value, event);
@@ -3042,7 +3086,11 @@ HRESULT WINAPI MFCreateMediaEvent(MediaEventType type, REFGUID extended_type, HR
if(!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return hr;
+ }
object->IMFMediaEvent_iface.lpVtbl = &mfmediaevent_vtbl;
object->type = type;
diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c
index d27d5ef12b..b526509ab3 100644
--- a/dlls/mfplat/mediatype.c
+++ b/dlls/mfplat/mediatype.c
@@ -116,6 +116,7 @@ static ULONG WINAPI mediatype_Release(IMFMediaType *iface)
if (!refcount)
{
+ clear_attributes_object(&media_type->attributes);
heap_free(media_type);
}
@@ -496,6 +497,7 @@ static const IMFMediaTypeVtbl mediatypevtbl =
HRESULT WINAPI MFCreateMediaType(IMFMediaType **media_type)
{
struct media_type *object;
+ HRESULT hr;
TRACE("%p.\n", media_type);
@@ -506,7 +508,11 @@ HRESULT WINAPI MFCreateMediaType(IMFMediaType **media_type)
if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return hr;
+ }
object->IMFMediaType_iface.lpVtbl = &mediatypevtbl;
*media_type = &object->IMFMediaType_iface;
@@ -561,6 +567,7 @@ static ULONG WINAPI stream_descriptor_Release(IMFStreamDescriptor *iface)
heap_free(stream_desc->media_types);
if (stream_desc->current_type)
IMFMediaType_Release(stream_desc->current_type);
+ clear_attributes_object(&stream_desc->attributes);
DeleteCriticalSection(&stream_desc->cs);
heap_free(stream_desc);
}
@@ -950,6 +957,7 @@ HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count,
{
struct stream_desc *object;
unsigned int i;
+ HRESULT hr;
TRACE("%d, %d, %p, %p.\n", identifier, count, types, descriptor);
@@ -960,14 +968,19 @@ HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count,
if (!object)
return E_OUTOFMEMORY;
- init_attribute_object(&object->attributes, 0);
+ if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
+ {
+ heap_free(object);
+ return hr;
+ }
object->IMFStreamDescriptor_iface.lpVtbl = &streamdescriptorvtbl;
object->IMFMediaTypeHandler_iface.lpVtbl = &mediatypehandlervtbl;
object->identifier = identifier;
object->media_types = heap_alloc(count * sizeof(*object->media_types));
+ InitializeCriticalSection(&object->cs);
if (!object->media_types)
{
- heap_free(object);
+ IMFStreamDescriptor_Release(&object->IMFStreamDescriptor_iface);
return E_OUTOFMEMORY;
}
for (i = 0; i < count; ++i)
@@ -977,7 +990,6 @@ HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count,
IMFMediaType_AddRef(object->media_types[i]);
}
object->media_types_count = count;
- InitializeCriticalSection(&object->cs);
*descriptor = &object->IMFStreamDescriptor_iface;
@@ -1027,6 +1039,7 @@ static ULONG WINAPI presentation_descriptor_Release(IMFPresentationDescriptor *i
if (presentation_desc->descriptors[i].descriptor)
IMFStreamDescriptor_Release(presentation_desc->descriptors[i].descriptor);
}
+ clear_attributes_object(&presentation_desc->attributes);
DeleteCriticalSection(&presentation_desc->cs);
heap_free(presentation_desc->descriptors);
heap_free(presentation_desc);
@@ -1369,16 +1382,19 @@ static const IMFPresentationDescriptorVtbl presentationdescriptorvtbl =
static HRESULT presentation_descriptor_init(struct presentation_desc *object, DWORD count)
{
- init_attribute_object(&object->attributes, 0);
+ HRESULT hr;
+
+ if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
+ return hr;
object->IMFPresentationDescriptor_iface.lpVtbl = &presentationdescriptorvtbl;
object->descriptors = heap_alloc_zero(count * sizeof(*object->descriptors));
+ InitializeCriticalSection(&object->cs);
if (!object->descriptors)
{
- heap_free(object);
+ IMFPresentationDescriptor_Release(&object->IMFPresentationDescriptor_iface);
return E_OUTOFMEMORY;
}
object->count = count;
- InitializeCriticalSection(&object->cs);
return S_OK;
}
diff --git a/dlls/mfplat/mfplat_private.h b/dlls/mfplat/mfplat_private.h
index c42570c8a9..7d2e25f435 100644
--- a/dlls/mfplat/mfplat_private.h
+++ b/dlls/mfplat/mfplat_private.h
@@ -24,13 +24,24 @@
#include "wine/heap.h"
+struct attribute
+{
+ GUID key;
+ PROPVARIANT value;
+};
+
typedef struct attributes
{
IMFAttributes IMFAttributes_iface;
LONG ref;
+ CRITICAL_SECTION cs;
+ struct attribute *attributes;
+ size_t capacity;
+ size_t count;
} mfattributes;
-extern void init_attribute_object(mfattributes *object, UINT32 size) DECLSPEC_HIDDEN;
+extern HRESULT init_attributes_object(struct attributes *object, UINT32 size) DECLSPEC_HIDDEN;
+extern void clear_attributes_object(struct attributes *object) DECLSPEC_HIDDEN;
extern void init_system_queues(void) DECLSPEC_HIDDEN;
extern void shutdown_system_queues(void) DECLSPEC_HIDDEN;
--
2.20.1
More information about the wine-devel
mailing list