Commit fa3ebd50 authored by Santino Mazza's avatar Santino Mazza Committed by Alexandre Julliard

evr: Don't lock presenter allocator when calling NotifyRelease.

The changes in the video sample allocator are not part of the public api specification, it's only made for internal use in the evr presenter implementation.
parent 7c0731e1
......@@ -55,4 +55,6 @@ HRESULT evr_filter_create(IUnknown *outer_unk, void **ppv) DECLSPEC_HIDDEN;
HRESULT evr_mixer_create(IUnknown *outer_unk, void **ppv) DECLSPEC_HIDDEN;
HRESULT evr_presenter_create(IUnknown *outer_unk, void **ppv) DECLSPEC_HIDDEN;
HRESULT create_video_sample_allocator(BOOL lock_notify_release, REFIID riid, void **obj);
#endif /* __EVR_PRIVATE_INCLUDED__ */
......@@ -2149,7 +2149,7 @@ static HRESULT video_presenter_init_d3d(struct video_presenter *presenter)
if (FAILED(hr))
WARN("Failed to set new device for the manager, hr %#lx.\n", hr);
if (SUCCEEDED(hr = MFCreateVideoSampleAllocator(&IID_IMFVideoSampleAllocator, (void **)&presenter->allocator)))
if (SUCCEEDED(hr = create_video_sample_allocator(FALSE, &IID_IMFVideoSampleAllocator, (void **)&presenter->allocator)))
{
hr = IMFVideoSampleAllocator_SetDirectXManager(presenter->allocator, (IUnknown *)presenter->device_manager);
}
......
......@@ -395,6 +395,7 @@ struct sample_allocator
unsigned int free_sample_count;
struct list free_samples;
struct list used_samples;
BOOL lock_notify_release;
CRITICAL_SECTION cs;
};
......@@ -809,6 +810,7 @@ static HRESULT WINAPI sample_allocator_tracking_callback_Invoke(IMFAsyncCallback
struct queued_sample *iter;
IUnknown *object = NULL;
IMFSample *sample = NULL;
IMFVideoSampleAllocatorNotify *callback = NULL;
HRESULT hr;
if (FAILED(IMFAsyncResult_GetObject(result, &object)))
......@@ -836,10 +838,24 @@ static HRESULT WINAPI sample_allocator_tracking_callback_Invoke(IMFAsyncCallback
IMFSample_Release(sample);
if (allocator->callback)
IMFVideoSampleAllocatorNotify_NotifyRelease(allocator->callback);
{
if (allocator->lock_notify_release)
IMFVideoSampleAllocatorNotify_NotifyRelease(allocator->callback);
else
{
callback = allocator->callback;
IMFVideoSampleAllocatorNotify_AddRef(callback);
}
}
LeaveCriticalSection(&allocator->cs);
if (callback)
{
IMFVideoSampleAllocatorNotify_NotifyRelease(callback);
IMFVideoSampleAllocatorNotify_Release(callback);
}
return S_OK;
}
......@@ -852,13 +868,11 @@ static const IMFAsyncCallbackVtbl sample_allocator_tracking_callback_vtbl =
sample_allocator_tracking_callback_Invoke,
};
HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj)
HRESULT create_video_sample_allocator(BOOL lock_notify_release, REFIID riid, void **obj)
{
struct sample_allocator *object;
HRESULT hr;
TRACE("%s, %p.\n", debugstr_guid(riid), obj);
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
......@@ -868,6 +882,7 @@ HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj)
object->refcount = 1;
list_init(&object->used_samples);
list_init(&object->free_samples);
object->lock_notify_release = lock_notify_release;
InitializeCriticalSection(&object->cs);
hr = IMFVideoSampleAllocator_QueryInterface(&object->IMFVideoSampleAllocator_iface, riid, obj);
......@@ -876,6 +891,13 @@ HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj)
return hr;
}
HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj)
{
TRACE("%s, %p.\n", debugstr_guid(riid), obj);
return create_video_sample_allocator(TRUE, riid, obj);
}
static HRESULT WINAPI video_sample_QueryInterface(IMFSample *iface, REFIID riid, void **out)
{
struct video_sample *sample = impl_from_IMFSample(iface);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment