[PATCH 3/4] mf/evr: Add IMFRateSupport stub.

Nikolay Sivov nsivov at codeweavers.com
Mon Apr 26 03:23:34 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/evr.c      | 67 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/mf/tests/mf.c |  3 +++
 2 files changed, 70 insertions(+)

diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index baa6665853e..2a529895237 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -80,6 +80,7 @@ struct video_renderer
     IMediaEventSink IMediaEventSink_iface;
     IMFAttributes IMFAttributes_iface;
     IMFQualityAdvise IMFQualityAdvise_iface;
+    IMFRateSupport IMFRateSupport_iface;
     LONG refcount;
 
     IMFMediaEventQueue *event_queue;
@@ -150,6 +151,11 @@ static struct video_renderer *impl_from_IMFQualityAdvise(IMFQualityAdvise *iface
     return CONTAINING_RECORD(iface, struct video_renderer, IMFQualityAdvise_iface);
 }
 
+static struct video_renderer *impl_from_IMFRateSupport(IMFRateSupport *iface)
+{
+    return CONTAINING_RECORD(iface, struct video_renderer, IMFRateSupport_iface);
+}
+
 static struct video_stream *impl_from_IMFStreamSink(IMFStreamSink *iface)
 {
     return CONTAINING_RECORD(iface, struct video_stream, IMFStreamSink_iface);
@@ -1087,6 +1093,10 @@ static HRESULT WINAPI video_renderer_sink_QueryInterface(IMFMediaSink *iface, RE
     {
         *obj = &renderer->IMFQualityAdvise_iface;
     }
+    else if (IsEqualIID(riid, &IID_IMFRateSupport))
+    {
+        *obj = &renderer->IMFRateSupport_iface;
+    }
     else
     {
         WARN("Unsupported interface %s.\n", debugstr_guid(riid));
@@ -2028,6 +2038,10 @@ static HRESULT WINAPI video_renderer_get_service_GetService(IMFGetService *iface
         if (renderer->device_manager)
             hr = IUnknown_QueryInterface(renderer->device_manager, riid, obj);
     }
+    else if (IsEqualGUID(service, &MF_RATE_CONTROL_SERVICE) && IsEqualIID(riid, &IID_IMFRateSupport))
+    {
+        hr = IMFVideoRenderer_QueryInterface(&renderer->IMFVideoRenderer_iface, riid, obj);
+    }
     else
     {
         FIXME("Unsupported service %s.\n", debugstr_guid(service));
@@ -2642,6 +2656,58 @@ static const IMFQualityAdviseVtbl video_renderer_quality_advise_vtbl =
     video_renderer_quality_advise_DropTime,
 };
 
+static HRESULT WINAPI video_renderer_rate_support_QueryInterface(IMFRateSupport *iface, REFIID riid, void **out)
+{
+    struct video_renderer *renderer = impl_from_IMFRateSupport(iface);
+    return IMFMediaSink_QueryInterface(&renderer->IMFMediaSink_iface, riid, out);
+}
+
+static ULONG WINAPI video_renderer_rate_support_AddRef(IMFRateSupport *iface)
+{
+    struct video_renderer *renderer = impl_from_IMFRateSupport(iface);
+    return IMFMediaSink_AddRef(&renderer->IMFMediaSink_iface);
+}
+
+static ULONG WINAPI video_renderer_rate_support_Release(IMFRateSupport *iface)
+{
+    struct video_renderer *renderer = impl_from_IMFRateSupport(iface);
+    return IMFMediaSink_Release(&renderer->IMFMediaSink_iface);
+}
+
+static HRESULT WINAPI video_renderer_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 video_renderer_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 video_renderer_rate_support_IsRateSupported(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 video_renderer_rate_support_vtbl =
+{
+    video_renderer_rate_support_QueryInterface,
+    video_renderer_rate_support_AddRef,
+    video_renderer_rate_support_Release,
+    video_renderer_rate_support_GetSlowestRate,
+    video_renderer_rate_support_GetFastestRate,
+    video_renderer_rate_support_IsRateSupported,
+};
+
 static HRESULT evr_create_object(IMFAttributes *attributes, void *user_context, IUnknown **obj)
 {
     struct video_renderer *object;
@@ -2664,6 +2730,7 @@ static HRESULT evr_create_object(IMFAttributes *attributes, void *user_context,
     object->IMediaEventSink_iface.lpVtbl = &media_event_sink_vtbl;
     object->IMFAttributes_iface.lpVtbl = &video_renderer_attributes_vtbl;
     object->IMFQualityAdvise_iface.lpVtbl = &video_renderer_quality_advise_vtbl;
+    object->IMFRateSupport_iface.lpVtbl = &video_renderer_rate_support_vtbl;
     object->refcount = 1;
     InitializeCriticalSection(&object->cs);
 
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 39b9d64e729..89da5d0ab64 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -4263,6 +4263,8 @@ static void test_evr(void)
     check_interface(sink, &IID_IMFClockStateSink, TRUE);
     check_interface(sink, &IID_IMFGetService, TRUE);
     check_interface(sink, &IID_IMFQualityAdvise, TRUE);
+    check_interface(sink, &IID_IMFRateSupport, TRUE);
+    check_interface(sink, &IID_IMFRateControl, FALSE);
     check_service_interface(sink, &MR_VIDEO_MIXER_SERVICE, &IID_IMFVideoProcessor, TRUE);
     check_service_interface(sink, &MR_VIDEO_MIXER_SERVICE, &IID_IMFVideoMixerBitmap, TRUE);
     check_service_interface(sink, &MR_VIDEO_MIXER_SERVICE, &IID_IMFVideoMixerControl, TRUE);
@@ -4270,6 +4272,7 @@ static void test_evr(void)
     check_service_interface(sink, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl, TRUE);
     check_service_interface(sink, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoPositionMapper, TRUE);
     check_service_interface(sink, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IDirect3DDeviceManager9, TRUE);
+    check_service_interface(sink, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, TRUE);
 
     hr = MFGetService((IUnknown *)sink, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl,
             (void **)&display_control);
-- 
2.30.2




More information about the wine-devel mailing list