Thinned rates are accepted too, though no actual thinning is performed. Since thinning behavior is expected to be implementation-dependent, this doesn't seem inappropriate. Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com> --- dlls/mfplat/tests/mfplat.c | 6 ------ dlls/winegstreamer/media_source.c | 28 +++++++++++++++++++++------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 6f7771bb79c..7201b6d3e4a 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -803,7 +803,6 @@ todo_wine { ok(rate == 1.0f, "Unexpected rate %f.\n", rate); hr = IMFRateControl_SetRate(rate_control, FALSE, 1e6f); -todo_wine ok(hr == S_OK, "Cannot set rate, hr %#x.\n", hr); if (SUCCEEDED(hr)) { @@ -813,11 +812,9 @@ todo_wine hr = IMFRateControl_GetRate(rate_control, &thinning, &rate); ok(hr == S_OK, "Failed to get current rate, hr %#x.\n", hr); ok(!thinning, "Unexpected thinning.\n", thinning); -todo_wine ok(rate == 1e6f, "Unexpected rate %f.\n", rate); hr = IMFRateControl_SetRate(rate_control, FALSE, 0.0f); -todo_wine ok(hr == S_OK, "Cannot set rate, hr %#x.\n", hr); if (SUCCEEDED(hr)) { @@ -827,11 +824,9 @@ todo_wine hr = IMFRateControl_GetRate(rate_control, &thinning, &rate); ok(hr == S_OK, "Failed to get current rate, hr %#x.\n", hr); ok(!thinning, "Unexpected thinning.\n", thinning); -todo_wine ok(rate == 0.0f, "Unexpected rate %f.\n", rate); hr = IMFRateControl_SetRate(rate_control, FALSE, 1e-6f); -todo_wine ok(hr == S_OK, "Cannot set rate, hr %#x.\n", hr); if (SUCCEEDED(hr)) { @@ -841,7 +836,6 @@ todo_wine hr = IMFRateControl_GetRate(rate_control, &thinning, &rate); ok(hr == S_OK, "Failed to get current rate, hr %#x.\n", hr); ok(!thinning, "Unexpected thinning.\n", thinning); -todo_wine ok(rate == 1e-6f, "Unexpected rate %f.\n", rate); hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor); diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index eb5b9e366ec..f77a8dfe78a 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -104,6 +104,8 @@ struct media_source HANDLE read_thread; bool read_thread_shutdown; + float rate; + BOOL thinning; }; static inline struct media_stream *impl_from_IMFMediaStream(IMFMediaStream *iface) @@ -989,28 +991,38 @@ static ULONG WINAPI media_source_rate_control_Release(IMFRateControl *iface) static HRESULT WINAPI media_source_rate_control_SetRate(IMFRateControl *iface, BOOL thin, float rate) { + struct media_source *source = impl_from_IMFRateControl(iface); + PROPVARIANT pv; + FIXME("%p, %d, %f.\n", iface, thin, rate); if (rate < 0.0f) return MF_E_REVERSE_UNSUPPORTED; + if (rate > 1e6) + return MF_E_UNSUPPORTED_RATE; - if (thin) - return MF_E_THINNING_UNSUPPORTED; + source->rate = rate; + source->thinning = thin; - if (rate != 1.0f) - return MF_E_UNSUPPORTED_RATE; + pv.vt = VT_R4; + pv.fltVal = rate; + IMFMediaEventQueue_QueueEventParamVar(source->event_queue, MESourceRateChanged, &GUID_NULL, S_OK, &pv); return S_OK; } static HRESULT WINAPI media_source_rate_control_GetRate(IMFRateControl *iface, BOOL *thin, float *rate) { + struct media_source *source = impl_from_IMFRateControl(iface); + TRACE("%p, %p, %p.\n", iface, thin, rate); - if (thin) - *thin = FALSE; + if (!rate) + return E_INVALIDARG; + *rate = source->rate; - *rate = 1.0f; + if (thin) + *thin = source->thinning; return S_OK; } @@ -1383,6 +1395,8 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ IMFPresentationDescriptor_SetUINT64(object->pres_desc, &MF_PD_DURATION, total_pres_time); object->state = SOURCE_STOPPED; + object->rate = 1.0f; + object->thinning = FALSE; *out_media_source = object; return S_OK; -- 2.31.1