[PATCH 3/5] evr/sample: Implement IMFDesiredSample.
Nikolay Sivov
nsivov at codeweavers.com
Wed Oct 14 08:03:10 CDT 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
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);
--
2.28.0
More information about the wine-devel
mailing list