mf/session: Add stubs for playback rate API.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Nikolay Sivov 2019-05-14 16:08:51 +03:00 committed by Alexandre Julliard
parent 034d2b9963
commit 8e6fa7e9b0
3 changed files with 194 additions and 1 deletions

View File

@ -55,6 +55,8 @@ struct media_session
{
IMFMediaSession IMFMediaSession_iface;
IMFGetService IMFGetService_iface;
IMFRateSupport IMFRateSupport_iface;
IMFRateControl IMFRateControl_iface;
IMFAsyncCallback commands_callback;
LONG refcount;
IMFMediaEventQueue *event_queue;
@ -124,6 +126,16 @@ static struct media_session *impl_from_IMFGetService(IMFGetService *iface)
return CONTAINING_RECORD(iface, struct media_session, IMFGetService_iface);
}
static struct media_session *impl_session_from_IMFRateSupport(IMFRateSupport *iface)
{
return CONTAINING_RECORD(iface, struct media_session, IMFRateSupport_iface);
}
static struct media_session *impl_session_from_IMFRateControl(IMFRateControl *iface)
{
return CONTAINING_RECORD(iface, struct media_session, IMFRateControl_iface);
}
static struct session_op *impl_op_from_IUnknown(IUnknown *iface)
{
return CONTAINING_RECORD(iface, struct session_op, IUnknown_iface);
@ -467,7 +479,30 @@ static ULONG WINAPI session_get_service_Release(IMFGetService *iface)
static HRESULT WINAPI session_get_service_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj)
{
FIXME("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj);
struct media_session *session = impl_from_IMFGetService(iface);
TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj);
*obj = NULL;
if (IsEqualGUID(service, &MF_RATE_CONTROL_SERVICE))
{
if (IsEqualIID(riid, &IID_IMFRateSupport))
{
*obj = &session->IMFRateSupport_iface;
}
else if (IsEqualIID(riid, &IID_IMFRateControl))
{
*obj = &session->IMFRateControl_iface;
}
if (*obj)
IUnknown_AddRef((IUnknown *)*obj);
return *obj ? S_OK : E_NOINTERFACE;
}
else
FIXME("Unsupported service %s.\n", debugstr_guid(service));
return E_NOTIMPL;
}
@ -543,6 +578,99 @@ static const IMFAsyncCallbackVtbl session_commands_callback_vtbl =
session_commands_callback_Invoke,
};
static HRESULT WINAPI session_rate_support_QueryInterface(IMFRateSupport *iface, REFIID riid, void **obj)
{
struct media_session *session = impl_session_from_IMFRateSupport(iface);
return IMFMediaSession_QueryInterface(&session->IMFMediaSession_iface, riid, obj);
}
static ULONG WINAPI session_rate_support_AddRef(IMFRateSupport *iface)
{
struct media_session *session = impl_session_from_IMFRateSupport(iface);
return IMFMediaSession_AddRef(&session->IMFMediaSession_iface);
}
static ULONG WINAPI session_rate_support_Release(IMFRateSupport *iface)
{
struct media_session *session = impl_session_from_IMFRateSupport(iface);
return IMFMediaSession_Release(&session->IMFMediaSession_iface);
}
static HRESULT WINAPI session_rate_support_GetSlowestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction,
BOOL thin, float *rate)
{
FIXME("%p, %d, %d, %p.\n", iface, direction, thin, rate);
return E_NOTIMPL;
}
static HRESULT WINAPI session_rate_support_GetFastestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction,
BOOL thin, float *rate)
{
FIXME("%p, %d, %d, %p.\n", iface, direction, thin, rate);
return E_NOTIMPL;
}
static HRESULT WINAPI session_rate_support_IsSupported(IMFRateSupport *iface, BOOL thin, float rate,
float *nearest_supported_rate)
{
FIXME("%p, %d, %f, %p.\n", iface, thin, rate, nearest_supported_rate);
return E_NOTIMPL;
}
static const IMFRateSupportVtbl session_rate_support_vtbl =
{
session_rate_support_QueryInterface,
session_rate_support_AddRef,
session_rate_support_Release,
session_rate_support_GetSlowestRate,
session_rate_support_GetFastestRate,
session_rate_support_IsSupported,
};
static HRESULT WINAPI session_rate_control_QueryInterface(IMFRateControl *iface, REFIID riid, void **obj)
{
struct media_session *session = impl_session_from_IMFRateControl(iface);
return IMFMediaSession_QueryInterface(&session->IMFMediaSession_iface, riid, obj);
}
static ULONG WINAPI session_rate_control_AddRef(IMFRateControl *iface)
{
struct media_session *session = impl_session_from_IMFRateControl(iface);
return IMFMediaSession_AddRef(&session->IMFMediaSession_iface);
}
static ULONG WINAPI session_rate_control_Release(IMFRateControl *iface)
{
struct media_session *session = impl_session_from_IMFRateControl(iface);
return IMFMediaSession_Release(&session->IMFMediaSession_iface);
}
static HRESULT WINAPI session_rate_control_SetRate(IMFRateControl *iface, BOOL thin, float rate)
{
FIXME("%p, %d, %f.\n", iface, thin, rate);
return E_NOTIMPL;
}
static HRESULT WINAPI session_rate_control_GetRate(IMFRateControl *iface, BOOL *thin, float *rate)
{
FIXME("%p, %p, %p.\n", iface, thin, rate);
return E_NOTIMPL;
}
static const IMFRateControlVtbl session_rate_control_vtbl =
{
session_rate_control_QueryInterface,
session_rate_control_AddRef,
session_rate_control_Release,
session_rate_control_SetRate,
session_rate_control_GetRate,
};
/***********************************************************************
* MFCreateMediaSession (mf.@)
*/
@ -562,6 +690,8 @@ HRESULT WINAPI MFCreateMediaSession(IMFAttributes *config, IMFMediaSession **ses
object->IMFMediaSession_iface.lpVtbl = &mfmediasessionvtbl;
object->IMFGetService_iface.lpVtbl = &session_get_service_vtbl;
object->IMFRateSupport_iface.lpVtbl = &session_rate_support_vtbl;
object->IMFRateControl_iface.lpVtbl = &session_rate_control_vtbl;
object->commands_callback.lpVtbl = &session_commands_callback_vtbl;
object->refcount = 1;
if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))

