From 1cb37f7e80ed6f2b17e1938a45bdc8b03a933f10 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 14 Oct 2020 16:03:10 +0300 Subject: [PATCH] evr/sample: Implement IMFDesiredSample. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/evr/sample.c | 42 ++++++++++++++++++++++++++++++++++++++---- dlls/evr/tests/evr.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/dlls/evr/sample.c b/dlls/evr/sample.c index 1073fb1f382..5427833a2c3 100644 --- a/dlls/evr/sample.c +++ b/dlls/evr/sample.c @@ -59,6 +59,10 @@ struct video_sample IMFAsyncResult *tracked_result; LONG tracked_refcount; + + LONGLONG desired_time; + LONGLONG desired_duration; + BOOL desired_set; }; static struct video_sample *impl_from_IMFSample(IMFSample *iface) @@ -869,20 +873,50 @@ static ULONG WINAPI desired_video_sample_Release(IMFDesiredSample *iface) static HRESULT WINAPI desired_video_sample_GetDesiredSampleTimeAndDuration(IMFDesiredSample *iface, LONGLONG *sample_time, LONGLONG *sample_duration) { - FIXME("%p, %p, %p.\n", iface, sample_time, sample_duration); + struct video_sample *sample = impl_from_IMFDesiredSample(iface); + HRESULT hr = S_OK; - return E_NOTIMPL; + TRACE("%p, %p, %p.\n", iface, sample_time, sample_duration); + + if (!sample_time || !sample_duration) + return E_POINTER; + + IMFSample_LockStore(sample->sample); + if (sample->desired_set) + { + *sample_time = sample->desired_time; + *sample_duration = sample->desired_duration; + } + else + hr = MF_E_NOT_AVAILABLE; + IMFSample_UnlockStore(sample->sample); + + return hr; } static void WINAPI desired_video_sample_SetDesiredSampleTimeAndDuration(IMFDesiredSample *iface, LONGLONG sample_time, LONGLONG sample_duration) { - FIXME("%p, %s, %s.\n", iface, debugstr_time(sample_time), debugstr_time(sample_duration)); + struct video_sample *sample = impl_from_IMFDesiredSample(iface); + + TRACE("%p, %s, %s.\n", iface, debugstr_time(sample_time), debugstr_time(sample_duration)); + + IMFSample_LockStore(sample->sample); + sample->desired_set = TRUE; + sample->desired_time = sample_time; + sample->desired_duration = sample_duration; + IMFSample_UnlockStore(sample->sample); } static void WINAPI desired_video_sample_Clear(IMFDesiredSample *iface) { - FIXME("%p.\n", iface); + struct video_sample *sample = impl_from_IMFDesiredSample(iface); + + TRACE("%p.\n", iface); + + IMFSample_LockStore(sample->sample); + sample->desired_set = FALSE; + IMFSample_UnlockStore(sample->sample); } static const IMFDesiredSampleVtbl desired_video_sample_vtbl = diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index 2d4cdc832a5..b924ac2d9b9 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -721,11 +721,11 @@ static void test_surface_sample(void) IDirect3DSurface9 *backbuffer = NULL; IMFDesiredSample *desired_sample; IMFMediaBuffer *buffer, *buffer2; + LONGLONG duration, time1, time2; IDirect3DSwapChain9 *swapchain; DWORD flags, count, length; IDirect3DDevice9 *device; IMFSample *sample; - LONGLONG duration; IDirect3D9 *d3d; IUnknown *unk; HWND window; @@ -764,8 +764,37 @@ static void test_surface_sample(void) ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!count, "Unexpected attribute count %u.\n", count); + hr = IMFDesiredSample_GetDesiredSampleTimeAndDuration(desired_sample, NULL, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFDesiredSample_GetDesiredSampleTimeAndDuration(desired_sample, NULL, &time2); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFDesiredSample_GetDesiredSampleTimeAndDuration(desired_sample, &time1, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFDesiredSample_GetDesiredSampleTimeAndDuration(desired_sample, &time1, &time2); + ok(hr == MF_E_NOT_AVAILABLE, "Unexpected hr %#x.\n", hr); + IMFDesiredSample_SetDesiredSampleTimeAndDuration(desired_sample, 123, 456); + time1 = time2 = 0; + hr = IMFDesiredSample_GetDesiredSampleTimeAndDuration(desired_sample, &time1, &time2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(time1 == 123 && time2 == 456, "Unexpected time values.\n"); + + IMFDesiredSample_SetDesiredSampleTimeAndDuration(desired_sample, 0, 0); + + time1 = time2 = 1; + hr = IMFDesiredSample_GetDesiredSampleTimeAndDuration(desired_sample, &time1, &time2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(time1 == 0 && time2 == 0, "Unexpected time values.\n"); + + IMFDesiredSample_Clear(desired_sample); + + hr = IMFDesiredSample_GetDesiredSampleTimeAndDuration(desired_sample, &time1, &time2); + ok(hr == MF_E_NOT_AVAILABLE, "Unexpected hr %#x.\n", hr); + hr = IMFSample_GetCount(sample, &count); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!count, "Unexpected attribute count %u.\n", count);