From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wmvcore/tests/wmvcore.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c index 237546ed7a6..098b9addd99 100644 --- a/dlls/wmvcore/tests/wmvcore.c +++ b/dlls/wmvcore/tests/wmvcore.c @@ -30,6 +30,8 @@
#include "wine/test.h"
+static const DWORD test_wmv_duration = 20460000; + HRESULT WINAPI WMCreateWriterPriv(IWMWriter **writer);
static BOOL compare_media_types(const WM_MEDIA_TYPE *a, const WM_MEDIA_TYPE *b) @@ -719,7 +721,7 @@ static void test_reader_attributes(IWMProfile *profile) ok(hr == S_OK, "Got hr %#lx.\n", hr); ok(type == WMT_TYPE_QWORD, "Got type %#x.\n", type); ok(size == sizeof(QWORD), "Got size %u.\n", size); - ok(duration == 20460000, "Got duration %I64u.\n", duration); + ok(duration == test_wmv_duration, "Got duration %I64u.\n", duration); ok(stream_number == 0, "Got stream number %u.\n", stream_number);
/* Pass a too-small size. */ @@ -2077,7 +2079,7 @@ static void run_async_reader(IWMReader *reader, IWMReaderAdvanced2 *advanced, st
hr = IWMReaderAdvanced2_SetUserProvidedClock(advanced, TRUE); ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IWMReaderAdvanced2_DeliverTime(advanced, 3000 * 10000); + hr = IWMReaderAdvanced2_DeliverTime(advanced, test_wmv_duration * 2); ok(hr == S_OK, "Got hr %#lx.\n", hr);
wait_eof_callback(callback); @@ -2416,7 +2418,7 @@ static void test_async_reader_streaming(void) /* By default the reader will time itself, and attempt to deliver samples * according to their presentation time. Call DeliverTime with the file * duration in order to request all samples as fast as possible. */ - hr = IWMReaderAdvanced2_DeliverTime(advanced, 3000 * 10000); + hr = IWMReaderAdvanced2_DeliverTime(advanced, test_wmv_duration * 2); ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); hr = IWMReaderAdvanced2_SetUserProvidedClock(advanced, TRUE); ok(hr == S_OK, "Got hr %#lx.\n", hr); @@ -2425,13 +2427,13 @@ static void test_async_reader_streaming(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); ret = WaitForSingleObject(callback.ontime_event, 1000); ok(!ret, "Wait timed out.\n"); - callback.expect_ontime = 1000 * 10000; - hr = IWMReaderAdvanced2_DeliverTime(advanced, 1000 * 10000); + callback.expect_ontime = test_wmv_duration / 2; + hr = IWMReaderAdvanced2_DeliverTime(advanced, test_wmv_duration / 2); ok(hr == S_OK, "Got hr %#lx.\n", hr); ret = WaitForSingleObject(callback.ontime_event, 1000); ok(!ret, "Wait timed out.\n"); - callback.expect_ontime = 3000 * 10000; - hr = IWMReaderAdvanced2_DeliverTime(advanced, 3000 * 10000); + callback.expect_ontime = test_wmv_duration * 2; + hr = IWMReaderAdvanced2_DeliverTime(advanced, test_wmv_duration * 2); ok(hr == S_OK, "Got hr %#lx.\n", hr);
wait_eof_callback(&callback); @@ -2443,7 +2445,7 @@ static void test_async_reader_streaming(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); wait_started_callback(&callback);
- hr = IWMReaderAdvanced2_DeliverTime(advanced, 3000 * 10000); + hr = IWMReaderAdvanced2_DeliverTime(advanced, test_wmv_duration * 2); ok(hr == S_OK, "Got hr %#lx.\n", hr);
wait_eof_callback(&callback);
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wmvcore/tests/wmvcore.c | 233 +++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c index 098b9addd99..4be27631547 100644 --- a/dlls/wmvcore/tests/wmvcore.c +++ b/dlls/wmvcore/tests/wmvcore.c @@ -917,6 +917,238 @@ static void test_sync_reader_compressed(IWMSyncReader *reader) ok(hr == S_OK, "Got hr %#lx.\n", hr); }
+static void check_sync_get_output_setting(IWMSyncReader *reader, DWORD output, const WCHAR *name, + WMT_ATTR_DATATYPE expect_type, DWORD expect_value, HRESULT expect_hr) +{ + WMT_ATTR_DATATYPE type; + DWORD value; + HRESULT hr; + WORD size; + + winetest_push_context("%s", debugstr_w(name)); + + value = 0; + type = expect_type; + if (expect_type == WMT_TYPE_BOOL) + size = sizeof(BOOL); + else if (expect_type == WMT_TYPE_WORD) + size = sizeof(WORD); + else + size = sizeof(DWORD); + + hr = IWMSyncReader_GetOutputSetting(reader, output, name, &type, (BYTE *)&value, &size); + todo_wine + ok(hr == expect_hr, "Got hr %#lx.\n", hr); + + if (SUCCEEDED(hr)) + { + ok(type == expect_type, "Got type %u.\n", type); + ok(value == expect_value, "Got value %lu.\n", value); + if (type == WMT_TYPE_BOOL) + ok(size == sizeof(BOOL), "Got size %u\n", size); + else if (type == WMT_TYPE_WORD) + ok(size == sizeof(WORD), "Got size %u\n", size); + else + ok(size == sizeof(DWORD), "Got size %u\n", size); + } + + winetest_pop_context(); +} + +static void check_sync_set_output_setting(IWMSyncReader *reader, DWORD output, const WCHAR *name, + WMT_ATTR_DATATYPE type, DWORD value, HRESULT expect_hr, BOOL todo) +{ + HRESULT hr; + WORD size; + + winetest_push_context("%s", debugstr_w(name)); + + if (type == WMT_TYPE_BOOL) + size = sizeof(BOOL); + else if (type == WMT_TYPE_WORD) + size = sizeof(WORD); + else + size = sizeof(DWORD); + + hr = IWMSyncReader_SetOutputSetting(reader, output, name, type, (BYTE *)&value, size); + todo_wine_if(todo) + ok(hr == expect_hr, "Got hr %#lx.\n", hr); + + winetest_pop_context(); +} + +static void test_sync_reader_settings(void) +{ + const WCHAR *filename = load_resource(L"test.wmv"); + struct teststream stream; + WMT_ATTR_DATATYPE type; + IWMSyncReader *reader; + DWORD value; + HRESULT hr; + WORD size; + HANDLE file; + BOOL ret; + + hr = WMCreateSyncReader(NULL, 0, &reader); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + type = WMT_TYPE_BOOL; + size = sizeof(BOOL); + value = 0; + hr = IWMSyncReader_GetOutputSetting(reader, 0, L"AllowInterlacedOutput", + &type, (BYTE *)&value, &size); + todo_wine + ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); + + file = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "Failed to open %s, error %lu.\n", debugstr_w(file), GetLastError()); + + teststream_init(&stream, file); + + hr = IWMSyncReader_OpenStream(reader, &stream.IStream_iface); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(stream.refcount > 1, "Got refcount %ld.\n", stream.refcount); + + check_sync_get_output_setting(reader, 0, L"AllowInterlacedOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 0, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 0, L"DeliverOnReceive", + WMT_TYPE_BOOL, 0, S_OK); + check_sync_get_output_setting(reader, 0, L"EnableDiscreteOutput", + WMT_TYPE_BOOL, 0, S_OK); + check_sync_get_output_setting(reader, 0, L"EnableFrameInterpolation", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 0, L"JustInTimeDecode", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 0, L"NeedsPreviousSample", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 0, L"ScrambledAudio", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 0, L"SingleOutputBuffer", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 0, L"SoftwareScaling", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 0, L"VideoSampleDurations", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 0, L"EnableWMAProSPDIFOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 0, L"StreamLanguage", + WMT_TYPE_WORD, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 0, L"DynamicRangeControl", + WMT_TYPE_DWORD, -1, S_OK); + check_sync_get_output_setting(reader, 0, L"EarlyDataDelivery", + WMT_TYPE_DWORD, 0, S_OK); + check_sync_get_output_setting(reader, 0, L"SpeakerConfig", + WMT_TYPE_DWORD, -1, S_OK); + + check_sync_get_output_setting(reader, 1, L"AllowInterlacedOutput", + WMT_TYPE_BOOL, 0, S_OK); + check_sync_get_output_setting(reader, 1, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 1, L"DeliverOnReceive", + WMT_TYPE_BOOL, 0, S_OK); + check_sync_get_output_setting(reader, 1, L"EnableDiscreteOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 1, L"EnableFrameInterpolation", + WMT_TYPE_BOOL, 0, S_OK); + check_sync_get_output_setting(reader, 1, L"JustInTimeDecode", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 1, L"NeedsPreviousSample", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 1, L"ScrambledAudio", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 1, L"SingleOutputBuffer", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 1, L"SoftwareScaling", + WMT_TYPE_BOOL, 1, S_OK); + check_sync_get_output_setting(reader, 1, L"VideoSampleDurations", + WMT_TYPE_BOOL, 0, S_OK); + check_sync_get_output_setting(reader, 1, L"EnableWMAProSPDIFOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 1, L"StreamLanguage", + WMT_TYPE_WORD, 0, NS_E_INVALID_REQUEST); + check_sync_get_output_setting(reader, 1, L"DynamicRangeControl", + WMT_TYPE_DWORD, 0, E_INVALIDARG); + check_sync_get_output_setting(reader, 1, L"EarlyDataDelivery", + WMT_TYPE_DWORD, 0, S_OK); + check_sync_get_output_setting(reader, 1, L"SpeakerConfig", + WMT_TYPE_DWORD, 0, E_INVALIDARG); + + check_sync_set_output_setting(reader, 0, L"AllowInterlacedOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 0, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST, TRUE); + check_sync_set_output_setting(reader, 0, L"DeliverOnReceive", + WMT_TYPE_BOOL, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 0, L"EnableDiscreteOutput", + WMT_TYPE_BOOL, 1, S_OK, FALSE); + check_sync_set_output_setting(reader, 0, L"EnableFrameInterpolation", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 0, L"JustInTimeDecode", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST, TRUE); + check_sync_set_output_setting(reader, 0, L"NeedsPreviousSample", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 0, L"ScrambledAudio", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 0, L"SingleOutputBuffer", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST, TRUE); + check_sync_set_output_setting(reader, 0, L"SoftwareScaling", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 0, L"VideoSampleDurations", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 0, L"EnableWMAProSPDIFOutput", + WMT_TYPE_BOOL, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 0, L"StreamLanguage", + WMT_TYPE_WORD, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 0, L"DynamicRangeControl", + WMT_TYPE_DWORD, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 0, L"EarlyDataDelivery", + WMT_TYPE_DWORD, 1000, S_OK, TRUE); + check_sync_set_output_setting(reader, 0, L"SpeakerConfig", + WMT_TYPE_DWORD, 1, S_OK, FALSE); + + check_sync_set_output_setting(reader, 1, L"AllowInterlacedOutput", + WMT_TYPE_BOOL, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 1, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST, TRUE); + check_sync_set_output_setting(reader, 1, L"DeliverOnReceive", + WMT_TYPE_BOOL, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 1, L"EnableDiscreteOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 1, L"EnableFrameInterpolation", + WMT_TYPE_BOOL, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 1, L"JustInTimeDecode", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST, TRUE); + check_sync_set_output_setting(reader, 1, L"NeedsPreviousSample", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 1, L"ScrambledAudio", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 1, L"SingleOutputBuffer", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST, TRUE); + check_sync_set_output_setting(reader, 1, L"SoftwareScaling", + WMT_TYPE_BOOL, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 1, L"VideoSampleDurations", + WMT_TYPE_BOOL, 1, S_OK, FALSE); + check_sync_set_output_setting(reader, 1, L"EnableWMAProSPDIFOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 1, L"StreamLanguage", + WMT_TYPE_WORD, 1, S_OK, TRUE); + check_sync_set_output_setting(reader, 1, L"DynamicRangeControl", + WMT_TYPE_DWORD, 0, E_INVALIDARG, TRUE); + check_sync_set_output_setting(reader, 1, L"EarlyDataDelivery", + WMT_TYPE_DWORD, 2000, S_OK, TRUE); + check_sync_set_output_setting(reader, 1, L"SpeakerConfig", + WMT_TYPE_DWORD, 0, E_INVALIDARG, TRUE); + + IWMSyncReader_Release(reader); + + ok(stream.refcount == 1, "Got outstanding refcount %ld.\n", stream.refcount); + CloseHandle(stream.file); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); +} + static void test_sync_reader_streaming(void) { DWORD size, capacity, flags, output_number, expect_output_number; @@ -2865,6 +3097,7 @@ START_TEST(wmvcore) test_WMCreateWriterPriv(); test_urlextension(); test_iscontentprotected(); + test_sync_reader_settings(); test_sync_reader_streaming(); test_sync_reader_types(); test_sync_reader_file();
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wmvcore/tests/wmvcore.c | 239 +++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c index 4be27631547..9a8a9634d8d 100644 --- a/dlls/wmvcore/tests/wmvcore.c +++ b/dlls/wmvcore/tests/wmvcore.c @@ -2283,6 +2283,66 @@ static void wait_eof_callback_(int line, struct callback *callback) ok_(__FILE__, line)(callback->eof_count == 1, "Got %u WMT_EOF callbacks.\n", callback->eof_count); }
+static void check_async_get_output_setting(IWMReaderAdvanced2 *reader, DWORD output, const WCHAR *name, + WMT_ATTR_DATATYPE expect_type, DWORD expect_value, HRESULT expect_hr) +{ + WMT_ATTR_DATATYPE type; + DWORD value; + HRESULT hr; + WORD size; + + winetest_push_context("%s", debugstr_w(name)); + + value = 0; + type = expect_type; + if (expect_type == WMT_TYPE_BOOL) + size = sizeof(BOOL); + else if (expect_type == WMT_TYPE_WORD) + size = sizeof(WORD); + else + size = sizeof(DWORD); + + hr = IWMReaderAdvanced2_GetOutputSetting(reader, output, name, &type, (BYTE *)&value, &size); + todo_wine + ok(hr == expect_hr, "Got hr %#lx.\n", hr); + + if (SUCCEEDED(hr)) + { + ok(type == expect_type, "Got type %u.\n", type); + ok(value == expect_value, "Got value %lu.\n", value); + if (type == WMT_TYPE_BOOL) + ok(size == sizeof(BOOL), "Got size %u\n", size); + else if (type == WMT_TYPE_WORD) + ok(size == sizeof(WORD), "Got size %u\n", size); + else + ok(size == sizeof(DWORD), "Got size %u\n", size); + } + + winetest_pop_context(); +} + +static void check_async_set_output_setting(IWMReaderAdvanced2 *reader, DWORD output, const WCHAR *name, + WMT_ATTR_DATATYPE type, DWORD value, HRESULT expect_hr) +{ + HRESULT hr; + WORD size; + + winetest_push_context("%s", debugstr_w(name)); + + if (type == WMT_TYPE_BOOL) + size = sizeof(BOOL); + else if (type == WMT_TYPE_WORD) + size = sizeof(WORD); + else + size = sizeof(DWORD); + + hr = IWMReaderAdvanced2_SetOutputSetting(reader, output, name, type, (BYTE *)&value, size); + todo_wine + ok(hr == expect_hr, "Got hr %#lx.\n", hr); + + winetest_pop_context(); +} + static void run_async_reader(IWMReader *reader, IWMReaderAdvanced2 *advanced, struct callback *callback) { HRESULT hr; @@ -2584,6 +2644,184 @@ static void test_async_reader_allocate_compressed(IWMReader *reader, callback->read_compressed = false; }
+static void test_async_reader_settings(void) +{ + const WCHAR *filename = load_resource(L"test.wmv"); + IWMReaderAdvanced2 *reader_advanced; + struct callback callback; + WMT_ATTR_DATATYPE type; + IWMReader *reader; + DWORD value; + HRESULT hr; + WORD size; + BOOL ret; + + callback_init(&callback); + + hr = WMCreateReader(NULL, 0, &reader); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IWMReader_QueryInterface(reader, &IID_IWMReaderAdvanced2, (void **)&reader_advanced); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + type = WMT_TYPE_BOOL; + size = sizeof(BOOL); + value = 0; + hr = IWMReaderAdvanced2_GetOutputSetting(reader_advanced, 0, L"AllowInterlacedOutput", + &type, (BYTE *)&value, &size); + todo_wine + ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); + + hr = IWMReader_Open(reader, filename, &callback.IWMReaderCallback_iface, (void **)0xdeadbeef); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + wait_opened_callback(&callback); + + check_async_get_output_setting(reader_advanced, 0, L"AllowInterlacedOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 0, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 0, L"DeliverOnReceive", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 0, L"EnableDiscreteOutput", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 0, L"EnableFrameInterpolation", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 0, L"JustInTimeDecode", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 0, L"NeedsPreviousSample", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 0, L"ScrambledAudio", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 0, L"SingleOutputBuffer", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 0, L"SoftwareScaling", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 0, L"VideoSampleDurations", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 0, L"EnableWMAProSPDIFOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 0, L"StreamLanguage", + WMT_TYPE_WORD, 0, NS_E_INVALID_REQUEST); + check_async_get_output_setting(reader_advanced, 0, L"DynamicRangeControl", + WMT_TYPE_DWORD, -1, S_OK); + check_async_get_output_setting(reader_advanced, 0, L"EarlyDataDelivery", + WMT_TYPE_DWORD, 0, S_OK); + check_async_get_output_setting(reader_advanced, 0, L"SpeakerConfig", + WMT_TYPE_DWORD, -1, S_OK); + + check_async_get_output_setting(reader_advanced, 1, L"AllowInterlacedOutput", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 1, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 1, L"DeliverOnReceive", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 1, L"EnableDiscreteOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 1, L"EnableFrameInterpolation", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 1, L"JustInTimeDecode", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 1, L"NeedsPreviousSample", + WMT_TYPE_BOOL, 0, NS_E_INVALID_REQUEST); + check_async_get_output_setting(reader_advanced, 1, L"ScrambledAudio", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 1, L"SingleOutputBuffer", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 1, L"SoftwareScaling", + WMT_TYPE_BOOL, 1, S_OK); + check_async_get_output_setting(reader_advanced, 1, L"VideoSampleDurations", + WMT_TYPE_BOOL, 0, S_OK); + check_async_get_output_setting(reader_advanced, 1, L"EnableWMAProSPDIFOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 1, L"StreamLanguage", + WMT_TYPE_WORD, 0, NS_E_INVALID_REQUEST); + check_async_get_output_setting(reader_advanced, 1, L"DynamicRangeControl", + WMT_TYPE_DWORD, 0, E_INVALIDARG); + check_async_get_output_setting(reader_advanced, 1, L"EarlyDataDelivery", + WMT_TYPE_DWORD, 0, S_OK); + check_async_get_output_setting(reader_advanced, 1, L"SpeakerConfig", + WMT_TYPE_DWORD, 0, E_INVALIDARG); + + check_async_set_output_setting(reader_advanced, 0, L"AllowInterlacedOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 0, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"DeliverOnReceive", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"EnableDiscreteOutput", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"EnableFrameInterpolation", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 0, L"JustInTimeDecode", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"NeedsPreviousSample", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 0, L"ScrambledAudio", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 0, L"SingleOutputBuffer", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"SoftwareScaling", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 0, L"VideoSampleDurations", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 0, L"EnableWMAProSPDIFOutput", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"StreamLanguage", + WMT_TYPE_WORD, 0, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"DynamicRangeControl", + WMT_TYPE_DWORD, 1, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"EarlyDataDelivery", + WMT_TYPE_DWORD, 1000, S_OK); + check_async_set_output_setting(reader_advanced, 0, L"SpeakerConfig", + WMT_TYPE_DWORD, 1, S_OK); + + check_async_set_output_setting(reader_advanced, 1, L"AllowInterlacedOutput", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"DeliverOnReceive", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"EnableDiscreteOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 1, L"EnableFrameInterpolation", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"JustInTimeDecode", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"NeedsPreviousSample", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 1, L"ScrambledAudio", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 1, L"SingleOutputBuffer", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"SoftwareScaling", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"VideoSampleDurations", + WMT_TYPE_BOOL, 1, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"EnableWMAProSPDIFOutput", + WMT_TYPE_BOOL, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 1, L"StreamLanguage", + WMT_TYPE_WORD, 0, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"DynamicRangeControl", + WMT_TYPE_DWORD, 0, E_INVALIDARG); + check_async_set_output_setting(reader_advanced, 1, L"EarlyDataDelivery", + WMT_TYPE_DWORD, 2000, S_OK); + check_async_set_output_setting(reader_advanced, 1, L"SpeakerConfig", + WMT_TYPE_DWORD, 0, E_INVALIDARG); + + SetEvent(callback.expect_started); + hr = IWMReader_Start(reader, 0, 0, 1, (void **)0xfacade); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IWMReader_Close(reader); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + IWMReaderAdvanced2_Release(reader_advanced); + IWMReader_Release(reader); + + callback_cleanup(&callback); + + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); +} + static void test_async_reader_streaming(void) { const WCHAR *filename = load_resource(L"test.wmv"); @@ -3101,6 +3339,7 @@ START_TEST(wmvcore) test_sync_reader_streaming(); test_sync_reader_types(); test_sync_reader_file(); + test_async_reader_settings(); test_async_reader_streaming(); test_async_reader_types(); test_async_reader_file();
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wmvcore/tests/wmvcore.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c index 9a8a9634d8d..3feb449c37d 100644 --- a/dlls/wmvcore/tests/wmvcore.c +++ b/dlls/wmvcore/tests/wmvcore.c @@ -1789,6 +1789,8 @@ struct callback bool read_compressed; DWORD max_stream_sample_size[2];
+ DWORD callback_tid; + QWORD expect_ontime; HANDLE ontime_event; }; @@ -1857,6 +1859,7 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta break;
case WMT_STARTED: + callback->callback_tid = GetCurrentThreadId(); ok(type == WMT_TYPE_DWORD, "Got type %#x.\n", type); ok(!*(DWORD *)value, "Got value %#lx.\n", *(DWORD *)value); ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context); @@ -1869,6 +1872,7 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta break;
case WMT_STOPPED: + ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); ok(type == WMT_TYPE_DWORD, "Got type %#x.\n", type); ok(!*(DWORD *)value, "Got value %#lx.\n", *(DWORD *)value); ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context); @@ -1885,6 +1889,7 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta break;
case WMT_END_OF_STREAMING: + ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); ok(type == WMT_TYPE_DWORD, "Got type %#x.\n", type); ok(!*(DWORD *)value, "Got value %#lx.\n", *(DWORD *)value); ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context); @@ -1892,6 +1897,7 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta break;
case WMT_EOF: + ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); ok(type == WMT_TYPE_DWORD, "Got type %#x.\n", type); ok(!*(DWORD *)value, "Got value %#lx.\n", *(DWORD *)value); ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context); @@ -1909,6 +1915,7 @@ static HRESULT WINAPI callback_OnStatus(IWMReaderCallback *iface, WMT_STATUS sta
/* Not sent when not using IWMReaderAdvanced::DeliverTime(). */ case WMT_END_OF_SEGMENT: + ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); ok(type == WMT_TYPE_QWORD, "Got type %#x.\n", type); ok(*(QWORD *)value == 3000, "Got value %#lx.\n", *(DWORD *)value); ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context); @@ -1978,6 +1985,8 @@ static HRESULT WINAPI callback_OnSample(IWMReaderCallback *iface, DWORD output, trace("%lu: %04lx: IWMReaderCallback::OnSample(output %lu, time %I64u, duration %I64u, flags %#lx)\n", GetTickCount(), GetCurrentThreadId(), output, time, duration, flags);
+ ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); + ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
check_async_sample(callback, sample); @@ -2031,6 +2040,8 @@ static HRESULT WINAPI callback_advanced_OnStreamSample(IWMReaderCallbackAdvanced trace("%lu: %04lx: IWMReaderCallbackAdvanced::OnStreamSample(stream %u, pts %I64u, duration %I64u, flags %#lx)\n", GetTickCount(), GetCurrentThreadId(), stream_number, pts, duration, flags);
+ ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); + ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
check_async_sample(callback, sample); @@ -2051,6 +2062,8 @@ static HRESULT WINAPI callback_advanced_OnTime(IWMReaderCallbackAdvanced *iface, trace("%lu: %04lx: IWMReaderCallbackAdvanced::OnTime(time %I64u)\n", GetTickCount(), GetCurrentThreadId(), time);
+ ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); + ok(time == callback->expect_ontime, "Got time %I64u.\n", time); ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context); SetEvent(callback->ontime_event); @@ -2082,6 +2095,9 @@ static HRESULT WINAPI callback_advanced_AllocateForStream(IWMReaderCallbackAdvan trace("%lu: %04lx: IWMReaderCallbackAdvanced::AllocateForStream(output %u, size %lu)\n", GetTickCount(), GetCurrentThreadId(), stream_number, size);
+ todo_wine + ok(callback->callback_tid != GetCurrentThreadId(), "got wrong thread\n"); + ok(callback->read_compressed, "AllocateForStream() should only be called when reading compressed samples.\n"); ok(callback->allocated_samples, "AllocateForStream() should only be called when using a custom allocator.\n");
@@ -2115,6 +2131,9 @@ static HRESULT WINAPI callback_advanced_AllocateForOutput(IWMReaderCallbackAdvan trace("%lu: %04lx: IWMReaderCallbackAdvanced::AllocateForOutput(output %lu, size %lu)\n", GetTickCount(), GetCurrentThreadId(), output, size);
+ todo_wine + ok(callback->callback_tid != GetCurrentThreadId(), "got wrong thread\n"); + if (!callback->read_compressed) { /* Actually AllocateForOutput() isn't called when reading compressed @@ -2352,6 +2371,7 @@ static void run_async_reader(IWMReader *reader, IWMReaderAdvanced2 *advanced, st callback->sample_count = 0; callback->end_of_streaming_count = 0; callback->eof_count = 0; + callback->callback_tid = 0;
hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade); ok(hr == S_OK, "Got hr %#lx.\n", hr);
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wmvcore/tests/wmvcore.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c index 3feb449c37d..9e38719c244 100644 --- a/dlls/wmvcore/tests/wmvcore.c +++ b/dlls/wmvcore/tests/wmvcore.c @@ -1791,6 +1791,8 @@ struct callback
DWORD callback_tid;
+ QWORD last_pts; + QWORD expect_ontime; HANDLE ontime_event; }; @@ -2041,6 +2043,8 @@ static HRESULT WINAPI callback_advanced_OnStreamSample(IWMReaderCallbackAdvanced GetTickCount(), GetCurrentThreadId(), stream_number, pts, duration, flags);
ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); + ok(callback->last_pts <= pts, "got pts %I64d\n", pts); + callback->last_pts = pts;
ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
@@ -2372,6 +2376,7 @@ static void run_async_reader(IWMReader *reader, IWMReaderAdvanced2 *advanced, st callback->end_of_streaming_count = 0; callback->eof_count = 0; callback->callback_tid = 0; + callback->last_pts = 0;
hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade); ok(hr == S_OK, "Got hr %#lx.\n", hr);
From: R��mi Bernon rbernon@codeweavers.com
--- dlls/wmvcore/tests/wmvcore.c | 74 ++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 4 deletions(-)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c index 9e38719c244..3635a2ed642 100644 --- a/dlls/wmvcore/tests/wmvcore.c +++ b/dlls/wmvcore/tests/wmvcore.c @@ -1789,7 +1789,9 @@ struct callback bool read_compressed; DWORD max_stream_sample_size[2];
+ bool dedicated_threads; DWORD callback_tid; + DWORD output_tid[2];
QWORD last_pts;
@@ -1987,7 +1989,24 @@ static HRESULT WINAPI callback_OnSample(IWMReaderCallback *iface, DWORD output, trace("%lu: %04lx: IWMReaderCallback::OnSample(output %lu, time %I64u, duration %I64u, flags %#lx)\n", GetTickCount(), GetCurrentThreadId(), output, time, duration, flags);
- ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); + if (callback->dedicated_threads) + { + todo_wine + ok(callback->callback_tid != GetCurrentThreadId(), "got wrong thread\n"); + } + else + ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); + + if (!callback->output_tid[output]) + callback->output_tid[output] = GetCurrentThreadId(); + else + ok(callback->output_tid[output] == GetCurrentThreadId(), "got wrong thread\n"); + + if (callback->dedicated_threads && callback->output_tid[1 - output]) + { + todo_wine + ok(callback->output_tid[1 - output] != GetCurrentThreadId(), "got wrong thread\n"); + }
ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
@@ -2042,9 +2061,28 @@ static HRESULT WINAPI callback_advanced_OnStreamSample(IWMReaderCallbackAdvanced trace("%lu: %04lx: IWMReaderCallbackAdvanced::OnStreamSample(stream %u, pts %I64u, duration %I64u, flags %#lx)\n", GetTickCount(), GetCurrentThreadId(), stream_number, pts, duration, flags);
- ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); - ok(callback->last_pts <= pts, "got pts %I64d\n", pts); - callback->last_pts = pts; + if (callback->dedicated_threads) + { + todo_wine + ok(callback->callback_tid != GetCurrentThreadId(), "got wrong thread\n"); + } + else + { + ok(callback->callback_tid == GetCurrentThreadId(), "got wrong thread\n"); + ok(callback->last_pts <= pts, "got pts %I64d\n", pts); + callback->last_pts = pts; + } + + if (!callback->output_tid[stream_number - 1]) + callback->output_tid[stream_number - 1] = GetCurrentThreadId(); + else + ok(callback->output_tid[stream_number - 1] == GetCurrentThreadId(), "got wrong thread\n"); + + if (callback->dedicated_threads && callback->output_tid[2 - stream_number]) + { + todo_wine + ok(callback->output_tid[2 - stream_number] != GetCurrentThreadId(), "got wrong thread\n"); + }
ok(context == (void *)0xfacade, "Got unexpected context %p.\n", context);
@@ -2101,6 +2139,8 @@ static HRESULT WINAPI callback_advanced_AllocateForStream(IWMReaderCallbackAdvan
todo_wine ok(callback->callback_tid != GetCurrentThreadId(), "got wrong thread\n"); + todo_wine_if(callback->output_tid[stream_number - 1]) + ok(callback->output_tid[stream_number - 1] != GetCurrentThreadId(), "got wrong thread\n");
ok(callback->read_compressed, "AllocateForStream() should only be called when reading compressed samples.\n"); ok(callback->allocated_samples, "AllocateForStream() should only be called when using a custom allocator.\n"); @@ -2137,6 +2177,8 @@ static HRESULT WINAPI callback_advanced_AllocateForOutput(IWMReaderCallbackAdvan
todo_wine ok(callback->callback_tid != GetCurrentThreadId(), "got wrong thread\n"); + todo_wine_if(callback->output_tid[output]) + ok(callback->output_tid[output] != GetCurrentThreadId(), "got wrong thread\n");
if (!callback->read_compressed) { @@ -2377,6 +2419,12 @@ static void run_async_reader(IWMReader *reader, IWMReaderAdvanced2 *advanced, st callback->eof_count = 0; callback->callback_tid = 0; callback->last_pts = 0; + memset(callback->output_tid, 0, sizeof(callback->output_tid)); + + check_async_set_output_setting(advanced, 0, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, callback->dedicated_threads, S_OK); + check_async_set_output_setting(advanced, 1, L"DedicatedDeliveryThread", + WMT_TYPE_BOOL, callback->dedicated_threads, S_OK);
hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade); ok(hr == S_OK, "Got hr %#lx.\n", hr); @@ -2954,10 +3002,28 @@ static void test_async_reader_streaming(void) wait_stopped_callback(&callback);
test_reader_attributes(profile); + + trace("Checking default settings.\n"); + trace(" with stream selection\n"); + test_async_reader_selection(reader, advanced, &callback); + trace(" with sample allocation\n"); + test_async_reader_allocate(reader, advanced, &callback); + trace(" with compressed sample\n"); + test_async_reader_compressed(reader, advanced, &callback); + trace(" with compressed sample allocation\n"); + test_async_reader_allocate_compressed(reader, advanced, &callback); + + callback.dedicated_threads = TRUE; + trace("Checking DedicatedDeliveryThread.\n"); + trace(" with stream selection\n"); test_async_reader_selection(reader, advanced, &callback); + trace(" with sample allocation\n"); test_async_reader_allocate(reader, advanced, &callback); + trace(" with compressed sample\n"); test_async_reader_compressed(reader, advanced, &callback); + trace(" with compressed sample allocation\n"); test_async_reader_allocate_compressed(reader, advanced, &callback); + callback.dedicated_threads = FALSE;
hr = IWMReader_Close(reader); ok(hr == S_OK, "Got hr %#lx.\n", hr);
On 8/20/22 09:02, Rémi Bernon wrote:
trace("Checking default settings.\n");
trace(" with stream selection\n");
test_async_reader_selection(reader, advanced, &callback);
trace(" with sample allocation\n");
test_async_reader_allocate(reader, advanced, &callback);
trace(" with compressed sample\n");
test_async_reader_compressed(reader, advanced, &callback);
trace(" with compressed sample allocation\n");
test_async_reader_allocate_compressed(reader, advanced, &callback);
callback.dedicated_threads = TRUE;
trace("Checking DedicatedDeliveryThread.\n");
trace(" with stream selection\n"); test_async_reader_selection(reader, advanced, &callback);
trace(" with sample allocation\n"); test_async_reader_allocate(reader, advanced, &callback);
trace(" with compressed sample\n"); test_async_reader_compressed(reader, advanced, &callback);
trace(" with compressed sample allocation\n"); test_async_reader_allocate_compressed(reader, advanced, &callback);
callback.dedicated_threads = FALSE;
hr = IWMReader_Close(reader); ok(hr == S_OK, "Got hr %#lx.\n", hr);
It'd be best to avoid these traces, at least with the default debug level. Probably winetest_push_context() would be best here.
We could probably also put the 4 streaming tests into a helper function, especially if you're adding a bunch of traces.
Anything I should do here?
On 8/30/22 08:15, Rémi Bernon (@rbernon) wrote:
Anything I should do here?
Sorry, this one slipped through.
This merge request was approved by Zebediah Figura.