[PATCH 7/7] mfplat/tests: Test pausing a media stream.
Giovanni Mascellani
gmascellani at codeweavers.com
Mon Sep 6 10:11:09 CDT 2021
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
dlls/mfplat/tests/mfplat.c | 161 ++++++++++++++++++++++++++++++++++++-
1 file changed, 157 insertions(+), 4 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index a2aa082fbbb..ffc939f54af 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -644,13 +644,14 @@ static void test_source_resolver(void)
IMFGetService *get_service;
IMFRateSupport *rate_support;
WCHAR pathW[MAX_PATH];
- int i, sample_count;
+ int i, sample_count, pause_count, while_paused_count, restart_count, seek_count, last_seen;
WCHAR *filename;
PROPVARIANT var;
HRESULT hr;
GUID guid;
float rate;
UINT32 rotation;
+ BOOL ret, pause_seen;
if (!pMFCreateSourceResolver)
{
@@ -864,9 +865,19 @@ todo_wine
expect_no_event((IMFMediaEventGenerator *)video_stream);
sample_count = 10;
+ pause_count = 2;
+ while_paused_count = 6;
+ restart_count = 7;
+ seek_count = 3;
- for (i = 0; i < sample_count; ++i)
+ for (i = 0; i < while_paused_count; ++i)
{
+ if (i == pause_count)
+ {
+ hr = IMFMediaSource_Pause(mediasource);
+ ok(hr == S_OK, "Could not pause media source, hr %#x.\n", hr);
+ }
+
hr = IMFMediaStream_RequestSample(video_stream, NULL);
if (i == sample_count)
break;
@@ -875,13 +886,84 @@ todo_wine
break;
}
- for (i = 0; i < sample_count; ++i)
+ pause_seen = FALSE;
+
+ for (i = 0; ; ++i)
+ {
+ static const LONGLONG MILLI_TO_100_NANO = 10000;
+ LONGLONG duration, time;
+ DWORD buffer_count;
+ IMFSample *sample;
+ MediaEventType met;
+
+ ret = get_event((IMFMediaEventGenerator *)video_stream, &met, &var);
+ if (!ret)
+ break;
+
+ if (met == MEStreamPaused)
+ {
+ ok(!pause_seen, "Pause seen twice\n");
+ pause_seen = TRUE;
+ i--;
+ continue;
+ }
+
+ ok(i < while_paused_count, "Too many samples: %d\n", i);
+ ok(met == MEMediaSample, "wrong type %d\n", met);
+
+ ok(var.vt == VT_UNKNOWN, "Unexpected value type %u from MEMediaSample event.\n", var.vt);
+ sample = (IMFSample *)var.punkVal;
+
+ hr = IMFSample_GetBufferCount(sample, &buffer_count);
+ ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr);
+ ok(buffer_count == 1, "Unexpected buffer count %u.\n", buffer_count);
+
+ hr = IMFSample_GetSampleDuration(sample, &duration);
+ ok(hr == S_OK, "Failed to get sample duration, hr %#x.\n", hr);
+ ok(duration == 40 * MILLI_TO_100_NANO, "Unexpected duration %s.\n", wine_dbgstr_longlong(duration));
+
+ hr = IMFSample_GetSampleTime(sample, &time);
+ ok(hr == S_OK, "Failed to get sample time, hr %#x.\n", hr);
+ ok(time == i * 40 * MILLI_TO_100_NANO, "Unexpected time %s.\n", wine_dbgstr_longlong(time));
+
+ IMFSample_Release(sample);
+ }
+
+ last_seen = i;
+
+ ok(pause_seen, "Pause not seen\n");
+
+ expect_event((IMFMediaEventGenerator *)mediasource, MESourcePaused, &var);
+ expect_no_event((IMFMediaEventGenerator *)mediasource);
+ expect_no_event((IMFMediaEventGenerator *)video_stream);
+
+ for (i = while_paused_count; i < restart_count; ++i)
+ {
+ hr = IMFMediaStream_RequestSample(video_stream, NULL);
+ if (i == sample_count)
+ break;
+ ok(hr == S_OK, "Failed to request sample %u, hr %#x.\n", i + 1, hr);
+ if (hr != S_OK)
+ break;
+ }
+
+ expect_no_event((IMFMediaEventGenerator *)mediasource);
+ expect_no_event((IMFMediaEventGenerator *)video_stream);
+
+ var.vt = VT_EMPTY;
+ hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
+ ok(hr == S_OK, "Failed to restart the media source, hr %#x.\n", hr);
+
+ expect_event((IMFMediaEventGenerator *)mediasource, MEUpdatedStream, &var);
+ expect_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, &var);
+ expect_event((IMFMediaEventGenerator *)video_stream, MEStreamStarted, &var);
+
+ for (i = last_seen; i < restart_count; ++i)
{
static const LONGLONG MILLI_TO_100_NANO = 10000;
LONGLONG duration, time;
DWORD buffer_count;
IMFSample *sample;
- BOOL ret;
ret = expect_event((IMFMediaEventGenerator *)video_stream, MEMediaSample, &var);
ok(ret, "Sample %u not received.\n", i + 1);
@@ -906,6 +988,77 @@ todo_wine
IMFSample_Release(sample);
}
+ expect_no_event((IMFMediaEventGenerator *)mediasource);
+ expect_no_event((IMFMediaEventGenerator *)video_stream);
+
+ hr = IMFMediaSource_Pause(mediasource);
+ ok(hr == S_OK, "cannot pause %#x\n", hr);
+
+ expect_event((IMFMediaEventGenerator *)mediasource, MESourcePaused, &var);
+ expect_event((IMFMediaEventGenerator *)video_stream, MEStreamPaused, &var);
+ expect_no_event((IMFMediaEventGenerator *)mediasource);
+ expect_no_event((IMFMediaEventGenerator *)video_stream);
+
+ for (i = 0; i < 200; i++)
+ {
+ hr = IMFMediaStream_RequestSample(video_stream, NULL);
+ ok(hr == S_OK, "Failed to request sample %u, hr %#x.\n", i + 1, hr);
+ }
+
+ expect_no_event((IMFMediaEventGenerator *)mediasource);
+ expect_no_event((IMFMediaEventGenerator *)video_stream);
+
+ var.vt = VT_I8;
+ var.hVal.QuadPart = seek_count * 40 * 10000;
+ hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
+ ok(hr == S_OK, "Failed to restart the media source, hr %#x.\n", hr);
+
+ expect_event((IMFMediaEventGenerator *)mediasource, MEUpdatedStream, &var);
+ expect_event((IMFMediaEventGenerator *)mediasource, MESourceSeeked, &var);
+ expect_event((IMFMediaEventGenerator *)video_stream, MEStreamSeeked, &var);
+ expect_no_event((IMFMediaEventGenerator *)mediasource);
+ expect_no_event((IMFMediaEventGenerator *)video_stream);
+
+ for (i = seek_count; i < sample_count; ++i)
+ {
+ hr = IMFMediaStream_RequestSample(video_stream, NULL);
+ if (i == sample_count)
+ break;
+ ok(hr == S_OK, "Failed to request sample %u, hr %#x.\n", i + 1, hr);
+ if (hr != S_OK)
+ break;
+ }
+
+ for (i = seek_count; i < sample_count; ++i)
+ {
+ static const LONGLONG MILLI_TO_100_NANO = 10000;
+ LONGLONG duration, time;
+ DWORD buffer_count;
+ IMFSample *sample;
+
+ ret = expect_event((IMFMediaEventGenerator *)video_stream, MEMediaSample, &var);
+ ok(ret, "Sample %u not received.\n", i + 1);
+ if (!ret)
+ break;
+
+ ok(var.vt == VT_UNKNOWN, "Unexpected value type %u from MEMediaSample event.\n", var.vt);
+ sample = (IMFSample *)var.punkVal;
+
+ hr = IMFSample_GetBufferCount(sample, &buffer_count);
+ ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr);
+ ok(buffer_count == 1, "Unexpected buffer count %u.\n", buffer_count);
+
+ hr = IMFSample_GetSampleDuration(sample, &duration);
+ ok(hr == S_OK, "Failed to get sample duration, hr %#x.\n", hr);
+ ok(duration == 40 * MILLI_TO_100_NANO, "Unexpected duration %s.\n", wine_dbgstr_longlong(duration));
+
+ hr = IMFSample_GetSampleTime(sample, &time);
+ ok(hr == S_OK, "Failed to get sample time, hr %#x.\n", hr);
+ ok(time == i * 40 * MILLI_TO_100_NANO, "Unexpected time %s %s %d %d.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(i * 40 * MILLI_TO_100_NANO), i, (int)(time / (40 * MILLI_TO_100_NANO)));
+
+ IMFSample_Release(sample);
+ }
+
if (i == sample_count)
{
/* MEEndOfStream isn't queued until after a one request beyond the last frame is submitted */
--
2.33.0
More information about the wine-devel
mailing list