Giovanni Mascellani : winegstreamer: Implement a stub IMFRateControl for the media source.
Alexandre Julliard
julliard at winehq.org
Fri Mar 26 16:03:31 CDT 2021
Module: wine
Branch: master
Commit: 767c200f47b15aec7fe7eb95f76ee034c5bba95f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=767c200f47b15aec7fe7eb95f76ee034c5bba95f
Author: Giovanni Mascellani <gmascellani at codeweavers.com>
Date: Fri Mar 26 09:25:29 2021 +0100
winegstreamer: Implement a stub IMFRateControl for the media source.
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mfplat/tests/mfplat.c | 1 -
dlls/winegstreamer/media_source.c | 66 +++++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index a38cecab827..1e84acd08fa 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -759,7 +759,6 @@ static void test_source_resolver(void)
check_interface(mediasource, &IID_IMFGetService, TRUE);
check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, TRUE);
-todo_wine
check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, TRUE);
hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor);
ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr);
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index 57c0b183ca8..eb5b9e366ec 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -80,6 +80,7 @@ struct media_source
IMFMediaSource IMFMediaSource_iface;
IMFGetService IMFGetService_iface;
IMFRateSupport IMFRateSupport_iface;
+ IMFRateControl IMFRateControl_iface;
IMFAsyncCallback async_commands_callback;
LONG ref;
DWORD async_commands_queue;
@@ -125,6 +126,11 @@ static inline struct media_source *impl_from_IMFRateSupport(IMFRateSupport *ifac
return CONTAINING_RECORD(iface, struct media_source, IMFRateSupport_iface);
}
+static inline struct media_source *impl_from_IMFRateControl(IMFRateControl *iface)
+{
+ return CONTAINING_RECORD(iface, struct media_source, IMFRateControl_iface);
+}
+
static inline struct media_source *impl_from_async_commands_callback_IMFAsyncCallback(IMFAsyncCallback *iface)
{
return CONTAINING_RECORD(iface, struct media_source, async_commands_callback);
@@ -867,6 +873,10 @@ static HRESULT WINAPI media_source_get_service_GetService(IMFGetService *iface,
{
*obj = &source->IMFRateSupport_iface;
}
+ else if (IsEqualIID(riid, &IID_IMFRateControl))
+ {
+ *obj = &source->IMFRateControl_iface;
+ }
}
else
FIXME("Unsupported service %s.\n", debugstr_guid(service));
@@ -959,6 +969,61 @@ static const IMFRateSupportVtbl media_source_rate_support_vtbl =
media_source_rate_support_IsRateSupported,
};
+static HRESULT WINAPI media_source_rate_control_QueryInterface(IMFRateControl *iface, REFIID riid, void **obj)
+{
+ struct media_source *source = impl_from_IMFRateControl(iface);
+ return IMFMediaSource_QueryInterface(&source->IMFMediaSource_iface, riid, obj);
+}
+
+static ULONG WINAPI media_source_rate_control_AddRef(IMFRateControl *iface)
+{
+ struct media_source *source = impl_from_IMFRateControl(iface);
+ return IMFMediaSource_AddRef(&source->IMFMediaSource_iface);
+}
+
+static ULONG WINAPI media_source_rate_control_Release(IMFRateControl *iface)
+{
+ struct media_source *source = impl_from_IMFRateControl(iface);
+ return IMFMediaSource_Release(&source->IMFMediaSource_iface);
+}
+
+static HRESULT WINAPI media_source_rate_control_SetRate(IMFRateControl *iface, BOOL thin, float rate)
+{
+ FIXME("%p, %d, %f.\n", iface, thin, rate);
+
+ if (rate < 0.0f)
+ return MF_E_REVERSE_UNSUPPORTED;
+
+ if (thin)
+ return MF_E_THINNING_UNSUPPORTED;
+
+ if (rate != 1.0f)
+ return MF_E_UNSUPPORTED_RATE;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI media_source_rate_control_GetRate(IMFRateControl *iface, BOOL *thin, float *rate)
+{
+ TRACE("%p, %p, %p.\n", iface, thin, rate);
+
+ if (thin)
+ *thin = FALSE;
+
+ *rate = 1.0f;
+
+ return S_OK;
+}
+
+static const IMFRateControlVtbl media_source_rate_control_vtbl =
+{
+ media_source_rate_control_QueryInterface,
+ media_source_rate_control_AddRef,
+ media_source_rate_control_Release,
+ media_source_rate_control_SetRate,
+ media_source_rate_control_GetRate,
+};
+
static HRESULT WINAPI media_source_QueryInterface(IMFMediaSource *iface, REFIID riid, void **out)
{
struct media_source *source = impl_from_IMFMediaSource(iface);
@@ -1236,6 +1301,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_
object->IMFMediaSource_iface.lpVtbl = &IMFMediaSource_vtbl;
object->IMFGetService_iface.lpVtbl = &media_source_get_service_vtbl;
object->IMFRateSupport_iface.lpVtbl = &media_source_rate_support_vtbl;
+ object->IMFRateControl_iface.lpVtbl = &media_source_rate_control_vtbl;
object->async_commands_callback.lpVtbl = &source_async_commands_callback_vtbl;
object->ref = 1;
object->byte_stream = bytestream;
More information about the wine-cvs
mailing list