View File

@ -943,8 +943,12 @@ todo_wine
static void test_media_session(void)
{
MFCLOCK_PROPERTIES clock_props;
IMFMediaSession *session;
IMFRateControl *rc, *rc2;
IMFRateSupport *rs;
IMFGetService *gs;
IMFClock *clock;
IUnknown *unk;
HRESULT hr;
@ -959,6 +963,35 @@ static void test_media_session(void)
hr = IMFMediaSession_QueryInterface(session, &IID_IMFGetService, (void **)&gs);
ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr);
hr = IMFGetService_GetService(gs, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, (void **)&rs);
ok(hr == S_OK, "Failed to get rate support interface, hr %#x.\n", hr);
hr = IMFGetService_GetService(gs, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, (void **)&rc);
ok(hr == S_OK, "Failed to get rate control interface, hr %#x.\n", hr);
hr = IMFRateSupport_QueryInterface(rs, &IID_IMFMediaSession, (void **)&unk);
ok(hr == S_OK, "Failed to get session interface, hr %#x.\n", hr);
ok(unk == (IUnknown *)session, "Unexpected pointer.\n");
IUnknown_Release(unk);
hr = IMFMediaSession_GetClock(session, &clock);
todo_wine
ok(hr == S_OK, "Failed to get clock, hr %#x.\n", hr);
if (SUCCEEDED(hr))
{
hr = IMFClock_QueryInterface(clock, &IID_IMFRateControl, (void **)&rc2);
ok(hr == S_OK, "Failed to get rate control, hr %#x.\n", hr);
IMFRateControl_Release(rc2);
hr = IMFClock_GetProperties(clock, &clock_props);
ok(hr == MF_E_CLOCK_NO_TIME_SOURCE, "Unexpected hr %#x.\n", hr);
}
IMFRateControl_Release(rc);
IMFRateSupport_Release(rs);
IMFGetService_Release(gs);
test_session_events(session);

View File

@ -89,6 +89,34 @@ interface IMFClock : IUnknown
HRESULT GetProperties([out] MFCLOCK_PROPERTIES *props);
}
typedef enum _MFRATE_DIRECTION
{
MFRATE_FORWARD,
MFRATE_REVERSE
} MFRATE_DIRECTION;
[
object,
uuid(0a9ccdbc-d797-4563-9667-94ec5d79292d),
]
interface IMFRateSupport : IUnknown
{
HRESULT GetSlowestRate(
[in] MFRATE_DIRECTION direction,
[in] BOOL thin,
[out] float *rate);
HRESULT GetFastestRate(
[in] MFRATE_DIRECTION direction,
[in] BOOL thin,
[out] float *rate);
HRESULT IsRateSupported(
[in] BOOL thin,
[in] float rate,
[in, out, unique] float *nearest_supported_rate);
}
[
object,
uuid(88ddcd21-03c3-4275-91ed-55ee3929328f)
@ -745,3 +773,5 @@ cpp_quote("EXTERN_GUID(MF_TOPOLOGY_PROJECTSTOP, 0x7ed3f803, 0x86bb, 0x4b3f, 0xb7
cpp_quote("EXTERN_GUID(MF_TOPOLOGY_RESOLUTION_STATUS, 0x494bbcde, 0xb031, 0x4e38, 0x97, 0xc4, 0xd5, 0x42, 0x2d, 0xd6, 0x18, 0xdc);")
cpp_quote("EXTERN_GUID(MF_TOPOLOGY_START_TIME_ON_PRESENTATION_SWITCH, 0xc8cc113f, 0x7951, 0x4548, 0xaa, 0xd6, 0x9e, 0xd6, 0x20, 0x2e, 0x62, 0xb3);")
cpp_quote("EXTERN_GUID(MF_TOPOLOGY_STATIC_PLAYBACK_OPTIMIZATIONS, 0xb86cac42, 0x41a6, 0x4b79, 0x89, 0x7a, 0x1a, 0xb0, 0xe5, 0x2b, 0x4a, 0x1b);")
cpp_quote("EXTERN_GUID(MF_RATE_CONTROL_SERVICE, 0x866fa297, 0xb802, 0x4bf8, 0x9d, 0xc9, 0x5e, 0x3b, 0x6a, 0x9f, 0x53, 0xc9);")