[PATCH 02/14] mf: Add support for returning slowest/fastest rates for session.
Nikolay Sivov
nsivov at codeweavers.com
Fri Feb 28 06:00:52 CST 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mf/session.c | 62 ++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 58 insertions(+), 4 deletions(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index 5ee4074379..2ef4b01028 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -17,6 +17,7 @@
*/
#include <stdarg.h>
+#include <math.h>
#define COBJMACROS
@@ -1447,20 +1448,73 @@ static ULONG WINAPI session_rate_support_Release(IMFRateSupport *iface)
return IMFMediaSession_Release(&session->IMFMediaSession_iface);
}
+static void session_presentation_object_get_rate(IUnknown *object, MFRATE_DIRECTION direction,
+ BOOL thin, BOOL fastest, float *result)
+{
+ IMFRateSupport *rate_support;
+ float rate;
+
+ if (SUCCEEDED(MFGetService(object, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, (void **)&rate_support)))
+ {
+ rate = 0.0f;
+ if (fastest)
+ {
+ if (SUCCEEDED(IMFRateSupport_GetFastestRate(rate_support, direction, thin, &rate)))
+ *result = min(fabsf(rate), *result);
+ }
+ else
+ {
+ if (SUCCEEDED(IMFRateSupport_GetSlowestRate(rate_support, direction, thin, &rate)))
+ *result = max(fabsf(rate), *result);
+ }
+
+ IMFRateSupport_Release(rate_support);
+ }
+}
+
+static HRESULT session_get_presentation_rate(struct media_session *session, MFRATE_DIRECTION direction,
+ BOOL thin, BOOL fastest, float *result)
+{
+ struct media_source *source;
+ struct media_sink *sink;
+
+ *result = 0.0f;
+
+ EnterCriticalSection(&session->cs);
+
+ LIST_FOR_EACH_ENTRY(source, &session->presentation.sources, struct media_source, entry)
+ {
+ session_presentation_object_get_rate((IUnknown *)source->source, direction, thin, fastest, result);
+ }
+
+ LIST_FOR_EACH_ENTRY(sink, &session->presentation.sinks, struct media_sink, entry)
+ {
+ session_presentation_object_get_rate((IUnknown *)sink->sink, direction, thin, fastest, result);
+ }
+
+ LeaveCriticalSection(&session->cs);
+
+ return S_OK;
+}
+
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);
+ struct media_session *session = impl_session_from_IMFRateSupport(iface);
- return E_NOTIMPL;
+ TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate);
+
+ return session_get_presentation_rate(session, direction, thin, FALSE, rate);
}
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);
+ struct media_session *session = impl_session_from_IMFRateSupport(iface);
- return E_NOTIMPL;
+ TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate);
+
+ return session_get_presentation_rate(session, direction, thin, TRUE, rate);
}
static HRESULT WINAPI session_rate_support_IsRateSupported(IMFRateSupport *iface, BOOL thin, float rate,
--
2.25.0
More information about the wine-devel
mailing list