Signed-off-by: Rémi Bernon rbernon@codeweavers.com ---
v2: Use "pts" rather than "timestamp", use UINT64 for their types.
include/wmcodecdsp.idl | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/include/wmcodecdsp.idl b/include/wmcodecdsp.idl index ae2a42419b4..4ad965ab3d9 100644 --- a/include/wmcodecdsp.idl +++ b/include/wmcodecdsp.idl @@ -45,6 +45,11 @@ coclass CMSH264DecoderMFT {} ] coclass CWMADecMediaObject {};
+[ + uuid(70f598e9-f4ab-495a-99e2-a7c4d3d89abf) +] +coclass CWMAEncMediaObject {}; + [ uuid(93af0c51-2275-45d2-a35b-f2ba21caed00) ]
And split it into check_transform / enum_transform.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/tests/mf.c | 159 ++++++++++++++++++++++++--------------------- 1 file changed, 86 insertions(+), 73 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 31a84e47bc1..d2b3b4f8901 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -162,6 +162,86 @@ static void check_attributes_(int line, IMFAttributes *attributes, const struct } }
+static BOOL check_transform(const GUID *class_id, const WCHAR *expect_name, + const media_type_desc *expect_input, ULONG expect_input_count, + const media_type_desc *expect_output, ULONG expect_output_count, + IMFTransform **transform) +{ + MFT_REGISTER_TYPE_INFO *input_types = NULL, *output_types = NULL; + UINT32 input_count = 0, output_count = 0, i; + WCHAR *name; + HRESULT hr; + + hr = MFTGetInfo(*class_id, &name, &input_types, &input_count, &output_types, &output_count, NULL); + if (FAILED(hr)) + { + todo_wine + win_skip("Failed to get %s info, skipping tests.\n", debugstr_w(expect_name)); + } + else + { + ok(hr == S_OK, "MFTEnum returned %lx\n", hr); + ok(!wcscmp(name, expect_name), "got name %s\n", debugstr_w(name)); + ok(input_count == expect_input_count, "got input_count %u\n", input_count); + for (i = 0; i < input_count; ++i) + { + ok(IsEqualGUID(&input_types[i].guidMajorType, expect_input[i][0].value.puuid), + "got input[%u] major %s\n", i, debugstr_guid(&input_types[i].guidMajorType)); + ok(IsEqualGUID(&input_types[i].guidSubtype, expect_input[i][1].value.puuid), + "got input[%u] subtype %s\n", i, debugstr_guid(&input_types[i].guidSubtype)); + } + ok(output_count == expect_output_count, "got output_count %u\n", output_count); + for (i = 0; i < output_count; ++i) + { + ok(IsEqualGUID(&output_types[i].guidMajorType, expect_output[i][0].value.puuid), + "got output[%u] major %s\n", i, debugstr_guid(&output_types[i].guidMajorType)); + ok(IsEqualGUID(&output_types[i].guidSubtype, expect_output[i][1].value.puuid), + "got output[%u] subtype %s\n", i, debugstr_guid(&output_types[i].guidSubtype)); + } + CoTaskMemFree(output_types); + CoTaskMemFree(input_types); + CoTaskMemFree(name); + } + + hr = CoCreateInstance(class_id, NULL, CLSCTX_INPROC_SERVER, &IID_IMFTransform, (void **)transform); + if (FAILED(hr)) + { + todo_wine + win_skip("Failed to create %s instance, skipping tests.\n", debugstr_w(expect_name)); + return FALSE; + } + + return TRUE; +} + +static BOOL enum_transform(GUID category, MFT_REGISTER_TYPE_INFO *input_type, + MFT_REGISTER_TYPE_INFO *output_type, const WCHAR *expect_name, + const media_type_desc *expect_input, ULONG expect_input_count, + const media_type_desc *expect_output, ULONG expect_output_count, + IMFTransform **transform, const GUID *expect_class_id, GUID *class_id) +{ + GUID *class_ids = NULL; + UINT32 count = 0; + HRESULT hr; + + hr = MFTEnum(category, 0, input_type, output_type, NULL, &class_ids, &count); + if (FAILED(hr)) + { + todo_wine + win_skip("Failed to enumerate %s, skipping tests.\n", debugstr_w(expect_name)); + return FALSE; + } + + ok(hr == S_OK, "MFTEnum returned %lx\n", hr); + ok(count == 1, "got %u\n", count); + *class_id = class_ids[0]; + CoTaskMemFree(class_ids); + ok(IsEqualGUID(class_id, expect_class_id), "got class id %s\n", debugstr_guid(class_id)); + + return check_transform(class_id, expect_name, expect_input, expect_input_count, + expect_output, expect_output_count, transform); +} + static HWND create_window(void) { RECT r = {0, 0, 640, 480}; @@ -5620,73 +5700,6 @@ static void test_MFRequireProtectedEnvironment(void) IMFPresentationDescriptor_Release(pd); }
-static BOOL create_transform(GUID category, MFT_REGISTER_TYPE_INFO *input_type, - MFT_REGISTER_TYPE_INFO *output_type, const WCHAR *expect_name, - const media_type_desc *expect_input, ULONG expect_input_count, - const media_type_desc *expect_output, ULONG expect_output_count, - IMFTransform **transform, GUID *class_id) -{ - MFT_REGISTER_TYPE_INFO *input_types = NULL, *output_types = NULL; - UINT32 input_count = 0, output_count = 0, count = 0, i; - GUID *class_ids = NULL; - WCHAR *name; - HRESULT hr; - - hr = MFTEnum(category, 0, input_type, output_type, NULL, &class_ids, &count); - if (FAILED(hr)) - { - todo_wine - win_skip("Failed to enumerate %s, skipping tests.\n", debugstr_w(expect_name)); - return FALSE; - } - - ok(hr == S_OK, "MFTEnum returned %lx\n", hr); - ok(count == 1, "got %u\n", count); - *class_id = class_ids[0]; - CoTaskMemFree(class_ids); - - hr = MFTGetInfo(*class_id, &name, &input_types, &input_count, &output_types, &output_count, NULL); - if (FAILED(hr)) - { - todo_wine - win_skip("Failed to get %s info, skipping tests.\n", debugstr_w(expect_name)); - } - else - { - ok(hr == S_OK, "MFTEnum returned %lx\n", hr); - ok(!wcscmp(name, expect_name), "got name %s\n", debugstr_w(name)); - ok(input_count == expect_input_count, "got input_count %u\n", input_count); - for (i = 0; i < input_count; ++i) - { - ok(IsEqualGUID(&input_types[i].guidMajorType, expect_input[i][0].value.puuid), - "got input[%u] major %s\n", i, debugstr_guid(&input_types[i].guidMajorType)); - ok(IsEqualGUID(&input_types[i].guidSubtype, expect_input[i][1].value.puuid), - "got input[%u] subtype %s\n", i, debugstr_guid(&input_types[i].guidSubtype)); - } - ok(output_count == expect_output_count, "got output_count %u\n", output_count); - for (i = 0; i < output_count; ++i) - { - ok(IsEqualGUID(&output_types[i].guidMajorType, expect_output[i][0].value.puuid), - "got output[%u] major %s\n", i, debugstr_guid(&output_types[i].guidMajorType)); - ok(IsEqualGUID(&output_types[i].guidSubtype, expect_output[i][1].value.puuid), - "got output[%u] subtype %s\n", i, debugstr_guid(&output_types[i].guidSubtype)); - } - CoTaskMemFree(output_types); - CoTaskMemFree(input_types); - CoTaskMemFree(name); - } - - hr = CoCreateInstance(class_id, NULL, CLSCTX_INPROC_SERVER, &IID_IMFTransform, (void **)transform); - if (FAILED(hr)) - { - todo_wine - win_skip("Failed to create %s instance, skipping tests.\n", debugstr_w(expect_name)); - return FALSE; - } - - return TRUE; -} - static IMFSample *create_sample(const BYTE *data, ULONG size) { IMFMediaBuffer *media_buffer; @@ -5820,9 +5833,9 @@ static void test_wma_encoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr);
- if (!create_transform(MFT_CATEGORY_AUDIO_ENCODER, &input_type, &output_type, L"WMAudio Encoder MFT", + if (!enum_transform(MFT_CATEGORY_AUDIO_ENCODER, &input_type, &output_type, L"WMAudio Encoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs), - &transform, &class_id)) + &transform, &CLSID_CWMAEncMediaObject, &class_id)) goto failed;
check_interface(transform, &IID_IMediaObject, TRUE); @@ -6056,9 +6069,9 @@ static void test_wma_decoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr);
- if (!create_transform(MFT_CATEGORY_AUDIO_DECODER, &input_type, &output_type, L"WMAudio Decoder MFT", + if (!enum_transform(MFT_CATEGORY_AUDIO_DECODER, &input_type, &output_type, L"WMAudio Decoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs), - &transform, &class_id)) + &transform, &CLSID_CWMADecMediaObject, &class_id)) goto failed;
check_interface(transform, &IID_IMediaObject, TRUE); @@ -6642,9 +6655,9 @@ static void test_h264_decoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr);
- if (!create_transform(MFT_CATEGORY_VIDEO_DECODER, &input_type, &output_type, L"Microsoft H264 Video Decoder MFT", + if (!enum_transform(MFT_CATEGORY_VIDEO_DECODER, &input_type, &output_type, L"Microsoft H264 Video Decoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs), - &transform, &class_id)) + &transform, &CLSID_MSH264DecoderMFT, &class_id)) goto failed;
hr = IMFTransform_GetAttributes(transform, &attributes);
On 4/5/22 11:36, Rémi Bernon wrote:
static IMFSample *create_sample(const BYTE *data, ULONG size) { IMFMediaBuffer *media_buffer; @@ -5820,9 +5833,9 @@ static void test_wma_encoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr);
- if (!create_transform(MFT_CATEGORY_AUDIO_ENCODER, &input_type, &output_type, L"WMAudio Encoder MFT",
- if (!enum_transform(MFT_CATEGORY_AUDIO_ENCODER, &input_type, &output_type, L"WMAudio Encoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs),
&transform, &class_id))
&transform, &CLSID_CWMAEncMediaObject, &class_id)) goto failed; check_interface(transform, &IID_IMediaObject, TRUE);
@@ -6056,9 +6069,9 @@ static void test_wma_decoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr);
- if (!create_transform(MFT_CATEGORY_AUDIO_DECODER, &input_type, &output_type, L"WMAudio Decoder MFT",
- if (!enum_transform(MFT_CATEGORY_AUDIO_DECODER, &input_type, &output_type, L"WMAudio Decoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs),
&transform, &class_id))
&transform, &CLSID_CWMADecMediaObject, &class_id)) goto failed; check_interface(transform, &IID_IMediaObject, TRUE);
@@ -6642,9 +6655,9 @@ static void test_h264_decoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr);
- if (!create_transform(MFT_CATEGORY_VIDEO_DECODER, &input_type, &output_type, L"Microsoft H264 Video Decoder MFT",
- if (!enum_transform(MFT_CATEGORY_VIDEO_DECODER, &input_type, &output_type, L"Microsoft H264 Video Decoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs),
&transform, &class_id))
&transform, &CLSID_MSH264DecoderMFT, &class_id)) goto failed; hr = IMFTransform_GetAttributes(transform, &attributes);
If the purpose is to check known transforms, do we need to MFTEnum for that? It seems it should be enough to use GetInfo and that create by CLSID?
On 4/6/22 14:44, Nikolay Sivov wrote:
On 4/5/22 11:36, Rémi Bernon wrote:
static IMFSample *create_sample(const BYTE *data, ULONG size) { IMFMediaBuffer *media_buffer; @@ -5820,9 +5833,9 @@ static void test_wma_encoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr); - if (!create_transform(MFT_CATEGORY_AUDIO_ENCODER, &input_type, &output_type, L"WMAudio Encoder MFT", + if (!enum_transform(MFT_CATEGORY_AUDIO_ENCODER, &input_type, &output_type, L"WMAudio Encoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs), - &transform, &class_id)) + &transform, &CLSID_CWMAEncMediaObject, &class_id)) goto failed; check_interface(transform, &IID_IMediaObject, TRUE); @@ -6056,9 +6069,9 @@ static void test_wma_decoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr); - if (!create_transform(MFT_CATEGORY_AUDIO_DECODER, &input_type, &output_type, L"WMAudio Decoder MFT", + if (!enum_transform(MFT_CATEGORY_AUDIO_DECODER, &input_type, &output_type, L"WMAudio Decoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs), - &transform, &class_id)) + &transform, &CLSID_CWMADecMediaObject, &class_id)) goto failed; check_interface(transform, &IID_IMediaObject, TRUE); @@ -6642,9 +6655,9 @@ static void test_h264_decoder(void) hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr); - if (!create_transform(MFT_CATEGORY_VIDEO_DECODER, &input_type, &output_type, L"Microsoft H264 Video Decoder MFT", + if (!enum_transform(MFT_CATEGORY_VIDEO_DECODER, &input_type, &output_type, L"Microsoft H264 Video Decoder MFT", transform_inputs, ARRAY_SIZE(transform_inputs), transform_outputs, ARRAY_SIZE(transform_outputs), - &transform, &class_id)) + &transform, &CLSID_MSH264DecoderMFT, &class_id)) goto failed; hr = IMFTransform_GetAttributes(transform, &attributes);
If the purpose is to check known transforms, do we need to MFTEnum for that? It seems it should be enough to use GetInfo and that create by CLSID?
I also couldn't find a way to find the transform category where it's registered to. Some transforms seem to exist and MFGetInfo works for their class, but they aren't enumerated (or I couldn't find the right category yet).
It's also how the tests were initially written and I didn't find it useful to change.
Not that this series has been superseded by the new series I just sent.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/tests/mf.c | 53 ++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 25 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index d2b3b4f8901..579953695b9 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -5730,8 +5730,8 @@ static IMFSample *create_sample(const BYTE *data, ULONG size) return sample; }
-#define check_sample(a, b, c, d) check_sample_(__LINE__, a, b, c, d) -static void check_sample_(int line, IMFSample *sample, const void *expect_buf, ULONG expect_len, HANDLE output_file) +#define check_sample(a, b, c) check_sample_(__LINE__, a, b, c) +static void check_sample_(int line, IMFSample *sample, const void *expect_buf, HANDLE output_file) { IMFMediaBuffer *media_buffer; DWORD length; @@ -5743,12 +5743,7 @@ static void check_sample_(int line, IMFSample *sample, const void *expect_buf, U ok_(__FILE__, line)(hr == S_OK, "ConvertToContiguousBuffer returned %#lx\n", hr); hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &length); ok_(__FILE__, line)(hr == S_OK, "Lock returned %#lx\n", hr); - ok_(__FILE__, line)(expect_len == length, "got length %lu\n", length); - if (length && length == expect_len) - { - ok_(__FILE__, line)(!memcmp(expect_buf, buffer, expect_len), - "unexpected buffer data\n"); - } + ok_(__FILE__, line)(!memcmp(expect_buf, buffer, length), "unexpected buffer data\n"); if (output_file) WriteFile(output_file, buffer, length, &length, NULL); hr = IMFMediaBuffer_Unlock(media_buffer); ok_(__FILE__, line)(hr == S_OK, "Unlock returned %#lx\n", hr); @@ -5822,11 +5817,11 @@ static void test_wma_encoder(void) ULONG wma_encoded_data_len; IMFMediaType *media_type; IMFTransform *transform; + DWORD status, length; HANDLE output_file; IMFSample *sample; HRSRC resource; GUID class_id; - DWORD status; ULONG i, ret; HRESULT hr;
@@ -5912,7 +5907,10 @@ static void test_wma_encoder(void) "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status); ok(wma_encoded_data_len > i * wma_block_size, "got %lu blocks\n", i); - check_sample(sample, wma_encoded_data + i * wma_block_size, wma_block_size, output_file); + hr = IMFSample_GetTotalLength(sample, &length); + ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); + ok(length == wma_block_size, "got length %lu\n", length); + check_sample(sample, wma_encoded_data + i * wma_block_size, output_file); winetest_pop_context(); i++; } @@ -5932,7 +5930,9 @@ static void test_wma_encoder(void) ok(output.pSample == sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == 0, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status); - check_sample(sample, NULL, 0, NULL); + hr = IMFSample_GetTotalLength(sample, &length); + ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); + ok(length == 0, "got length %lu\n", length); ret = IMFSample_Release(sample); ok(ret == 0, "Release returned %lu\n", ret);
@@ -6059,10 +6059,10 @@ static void test_wma_decoder(void) ULONG wma_encoded_data_len; IMFMediaType *media_type; IMFTransform *transform; + DWORD status, length; IMFSample *sample; HRSRC resource; GUID class_id; - DWORD status; ULONG i, ret; HRESULT hr;
@@ -6303,26 +6303,23 @@ static void test_wma_decoder(void) broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7) || output.dwStatus == 7) /* Win7 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status); + hr = IMFSample_GetTotalLength(sample, &length); + ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); if (output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7))) { - check_sample(sample, wma_decoded_data, sizeof(wma_decoded_data), NULL); + ok(length == sizeof(wma_decoded_data), "got length %lu\n", length); + check_sample(sample, wma_decoded_data, NULL); i += sizeof(wma_decoded_data); } else { - DWORD length; - /* FFmpeg doesn't seem to decode WMA buffers in the same way as native */ - - hr = IMFSample_GetTotalLength(sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); todo_wine ok(length == sizeof(wma_decoded_data) / 2, "got length %lu\n", length); - if (length == sizeof(wma_decoded_data) / 2) { - check_sample(sample, wma_decoded_data, sizeof(wma_decoded_data) / 2, NULL); + check_sample(sample, wma_decoded_data, NULL); i += sizeof(wma_decoded_data) / 2; } } @@ -6356,7 +6353,9 @@ static void test_wma_decoder(void) broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7)) /* Win7 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status); - check_sample(sample, NULL, 0, NULL); + hr = IMFSample_GetTotalLength(sample, &length); + ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); + ok(length == 0, "got length %lu\n", length); ret = IMFSample_Release(sample); ok(ret == 0, "Release returned %lu\n", ret);
@@ -6857,7 +6856,9 @@ static void test_h264_decoder(void) ok(output.dwStatus == 0, "got dwStatus %#lx\n", output.dwStatus); ok(!output.pEvents, "got pEvents %p\n", output.pEvents); ok(status == 0, "got status %#lx\n", status); - check_sample(output.pSample, NULL, 0, NULL); + hr = IMFSample_GetTotalLength(output.pSample, &length); + ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); + ok(length == 0, "got length %lu\n", length); ret = IMFSample_Release(output.pSample); ok(ret == 0, "Release returned %lu\n", ret);
@@ -6892,8 +6893,10 @@ static void test_h264_decoder(void) todo_wine ok(status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS, "got status %#lx\n", status); - if (status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS) - check_sample(output.pSample, NULL, 0, NULL); + hr = IMFSample_GetTotalLength(output.pSample, &length); + ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); + todo_wine + ok(length == 0, "got length %lu\n", length); ret = IMFSample_Release(output.pSample); ok(ret == 0, "Release returned %lu\n", ret);
@@ -6967,7 +6970,7 @@ static void test_h264_decoder(void) IMFMediaBuffer_Release(media_buffer);
if (length == nv12_frame_len) - check_sample(output.pSample, nv12_frame_data, nv12_frame_len, output_file); + check_sample(output.pSample, nv12_frame_data, output_file); } ret = IMFSample_Release(output.pSample); ok(ret == 0, "Release returned %lu\n", ret);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=111940
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/mf/tests/mf.c:6892 Task: Patch failed to apply
=== debian11 (32 bit report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Arabic:Morocco report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit German report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit French report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hebrew:Israel report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hindi:India report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Japanese:Japan report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Chinese:China report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit WoW report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (64 bit WoW report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
On 4/5/22 10:48, Marvin wrote:
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=111940
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/mf/tests/mf.c:6892 Task: Patch failed to apply
=== debian11 (32 bit report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Arabic:Morocco report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit German report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit French report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hebrew:Israel report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hindi:India report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Japanese:Japan report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Chinese:China report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (32 bit WoW report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
=== debian11 (64 bit WoW report) ===
mf: mf.c:6899: Test succeeded inside todo block: got length 0
I think the build failure is unrelated and caused by the build VM being out of date.
The test spurious successes are coming from some behavior specific to the GStreamer version that is on the testbot, I'll fix it.
On Tue, 5 Apr 2022, Rémi Bernon wrote: [...]
I think the build failure is unrelated and caused by the build VM being out of date.
Indeed. One of my patches broke the Reconfig.pl script so the build failed and the source did not get updated. I have sent a patch for it.
Instead of silent data. This shows some difference in the FFmpeg decoded data, with the data delayed by half a buffer, explaining the additional data we decode.
The audiodata.bin resource has been generated with:
gst-launch-1.0 audiomixer name=mix ! \ audio/x-raw,format=F32LE,rate=22050,channels=2 ! \ filesink location=dlls/winegstreamer/tests/audiodata.bin \ audiotestsrc freq=400 volume=0.2 num-buffers=1 \ samplesperbuffer=22050 ! mix. \ audiotestsrc freq=600 volume=0.2 num-buffers=1 \ samplesperbuffer=22050 timestamp-offset=20000000 ! mix.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/tests/audiodata.bin | Bin 0 -> 179928 bytes dlls/mf/tests/mf.c | 175 +++++++++++++++++++++++------------ dlls/mf/tests/resource.rc | 10 +- dlls/mf/tests/wmadata.bin | Bin 49071 -> 0 bytes dlls/mf/tests/wmadecdata.bin | Bin 0 -> 28672 bytes dlls/mf/tests/wmaencdata.bin | Bin 0 -> 4461 bytes 6 files changed, 123 insertions(+), 62 deletions(-) create mode 100644 dlls/mf/tests/audiodata.bin delete mode 100644 dlls/mf/tests/wmadata.bin create mode 100644 dlls/mf/tests/wmadecdata.bin create mode 100644 dlls/mf/tests/wmaencdata.bin
diff --git a/dlls/mf/tests/audiodata.bin b/dlls/mf/tests/audiodata.bin new file mode 100644 index 0000000000000000000000000000000000000000..5bf3fa1575ce8b980ef68a5c83b70a1b8e4760f2 GIT binary patch literal 179928 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 H+%NqPHAu^@
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 579953695b9..a93ae1510f2 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -5751,9 +5751,42 @@ static void check_sample_(int line, IMFSample *sample, const void *expect_buf, H ok_(__FILE__, line)(ret == 1, "Release returned %lu\n", ret); }
+#define check_sample_pcm16(a, b, c, d) check_sample_pcm16_(__LINE__, a, b, c, d) +static void check_sample_pcm16_(int line, IMFSample *sample, const BYTE *expect_buf, HANDLE output_file, BOOL todo) +{ + IMFMediaBuffer *media_buffer; + DWORD i, length; + BYTE *buffer; + HRESULT hr; + ULONG ret; + + hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer); + ok_(__FILE__, line)(hr == S_OK, "ConvertToContiguousBuffer returned %#lx\n", hr); + hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &length); + ok_(__FILE__, line)(hr == S_OK, "Lock returned %#lx\n", hr); + + /* check that buffer values are close enough, there's some differences in + * the output of audio DSP between 32bit and 64bit implementation + */ + for (i = 0; i < length; i += 2) + { + DWORD expect = *(INT16 *)(expect_buf + i), value = *(INT16 *)(buffer + i); + if (expect - value + 512 > 1024) break; + } + + todo_wine_if(todo) + ok_(__FILE__, line)(i == length, "unexpected buffer data\n"); + + if (output_file) WriteFile(output_file, buffer, length, &length, NULL); + hr = IMFMediaBuffer_Unlock(media_buffer); + ok_(__FILE__, line)(hr == S_OK, "Unlock returned %#lx\n", hr); + ret = IMFMediaBuffer_Release(media_buffer); + ok_(__FILE__, line)(ret == 1, "Release returned %lu\n", ret); +} + static const BYTE wma_codec_data[10] = {0, 0x44, 0, 0, 0x17, 0, 0, 0, 0, 0}; -static const BYTE wma_decoded_data[0x4000] = {0}; -static const ULONG wma_block_size = 1487; +static const ULONG wmaenc_block_size = 1487; +static const ULONG wmadec_block_size = 0x2000;
static void test_wma_encoder(void) { @@ -5802,19 +5835,19 @@ static void test_wma_encoder(void) ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2), ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 22050), ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 4003), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, wma_block_size), + ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, wmaenc_block_size), ATTR_BLOB(MF_MT_USER_DATA, wma_codec_data, sizeof(wma_codec_data)), {0}, };
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float}; + ULONG audio_data_len, wmaenc_data_len; + const BYTE *audio_data, *wmaenc_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; MFT_OUTPUT_DATA_BUFFER output; - const BYTE *wma_encoded_data; WCHAR output_path[MAX_PATH]; - ULONG wma_encoded_data_len; IMFMediaType *media_type; IMFTransform *transform; DWORD status, length; @@ -5860,39 +5893,42 @@ static void test_wma_encoder(void) hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info); ok(hr == S_OK, "GetOutputStreamInfo returned %#lx\n", hr); ok(output_info.dwFlags == 0, "got dwFlags %#lx\n", output_info.dwFlags); - ok(output_info.cbSize == wma_block_size, "got cbSize %#lx\n", output_info.cbSize); + ok(output_info.cbSize == wmaenc_block_size, "got cbSize %#lx\n", output_info.cbSize); ok(output_info.cbAlignment == 1, "got cbAlignment %#lx\n", output_info.cbAlignment);
- i = 0; - sample = create_sample(wma_decoded_data, sizeof(wma_decoded_data)); - while (SUCCEEDED(hr = IMFTransform_ProcessInput(transform, 0, sample, 0))) - { - ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - i += sizeof(wma_decoded_data); - } - ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); - ok(i == 0x204000, "ProcessInput consumed %#lx bytes\n", i); + resource = FindResourceW(NULL, L"audiodata.bin", (const WCHAR *)RT_RCDATA); + ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); + audio_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); + audio_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + ok(audio_data_len == 179928, "got length %lu\n", audio_data_len);
+ sample = create_sample(audio_data, audio_data_len); + hr = IMFSample_SetSampleTime(sample, 0); + ok(hr == S_OK, "SetSampleTime returned %#lx\n", hr); + hr = IMFSample_SetSampleDuration(sample, 10000000); + ok(hr == S_OK, "SetSampleDuration returned %#lx\n", hr); + hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); hr = IMFTransform_ProcessMessage(transform, MFT_MESSAGE_COMMAND_DRAIN, 0); ok(hr == S_OK, "ProcessMessage returned %#lx\n", hr); hr = IMFTransform_ProcessInput(transform, 0, sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); + IMFSample_Release(sample);
status = 0xdeadbeef; sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); output.pSample = sample;
- /* check wmadata.bin against current encoder output */ - resource = FindResourceW(NULL, L"wmadata.bin", (const WCHAR *)RT_RCDATA); + resource = FindResourceW(NULL, L"wmaencdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - wma_encoded_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - wma_encoded_data_len = SizeofResource(GetModuleHandleW(NULL), resource); - ok(wma_encoded_data_len % wma_block_size == 0, "got wma encoded length %lu\n", wma_encoded_data_len); + wmaenc_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); + wmaenc_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + ok(wmaenc_data_len % wmaenc_block_size == 0, "got length %lu\n", wmaenc_data_len);
/* and generate a new one as well in a temporary directory */ GetTempPathW(ARRAY_SIZE(output_path), output_path); - lstrcatW(output_path, L"wmadata.bin"); + lstrcatW(output_path, L"wmaencdata.bin"); output_file = CreateFileW(output_path, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); ok(output_file != INVALID_HANDLE_VALUE, "CreateFileW failed, error %lu\n", GetLastError());
@@ -5903,14 +5939,14 @@ static void test_wma_encoder(void) ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output.pSample == sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || - broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|5)) /* win7 */, + broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7)) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status); - ok(wma_encoded_data_len > i * wma_block_size, "got %lu blocks\n", i); hr = IMFSample_GetTotalLength(sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - ok(length == wma_block_size, "got length %lu\n", length); - check_sample(sample, wma_encoded_data + i * wma_block_size, output_file); + ok(length == wmaenc_block_size, "got length %lu\n", length); + ok(wmaenc_data_len > i * wmaenc_block_size, "got %lu blocks\n", i); + check_sample(sample, wmaenc_data + i * wmaenc_block_size, output_file); winetest_pop_context(); i++; } @@ -6032,7 +6068,7 @@ static void test_wma_decoder(void) ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_WMAudioV8), ATTR_BLOB(MF_MT_USER_DATA, wma_codec_data, sizeof(wma_codec_data)), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, wma_block_size), + ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, wmaenc_block_size), ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 22050), ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2), {0}, @@ -6040,26 +6076,28 @@ static void test_wma_decoder(void) static const struct attribute_desc output_type_desc[] = { ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio), - ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_Float), - ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 176400), - ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 32), + ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_PCM), + ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 88200), + ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16), ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2), ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 22050), - ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 8), + ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 4), {0}, };
MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8}; MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_Float}; + ULONG wmadec_data_len, wmaenc_data_len; + const BYTE *wmadec_data, *wmaenc_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_OUTPUT_DATA_BUFFER outputs[2]; MFT_INPUT_STREAM_INFO input_info; MFT_OUTPUT_DATA_BUFFER output; - const BYTE *wma_encoded_data; - ULONG wma_encoded_data_len; + WCHAR output_path[MAX_PATH]; IMFMediaType *media_type; IMFTransform *transform; DWORD status, length; + HANDLE output_file; IMFSample *sample; HRSRC resource; GUID class_id; @@ -6179,7 +6217,7 @@ static void test_wma_decoder(void) ok(hr == S_OK, "GetInputStreamInfo returned %#lx\n", hr); ok(input_info.hnsMaxLatency == 0, "got hnsMaxLatency %s\n", wine_dbgstr_longlong(input_info.hnsMaxLatency)); ok(input_info.dwFlags == 0, "got dwFlags %#lx\n", input_info.dwFlags); - ok(input_info.cbSize == wma_block_size, "got cbSize %lu\n", input_info.cbSize); + ok(input_info.cbSize == wmaenc_block_size, "got cbSize %lu\n", input_info.cbSize); ok(input_info.cbMaxLookahead == 0, "got cbMaxLookahead %#lx\n", input_info.cbMaxLookahead); ok(input_info.cbAlignment == 1, "got cbAlignment %#lx\n", input_info.cbAlignment);
@@ -6214,27 +6252,26 @@ static void test_wma_decoder(void) hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info); ok(hr == S_OK, "GetOutputStreamInfo returned %#lx\n", hr); ok(output_info.dwFlags == 0, "got dwFlags %#lx\n", output_info.dwFlags); - ok(output_info.cbSize == sizeof(wma_decoded_data), "got cbSize %#lx\n", output_info.cbSize); + ok(output_info.cbSize == wmadec_block_size, "got cbSize %#lx\n", output_info.cbSize); ok(output_info.cbAlignment == 1, "got cbAlignment %#lx\n", output_info.cbAlignment);
- /* resource is generated using test_wma_encoder output file */ - resource = FindResourceW(NULL, L"wmadata.bin", (const WCHAR *)RT_RCDATA); + resource = FindResourceW(NULL, L"wmaencdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - wma_encoded_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - wma_encoded_data_len = SizeofResource(GetModuleHandleW(NULL), resource); - ok(wma_encoded_data_len % wma_block_size == 0, "got wma encoded length %lu\n", wma_encoded_data_len); + wmaenc_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); + wmaenc_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + ok(wmaenc_data_len % wmaenc_block_size == 0, "got length %lu\n", wmaenc_data_len);
- sample = create_sample(wma_encoded_data, wma_block_size / 2); + sample = create_sample(wmaenc_data, wmaenc_block_size / 2); hr = IMFTransform_ProcessInput(transform, 0, sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); ret = IMFSample_Release(sample); ok(ret == 0, "Release returned %lu\n", ret); - sample = create_sample(wma_encoded_data, wma_block_size + 1); + sample = create_sample(wmaenc_data, wmaenc_block_size + 1); hr = IMFTransform_ProcessInput(transform, 0, sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); ret = IMFSample_Release(sample); ok(ret == 0, "Release returned %lu\n", ret); - sample = create_sample(wma_encoded_data, wma_block_size); + sample = create_sample(wmaenc_data, wmaenc_block_size); hr = IMFTransform_ProcessInput(transform, 0, sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); hr = IMFTransform_ProcessInput(transform, 0, sample, 0); @@ -6258,7 +6295,7 @@ static void test_wma_decoder(void) ok(!output.pEvents, "got pEvents %p\n", output.pEvents); ok(status == 0, "got status %#lx\n", status);
- sample = create_sample(wma_encoded_data, wma_block_size); + sample = create_sample(wmaenc_data, wmaenc_block_size); hr = IMFTransform_ProcessInput(transform, 0, sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); ret = IMFSample_Release(sample); @@ -6276,7 +6313,7 @@ static void test_wma_decoder(void)
status = 0xdeadbeef; memset(&output, 0, sizeof(output)); - output_info.cbSize = sizeof(wma_decoded_data); + output_info.cbSize = wmadec_block_size; sample = create_sample(NULL, output_info.cbSize); outputs[0].pSample = sample; sample = create_sample(NULL, output_info.cbSize); @@ -6286,18 +6323,30 @@ static void test_wma_decoder(void) IMFSample_Release(outputs[0].pSample); IMFSample_Release(outputs[1].pSample);
+ resource = FindResourceW(NULL, L"wmadecdata.bin", (const WCHAR *)RT_RCDATA); + ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); + wmadec_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); + wmadec_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + ok(wmadec_data_len == wmadec_block_size * 7 / 2, "got length %lu\n", wmadec_data_len); + + /* and generate a new one as well in a temporary directory */ + GetTempPathW(ARRAY_SIZE(output_path), output_path); + lstrcatW(output_path, L"wmadecdata.bin"); + output_file = CreateFileW(output_path, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(output_file != INVALID_HANDLE_VALUE, "CreateFileW failed, error %lu\n", GetLastError()); + status = 0xdeadbeef; - output_info.cbSize = sizeof(wma_decoded_data); + output_info.cbSize = wmadec_block_size; sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); output.pSample = sample; hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); - ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample);
- i = 0; - while (hr == S_OK) + for (i = 0; i < 4; ++i) { + winetest_push_context("%lu", i); + + ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output.pSample == sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || output.dwStatus == 0 || broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7) || output.dwStatus == 7) /* Win7 */, @@ -6308,20 +6357,21 @@ static void test_wma_decoder(void) if (output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7))) { - ok(length == sizeof(wma_decoded_data), "got length %lu\n", length); - check_sample(sample, wma_decoded_data, NULL); - i += sizeof(wma_decoded_data); + ok(length == wmadec_block_size, "got length %lu\n", length); + check_sample_pcm16(sample, wmadec_data, output_file, TRUE); + wmadec_data += wmadec_block_size; + wmadec_data_len -= wmadec_block_size; } else { /* FFmpeg doesn't seem to decode WMA buffers in the same way as native */ todo_wine - ok(length == sizeof(wma_decoded_data) / 2, "got length %lu\n", length); - if (length == sizeof(wma_decoded_data) / 2) - { - check_sample(sample, wma_decoded_data, NULL); - i += sizeof(wma_decoded_data) / 2; - } + ok(length == wmadec_block_size / 2, "got length %lu\n", length); + + if (length == wmadec_block_size / 2) + check_sample_pcm16(sample, wmadec_data, output_file, FALSE); + wmadec_data += length; + wmadec_data_len -= length; } ret = IMFSample_Release(sample); ok(ret == 0, "Release returned %lu\n", ret); @@ -6331,9 +6381,14 @@ static void test_wma_decoder(void) memset(&output, 0, sizeof(output)); output.pSample = sample; hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + + winetest_pop_context(); } todo_wine - ok(i == 0xe000, "ProcessOutput produced %#lx bytes\n", i); + ok(wmadec_data_len == 0, "missing %#lx bytes\n", wmadec_data_len); + + trace("created %s\n", debugstr_w(output_path)); + CloseHandle(output_file);
ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); ok(output.pSample == sample, "got pSample %p\n", output.pSample); @@ -6359,7 +6414,7 @@ static void test_wma_decoder(void) ret = IMFSample_Release(sample); ok(ret == 0, "Release returned %lu\n", ret);
- sample = create_sample(wma_encoded_data, wma_block_size); + sample = create_sample(wmaenc_data, wmaenc_block_size); hr = IMFTransform_ProcessInput(transform, 0, sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr);
diff --git a/dlls/mf/tests/resource.rc b/dlls/mf/tests/resource.rc index 5a2bf913672..483ff53ca94 100644 --- a/dlls/mf/tests/resource.rc +++ b/dlls/mf/tests/resource.rc @@ -20,8 +20,14 @@
#include "windef.h"
-/* @makedep: wmadata.bin */ -wmadata.bin RCDATA wmadata.bin +/* @makedep: audiodata.bin */ +audiodata.bin RCDATA audiodata.bin + +/* @makedep: wmaencdata.bin */ +wmaencdata.bin RCDATA wmaencdata.bin + +/* @makedep: wmadecdata.bin */ +wmadecdata.bin RCDATA wmadecdata.bin
/* @makedep: h264data.bin */ h264data.bin RCDATA h264data.bin diff --git a/dlls/mf/tests/wmadata.bin b/dlls/mf/tests/wmadata.bin deleted file mode 100644 index 6c70c14ce3208f5c711effe156ac484c706686cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001
literal 49071 zcmeI%v1tQA5CzZ!Co(v2sMN-RN>FHQ2Zt+A0S?rGRe*vkK_#dJm7ofYN{~8G=;V@t zY2d@#Y&QD5fzQG|4#V$leA<6a-|s)KZ=Zi3&-<6f;1D1{fIybOau^hN*2<(MK!89e zuu|t8i#q}Y2&4(D)p^>=<Rw6WKqoM&^Nz(G0RjZl1U7S>`wC6loV)}G5GVp$uk+$z zAV7dXsK8F0hi*=60t5&Yfk~Yg4+8-L1VRN4>O6FFViO=hpa>l2I`<V?SPTRR5J(d^ zd7Y=NOkM&62y_Bxb>6YKBS3&an!rV!r>#t00t5(j0#|k3vA82ZfIynSeXes~p=q0w zmjD3*MPT7|UOWs02oMMrSgP~T&52Eb0D&T~Qs>3PK!5;&P=U2N58a&D1PBl)0^?lg zzCsI&fdBylX#yLs^R$)8OMn1@PGGCfI~I2Y2oOjU*s1fhmB~wh0D(?mQs*6uI|2j< zqzN46I`<WtwmEqT5Fk(lj$Y@*!$5!lflz^yIuG5P*aQd=C<147UOWs02oMMrxTy2c w&52Eb0D&TKo$K6JXkjrBAV45Z;O=#vwlaAM5FpSAJgD=I#T@|x1kwcl0V8@&#Q*>R
diff --git a/dlls/mf/tests/wmadecdata.bin b/dlls/mf/tests/wmadecdata.bin new file mode 100644 index 0000000000000000000000000000000000000000..4e339804f1f908f4b73c61ef275da893022da2b6 GIT binary patch literal 28672 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 LkTD^6zrp_iCe*Mb
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/wmaencdata.bin b/dlls/mf/tests/wmaencdata.bin new file mode 100644 index 0000000000000000000000000000000000000000..5cb4e42c6e8d3317a4743e8e06aeade5e5aa1983 GIT binary patch literal 4461 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 Sw4N#Oaqn9@p`Br?_xL9hNbigQ
literal 0 HcmV?d00001
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=111941
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/mf/tests/mf.c:6892 error: patch failed: dlls/mf/tests/mf.c:5802 Task: Patch failed to apply
=== debian11 (32 bit report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Arabic:Morocco report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (32 bit German report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (32 bit French report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hebrew:Israel report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hindi:India report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Japanese:Japan report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Chinese:China report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (32 bit WoW report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
=== debian11 (64 bit WoW report) ===
mf: mf.c:6954: Test succeeded inside todo block: got length 0
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/tests/mf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index a93ae1510f2..d300b2a4d82 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -6093,10 +6093,11 @@ static void test_wma_decoder(void) MFT_OUTPUT_DATA_BUFFER outputs[2]; MFT_INPUT_STREAM_INFO input_info; MFT_OUTPUT_DATA_BUFFER output; + DWORD status, flags, length; WCHAR output_path[MAX_PATH]; IMFMediaType *media_type; IMFTransform *transform; - DWORD status, length; + LONGLONG time, duration; HANDLE output_file; IMFSample *sample; HRSRC resource; @@ -6354,10 +6355,26 @@ static void test_wma_decoder(void) ok(status == 0, "got status %#lx\n", status); hr = IMFSample_GetTotalLength(sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); + flags = 0xdeadbeef; + hr = IMFSample_GetSampleFlags(sample, &flags); + ok(hr == S_OK, "GetSampleFlags returned %#lx\n", hr); + ok(flags == 0, "got flags %#lx\n", flags); + time = 0xdeadbeef; + hr = IMFSample_GetSampleTime(sample, &time); + todo_wine + ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); + todo_wine + ok(time == i * 928798, "got time %I64d\n", time); + duration = 0xdeadbeef; + hr = IMFSample_GetSampleDuration(sample, &duration); + todo_wine + ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); if (output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7))) { ok(length == wmadec_block_size, "got length %lu\n", length); + todo_wine + ok(duration == 928798, "got duration %I64d\n", duration); check_sample_pcm16(sample, wmadec_data, output_file, TRUE); wmadec_data += wmadec_block_size; wmadec_data_len -= wmadec_block_size; @@ -6367,6 +6384,8 @@ static void test_wma_decoder(void) /* FFmpeg doesn't seem to decode WMA buffers in the same way as native */ todo_wine ok(length == wmadec_block_size / 2, "got length %lu\n", length); + todo_wine + ok(duration == 464399, "got duration %I64d\n", duration);
if (length == wmadec_block_size / 2) check_sample_pcm16(sample, wmadec_data, output_file, FALSE); @@ -6693,11 +6712,12 @@ static void test_h264_decoder(void) MFT_INPUT_STREAM_INFO input_info; MFT_OUTPUT_DATA_BUFFER output; IMFMediaBuffer *media_buffer; + DWORD status, length, count; WCHAR output_path[MAX_PATH]; IMFAttributes *attributes; IMFMediaType *media_type; + LONGLONG time, duration; IMFTransform *transform; - DWORD status, length; ULONG i, ret, flags; HANDLE output_file; IMFSample *sample; @@ -7002,6 +7022,28 @@ static void test_h264_decoder(void) ok(status == 0, "got status %#lx\n", status); if (hr == S_OK) { + count = 0xdeadbeef; + hr = IMFSample_GetBufferCount(output.pSample, &count); + ok(hr == S_OK, "GetBufferCount returned %#lx\n", hr); + ok(count == 1, "got count %#lx\n", count); + + flags = 0xdeadbeef; + hr = IMFSample_GetSampleFlags(output.pSample, &flags); + ok(hr == S_OK, "GetSampleFlags returned %#lx\n", hr); + ok(flags == 0, "got flags %#lx\n", flags); + time = 0xdeadbeef; + hr = IMFSample_GetSampleTime(output.pSample, &time); + todo_wine + ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); + todo_wine + ok(time == 0, "got time %I64d\n", time); + duration = 0xdeadbeef; + hr = IMFSample_GetSampleDuration(output.pSample, &duration); + todo_wine + ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); + todo_wine + ok(duration == 333667, "got duration %I64d\n", duration); + /* Win8 and before pad the data with garbage instead of original * buffer data, make sure it's consistent. */ hr = IMFSample_ConvertToContiguousBuffer(output.pSample, &media_buffer);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=111942
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/mf/tests/mf.c:6892 error: patch failed: dlls/mf/tests/mf.c:5802 error: patch failed: dlls/mf/tests/mf.c:6093 Task: Patch failed to apply
=== debian11 (32 bit report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Arabic:Morocco report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (32 bit German report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (32 bit French report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hebrew:Israel report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hindi:India report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Japanese:Japan report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Chinese:China report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (32 bit WoW report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
=== debian11 (64 bit WoW report) ===
mf: mf.c:6974: Test succeeded inside todo block: got length 0
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45988 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47084 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49715 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52183 Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/mf/tests/mf.c | 10 +--------- dlls/winegstreamer/mfplat.c | 17 +++++++++++++++++ dlls/winegstreamer/unixlib.h | 5 +++++ dlls/winegstreamer/wg_transform.c | 25 +++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 9 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index d300b2a4d82..db08eb680db 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -6361,19 +6361,15 @@ static void test_wma_decoder(void) ok(flags == 0, "got flags %#lx\n", flags); time = 0xdeadbeef; hr = IMFSample_GetSampleTime(sample, &time); - todo_wine ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - todo_wine ok(time == i * 928798, "got time %I64d\n", time); duration = 0xdeadbeef; hr = IMFSample_GetSampleDuration(sample, &duration); - todo_wine ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); if (output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7))) { ok(length == wmadec_block_size, "got length %lu\n", length); - todo_wine ok(duration == 928798, "got duration %I64d\n", duration); check_sample_pcm16(sample, wmadec_data, output_file, TRUE); wmadec_data += wmadec_block_size; @@ -7033,16 +7029,12 @@ static void test_h264_decoder(void) ok(flags == 0, "got flags %#lx\n", flags); time = 0xdeadbeef; hr = IMFSample_GetSampleTime(output.pSample, &time); - todo_wine ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - todo_wine ok(time == 0, "got time %I64d\n", time); duration = 0xdeadbeef; hr = IMFSample_GetSampleDuration(output.pSample, &duration); - todo_wine ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - todo_wine - ok(duration == 333667, "got duration %I64d\n", duration); + ok(duration - 333666 <= 2, "got duration %I64d\n", duration);
/* Win8 and before pad the data with garbage instead of original * buffer data, make sure it's consistent. */ diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c index 97e27bb7301..9dcfc558963 100644 --- a/dlls/winegstreamer/mfplat.c +++ b/dlls/winegstreamer/mfplat.c @@ -903,6 +903,7 @@ HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out) { DWORD current_length, max_length; struct mf_sample *mf_sample; + LONGLONG time, duration; BYTE *buffer; HRESULT hr;
@@ -913,6 +914,17 @@ HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out) if (FAILED(hr = IMFMediaBuffer_Lock(mf_sample->media_buffer, &buffer, &max_length, ¤t_length))) goto out;
+ if (SUCCEEDED(IMFSample_GetSampleTime(sample, &time))) + { + mf_sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_PTS; + mf_sample->wg_sample.pts = time; + } + if (SUCCEEDED(IMFSample_GetSampleDuration(sample, &duration))) + { + mf_sample->wg_sample.flags |= WG_SAMPLE_FLAG_HAS_DURATION; + mf_sample->wg_sample.duration = duration; + } + IMFSample_AddRef((mf_sample->sample = sample)); mf_sample->wg_sample.data = buffer; mf_sample->wg_sample.size = current_length; @@ -937,6 +949,11 @@ void mf_destroy_wg_sample(struct wg_sample *wg_sample) IMFMediaBuffer_SetCurrentLength(mf_sample->media_buffer, wg_sample->size); IMFMediaBuffer_Release(mf_sample->media_buffer);
+ if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_PTS) + IMFSample_SetSampleTime(mf_sample->sample, wg_sample->pts); + if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_DURATION) + IMFSample_SetSampleDuration(mf_sample->sample, wg_sample->duration); + IMFSample_Release(mf_sample->sample); free(mf_sample); } diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index f4e2ea4966b..32e5b068187 100644 --- a/dlls/winegstreamer/unixlib.h +++ b/dlls/winegstreamer/unixlib.h @@ -114,10 +114,15 @@ struct wg_format enum wg_sample_flag { WG_SAMPLE_FLAG_INCOMPLETE = 1, + WG_SAMPLE_FLAG_HAS_PTS = 2, + WG_SAMPLE_FLAG_HAS_DURATION = 4, };
struct wg_sample { + /* timestamp and duration are in 100-nanosecond units. */ + UINT64 pts; + UINT64 duration; UINT32 flags; UINT32 max_size; UINT32 size; diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 0327b92ce8e..c247a470e75 100644 --- a/dlls/winegstreamer/wg_transform.c +++ b/dlls/winegstreamer/wg_transform.c @@ -223,6 +223,9 @@ NTSTATUS wg_transform_create(void *args) * to match its expectations. */ transform->input_max_length = 16; + if (!(element = create_element("h264parse", "base")) + || !transform_append_element(transform, element, &first, &last)) + goto out; /* fallthrough */ case WG_MAJOR_TYPE_WMA: if (!(element = transform_find_element(GST_ELEMENT_FACTORY_TYPE_DECODER, src_caps, raw_caps)) @@ -362,6 +365,10 @@ NTSTATUS wg_transform_push_data(void *args) return STATUS_NO_MEMORY; } gst_buffer_fill(buffer, 0, sample->data, sample->size); + if (sample->flags & WG_SAMPLE_FLAG_HAS_PTS) + GST_BUFFER_PTS(buffer) = sample->pts * 100; + if (sample->flags & WG_SAMPLE_FLAG_HAS_DURATION) + GST_BUFFER_DURATION(buffer) = sample->duration * 100; gst_buffer_list_insert(transform->input, -1, buffer);
GST_INFO("Copied %u bytes from sample %p to input buffer list", sample->size, sample); @@ -391,6 +398,24 @@ static NTSTATUS read_transform_output_data(GstBuffer *buffer, struct wg_sample * gst_buffer_unmap(buffer, &info); gst_buffer_resize(buffer, sample->size, -1);
+ if (GST_BUFFER_PTS_IS_VALID(buffer)) + { + sample->flags |= WG_SAMPLE_FLAG_HAS_PTS; + sample->pts = GST_BUFFER_PTS(buffer) / 100; + } + if (GST_BUFFER_DURATION_IS_VALID(buffer)) + { + GstClockTime duration = GST_BUFFER_DURATION(buffer) / 100; + + duration = (duration * sample->size) / info.size; + GST_BUFFER_DURATION(buffer) -= duration * 100; + if (GST_BUFFER_PTS_IS_VALID(buffer)) + GST_BUFFER_PTS(buffer) += duration * 100; + + sample->flags |= WG_SAMPLE_FLAG_HAS_DURATION; + sample->duration = duration; + } + GST_INFO("Copied %u bytes, sample %p, flags %#x", sample->size, sample, sample->flags); return STATUS_SUCCESS; }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=111943
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/mf/tests/mf.c:6892 error: patch failed: dlls/mf/tests/mf.c:5802 error: patch failed: dlls/mf/tests/mf.c:6093 error: patch failed: dlls/mf/tests/mf.c:6361 error: patch failed: dlls/winegstreamer/wg_transform.c:391 Task: Patch failed to apply
=== debian11 (32 bit report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Arabic:Morocco report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (32 bit German report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (32 bit French report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hebrew:Israel report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Hindi:India report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Japanese:Japan report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (32 bit Chinese:China report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (32 bit WoW report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0
=== debian11 (64 bit WoW report) ===
mf: mf.c:6970: Test succeeded inside todo block: got length 0