mf: Create presentation clock on session creation.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
8e6fa7e9b0
commit
42ba38c14c
|
@ -60,6 +60,7 @@ struct media_session
|
||||||
IMFAsyncCallback commands_callback;
|
IMFAsyncCallback commands_callback;
|
||||||
LONG refcount;
|
LONG refcount;
|
||||||
IMFMediaEventQueue *event_queue;
|
IMFMediaEventQueue *event_queue;
|
||||||
|
IMFPresentationClock *clock;
|
||||||
struct list topologies;
|
struct list topologies;
|
||||||
CRITICAL_SECTION cs;
|
CRITICAL_SECTION cs;
|
||||||
};
|
};
|
||||||
|
@ -292,6 +293,8 @@ static ULONG WINAPI mfsession_Release(IMFMediaSession *iface)
|
||||||
session_clear_topologies(session);
|
session_clear_topologies(session);
|
||||||
if (session->event_queue)
|
if (session->event_queue)
|
||||||
IMFMediaEventQueue_Release(session->event_queue);
|
IMFMediaEventQueue_Release(session->event_queue);
|
||||||
|
if (session->clock)
|
||||||
|
IMFPresentationClock_Release(session->clock);
|
||||||
DeleteCriticalSection(&session->cs);
|
DeleteCriticalSection(&session->cs);
|
||||||
heap_free(session);
|
heap_free(session);
|
||||||
}
|
}
|
||||||
|
@ -419,9 +422,14 @@ static HRESULT WINAPI mfsession_Shutdown(IMFMediaSession *iface)
|
||||||
|
|
||||||
static HRESULT WINAPI mfsession_GetClock(IMFMediaSession *iface, IMFClock **clock)
|
static HRESULT WINAPI mfsession_GetClock(IMFMediaSession *iface, IMFClock **clock)
|
||||||
{
|
{
|
||||||
FIXME("(%p)->(%p)\n", iface, clock);
|
struct media_session *session = impl_from_IMFMediaSession(iface);
|
||||||
|
|
||||||
return E_NOTIMPL;
|
TRACE("%p, %p.\n", iface, clock);
|
||||||
|
|
||||||
|
*clock = (IMFClock *)session->clock;
|
||||||
|
IMFClock_AddRef(*clock);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI mfsession_GetSessionCapabilities(IMFMediaSession *iface, DWORD *caps)
|
static HRESULT WINAPI mfsession_GetSessionCapabilities(IMFMediaSession *iface, DWORD *caps)
|
||||||
|
@ -694,17 +702,22 @@ HRESULT WINAPI MFCreateMediaSession(IMFAttributes *config, IMFMediaSession **ses
|
||||||
object->IMFRateControl_iface.lpVtbl = &session_rate_control_vtbl;
|
object->IMFRateControl_iface.lpVtbl = &session_rate_control_vtbl;
|
||||||
object->commands_callback.lpVtbl = &session_commands_callback_vtbl;
|
object->commands_callback.lpVtbl = &session_commands_callback_vtbl;
|
||||||
object->refcount = 1;
|
object->refcount = 1;
|
||||||
if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
|
|
||||||
{
|
|
||||||
IMFMediaSession_Release(&object->IMFMediaSession_iface);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
list_init(&object->topologies);
|
list_init(&object->topologies);
|
||||||
InitializeCriticalSection(&object->cs);
|
InitializeCriticalSection(&object->cs);
|
||||||
|
|
||||||
|
if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
|
||||||
|
goto failed;
|
||||||
|
|
||||||
|
if (FAILED(hr = MFCreatePresentationClock(&object->clock)))
|
||||||
|
goto failed;
|
||||||
|
|
||||||
*session = &object->IMFMediaSession_iface;
|
*session = &object->IMFMediaSession_iface;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
|
failed:
|
||||||
|
IMFMediaSession_Release(&object->IMFMediaSession_iface);
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI present_clock_QueryInterface(IMFPresentationClock *iface, REFIID riid, void **out)
|
static HRESULT WINAPI present_clock_QueryInterface(IMFPresentationClock *iface, REFIID riid, void **out)
|
||||||
|
@ -818,9 +831,24 @@ static HRESULT WINAPI present_clock_GetState(IMFPresentationClock *iface, DWORD
|
||||||
|
|
||||||
static HRESULT WINAPI present_clock_GetProperties(IMFPresentationClock *iface, MFCLOCK_PROPERTIES *props)
|
static HRESULT WINAPI present_clock_GetProperties(IMFPresentationClock *iface, MFCLOCK_PROPERTIES *props)
|
||||||
{
|
{
|
||||||
FIXME("%p, %p.\n", iface, props);
|
struct presentation_clock *clock = impl_from_IMFPresentationClock(iface);
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
return E_NOTIMPL;
|
TRACE("%p, %p.\n", iface, props);
|
||||||
|
|
||||||
|
EnterCriticalSection(&clock->cs);
|
||||||
|
|
||||||
|
if (clock->time_source)
|
||||||
|
{
|
||||||
|
FIXME("%p, %p.\n", iface, props);
|
||||||
|
hr = E_NOTIMPL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hr = MF_E_CLOCK_NO_TIME_SOURCE;
|
||||||
|
|
||||||
|
LeaveCriticalSection(&clock->cs);
|
||||||
|
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI present_clock_SetTimeSource(IMFPresentationClock *iface,
|
static HRESULT WINAPI present_clock_SetTimeSource(IMFPresentationClock *iface,
|
||||||
|
|
|
@ -976,11 +976,8 @@ static void test_media_session(void)
|
||||||
IUnknown_Release(unk);
|
IUnknown_Release(unk);
|
||||||
|
|
||||||
hr = IMFMediaSession_GetClock(session, &clock);
|
hr = IMFMediaSession_GetClock(session, &clock);
|
||||||
todo_wine
|
|
||||||
ok(hr == S_OK, "Failed to get clock, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to get clock, hr %#x.\n", hr);
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
{
|
|
||||||
hr = IMFClock_QueryInterface(clock, &IID_IMFRateControl, (void **)&rc2);
|
hr = IMFClock_QueryInterface(clock, &IID_IMFRateControl, (void **)&rc2);
|
||||||
ok(hr == S_OK, "Failed to get rate control, hr %#x.\n", hr);
|
ok(hr == S_OK, "Failed to get rate control, hr %#x.\n", hr);
|
||||||
IMFRateControl_Release(rc2);
|
IMFRateControl_Release(rc2);
|
||||||
|
@ -988,7 +985,6 @@ if (SUCCEEDED(hr))
|
||||||
hr = IMFClock_GetProperties(clock, &clock_props);
|
hr = IMFClock_GetProperties(clock, &clock_props);
|
||||||
ok(hr == MF_E_CLOCK_NO_TIME_SOURCE, "Unexpected hr %#x.\n", hr);
|
ok(hr == MF_E_CLOCK_NO_TIME_SOURCE, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
}
|
|
||||||
IMFRateControl_Release(rc);
|
IMFRateControl_Release(rc);
|
||||||
IMFRateSupport_Release(rs);
|
IMFRateSupport_Release(rs);
|
||||||
|
|
||||||
|
@ -1204,7 +1200,6 @@ todo_wine
|
||||||
ok(value == 0, "Unexpected value %u.\n", value);
|
ok(value == 0, "Unexpected value %u.\n", value);
|
||||||
|
|
||||||
hr = IMFPresentationClock_GetProperties(clock, &props);
|
hr = IMFPresentationClock_GetProperties(clock, &props);
|
||||||
todo_wine
|
|
||||||
ok(hr == MF_E_CLOCK_NO_TIME_SOURCE, "Unexpected hr %#x.\n", hr);
|
ok(hr == MF_E_CLOCK_NO_TIME_SOURCE, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IMFPresentationClock_GetState(clock, 0, &state);
|
hr = IMFPresentationClock_GetState(clock, 0, &state);
|
||||||
|
|
Loading…
Reference in New Issue