evr/allocator: Implement SetCallback().

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-10-08 14:44:17 +03:00 committed by Alexandre Julliard
parent 30e5405aca
commit 4fa62d40dc
2 changed files with 67 additions and 2 deletions

View File

@ -30,6 +30,9 @@ struct sample_allocator
IMFVideoSampleAllocator IMFVideoSampleAllocator_iface;
IMFVideoSampleAllocatorCallback IMFVideoSampleAllocatorCallback_iface;
LONG refcount;
IMFVideoSampleAllocatorNotify *callback;
CRITICAL_SECTION cs;
};
static struct sample_allocator *impl_from_IMFVideoSampleAllocator(IMFVideoSampleAllocator *iface)
@ -87,6 +90,9 @@ static ULONG WINAPI sample_allocator_Release(IMFVideoSampleAllocator *iface)
if (!refcount)
{
if (allocator->callback)
IMFVideoSampleAllocatorNotify_Release(allocator->callback);
DeleteCriticalSection(&allocator->cs);
heap_free(allocator);
}
@ -156,9 +162,19 @@ static ULONG WINAPI sample_allocator_callback_Release(IMFVideoSampleAllocatorCal
static HRESULT WINAPI sample_allocator_callback_SetCallback(IMFVideoSampleAllocatorCallback *iface,
IMFVideoSampleAllocatorNotify *callback)
{
FIXME("%p, %p.\n", iface, callback);
struct sample_allocator *allocator = impl_from_IMFVideoSampleAllocatorCallback(iface);
return E_NOTIMPL;
TRACE("%p, %p.\n", iface, callback);
EnterCriticalSection(&allocator->cs);
if (allocator->callback)
IMFVideoSampleAllocatorNotify_Release(allocator->callback);
allocator->callback = callback;
if (allocator->callback)
IMFVideoSampleAllocatorNotify_AddRef(allocator->callback);
LeaveCriticalSection(&allocator->cs);
return S_OK;
}
static HRESULT WINAPI sample_allocator_callback_GetFreeSampleCount(IMFVideoSampleAllocatorCallback *iface,
@ -191,6 +207,7 @@ HRESULT WINAPI MFCreateVideoSampleAllocator(REFIID riid, void **obj)
object->IMFVideoSampleAllocator_iface.lpVtbl = &sample_allocator_vtbl;
object->IMFVideoSampleAllocatorCallback_iface.lpVtbl = &sample_allocator_callback_vtbl;
object->refcount = 1;
InitializeCriticalSection(&object->cs);
hr = IMFVideoSampleAllocator_QueryInterface(&object->IMFVideoSampleAllocator_iface, riid, obj);
IMFVideoSampleAllocator_Release(&object->IMFVideoSampleAllocator_iface);

View File

@ -1147,8 +1147,47 @@ static void test_MFCreateVideoMixerAndPresenter(void)
IUnknown_Release(presenter);
}
static HRESULT WINAPI test_notify_callback_QueryInterface(IMFVideoSampleAllocatorNotify *iface,
REFIID riid, void **obj)
{
if (IsEqualIID(riid, &IID_IMFVideoSampleAllocatorNotify) ||
IsEqualIID(riid, &IID_IUnknown))
{
*obj = iface;
IMFVideoSampleAllocatorNotify_AddRef(iface);
return S_OK;
}
*obj = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI test_notify_callback_AddRef(IMFVideoSampleAllocatorNotify *iface)
{
return 2;
}
static ULONG WINAPI test_notify_callback_Release(IMFVideoSampleAllocatorNotify *iface)
{
return 1;
}
static HRESULT WINAPI test_notify_callback_NotifyRelease(IMFVideoSampleAllocatorNotify *iface)
{
return E_NOTIMPL;
}
static const IMFVideoSampleAllocatorNotifyVtbl test_notify_callback_vtbl =
{
test_notify_callback_QueryInterface,
test_notify_callback_AddRef,
test_notify_callback_Release,
test_notify_callback_NotifyRelease,
};
static void test_MFCreateVideoSampleAllocator(void)
{
IMFVideoSampleAllocatorNotify test_notify = { &test_notify_callback_vtbl };
IMFVideoSampleAllocatorCallback *allocator_cb;
IMFVideoSampleAllocator *allocator;
IMFVideoMediaType *video_type;
@ -1171,6 +1210,15 @@ static void test_MFCreateVideoSampleAllocator(void)
hr = IMFVideoSampleAllocator_QueryInterface(allocator, &IID_IMFVideoSampleAllocatorCallback, (void **)&allocator_cb);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFVideoSampleAllocatorCallback_SetCallback(allocator_cb, NULL);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFVideoSampleAllocatorCallback_SetCallback(allocator_cb, &test_notify);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFVideoSampleAllocatorCallback_SetCallback(allocator_cb, NULL);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
count = 10;
hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, &count);
todo_wine {