Commit 603b00fe authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

evr/presenter: Create sample allocator on object creation.

parent 11fb2a59
...@@ -70,6 +70,7 @@ struct video_presenter ...@@ -70,6 +70,7 @@ struct video_presenter
IMediaEventSink *event_sink; IMediaEventSink *event_sink;
IDirect3DDeviceManager9 *device_manager; IDirect3DDeviceManager9 *device_manager;
IMFVideoSampleAllocator *allocator;
struct streaming_thread thread; struct streaming_thread thread;
IMFMediaType *media_type; IMFMediaType *media_type;
UINT reset_token; UINT reset_token;
...@@ -175,12 +176,13 @@ static void video_presenter_reset_media_type(struct video_presenter *presenter) ...@@ -175,12 +176,13 @@ static void video_presenter_reset_media_type(struct video_presenter *presenter)
IMFMediaType_Release(presenter->media_type); IMFMediaType_Release(presenter->media_type);
presenter->media_type = NULL; presenter->media_type = NULL;
/* FIXME: release samples pool */ IMFVideoSampleAllocator_UninitializeSampleAllocator(presenter->allocator);
} }
static HRESULT video_presenter_set_media_type(struct video_presenter *presenter, IMFMediaType *media_type) static HRESULT video_presenter_set_media_type(struct video_presenter *presenter, IMFMediaType *media_type)
{ {
unsigned int flags; unsigned int flags;
HRESULT hr;
if (!media_type) if (!media_type)
{ {
...@@ -193,12 +195,15 @@ static HRESULT video_presenter_set_media_type(struct video_presenter *presenter, ...@@ -193,12 +195,15 @@ static HRESULT video_presenter_set_media_type(struct video_presenter *presenter,
video_presenter_reset_media_type(presenter); video_presenter_reset_media_type(presenter);
/* FIXME: allocate samples pool */ if (SUCCEEDED(hr = IMFVideoSampleAllocator_InitializeSampleAllocator(presenter->allocator, 3, media_type)))
{
presenter->media_type = media_type; presenter->media_type = media_type;
IMFMediaType_AddRef(presenter->media_type); IMFMediaType_AddRef(presenter->media_type);
}
else
WARN("Failed to initialize sample allocator, hr %#x.\n", hr);
return S_OK; return hr;
} }
static HRESULT video_presenter_invalidate_media_type(struct video_presenter *presenter) static HRESULT video_presenter_invalidate_media_type(struct video_presenter *presenter)
...@@ -220,7 +225,9 @@ static HRESULT video_presenter_invalidate_media_type(struct video_presenter *pre ...@@ -220,7 +225,9 @@ static HRESULT video_presenter_invalidate_media_type(struct video_presenter *pre
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
hr = video_presenter_set_media_type(presenter, media_type); hr = video_presenter_set_media_type(presenter, media_type);
hr = IMFTransform_SetOutputType(presenter->mixer, 0, media_type, 0); if (SUCCEEDED(hr))
hr = IMFTransform_SetOutputType(presenter->mixer, 0, media_type, 0);
IMFMediaType_Release(media_type); IMFMediaType_Release(media_type);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
...@@ -388,9 +395,12 @@ static ULONG WINAPI video_presenter_inner_Release(IUnknown *iface) ...@@ -388,9 +395,12 @@ static ULONG WINAPI video_presenter_inner_Release(IUnknown *iface)
{ {
video_presenter_end_streaming(presenter); video_presenter_end_streaming(presenter);
video_presenter_clear_container(presenter); video_presenter_clear_container(presenter);
video_presenter_reset_media_type(presenter);
DeleteCriticalSection(&presenter->cs); DeleteCriticalSection(&presenter->cs);
if (presenter->device_manager) if (presenter->device_manager)
IDirect3DDeviceManager9_Release(presenter->device_manager); IDirect3DDeviceManager9_Release(presenter->device_manager);
if (presenter->allocator)
IMFVideoSampleAllocator_Release(presenter->allocator);
heap_free(presenter); heap_free(presenter);
} }
...@@ -1179,6 +1189,11 @@ static HRESULT video_presenter_init_d3d(struct video_presenter *presenter) ...@@ -1179,6 +1189,11 @@ 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 %#x.\n", hr); WARN("Failed to set new device for the manager, hr %#x.\n", hr);
if (SUCCEEDED(hr = MFCreateVideoSampleAllocator(&IID_IMFVideoSampleAllocator, (void **)&presenter->allocator)))
{
hr = IMFVideoSampleAllocator_SetDirectXManager(presenter->allocator, (IUnknown *)presenter->device_manager);
}
return hr; return hr;
} }
......
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