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; ...@@ -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_mixer_create(IUnknown *outer_unk, void **ppv) DECLSPEC_HIDDEN;
HRESULT evr_presenter_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__ */ #endif /* __EVR_PRIVATE_INCLUDED__ */
...@@ -2149,7 +2149,7 @@ static HRESULT video_presenter_init_d3d(struct video_presenter *presenter) ...@@ -2149,7 +2149,7 @@ static HRESULT video_presenter_init_d3d(struct video_presenter *presenter)
if (FAILED(hr)) if (FAILED(hr))
WARN("Failed to set new device for the manager, hr %#lx.\n", 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); hr = IMFVideoSampleAllocator_SetDirectXManager(presenter->allocator, (IUnknown *)presenter->device_manager);
} }
......
...@@ -395,6 +395,7 @@ struct sample_allocator ...@@ -395,6 +395,7 @@ struct sample_allocator
unsigned int free_sample_count; unsigned int free_sample_count;
struct list free_samples; struct list free_samples;
struct list used_samples; struct list used_samples;
BOOL lock_notify_release;
CRITICAL_SECTION cs; CRITICAL_SECTION cs;
}; };
...@@ -809,6 +810,7 @@ static HRESULT WINAPI sample_allocator_tracking_callback_Invoke(IMFAsyncCallback ...@@ -809,6 +810,7 @@ static HRESULT WINAPI sample_allocator_tracking_callback_Invoke(IMFAsyncCallback
struct queued_sample *iter; struct queued_sample *iter;
IUnknown *object = NULL; IUnknown *object = NULL;
IMFSample *sample = NULL; IMFSample *sample = NULL;
IMFVideoSampleAllocatorNotify *callback = NULL;
HRESULT hr; HRESULT hr;
if (FAILED(IMFAsyncResult_GetObject(result, &object))) if (FAILED(IMFAsyncResult_GetObject(result, &object)))
...@@ -836,10 +838,24 @@ static HRESULT WINAPI sample_allocator_tracking_callback_Invoke(IMFAsyncCallback ...@@ -836,10 +838,24 @@ static HRESULT WINAPI sample_allocator_tracking_callback_Invoke(IMFAsyncCallback
IMFSample_Release(sample); IMFSample_Release(sample);
if (allocator->callback) if (allocator->callback)
{
if (allocator->lock_notify_release)
IMFVideoSampleAllocatorNotify_NotifyRelease(allocator->callback); IMFVideoSampleAllocatorNotify_NotifyRelease(allocator->callback);
else
{
callback = allocator->callback;
IMFVideoSampleAllocatorNotify_AddRef(callback);
}
}
LeaveCriticalSection(&allocator->cs); LeaveCriticalSection(&allocator->cs);
if (callback)
{
IMFVideoSampleAllocatorNotify_NotifyRelease(callback);
IMFVideoSampleAllocatorNotify_Release(callback);
}
return S_OK; return S_OK;
} }
...@@ -852,13 +868,11 @@ static const IMFAsyncCallbackVtbl sample_allocator_tracking_callback_vtbl = ...@@ -852,13 +868,11 @@ static const IMFAsyncCallbackVtbl sample_allocator_tracking_callback_vtbl =
sample_allocator_tracking_callback_Invoke, 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; struct sample_allocator *object;
HRESULT hr; HRESULT hr;
TRACE("%s, %p.\n", debugstr_guid(riid), obj);
if (!(object = calloc(1, sizeof(*object)))) if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
...@@ -868,6 +882,7 @@ HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj) ...@@ -868,6 +882,7 @@ HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj)
object->refcount = 1; object->refcount = 1;
list_init(&object->used_samples); list_init(&object->used_samples);
list_init(&object->free_samples); list_init(&object->free_samples);
object->lock_notify_release = lock_notify_release;
InitializeCriticalSection(&object->cs); InitializeCriticalSection(&object->cs);
hr = IMFVideoSampleAllocator_QueryInterface(&object->IMFVideoSampleAllocator_iface, riid, obj); hr = IMFVideoSampleAllocator_QueryInterface(&object->IMFVideoSampleAllocator_iface, riid, obj);
...@@ -876,6 +891,13 @@ HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj) ...@@ -876,6 +891,13 @@ HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj)
return hr; 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) static HRESULT WINAPI video_sample_QueryInterface(IMFSample *iface, REFIID riid, void **out)
{ {
struct video_sample *sample = impl_from_IMFSample(iface); 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