[PATCH 5/5] wmvcore/tests: Add tests for stream selection.
Zebediah Figura
zfigura at codeweavers.com
Wed Nov 10 10:41:13 CST 2021
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/wmvcore/tests/wmvcore.c | 236 ++++++++++++++++++++++++++++++++++-
1 file changed, 234 insertions(+), 2 deletions(-)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index ec66fb1bb74..76586822c84 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -589,6 +589,122 @@ static void test_reader_attributes(IWMProfile *profile)
IWMHeaderInfo_Release(header_info);
}
+static void test_sync_reader_selection(IWMSyncReader *reader)
+{
+ WMT_STREAM_SELECTION selections[2];
+ WORD stream_numbers[2];
+ QWORD pts, duration;
+ INSSBuffer *sample;
+ DWORD flags;
+ HRESULT hr;
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMSyncReader_GetStreamSelected(reader, 0, &selections[0]);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ ok(selections[0] == 0xdeadbeef, "Got selection %#x.\n", selections[0]);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMSyncReader_GetStreamSelected(reader, 1, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_ON, "Got selection %#x.\n", selections[0]);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMSyncReader_GetStreamSelected(reader, 2, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_ON, "Got selection %#x.\n", selections[0]);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMSyncReader_GetStreamSelected(reader, 3, &selections[0]);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ ok(selections[0] == 0xdeadbeef, "Got selection %#x.\n", selections[0]);
+
+ hr = IWMSyncReader_SetStreamsSelected(reader, 0, NULL, NULL);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ stream_numbers[0] = 1;
+ stream_numbers[1] = 0;
+ selections[0] = selections[1] = WMT_OFF;
+ hr = IWMSyncReader_SetStreamsSelected(reader, 2, stream_numbers, selections);
+ ok(hr == NS_E_INVALID_REQUEST, "Got hr %#x.\n", hr);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMSyncReader_GetStreamSelected(reader, 1, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_ON, "Got selection %#x.\n", selections[0]);
+
+ stream_numbers[0] = stream_numbers[1] = 1;
+ selections[0] = selections[1] = WMT_OFF;
+ hr = IWMSyncReader_SetStreamsSelected(reader, 2, stream_numbers, selections);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMSyncReader_GetStreamSelected(reader, 1, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_OFF, "Got selection %#x.\n", selections[0]);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMSyncReader_GetStreamSelected(reader, 2, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_ON, "Got selection %#x.\n", selections[0]);
+
+ hr = IWMSyncReader_GetNextSample(reader, 1, &sample, &pts, &duration, &flags, NULL, NULL);
+ ok(hr == NS_E_INVALID_REQUEST, "Got hr %#x.\n", hr);
+
+ hr = IWMSyncReader_GetNextSample(reader, 2, &sample, &pts, &duration, &flags, NULL, NULL);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ INSSBuffer_Release(sample);
+
+ for (;;)
+ {
+ hr = IWMSyncReader_GetNextSample(reader, 2, &sample, &pts, &duration, &flags, NULL, NULL);
+ if (hr == NS_E_NO_MORE_SAMPLES)
+ break;
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ INSSBuffer_Release(sample);
+ }
+
+ hr = IWMSyncReader_GetNextSample(reader, 1, &sample, &pts, &duration, &flags, NULL, NULL);
+ ok(hr == NS_E_INVALID_REQUEST, "Got hr %#x.\n", hr);
+
+ hr = IWMSyncReader_SetRange(reader, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IWMSyncReader_GetNextSample(reader, 0, &sample, &pts, &duration,
+ &flags, NULL, &stream_numbers[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(stream_numbers[0] == 2, "Got stream number %u.\n", stream_numbers[0]);
+ INSSBuffer_Release(sample);
+
+ for (;;)
+ {
+ hr = IWMSyncReader_GetNextSample(reader, 0, &sample, &pts, &duration,
+ &flags, NULL, &stream_numbers[0]);
+ if (hr == NS_E_NO_MORE_SAMPLES)
+ break;
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(stream_numbers[0] == 2, "Got stream number %u.\n", stream_numbers[0]);
+ INSSBuffer_Release(sample);
+ }
+
+ stream_numbers[0] = stream_numbers[1] = 2;
+ selections[0] = selections[1] = WMT_OFF;
+ hr = IWMSyncReader_SetStreamsSelected(reader, 2, stream_numbers, selections);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IWMSyncReader_SetRange(reader, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IWMSyncReader_GetNextSample(reader, 0, &sample, &pts, &duration,
+ &flags, NULL, &stream_numbers[0]);
+ ok(hr == NS_E_NO_MORE_SAMPLES, "Got hr %#x.\n", hr);
+
+ stream_numbers[0] = 1;
+ stream_numbers[1] = 2;
+ selections[0] = selections[1] = WMT_ON;
+ hr = IWMSyncReader_SetStreamsSelected(reader, 2, stream_numbers, selections);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+}
+
static void test_sync_reader_streaming(void)
{
DWORD size, capacity, flags, output_number, expect_output_number;
@@ -792,6 +908,11 @@ static void test_sync_reader_streaming(void)
&pts, &duration, &flags, NULL, NULL);
ok(hr == NS_E_NO_MORE_SAMPLES, "Got hr %#x.\n", hr);
+ hr = IWMSyncReader_SetRange(reader, 0, 0);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ test_sync_reader_selection(reader);
+
test_reader_attributes(profile);
hr = IWMSyncReader_Close(reader);
@@ -1112,6 +1233,7 @@ struct callback
LONG refcount;
HANDLE got_opened, got_stopped, eof_event;
unsigned int got_closed, got_started, got_sample, got_end_of_streaming, got_eof;
+ bool all_streams_off;
};
static struct callback *impl_from_IWMReaderCallback(IWMReaderCallback *iface)
@@ -1196,7 +1318,10 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta
ok(type == WMT_TYPE_DWORD, "Got type %#x.\n", type);
ok(!*(DWORD *)value, "Got value %#x.\n", *(DWORD *)value);
ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
- ok(callback->got_sample > 0, "Got no samples.\n");
+ if (callback->all_streams_off)
+ ok(callback->got_sample == 0, "Got %u samples.\n", callback->got_sample);
+ else
+ ok(callback->got_sample > 0, "Got no samples.\n");
ok(callback->got_end_of_streaming == 1, "Got %u WMT_END_OF_STREAMING callbacks.\n",
callback->got_end_of_streaming);
++callback->got_eof;
@@ -1208,7 +1333,10 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta
ok(type == WMT_TYPE_QWORD, "Got type %#x.\n", type);
ok(*(QWORD *)value == 3000, "Got value %#x.\n", *(DWORD *)value);
ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
- ok(callback->got_sample > 0, "Got no samples.\n");
+ if (callback->all_streams_off)
+ ok(callback->got_sample == 0, "Got %u samples.\n", callback->got_sample);
+ else
+ ok(callback->got_sample > 0, "Got no samples.\n");
ok(callback->got_eof == 1, "Got %u WMT_EOF callbacks.\n", callback->got_eof);
break;
@@ -1289,6 +1417,109 @@ static void callback_cleanup(struct callback *callback)
CloseHandle(callback->eof_event);
}
+static void run_async_reader(IWMReader *reader, IWMReaderAdvanced2 *advanced, struct callback *callback)
+{
+ HRESULT hr;
+ DWORD ret;
+
+ callback->got_closed = 0;
+ callback->got_started = 0;
+ callback->got_sample = 0;
+ callback->got_end_of_streaming = 0;
+ callback->got_eof = 0;
+
+ hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IWMReaderAdvanced2_SetUserProvidedClock(advanced, TRUE);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IWMReaderAdvanced2_DeliverTime(advanced, 3000 * 10000);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ ret = WaitForSingleObject(callback->eof_event, 1000);
+ ok(!ret, "Wait timed out.\n");
+ ok(callback->got_eof == 1, "Got %u WMT_EOF callbacks.\n", callback->got_eof);
+
+ hr = IWMReader_Stop(reader);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ret = WaitForSingleObject(callback->got_stopped, 1000);
+ ok(!ret, "Wait timed out.\n");
+}
+
+static void test_async_reader_selection(IWMReader *reader,
+ IWMReaderAdvanced2 *advanced, struct callback *callback)
+{
+ WMT_STREAM_SELECTION selections[2];
+ WORD stream_numbers[2];
+ HRESULT hr;
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMReaderAdvanced2_GetStreamSelected(advanced, 0, &selections[0]);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ ok(selections[0] == 0xdeadbeef, "Got selection %#x.\n", selections[0]);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMReaderAdvanced2_GetStreamSelected(advanced, 1, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_ON, "Got selection %#x.\n", selections[0]);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMReaderAdvanced2_GetStreamSelected(advanced, 2, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_ON, "Got selection %#x.\n", selections[0]);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMReaderAdvanced2_GetStreamSelected(advanced, 3, &selections[0]);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+ ok(selections[0] == 0xdeadbeef, "Got selection %#x.\n", selections[0]);
+
+ hr = IWMReaderAdvanced2_SetStreamsSelected(advanced, 0, NULL, NULL);
+ ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr);
+
+ stream_numbers[0] = 1;
+ stream_numbers[1] = 0;
+ selections[0] = selections[1] = WMT_OFF;
+ hr = IWMReaderAdvanced2_SetStreamsSelected(advanced, 2, stream_numbers, selections);
+ ok(hr == NS_E_INVALID_REQUEST, "Got hr %#x.\n", hr);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMReaderAdvanced2_GetStreamSelected(advanced, 1, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_ON, "Got selection %#x.\n", selections[0]);
+
+ stream_numbers[0] = stream_numbers[1] = 1;
+ selections[0] = selections[1] = WMT_OFF;
+ hr = IWMReaderAdvanced2_SetStreamsSelected(advanced, 2, stream_numbers, selections);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMReaderAdvanced2_GetStreamSelected(advanced, 1, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_OFF, "Got selection %#x.\n", selections[0]);
+
+ selections[0] = 0xdeadbeef;
+ hr = IWMReaderAdvanced2_GetStreamSelected(advanced, 2, &selections[0]);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(selections[0] == WMT_ON, "Got selection %#x.\n", selections[0]);
+
+ run_async_reader(reader, advanced, callback);
+
+ stream_numbers[0] = stream_numbers[1] = 2;
+ selections[0] = selections[1] = WMT_OFF;
+ hr = IWMReaderAdvanced2_SetStreamsSelected(advanced, 2, stream_numbers, selections);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ callback->all_streams_off = true;
+ run_async_reader(reader, advanced, callback);
+ callback->all_streams_off = false;
+
+ stream_numbers[0] = 1;
+ stream_numbers[1] = 2;
+ selections[0] = selections[1] = WMT_ON;
+ hr = IWMReaderAdvanced2_SetStreamsSelected(advanced, 2, stream_numbers, selections);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+}
+
static void test_async_reader_streaming(void)
{
const WCHAR *filename = load_resource(L"test.wmv");
@@ -1379,6 +1610,7 @@ static void test_async_reader_streaming(void)
ok(!ret, "Wait timed out.\n");
test_reader_attributes(profile);
+ test_async_reader_selection(reader, advanced, &callback);
hr = IWMReader_Close(reader);
ok(hr == S_OK, "Got hr %#x.\n", hr);
--
2.33.0
More information about the wine-devel
mailing list