From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/copier.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/mf/copier.c b/dlls/mf/copier.c index ab995fb98db..816bed6388e 100644 --- a/dlls/mf/copier.c +++ b/dlls/mf/copier.c @@ -494,6 +494,9 @@ static HRESULT WINAPI sample_copier_transform_ProcessOutput(IMFTransform *iface,
TRACE("%p, %#lx, %lu, %p, %p.\n", iface, flags, count, buffers, status);
+ if (count != 1) + return E_INVALIDARG; + EnterCriticalSection(&transform->cs); if (!(transform->flags & SAMPLE_COPIER_OUTPUT_TYPE_SET)) hr = MF_E_TRANSFORM_TYPE_NOT_SET;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 469 +++++++++++++++++++------------------- 1 file changed, 230 insertions(+), 239 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index c5dbea290bc..5c9e3a24f79 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -1424,6 +1424,7 @@ static void test_wma_encoder(void)
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float}; + IMFSample *input_sample, *output_sample; ULONG audio_data_len, wmaenc_data_len; const BYTE *audio_data, *wmaenc_data; MFT_OUTPUT_STREAM_INFO output_info; @@ -1434,7 +1435,6 @@ static void test_wma_encoder(void) IMFTransform *transform; DWORD status, length; HANDLE output_file; - IMFSample *sample; HRSRC resource; ULONG i, ret; HRESULT hr; @@ -1502,24 +1502,23 @@ static void test_wma_encoder(void) 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); + input_sample = create_sample(audio_data, audio_data_len); + hr = IMFSample_SetSampleTime(input_sample, 0); ok(hr == S_OK, "SetSampleTime returned %#lx\n", hr); - hr = IMFSample_SetSampleDuration(sample, 10000000); + hr = IMFSample_SetSampleDuration(input_sample, 10000000); ok(hr == S_OK, "SetSampleDuration returned %#lx\n", hr); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_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); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); - ref = IMFSample_Release(sample); + ref = IMFSample_Release(input_sample); ok(ref <= 1, "Release returned %ld\n", ref);
status = 0xdeadbeef; - sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, output_info.cbSize);
resource = FindResourceW(NULL, L"wmaencdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); @@ -1538,16 +1537,16 @@ static void test_wma_encoder(void) { 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.pSample == output_sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7)) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); 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); + check_sample(output_sample, wmaenc_data + i * wmaenc_block_size, output_file); winetest_pop_context(); i++; } @@ -1555,22 +1554,21 @@ static void test_wma_encoder(void) trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file);
- ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, output_info.cbSize); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_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); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
ret = IMFTransform_Release(transform); @@ -1696,6 +1694,7 @@ static void test_wma_decoder(void) MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8}; MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_Float}; IUnknown *unknown, *tmp_unknown, outer = {&test_unk_vtbl}; + IMFSample *input_sample, *output_sample; ULONG wmadec_data_len, wmaenc_data_len; const BYTE *wmadec_data, *wmaenc_data; MFT_OUTPUT_STREAM_INFO output_info; @@ -1710,7 +1709,6 @@ static void test_wma_decoder(void) IMFTransform *transform; LONGLONG time, duration; HANDLE output_file; - IMFSample *sample; ULONG i, ret, ref; HRSRC resource; UINT32 value; @@ -1834,22 +1832,22 @@ static void test_wma_decoder(void) 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(wmaenc_data, wmaenc_block_size / 2); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + input_sample = create_sample(wmaenc_data, wmaenc_block_size / 2); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret); - sample = create_sample(wmaenc_data, wmaenc_block_size + 1); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + input_sample = create_sample(wmaenc_data, wmaenc_block_size + 1); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret); - sample = create_sample(wmaenc_data, wmaenc_block_size); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + input_sample = create_sample(wmaenc_data, wmaenc_block_size); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret == 1, "Release returned %lu\n", ret);
/* As output_info.dwFlags doesn't have MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES @@ -1867,10 +1865,10 @@ 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(wmaenc_data, wmaenc_block_size); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + input_sample = create_sample(wmaenc_data, wmaenc_block_size); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; @@ -1886,10 +1884,8 @@ static void test_wma_decoder(void) status = 0xdeadbeef; memset(&output, 0, sizeof(output)); output_info.cbSize = wmadec_block_size; - sample = create_sample(NULL, output_info.cbSize); - outputs[0].pSample = sample; - sample = create_sample(NULL, output_info.cbSize); - outputs[1].pSample = sample; + outputs[0].pSample = create_sample(NULL, output_info.cbSize); + outputs[1].pSample = create_sample(NULL, output_info.cbSize); hr = IMFTransform_ProcessOutput(transform, 0, 2, outputs, &status); ok(hr == E_INVALIDARG, "ProcessOutput returned %#lx\n", hr); ref = IMFSample_Release(outputs[0].pSample); @@ -1911,9 +1907,8 @@ static void test_wma_decoder(void)
status = 0xdeadbeef; output_info.cbSize = wmadec_block_size; - sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, output_info.cbSize); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
for (i = 0; i < 4; ++i) @@ -1921,34 +1916,34 @@ static void test_wma_decoder(void) 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.pSample == output_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 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status); value = 0xdeadbeef; - hr = IMFSample_GetUINT32(sample, &MFSampleExtension_CleanPoint, &value); + hr = IMFSample_GetUINT32(output_sample, &MFSampleExtension_CleanPoint, &value); ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); ok(value == 1, "got MFSampleExtension_CleanPoint %u\n", value); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); flags = 0xdeadbeef; - hr = IMFSample_GetSampleFlags(sample, &flags); + hr = IMFSample_GetSampleFlags(output_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); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == i * 928798, "got time %I64d\n", time); duration = 0xdeadbeef; - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); 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); ok(duration == 928798, "got duration %I64d\n", duration); - check_sample_pcm16(sample, wmadec_data, output_file, TRUE); + check_sample_pcm16(output_sample, wmadec_data, output_file, TRUE); wmadec_data += wmadec_block_size; wmadec_data_len -= wmadec_block_size; } @@ -1961,17 +1956,16 @@ static void test_wma_decoder(void) ok(duration == 464399, "got duration %I64d\n", duration);
if (length == wmadec_block_size / 2) - check_sample_pcm16(sample, wmadec_data, output_file, FALSE); + check_sample_pcm16(output_sample, wmadec_data, output_file, FALSE); wmadec_data += length; wmadec_data_len -= length; } - ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, output_info.cbSize); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
winetest_pop_context(); @@ -1986,36 +1980,35 @@ static void test_wma_decoder(void) 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); + ok(output.pSample == output_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); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, output_info.cbSize); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == 0 || broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|7)) /* Win7 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- sample = create_sample(wmaenc_data, wmaenc_block_size); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + input_sample = create_sample(wmaenc_data, wmaenc_block_size); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr);
ret = IMFTransform_Release(transform); ok(ret == 0, "Release returned %lu\n", ret); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret);
hr = CoCreateInstance( &CLSID_CWMADecMediaObject, &outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, @@ -2290,6 +2283,7 @@ static void test_h264_decoder(void) const BYTE *h264_encoded_data, *nv12_frame_data, *i420_frame_data; ULONG h264_encoded_data_len, nv12_frame_len, i420_frame_len; DWORD input_id, output_id, input_count, output_count; + IMFSample *input_sample, *output_sample; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; MFT_OUTPUT_DATA_BUFFER output; @@ -2302,7 +2296,6 @@ static void test_h264_decoder(void) IMFTransform *transform; ULONG i, ret, flags; HANDLE output_file; - IMFSample *sample; HRSRC resource; UINT32 value; BYTE *data; @@ -2498,37 +2491,37 @@ static void test_h264_decoder(void) ok(status == 0, "got status %#lx\n", status);
i = 0; - sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); + input_sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); while (1) { status = 0; memset(&output, 0, sizeof(output)); - output.pSample = create_sample(NULL, output_info.cbSize); + output.pSample = output_sample = create_sample(NULL, output_info.cbSize); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); if (hr != MF_E_TRANSFORM_NEED_MORE_INPUT) break; ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(!!output.pSample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); 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); - hr = IMFSample_GetTotalLength(output.pSample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); - ret = IMFSample_Release(output.pSample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %lu\n", ret); - sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); + input_sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len);
- hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %lu\n", ret); - sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); + input_sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); i++;
hr = IMFTransform_ProcessMessage(transform, MFT_MESSAGE_COMMAND_DRAIN, 0); @@ -2540,16 +2533,16 @@ static void test_h264_decoder(void) ok(h264_encoded_data_len == 1180, "got h264_encoded_data_len %lu\n", h264_encoded_data_len); ok(hr == MF_E_TRANSFORM_STREAM_CHANGE, "ProcessOutput returned %#lx\n", hr); ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(!!output.pSample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE, "got dwStatus %#lx\n", output.dwStatus); ok(!output.pEvents, "got pEvents %p\n", output.pEvents); ok(status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS, "got status %#lx\n", status); - hr = IMFSample_GetTotalLength(output.pSample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); - ret = IMFSample_Release(output.pSample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
flags = MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE; @@ -2596,42 +2589,43 @@ static void test_h264_decoder(void)
status = 0; memset(&output, 0, sizeof(output)); - output.pSample = create_sample(NULL, nv12_frame_len); + output.pSample = output_sample = create_sample(NULL, nv12_frame_len); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(!!output.pSample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); 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);
- hr = IMFSample_GetUINT32(sample, &MFSampleExtension_CleanPoint, &value); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); + hr = IMFSample_GetUINT32(output_sample, &MFSampleExtension_CleanPoint, &value); + ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); + ok(value == 1, "got MFSampleExtension_CleanPoint %u\n", value);
count = 0xdeadbeef; - hr = IMFSample_GetBufferCount(output.pSample, &count); + hr = IMFSample_GetBufferCount(output_sample, &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); + hr = IMFSample_GetSampleFlags(output_sample, &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); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == 0, "got time %I64d\n", time);
/* doesn't matter what frame rate we've selected, duration is defined by the stream */ duration = 0xdeadbeef; - hr = IMFSample_GetSampleDuration(output.pSample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); 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. */ - hr = IMFSample_ConvertToContiguousBuffer(output.pSample, &media_buffer); + hr = IMFSample_ConvertToContiguousBuffer(output_sample, &media_buffer); ok(hr == S_OK, "ConvertToContiguousBuffer returned %#lx\n", hr); hr = IMFMediaBuffer_Lock(media_buffer, &data, NULL, &length); ok(hr == S_OK, "Lock returned %#lx\n", hr); @@ -2649,9 +2643,9 @@ static void test_h264_decoder(void) ok(hr == S_OK, "Unlock returned %#lx\n", hr); IMFMediaBuffer_Release(media_buffer);
- check_sample(output.pSample, nv12_frame_data, output_file); + check_sample(output_sample, nv12_frame_data, output_file);
- ret = IMFSample_Release(output.pSample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
trace("created %s\n", debugstr_w(output_path)); @@ -2679,32 +2673,32 @@ static void test_h264_decoder(void)
status = 0; memset(&output, 0, sizeof(output)); - output.pSample = create_sample(NULL, actual_width * actual_height * 2); + output.pSample = output_sample = create_sample(NULL, actual_width * actual_height * 2); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); todo_wine ok(hr == MF_E_TRANSFORM_STREAM_CHANGE, "ProcessOutput returned %#lx\n", hr);
while (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %lu\n", ret); - sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); + input_sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); todo_wine_if(hr == MF_E_TRANSFORM_NEED_MORE_INPUT) ok(hr == MF_E_TRANSFORM_STREAM_CHANGE, "ProcessOutput returned %#lx\n", hr); }
ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(!!output.pSample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE, "got dwStatus %#lx\n", output.dwStatus); ok(!output.pEvents, "got pEvents %p\n", output.pEvents); ok(status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS, "got status %#lx\n", status); - hr = IMFSample_GetTotalLength(output.pSample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); - ret = IMFSample_Release(output.pSample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
GetTempPathW(ARRAY_SIZE(output_path), output_path); @@ -2720,28 +2714,28 @@ static void test_h264_decoder(void)
status = 0; memset(&output, 0, sizeof(output)); - output.pSample = create_sample(NULL, actual_width * actual_height * 2); + output.pSample = output_sample = create_sample(NULL, actual_width * actual_height * 2); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(!!output.pSample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); 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);
- hr = IMFSample_GetSampleTime(output.pSample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); todo_wine_if(time == 1334666) /* when VA-API plugin is used */ ok(time - 333666 <= 2, "got time %I64d\n", time);
duration = 0xdeadbeef; - hr = IMFSample_GetSampleDuration(output.pSample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); 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. */ - hr = IMFSample_ConvertToContiguousBuffer(output.pSample, &media_buffer); + hr = IMFSample_ConvertToContiguousBuffer(output_sample, &media_buffer); ok(hr == S_OK, "ConvertToContiguousBuffer returned %#lx\n", hr); hr = IMFMediaBuffer_Lock(media_buffer, &data, NULL, &length); ok(hr == S_OK, "Lock returned %#lx\n", hr); @@ -2765,9 +2759,9 @@ static void test_h264_decoder(void) ok(hr == S_OK, "Unlock returned %#lx\n", hr); IMFMediaBuffer_Release(media_buffer);
- check_sample(output.pSample, i420_frame_data, output_file); + check_sample(output_sample, i420_frame_data, output_file);
- ret = IMFSample_Release(output.pSample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
trace("created %s\n", debugstr_w(output_path)); @@ -2775,21 +2769,21 @@ static void test_h264_decoder(void)
status = 0; memset(&output, 0, sizeof(output)); - output.pSample = create_sample(NULL, actual_width * actual_height * 2); + output.pSample = output_sample = create_sample(NULL, actual_width * actual_height * 2); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); todo_wine_if(hr == S_OK) /* when VA-API plugin is used */ ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(!!output.pSample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); 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); - ret = IMFSample_Release(output.pSample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
ret = IMFTransform_Release(transform); ok(ret == 0, "Release returned %lu\n", ret); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret);
failed: @@ -2907,6 +2901,7 @@ static void test_audio_convert(void) MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float}; static const ULONG audioconv_block_size = 0x4000; ULONG audio_data_len, audioconv_data_len; + IMFSample *input_sample, *output_sample; const BYTE *audio_data, *audioconv_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; @@ -2917,7 +2912,6 @@ static void test_audio_convert(void) IMFTransform *transform; DWORD length, status; HANDLE output_file; - IMFSample *sample; HRSRC resource; ULONG i, ret; HRESULT hr; @@ -3049,24 +3043,23 @@ static void test_audio_convert(void) 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); + input_sample = create_sample(audio_data, audio_data_len); + hr = IMFSample_SetSampleTime(input_sample, 0); ok(hr == S_OK, "SetSampleTime returned %#lx\n", hr); - hr = IMFSample_SetSampleDuration(sample, 10000000); + hr = IMFSample_SetSampleDuration(input_sample, 10000000); ok(hr == S_OK, "SetSampleDuration returned %#lx\n", hr); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_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); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, audioconv_block_size); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, audioconv_block_size);
resource = FindResourceW(NULL, L"audioconvdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); @@ -3085,7 +3078,7 @@ static void test_audio_convert(void) { 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.pSample == output_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|6) || output.dwStatus == 6) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); @@ -3096,17 +3089,17 @@ static void test_audio_convert(void) break; }
- hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == i * 928798, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 928798, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == audioconv_block_size, "got length %lu\n", length); ok(audioconv_data_len > audioconv_block_size, "got remaining length %lu\n", audioconv_data_len); - check_sample_pcm16(sample, audioconv_data, output_file, FALSE); + check_sample_pcm16(output_sample, audioconv_data, output_file, FALSE); audioconv_data_len -= audioconv_block_size; audioconv_data += audioconv_block_size;
@@ -3114,28 +3107,32 @@ static void test_audio_convert(void) i++; }
- hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == i * 928798, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); todo_wine ok(duration == 897506, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); todo_wine ok(length == 15832, "got length %lu\n", length); ok(audioconv_data_len == 16084, "got remaining length %lu\n", audioconv_data_len); - check_sample_pcm16(sample, audioconv_data, output_file, FALSE); + check_sample_pcm16(output_sample, audioconv_data, output_file, FALSE); audioconv_data_len -= length; audioconv_data += length;
+ ret = IMFSample_Release(output_sample); + ok(ret == 0, "Release returned %lu\n", ret); + + status = 0xdeadbeef; memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, audioconv_block_size); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); todo_wine ok(hr == S_OK || broken(hr == MF_E_TRANSFORM_NEED_MORE_INPUT) /* win7 */, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); todo_wine ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == 0) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); @@ -3143,41 +3140,40 @@ static void test_audio_convert(void)
if (hr == S_OK) { - hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); todo_wine ok(time == 10185486, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); todo_wine ok(duration == 14286, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); todo_wine ok(length == audioconv_data_len, "got length %lu\n", length); if (length == audioconv_data_len) - check_sample_pcm16(sample, audioconv_data, output_file, FALSE); + check_sample_pcm16(output_sample, audioconv_data, output_file, FALSE); }
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file);
- ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, audioconv_block_size); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, audioconv_block_size); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_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); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
ret = IMFTransform_Release(transform); @@ -3357,6 +3353,7 @@ static void test_color_convert(void) MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_I420}; ULONG nv12frame_data_len, rgb32_data_len; const BYTE *nv12frame_data, *rgb32_data; + IMFSample *input_sample, *output_sample; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; MFT_OUTPUT_DATA_BUFFER output; @@ -3366,7 +3363,6 @@ static void test_color_convert(void) IMFTransform *transform; DWORD length, status; HANDLE output_file; - IMFSample *sample; HRSRC resource; ULONG i, ret; HRESULT hr; @@ -3477,18 +3473,18 @@ static void test_color_convert(void) nv12frame_data_len = SizeofResource(GetModuleHandleW(NULL), resource); ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len);
- sample = create_sample(nv12frame_data, nv12frame_data_len); - hr = IMFSample_SetSampleTime(sample, 0); + input_sample = create_sample(nv12frame_data, nv12frame_data_len); + hr = IMFSample_SetSampleTime(input_sample, 0); ok(hr == S_OK, "SetSampleTime returned %#lx\n", hr); - hr = IMFSample_SetSampleDuration(sample, 10000000); + hr = IMFSample_SetSampleDuration(input_sample, 10000000); ok(hr == S_OK, "SetSampleDuration returned %#lx\n", hr); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); hr = IMFTransform_ProcessMessage(transform, MFT_MESSAGE_COMMAND_DRAIN, 0); ok(hr == S_OK, "ProcessMessage returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
resource = FindResourceW(NULL, L"rgb32frame.bin", (const WCHAR *)RT_RCDATA); @@ -3504,47 +3500,45 @@ static void test_color_convert(void) ok(output_file != INVALID_HANDLE_VALUE, "CreateFileW failed, error %lu\n", GetLastError());
status = 0xdeadbeef; - sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, output_info.cbSize); 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); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == 0 || broken(output.dwStatus == 6) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status);
- hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == 0, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 10000000, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == output_info.cbSize, "got length %lu\n", length); - check_sample_rgb32(sample, rgb32_data, output_file); + check_sample_rgb32(output_sample, rgb32_data, output_file); rgb32_data_len -= output_info.cbSize; rgb32_data += output_info.cbSize;
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file);
- ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, output_info.cbSize); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_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); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
ret = IMFTransform_Release(transform); @@ -3721,15 +3715,14 @@ static void test_video_processor(void) DWORD input_count, output_count, input_id, output_id, flags; DWORD input_min, input_max, output_min, output_max, i, j, k; ULONG nv12frame_data_len, rgb32_data_len; + IMFSample *input_sample, *output_sample; IMFMediaType *media_type, *media_type2; IMFAttributes *attributes, *attributes2; const BYTE *nv12frame_data, *rgb32_data; - MFT_OUTPUT_DATA_BUFFER output_buffer; const GUID *expect_available_inputs; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; MFT_OUTPUT_DATA_BUFFER output; - IMFSample *sample, *sample2; WCHAR output_path[MAX_PATH]; LONGLONG time, duration; IMFTransform *transform; @@ -3959,75 +3952,75 @@ todo_wine { ok(output_info.cbSize > 0, "Unexpected size %lu.\n", output_info.cbSize); ok(output_info.cbAlignment == 0, "Unexpected alignment %lu.\n", output_info.cbAlignment);
- hr = MFCreateSample(&sample); + hr = MFCreateSample(&input_sample); ok(hr == S_OK, "Failed to create a sample, hr %#lx.\n", hr);
- hr = MFCreateSample(&sample2); + hr = MFCreateSample(&output_sample); ok(hr == S_OK, "Failed to create a sample, hr %#lx.\n", hr);
- memset(&output_buffer, 0, sizeof(output_buffer)); - output_buffer.pSample = sample; + memset(&output, 0, sizeof(output)); + output.pSample = output_sample; flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output_buffer, &flags); + hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); todo_wine ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "Unexpected hr %#lx.\n", hr); - ok(output_buffer.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output_buffer.dwStatus); + ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); ok(flags == 0, "Unexpected status %#lx.\n", flags);
- hr = IMFTransform_ProcessInput(transform, 0, sample2, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); todo_wine ok(hr == S_OK, "Failed to push a sample, hr %#lx.\n", hr);
- hr = IMFTransform_ProcessInput(transform, 0, sample2, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); todo_wine ok(hr == MF_E_NOTACCEPTING, "Unexpected hr %#lx.\n", hr);
- memset(&output_buffer, 0, sizeof(output_buffer)); - output_buffer.pSample = sample; + memset(&output, 0, sizeof(output)); + output.pSample = output_sample; flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output_buffer, &flags); + hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); todo_wine ok(hr == MF_E_NO_SAMPLE_TIMESTAMP, "Unexpected hr %#lx.\n", hr); - ok(output_buffer.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output_buffer.dwStatus); + ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); ok(flags == 0, "Unexpected status %#lx.\n", flags);
- hr = IMFSample_SetSampleTime(sample2, 0); + hr = IMFSample_SetSampleTime(input_sample, 0); ok(hr == S_OK, "Failed to set sample time, hr %#lx.\n", hr); - memset(&output_buffer, 0, sizeof(output_buffer)); - output_buffer.pSample = sample; + memset(&output, 0, sizeof(output)); + output.pSample = output_sample; flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output_buffer, &flags); + hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - ok(output_buffer.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output_buffer.dwStatus); + ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); ok(flags == 0, "Unexpected status %#lx.\n", flags);
hr = MFCreateMemoryBuffer(1024 * 1024, &buffer); ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr);
- hr = IMFSample_AddBuffer(sample2, buffer); + hr = IMFSample_AddBuffer(input_sample, buffer); ok(hr == S_OK, "Failed to add a buffer, hr %#lx.\n", hr);
- hr = IMFSample_AddBuffer(sample, buffer); + hr = IMFSample_AddBuffer(output_sample, buffer); ok(hr == S_OK, "Failed to add a buffer, hr %#lx.\n", hr);
- memset(&output_buffer, 0, sizeof(output_buffer)); - output_buffer.pSample = sample; + memset(&output, 0, sizeof(output)); + output.pSample = output_sample; flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output_buffer, &flags); + hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); todo_wine ok(hr == S_OK || broken(FAILED(hr)) /* Win8 */, "Failed to get output buffer, hr %#lx.\n", hr); - ok(output_buffer.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output_buffer.dwStatus); + ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); ok(flags == 0, "Unexpected status %#lx.\n", flags);
if (SUCCEEDED(hr)) { - memset(&output_buffer, 0, sizeof(output_buffer)); - output_buffer.pSample = sample; + memset(&output, 0, sizeof(output)); + output.pSample = output_sample; flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output_buffer, &flags); + hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "Unexpected hr %#lx.\n", hr); - ok(output_buffer.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output_buffer.dwStatus); + ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); ok(flags == 0, "Unexpected status %#lx.\n", flags); }
@@ -4036,9 +4029,9 @@ todo_wine {
ref = IMFMediaType_Release(media_type); ok(ref == 0, "Release returned %ld\n", ref); - ref = IMFSample_Release(sample2); + ref = IMFSample_Release(input_sample); ok(ref == 0, "Release returned %ld\n", ref); - ref = IMFSample_Release(sample); + ref = IMFSample_Release(output_sample); ok(ref == 0, "Release returned %ld\n", ref); ref = IMFMediaBuffer_Release(buffer); ok(ref == 0, "Release returned %ld\n", ref); @@ -4192,18 +4185,18 @@ todo_wine { nv12frame_data_len = SizeofResource(GetModuleHandleW(NULL), resource); ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len);
- sample = create_sample(nv12frame_data, nv12frame_data_len); - hr = IMFSample_SetSampleTime(sample, 0); + input_sample = create_sample(nv12frame_data, nv12frame_data_len); + hr = IMFSample_SetSampleTime(input_sample, 0); ok(hr == S_OK, "SetSampleTime returned %#lx\n", hr); - hr = IMFSample_SetSampleDuration(sample, 10000000); + hr = IMFSample_SetSampleDuration(input_sample, 10000000); ok(hr == S_OK, "SetSampleDuration returned %#lx\n", hr); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); hr = IMFTransform_ProcessMessage(transform, MFT_MESSAGE_COMMAND_DRAIN, 0); ok(hr == S_OK, "ProcessMessage returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
resource = FindResourceW(NULL, L"rgb32frame-vp.bin", (const WCHAR *)RT_RCDATA); @@ -4219,9 +4212,8 @@ todo_wine { ok(output_file != INVALID_HANDLE_VALUE, "CreateFileW failed, error %lu\n", GetLastError());
status = 0xdeadbeef; - sample = create_sample(NULL, rgb32_data_len); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, rgb32_data_len); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == S_OK || broken(hr == MF_E_SHUTDOWN) /* w8 */, "ProcessOutput returned %#lx\n", hr); if (hr != S_OK) @@ -4230,21 +4222,21 @@ todo_wine { CloseHandle(output_file); goto skip_output; } - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == 0 || broken(output.dwStatus == 6) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0xdeadbeef, "got status %#lx\n", status);
- hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == 0, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 10000000, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == output_info.cbSize, "got length %lu\n", length);
- hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer); + hr = IMFSample_ConvertToContiguousBuffer(output_sample, &buffer); ok(hr == S_OK, "ConvertToContiguousBuffer returned %#lx\n", hr); hr = IMFMediaBuffer_Lock(buffer, &ptr, NULL, &length); ok(hr == S_OK, "Lock returned %#lx\n", hr); @@ -4259,31 +4251,30 @@ todo_wine { if (tmp == 0x00) win_skip("Frame got resized, skipping output comparison\n"); else if (tmp == 0xcd) /* Wine doesn't flip the frame, yet */ - check_sample_rgb32(sample, rgb32_data, output_file); + check_sample_rgb32(output_sample, rgb32_data, output_file); rgb32_data_len -= output_info.cbSize; rgb32_data += output_info.cbSize;
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file);
- ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, output_info.cbSize); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, output_info.cbSize); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); ok(output.dwStatus == 0, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0xdeadbeef, "got status %#lx\n", status); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length);
skip_output: - ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
ret = IMFTransform_Release(transform); @@ -4419,6 +4410,7 @@ static void test_mp3_decoder(void) MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_PCM}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_MP3}; static const ULONG mp3dec_block_size = 0x1200; + IMFSample *input_sample, *output_sample; ULONG mp3dec_data_len, mp3enc_data_len; const BYTE *mp3dec_data, *mp3enc_data; MFT_OUTPUT_STREAM_INFO output_info; @@ -4430,7 +4422,6 @@ static void test_mp3_decoder(void) LONGLONG time, duration; DWORD status, length; HANDLE output_file; - IMFSample *sample; HRSRC resource; ULONG i, ret; HRESULT hr; @@ -4554,22 +4545,21 @@ static void test_mp3_decoder(void) mp3enc_data_len = SizeofResource(GetModuleHandleW(NULL), resource); ok(mp3enc_data_len == 6295, "got length %lu\n", mp3enc_data_len);
- sample = create_sample(mp3enc_data, mp3enc_data_len); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + input_sample = create_sample(mp3enc_data, mp3enc_data_len); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret == 1, "Release returned %lu\n", ret);
- sample = create_sample(mp3enc_data, mp3enc_data_len); - hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + input_sample = create_sample(mp3enc_data, mp3enc_data_len); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#lx\n", hr); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, mp3dec_block_size); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, mp3dec_block_size);
resource = FindResourceW(NULL, L"mp3decdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); @@ -4588,25 +4578,25 @@ static void test_mp3_decoder(void)
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); + ok(output.pSample == output_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 */, "got dwStatus %#lx\n", output.dwStatus); ok(status == 0, "got status %#lx\n", status);
- hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == 0, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 282993 || broken(duration == 522449) /* win8 */ || broken(duration == 261224) /* win7 */, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0x9c0 || broken(length == mp3dec_block_size) /* win8 */ || broken(length == 0x900) /* win7 */, "got length %lu\n", length); ok(mp3dec_data_len > length, "got remaining length %lu\n", mp3dec_data_len); - if (length == 0x9c0) check_sample_pcm16(sample, mp3dec_data, output_file, FALSE); + if (length == 0x9c0) check_sample_pcm16(output_sample, mp3dec_data, output_file, FALSE); mp3dec_data_len -= 0x9c0; mp3dec_data += 0x9c0;
@@ -4615,7 +4605,7 @@ static void test_mp3_decoder(void) { 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.pSample == output_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 */, "got dwStatus %#lx\n", output.dwStatus); @@ -4626,20 +4616,20 @@ static void test_mp3_decoder(void) break; }
- hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == i, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 522449 || broken(261225 - duration <= 1) /* win7 */, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == mp3dec_block_size || broken(length == 0x900) /* win7 */, "got length %lu\n", length); ok(mp3dec_data_len > length || broken(mp3dec_data_len == 2304 || mp3dec_data_len == 0) /* win7 */, "got remaining length %lu\n", mp3dec_data_len); - if (length == mp3dec_block_size) check_sample_pcm16(sample, mp3dec_data, output_file, FALSE); + if (length == mp3dec_block_size) check_sample_pcm16(output_sample, mp3dec_data, output_file, FALSE); mp3dec_data += min(mp3dec_data_len, length); mp3dec_data_len -= min(mp3dec_data_len, length);
@@ -4647,28 +4637,30 @@ static void test_mp3_decoder(void) i += duration; }
- hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == i || broken(time == i - duration) /* win7 */, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); todo_wine ok(duration == 522449 || broken(261225 - duration <= 1) /* win7 */, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); todo_wine ok(length == mp3dec_block_size || broken(length == 0) /* win7 */, "got length %lu\n", length); ok(mp3dec_data_len == mp3dec_block_size || broken(mp3dec_data_len == 0) /* win7 */, "got remaining length %lu\n", mp3dec_data_len); - check_sample_pcm16(sample, mp3dec_data, output_file, FALSE); + check_sample_pcm16(output_sample, mp3dec_data, output_file, FALSE); mp3dec_data_len -= length; mp3dec_data += length;
+ IMFSample_Release(output_sample); + memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, mp3dec_block_size); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); todo_wine ok(hr == S_OK || broken(hr == MF_E_TRANSFORM_NEED_MORE_INPUT) /* win7 */, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); todo_wine ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == 0) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); @@ -4676,41 +4668,40 @@ static void test_mp3_decoder(void)
if (hr == S_OK) { - hr = IMFSample_GetSampleTime(sample, &time); + hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); todo_wine ok(time == 10185486, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(sample, &duration); + hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); todo_wine ok(duration == 14286, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); todo_wine ok(length == mp3dec_data_len, "got length %lu\n", length); if (length == mp3dec_data_len) - check_sample_pcm16(sample, mp3dec_data, output_file, FALSE); + check_sample_pcm16(output_sample, mp3dec_data, output_file, FALSE); }
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file);
- ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
status = 0xdeadbeef; - sample = create_sample(NULL, mp3dec_block_size); memset(&output, 0, sizeof(output)); - output.pSample = sample; + output.pSample = output_sample = create_sample(NULL, mp3dec_block_size); hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == sample, "got pSample %p\n", output.pSample); + ok(output.pSample == output_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); - hr = IMFSample_GetTotalLength(sample, &length); + hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); - ret = IMFSample_Release(sample); + ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
ret = IMFTransform_Release(transform);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 432 +++++++++++++------------------------- 1 file changed, 150 insertions(+), 282 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 5c9e3a24f79..00166d4fd5e 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -311,6 +311,48 @@ static void check_mft_set_output_type_required_(int line, IMFTransform *transfor ok_(__FILE__, line)(!ref, "Release returned %lu\n", ref); }
+#define check_mft_process_output(a, b, c) check_mft_process_output_(__LINE__, a, b, c) +static HRESULT check_mft_process_output_(int line, IMFTransform *transform, IMFSample *output_sample, DWORD *output_status) +{ + static const DWORD expect_flags = MFT_OUTPUT_DATA_BUFFER_INCOMPLETE | MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE + | MFT_OUTPUT_DATA_BUFFER_STREAM_END | MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; + MFT_OUTPUT_DATA_BUFFER output[2]; + HRESULT hr, ret; + DWORD status; + + status = 0xdeadbeef; + memset(&output, 0xcd, sizeof(output)); + output[0].pSample = output_sample; + output[1].pSample = output_sample; + hr = IMFTransform_ProcessOutput(transform, 0, 2, output, &status); + ok_(__FILE__, line)(hr == E_INVALIDARG, "ProcessOutput returned %#lx\n", hr); + ok_(__FILE__, line)(status == 0 || status == 0xdeadbeef, "got status %#lx\n", status); + + status = 0; + memset(&output, 0, sizeof(output)); + output[0].pSample = output_sample; + output[0].dwStreamID = 0; + ret = IMFTransform_ProcessOutput(transform, 0, 1, output, &status); + ok_(__FILE__, line)(output[0].dwStreamID == 0, "got dwStreamID %#lx\n", output[0].dwStreamID); + ok_(__FILE__, line)(output[0].pEvents == NULL, "got pEvents %p\n", output[0].pEvents); + ok_(__FILE__, line)(output[0].pSample == output_sample, "got pSample %p\n", output[0].pSample); + ok_(__FILE__, line)((output[0].dwStatus & ~expect_flags) == 0 + || broken((output[0].dwStatus & ~expect_flags) == 6) /* Win7 */ + || broken((output[0].dwStatus & ~expect_flags) == 7) /* Win7 */, + "got dwStatus %#lx\n", output[0].dwStatus); + *output_status = output[0].dwStatus & expect_flags; + + if (!output_sample) + ok_(__FILE__, line)(status == 0, "got status %#lx\n", status); + else if (ret == MF_E_TRANSFORM_STREAM_CHANGE) + ok_(__FILE__, line)(status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS, + "got status %#lx\n", status); + else + ok_(__FILE__, line)(status == 0, "got status %#lx\n", status); + + return ret; +} + static HRESULT WINAPI test_unk_QueryInterface(IUnknown *iface, REFIID riid, void **obj) { if (IsEqualIID(riid, &IID_IUnknown)) @@ -394,18 +436,17 @@ static BOOL is_sample_copier_available_type(IMFMediaType *type)
static void test_sample_copier(void) { + DWORD input_count, output_count, output_status; IMFAttributes *attributes, *attributes2; DWORD in_min, in_max, out_min, out_max; IMFMediaType *mediatype, *mediatype2; MFT_OUTPUT_STREAM_INFO output_info; IMFSample *sample, *client_sample; MFT_INPUT_STREAM_INFO input_info; - DWORD input_count, output_count; - MFT_OUTPUT_DATA_BUFFER buffer; IMFMediaBuffer *media_buffer; IMFTransform *copier; - DWORD flags, status; UINT32 value, count; + DWORD flags; HRESULT hr; LONG ref;
@@ -641,15 +682,14 @@ static void test_sample_copier(void) ok(hr == S_OK, "Failed to add a buffer, hr %#lx.\n", hr); IMFMediaBuffer_Release(media_buffer);
- status = 0; - memset(&buffer, 0, sizeof(buffer)); - buffer.pSample = client_sample; - hr = IMFTransform_ProcessOutput(copier, 0, 1, &buffer, &status); + hr = check_mft_process_output(copier, client_sample, &output_status); ok(hr == S_OK, "Failed to get output, hr %#lx.\n", hr); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); EXPECT_REF(sample, 1);
- hr = IMFTransform_ProcessOutput(copier, 0, 1, &buffer, &status); + hr = check_mft_process_output(copier, client_sample, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "Failed to get output, hr %#lx.\n", hr); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
/* Flushing. */ hr = IMFTransform_ProcessInput(copier, 0, sample, 0); @@ -684,8 +724,7 @@ static void sample_copier_process(IMFTransform *copier, IMFMediaBuffer *input_bu { static const struct sample_metadata zero_md = { 0, ~0u, ~0u }; IMFSample *input_sample, *output_sample; - MFT_OUTPUT_DATA_BUFFER buffer; - DWORD flags, status; + DWORD flags, output_status; LONGLONG time; HRESULT hr; LONG ref; @@ -726,11 +765,9 @@ static void sample_copier_process(IMFTransform *copier, IMFMediaBuffer *input_bu hr = IMFTransform_ProcessInput(copier, 0, input_sample, 0); ok(hr == S_OK, "Failed to process input, hr %#lx.\n", hr);
- status = 0; - memset(&buffer, 0, sizeof(buffer)); - buffer.pSample = output_sample; - hr = IMFTransform_ProcessOutput(copier, 0, 1, &buffer, &status); + hr = check_mft_process_output(copier, output_sample, &output_status); ok(hr == S_OK, "Failed to get output, hr %#lx.\n", hr); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
if (!md) md = &zero_md;
@@ -1429,11 +1466,10 @@ static void test_wma_encoder(void) const BYTE *audio_data, *wmaenc_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - MFT_OUTPUT_DATA_BUFFER output; WCHAR output_path[MAX_PATH]; + DWORD length, output_status; IMFMediaType *media_type; IMFTransform *transform; - DWORD status, length; HANDLE output_file; HRSRC resource; ULONG i, ret; @@ -1516,9 +1552,7 @@ static void test_wma_encoder(void) ref = IMFSample_Release(input_sample); ok(ref <= 1, "Release returned %ld\n", ref);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); + output_sample = create_sample(NULL, output_info.cbSize);
resource = FindResourceW(NULL, L"wmaencdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); @@ -1532,39 +1566,30 @@ static void test_wma_encoder(void) 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());
- i = 0; - while (SUCCEEDED(hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status))) + for (i = 0; SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status)); i++) { winetest_push_context("%lu", i); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || - 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(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); 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(output_sample, wmaenc_data + i * wmaenc_block_size, output_file); winetest_pop_context(); - i++; } + ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); + ret = IMFSample_Release(output_sample); + ok(ret == 0, "Release returned %lu\n", ret);
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file);
- ret = IMFSample_Release(output_sample); - ok(ret == 0, "Release returned %lu\n", ret); - - status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); @@ -1698,10 +1723,8 @@ static void test_wma_decoder(void) 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]; + DWORD flags, length, output_status; MFT_INPUT_STREAM_INFO input_info; - MFT_OUTPUT_DATA_BUFFER output; - DWORD status, flags, length; WCHAR output_path[MAX_PATH]; IMediaObject *media_object; IPropertyBag *property_bag; @@ -1853,17 +1876,11 @@ static void test_wma_decoder(void) /* As output_info.dwFlags doesn't have MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES * IMFTransform_ProcessOutput needs a sample or returns MF_E_TRANSFORM_NEED_MORE_INPUT */
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + hr = check_mft_process_output(transform, NULL, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(!output.pSample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE || - broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE)) /* Win7 */, - "got dwStatus %#lx\n", output.dwStatus); - ok(!output.pEvents, "got pEvents %p\n", output.pEvents); - ok(status == 0, "got status %#lx\n", status); + ok(output_status == MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE + || broken(output_status == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE)) /* Win7 */, + "got output[0].dwStatus %#lx\n", output_status);
input_sample = create_sample(wmaenc_data, wmaenc_block_size); hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); @@ -1871,27 +1888,11 @@ static void test_wma_decoder(void) ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + hr = check_mft_process_output(transform, NULL, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(!output.pSample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE || - broken(output.dwStatus == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE)) /* Win7 */, - "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0, "got status %#lx\n", status); - - status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output_info.cbSize = wmadec_block_size; - outputs[0].pSample = create_sample(NULL, output_info.cbSize); - outputs[1].pSample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 2, outputs, &status); - ok(hr == E_INVALIDARG, "ProcessOutput returned %#lx\n", hr); - ref = IMFSample_Release(outputs[0].pSample); - ok(ref == 0, "Release returned %ld\n", ref); - ref = IMFSample_Release(outputs[1].pSample); - ok(ref == 0, "Release returned %ld\n", ref); + ok(output_status == MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE + || broken(output_status == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE)) /* Win7 */, + "got output[0].dwStatus %#lx\n", output_status);
resource = FindResourceW(NULL, L"wmadecdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); @@ -1905,22 +1906,15 @@ static void test_wma_decoder(void) 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 = wmadec_block_size; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status);
for (i = 0; i < 4; ++i) { winetest_push_context("%lu", i);
ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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 */, - "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0, "got status %#lx\n", status); value = 0xdeadbeef; hr = IMFSample_GetUINT32(output_sample, &MFSampleExtension_CleanPoint, &value); ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); @@ -1938,9 +1932,10 @@ static void test_wma_decoder(void) duration = 0xdeadbeef; hr = IMFSample_GetSampleDuration(output_sample, &duration); 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))) + + if (output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE) { + ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); ok(length == wmadec_block_size, "got length %lu\n", length); ok(duration == 928798, "got duration %I64d\n", duration); check_sample_pcm16(output_sample, wmadec_data, output_file, TRUE); @@ -1949,6 +1944,7 @@ static void test_wma_decoder(void) } else { + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); /* 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); @@ -1963,10 +1959,8 @@ static void test_wma_decoder(void) ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status);
winetest_pop_context();
@@ -1980,22 +1974,14 @@ static void test_wma_decoder(void) CloseHandle(output_file);
ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == 0 || - 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(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); @@ -2285,10 +2271,9 @@ static void test_h264_decoder(void) DWORD input_id, output_id, input_count, output_count; IMFSample *input_sample, *output_sample; MFT_OUTPUT_STREAM_INFO output_info; + DWORD length, count, output_status; 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; @@ -2480,31 +2465,19 @@ static void test_h264_decoder(void) /* As output_info.dwFlags doesn't have MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES * IMFTransform_ProcessOutput needs a sample or returns an error */
- status = 0; - memset(&output, 0, sizeof(output)); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + hr = check_mft_process_output(transform, NULL, &output_status); ok(hr == E_INVALIDARG || hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(!output.pSample, "got pSample %p\n", output.pSample); - 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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
i = 0; input_sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); while (1) { - status = 0; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status); if (hr != MF_E_TRANSFORM_NEED_MORE_INPUT) break; ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - 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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); @@ -2532,13 +2505,7 @@ static void test_h264_decoder(void) todo_wine ok(h264_encoded_data_len == 1180, "got h264_encoded_data_len %lu\n", h264_encoded_data_len); ok(hr == MF_E_TRANSFORM_STREAM_CHANGE, "ProcessOutput returned %#lx\n", hr); - ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE, - "got dwStatus %#lx\n", output.dwStatus); - ok(!output.pEvents, "got pEvents %p\n", output.pEvents); - ok(status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS, - "got status %#lx\n", status); + ok(output_status == MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); @@ -2587,16 +2554,10 @@ static void test_h264_decoder(void) nv12_frame_len = SizeofResource(GetModuleHandleW(NULL), resource); ok(nv12_frame_len == actual_width * actual_height * 3 / 2, "got frame length %lu\n", nv12_frame_len);
- status = 0; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, nv12_frame_len); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, nv12_frame_len); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - 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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
hr = IMFSample_GetUINT32(output_sample, &MFSampleExtension_CleanPoint, &value); ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); @@ -2671,12 +2632,12 @@ static void test_h264_decoder(void) ret = IMFMediaType_Release(media_type); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, actual_width * actual_height * 2); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, actual_width * actual_height * 2); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine ok(hr == MF_E_TRANSFORM_STREAM_CHANGE, "ProcessOutput returned %#lx\n", hr); + todo_wine + ok(output_status == MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE, "got output[0].dwStatus %#lx\n", output_status);
while (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { @@ -2685,16 +2646,12 @@ static void test_h264_decoder(void) ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %lu\n", ret); input_sample = next_h264_sample(&h264_encoded_data, &h264_encoded_data_len); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine_if(hr == MF_E_TRANSFORM_NEED_MORE_INPUT) ok(hr == MF_E_TRANSFORM_STREAM_CHANGE, "ProcessOutput returned %#lx\n", hr); + ok(output_status == MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE, "got output[0].dwStatus %#lx\n", output_status); }
- ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE, "got dwStatus %#lx\n", output.dwStatus); - ok(!output.pEvents, "got pEvents %p\n", output.pEvents); - ok(status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS, "got status %#lx\n", status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); @@ -2712,16 +2669,10 @@ static void test_h264_decoder(void) i420_frame_len = SizeofResource(GetModuleHandleW(NULL), resource); ok(i420_frame_len == actual_width * actual_height * 3 / 2, "got frame length %lu\n", i420_frame_len);
- status = 0; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, actual_width * actual_height * 2); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, actual_width * actual_height * 2); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - 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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); @@ -2767,17 +2718,11 @@ static void test_h264_decoder(void) trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file);
- status = 0; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, actual_width * actual_height * 2); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, actual_width * actual_height * 2); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine_if(hr == S_OK) /* when VA-API plugin is used */ ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.dwStreamID == 0, "got dwStreamID %lu\n", output.dwStreamID); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - 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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
@@ -2905,12 +2850,11 @@ static void test_audio_convert(void) const BYTE *audio_data, *audioconv_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - MFT_OUTPUT_DATA_BUFFER output; WCHAR output_path[MAX_PATH]; + DWORD length, output_status; IMFMediaType *media_type; LONGLONG time, duration; IMFTransform *transform; - DWORD length, status; HANDLE output_file; HRSRC resource; ULONG i, ret; @@ -3057,9 +3001,7 @@ static void test_audio_convert(void) ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, audioconv_block_size); + output_sample = create_sample(NULL, audioconv_block_size);
resource = FindResourceW(NULL, L"audioconvdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); @@ -3074,21 +3016,18 @@ static void test_audio_convert(void) ok(output_file != INVALID_HANDLE_VALUE, "CreateFileW failed, error %lu\n", GetLastError());
i = 0; - while (SUCCEEDED(hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status))) + while (SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status))) { winetest_push_context("%lu", i); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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|6) || output.dwStatus == 6) /* win7 */, - "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0, "got status %#lx\n", status); - if (!(output.dwStatus & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)) + if (!(output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)) { + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); winetest_pop_context(); break; }
+ ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == i * 928798, "got time %I64d\n", time); @@ -3126,17 +3065,12 @@ static void test_audio_convert(void) ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, audioconv_block_size); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, audioconv_block_size); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine ok(hr == S_OK || broken(hr == MF_E_TRANSFORM_NEED_MORE_INPUT) /* win7 */, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); todo_wine - ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == 0) /* win7 */, - "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0, "got status %#lx\n", status); + ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status);
if (hr == S_OK) { @@ -3162,14 +3096,10 @@ static void test_audio_convert(void) ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, audioconv_block_size); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, audioconv_block_size); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); @@ -3356,12 +3286,11 @@ static void test_color_convert(void) IMFSample *input_sample, *output_sample; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - MFT_OUTPUT_DATA_BUFFER output; WCHAR output_path[MAX_PATH]; + DWORD length, output_status; IMFMediaType *media_type; LONGLONG time, duration; IMFTransform *transform; - DWORD length, status; HANDLE output_file; HRSRC resource; ULONG i, ret; @@ -3499,14 +3428,10 @@ static void test_color_convert(void) 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; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == 0 || broken(output.dwStatus == 6) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0, "got status %#lx\n", status); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); @@ -3527,14 +3452,10 @@ static void test_color_convert(void) ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); @@ -3722,13 +3643,12 @@ static void test_video_processor(void) const GUID *expect_available_inputs; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - MFT_OUTPUT_DATA_BUFFER output; + DWORD length, output_status; WCHAR output_path[MAX_PATH]; LONGLONG time, duration; IMFTransform *transform; IMFMediaBuffer *buffer; IMFMediaEvent *event; - DWORD length, status; unsigned int value; HANDLE output_file; HRSRC resource; @@ -3958,14 +3878,9 @@ todo_wine { hr = MFCreateSample(&output_sample); ok(hr == S_OK, "Failed to create a sample, hr %#lx.\n", hr);
- memset(&output, 0, sizeof(output)); - output.pSample = output_sample; - flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "Unexpected hr %#lx.\n", hr); - ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); - ok(flags == 0, "Unexpected status %#lx.\n", flags);
hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); todo_wine @@ -3975,25 +3890,15 @@ todo_wine { todo_wine ok(hr == MF_E_NOTACCEPTING, "Unexpected hr %#lx.\n", hr);
- memset(&output, 0, sizeof(output)); - output.pSample = output_sample; - flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine ok(hr == MF_E_NO_SAMPLE_TIMESTAMP, "Unexpected hr %#lx.\n", hr); - ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); - ok(flags == 0, "Unexpected status %#lx.\n", flags);
hr = IMFSample_SetSampleTime(input_sample, 0); ok(hr == S_OK, "Failed to set sample time, hr %#lx.\n", hr); - memset(&output, 0, sizeof(output)); - output.pSample = output_sample; - flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); - ok(flags == 0, "Unexpected status %#lx.\n", flags);
hr = MFCreateMemoryBuffer(1024 * 1024, &buffer); ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); @@ -4004,24 +3909,14 @@ todo_wine { hr = IMFSample_AddBuffer(output_sample, buffer); ok(hr == S_OK, "Failed to add a buffer, hr %#lx.\n", hr);
- memset(&output, 0, sizeof(output)); - output.pSample = output_sample; - flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine ok(hr == S_OK || broken(FAILED(hr)) /* Win8 */, "Failed to get output buffer, hr %#lx.\n", hr); - ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); - ok(flags == 0, "Unexpected status %#lx.\n", flags);
if (SUCCEEDED(hr)) { - memset(&output, 0, sizeof(output)); - output.pSample = output_sample; - flags = 0; - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &flags); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "Unexpected hr %#lx.\n", hr); - ok(output.dwStatus == 0, "Unexpected buffer status, %#lx.\n", output.dwStatus); - ok(flags == 0, "Unexpected status %#lx.\n", flags); }
ref = IMFTransform_Release(transform); @@ -4211,10 +4106,8 @@ todo_wine { 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; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, rgb32_data_len); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, rgb32_data_len); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK || broken(hr == MF_E_SHUTDOWN) /* w8 */, "ProcessOutput returned %#lx\n", hr); if (hr != S_OK) { @@ -4222,9 +4115,7 @@ todo_wine { CloseHandle(output_file); goto skip_output; } - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == 0 || broken(output.dwStatus == 6) /* win7 */, "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0xdeadbeef, "got status %#lx\n", status); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); @@ -4261,14 +4152,10 @@ todo_wine { ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, output_info.cbSize); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - ok(output.dwStatus == 0, "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0xdeadbeef, "got status %#lx\n", status); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length); @@ -4415,12 +4302,11 @@ static void test_mp3_decoder(void) const BYTE *mp3dec_data, *mp3enc_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - MFT_OUTPUT_DATA_BUFFER output; WCHAR output_path[MAX_PATH]; + DWORD length, output_status; IMFMediaType *media_type; IMFTransform *transform; LONGLONG time, duration; - DWORD status, length; HANDLE output_file; HRSRC resource; ULONG i, ret; @@ -4557,9 +4443,7 @@ static void test_mp3_decoder(void) ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, mp3dec_block_size); + output_sample = create_sample(NULL, mp3dec_block_size);
resource = FindResourceW(NULL, L"mp3decdata.bin", (const WCHAR *)RT_RCDATA); ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); @@ -4576,13 +4460,9 @@ static void test_mp3_decoder(void) hr = IMFTransform_ProcessMessage(transform, MFT_MESSAGE_COMMAND_DRAIN, 0); ok(hr == S_OK, "ProcessMessage returned %#lx\n", hr);
- hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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 */, - "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0, "got status %#lx\n", status); + ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status);
hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); @@ -4601,21 +4481,18 @@ static void test_mp3_decoder(void) mp3dec_data += 0x9c0;
i = duration; - while (SUCCEEDED(hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status))) + while (SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status))) { winetest_push_context("%lu", i); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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 */, - "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0, "got status %#lx\n", status); - if (!(output.dwStatus & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)) + if (!(output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)) { + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); winetest_pop_context(); break; }
+ ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetSampleTime(output_sample, &time); ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); ok(time == i, "got time %I64d\n", time); @@ -4655,16 +4532,11 @@ static void test_mp3_decoder(void)
IMFSample_Release(output_sample);
- memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, mp3dec_block_size); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, mp3dec_block_size); + hr = check_mft_process_output(transform, output_sample, &output_status); todo_wine ok(hr == S_OK || broken(hr == MF_E_TRANSFORM_NEED_MORE_INPUT) /* win7 */, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_sample, "got pSample %p\n", output.pSample); - todo_wine - ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE || broken(output.dwStatus == 0) /* win7 */, - "got dwStatus %#lx\n", output.dwStatus); - ok(status == 0, "got status %#lx\n", status); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
if (hr == S_OK) { @@ -4690,14 +4562,10 @@ static void test_mp3_decoder(void) ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- status = 0xdeadbeef; - memset(&output, 0, sizeof(output)); - output.pSample = output_sample = create_sample(NULL, mp3dec_block_size); - hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status); + output_sample = create_sample(NULL, mp3dec_block_size); + hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); - ok(output.pSample == output_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); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0, "got length %lu\n", length);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=123696
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
mf: transform.c:3073: Test failed: resampler: got output[0].dwStatus 0
=== w7u_adm (32 bit report) ===
mf: transform.c:3073: Test failed: resampler: got output[0].dwStatus 0
=== w7u_el (32 bit report) ===
mf: transform.c:3073: Test failed: resampler: got output[0].dwStatus 0
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 90 ++++++++++----------------------------- 1 file changed, 23 insertions(+), 67 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 00166d4fd5e..9179e5bd06c 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -49,6 +49,14 @@ DEFINE_GUID(MFAudioFormat_RAW_AAC1,WAVE_FORMAT_RAW_AAC1,0x0000,0x0010,0x80,0x00, DEFINE_GUID(MFVideoFormat_ABGR32,0x00000020,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71); DEFINE_GUID(MFVideoFormat_P208,0x38303250,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
+static void load_resource(const WCHAR *filename, const BYTE **data, DWORD *length) +{ + HRSRC resource = FindResourceW(NULL, filename, (const WCHAR *)RT_RCDATA); + ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); + *data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); + *length = SizeofResource(GetModuleHandleW(NULL), resource); +} + #define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__) static void _expect_ref(IUnknown* obj, ULONG expected_refcount, int line) { @@ -1471,7 +1479,6 @@ static void test_wma_encoder(void) IMFMediaType *media_type; IMFTransform *transform; HANDLE output_file; - HRSRC resource; ULONG i, ret; HRESULT hr; LONG ref; @@ -1532,10 +1539,7 @@ static void test_wma_encoder(void) 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);
- 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); + load_resource(L"audiodata.bin", &audio_data, &audio_data_len); ok(audio_data_len == 179928, "got length %lu\n", audio_data_len);
input_sample = create_sample(audio_data, audio_data_len); @@ -1554,10 +1558,7 @@ static void test_wma_encoder(void)
output_sample = create_sample(NULL, output_info.cbSize);
- resource = FindResourceW(NULL, L"wmaencdata.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - wmaenc_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - wmaenc_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"wmaencdata.bin", &wmaenc_data, &wmaenc_data_len); 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 */ @@ -1733,7 +1734,6 @@ static void test_wma_decoder(void) LONGLONG time, duration; HANDLE output_file; ULONG i, ret, ref; - HRSRC resource; UINT32 value; HRESULT hr;
@@ -1849,10 +1849,7 @@ static void test_wma_decoder(void) 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 = FindResourceW(NULL, L"wmaencdata.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - wmaenc_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - wmaenc_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"wmaencdata.bin", &wmaenc_data, &wmaenc_data_len); ok(wmaenc_data_len % wmaenc_block_size == 0, "got length %lu\n", wmaenc_data_len);
input_sample = create_sample(wmaenc_data, wmaenc_block_size / 2); @@ -1894,10 +1891,7 @@ static void test_wma_decoder(void) || broken(output_status == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE)) /* Win7 */, "got output[0].dwStatus %#lx\n", output_status);
- 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); + load_resource(L"wmadecdata.bin", &wmadec_data, &wmadec_data_len); 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 */ @@ -2281,7 +2275,6 @@ static void test_h264_decoder(void) IMFTransform *transform; ULONG i, ret, flags; HANDLE output_file; - HRSRC resource; UINT32 value; BYTE *data; HRESULT hr; @@ -2457,10 +2450,7 @@ static void test_h264_decoder(void) hr = IMFTransform_GetStreamIDs(transform, 1, &input_id, 1, &output_id); ok(hr == E_NOTIMPL, "GetStreamIDs returned %#lx\n", hr);
- resource = FindResourceW(NULL, L"h264data.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - h264_encoded_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - h264_encoded_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"h264data.bin", &h264_encoded_data, &h264_encoded_data_len);
/* As output_info.dwFlags doesn't have MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES * IMFTransform_ProcessOutput needs a sample or returns an error */ @@ -2548,10 +2538,7 @@ static void test_h264_decoder(void) 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());
- resource = FindResourceW(NULL, L"nv12frame.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - nv12_frame_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - nv12_frame_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"nv12frame.bin", &nv12_frame_data, &nv12_frame_len); ok(nv12_frame_len == actual_width * actual_height * 3 / 2, "got frame length %lu\n", nv12_frame_len);
output_sample = create_sample(NULL, nv12_frame_len); @@ -2663,10 +2650,7 @@ static void test_h264_decoder(void) 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());
- resource = FindResourceW(NULL, L"i420frame.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - i420_frame_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - i420_frame_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"i420frame.bin", &i420_frame_data, &i420_frame_len); ok(i420_frame_len == actual_width * actual_height * 3 / 2, "got frame length %lu\n", i420_frame_len);
output_sample = create_sample(NULL, actual_width * actual_height * 2); @@ -2856,7 +2840,6 @@ static void test_audio_convert(void) LONGLONG time, duration; IMFTransform *transform; HANDLE output_file; - HRSRC resource; ULONG i, ret; HRESULT hr;
@@ -2981,10 +2964,7 @@ static void test_audio_convert(void) ok(output_info.cbSize == 4, "got cbSize %#lx\n", output_info.cbSize); ok(output_info.cbAlignment == 1, "got cbAlignment %#lx\n", output_info.cbAlignment);
- 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); + load_resource(L"audiodata.bin", &audio_data, &audio_data_len); ok(audio_data_len == 179928, "got length %lu\n", audio_data_len);
input_sample = create_sample(audio_data, audio_data_len); @@ -3003,10 +2983,7 @@ static void test_audio_convert(void)
output_sample = create_sample(NULL, audioconv_block_size);
- resource = FindResourceW(NULL, L"audioconvdata.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - audioconv_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - audioconv_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"audioconvdata.bin", &audioconv_data, &audioconv_data_len); ok(audioconv_data_len == 179924, "got length %lu\n", audioconv_data_len);
/* and generate a new one as well in a temporary directory */ @@ -3292,7 +3269,6 @@ static void test_color_convert(void) LONGLONG time, duration; IMFTransform *transform; HANDLE output_file; - HRSRC resource; ULONG i, ret; HRESULT hr;
@@ -3396,10 +3372,7 @@ static void test_color_convert(void) ok(output_info.cbSize == actual_width * actual_height * 4, "got cbSize %#lx\n", output_info.cbSize); ok(output_info.cbAlignment == 1, "got cbAlignment %#lx\n", output_info.cbAlignment);
- resource = FindResourceW(NULL, L"nv12frame.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - nv12frame_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - nv12frame_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"nv12frame.bin", &nv12frame_data, &nv12frame_data_len); ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len);
input_sample = create_sample(nv12frame_data, nv12frame_data_len); @@ -3416,10 +3389,7 @@ static void test_color_convert(void) ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
- resource = FindResourceW(NULL, L"rgb32frame.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - rgb32_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - rgb32_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"rgb32frame.bin", &rgb32_data, &rgb32_data_len); ok(rgb32_data_len == output_info.cbSize, "got length %lu\n", rgb32_data_len);
/* and generate a new one as well in a temporary directory */ @@ -3651,7 +3621,6 @@ static void test_video_processor(void) IMFMediaEvent *event; unsigned int value; HANDLE output_file; - HRSRC resource; BYTE *ptr, tmp; UINT32 count; HRESULT hr; @@ -4074,10 +4043,7 @@ todo_wine { ok(output_info.cbSize == actual_width * actual_height * 4, "got cbSize %#lx\n", output_info.cbSize); ok(output_info.cbAlignment == 0, "got cbAlignment %#lx\n", output_info.cbAlignment);
- resource = FindResourceW(NULL, L"nv12frame.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - nv12frame_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - nv12frame_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"nv12frame.bin", &nv12frame_data, &nv12frame_data_len); ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len);
input_sample = create_sample(nv12frame_data, nv12frame_data_len); @@ -4094,10 +4060,7 @@ todo_wine { ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
- resource = FindResourceW(NULL, L"rgb32frame-vp.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - rgb32_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - rgb32_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"rgb32frame-vp.bin", &rgb32_data, &rgb32_data_len); ok(rgb32_data_len == output_info.cbSize, "got length %lu\n", rgb32_data_len);
/* and generate a new one as well in a temporary directory */ @@ -4308,7 +4271,6 @@ static void test_mp3_decoder(void) IMFTransform *transform; LONGLONG time, duration; HANDLE output_file; - HRSRC resource; ULONG i, ret; HRESULT hr;
@@ -4425,10 +4387,7 @@ static void test_mp3_decoder(void) ok(output_info.cbSize == mp3dec_block_size, "got cbSize %#lx\n", output_info.cbSize); ok(output_info.cbAlignment == 1, "got cbAlignment %#lx\n", output_info.cbAlignment);
- resource = FindResourceW(NULL, L"mp3encdata.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - mp3enc_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - mp3enc_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"mp3encdata.bin", &mp3enc_data, &mp3enc_data_len); ok(mp3enc_data_len == 6295, "got length %lu\n", mp3enc_data_len);
input_sample = create_sample(mp3enc_data, mp3enc_data_len); @@ -4445,10 +4404,7 @@ static void test_mp3_decoder(void)
output_sample = create_sample(NULL, mp3dec_block_size);
- resource = FindResourceW(NULL, L"mp3decdata.bin", (const WCHAR *)RT_RCDATA); - ok(resource != 0, "FindResourceW failed, error %lu\n", GetLastError()); - mp3dec_data = LockResource(LoadResource(GetModuleHandleW(NULL), resource)); - mp3dec_data_len = SizeofResource(GetModuleHandleW(NULL), resource); + load_resource(L"mp3decdata.bin", &mp3dec_data, &mp3dec_data_len); ok(mp3dec_data_len == 94656, "got length %lu\n", mp3dec_data_len);
/* and generate a new one as well in a temporary directory */
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=123697
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
mf: transform.c:3050: Test failed: resampler: got output[0].dwStatus 0
=== w7u_adm (32 bit report) ===
mf: transform.c:3050: Test failed: resampler: got output[0].dwStatus 0
=== w7u_el (32 bit report) ===
mf: transform.c:3050: Test failed: resampler: got output[0].dwStatus 0
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 229 +++++++++++++++++++++++++++++++++----- 1 file changed, 202 insertions(+), 27 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 9179e5bd06c..bd204185172 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -361,6 +361,62 @@ static HRESULT check_mft_process_output_(int line, IMFTransform *transform, IMFS return ret; }
+struct buffer_desc +{ + DWORD length; +}; + +struct sample_desc +{ + DWORD buffer_count; + const struct buffer_desc *buffers; +}; + +typedef void (*enum_mf_media_buffers_cb)(IMFMediaBuffer *buffer, const struct buffer_desc *desc, void *context); +static void enum_mf_media_buffers(IMFSample *sample, const struct sample_desc *sample_desc, + enum_mf_media_buffers_cb callback, void *context) +{ + IMFMediaBuffer *buffer; + HRESULT hr; + DWORD i; + + for (i = 0; SUCCEEDED(hr = IMFSample_GetBufferByIndex(sample, i, &buffer)); i++) + { + winetest_push_context("buffer %lu", i); + ok(hr == S_OK, "GetBufferByIndex returned %#lx\n", hr); + ok(i < sample_desc->buffer_count, "got unexpected buffer\n"); + + callback(buffer, sample_desc->buffers + i, context); + + IMFMediaBuffer_Release(buffer); + winetest_pop_context(); + } + ok(hr == E_INVALIDARG, "GetBufferByIndex returned %#lx\n", hr); +} + +static void dump_mf_media_buffer(IMFMediaBuffer *buffer, const struct buffer_desc *buffer_desc, HANDLE output) +{ + DWORD length, written; + HRESULT hr; + BYTE *data; + BOOL ret; + + hr = IMFMediaBuffer_Lock(buffer, &data, NULL, &length); + ok(hr == S_OK, "Lock returned %#lx\n", hr); + + ret = WriteFile(output, data, length, &written, NULL); + ok(ret, "WriteFile failed, error %lu\n", GetLastError()); + ok(written == length, "written %lu bytes\n", written); + + hr = IMFMediaBuffer_Unlock(buffer); + ok(hr == S_OK, "Unlock returned %#lx\n", hr); +} + +static void dump_mf_sample(IMFSample *sample, const struct sample_desc *sample_desc, HANDLE output) +{ + enum_mf_media_buffers(sample, sample_desc, dump_mf_media_buffer, output); +} + static HRESULT WINAPI test_unk_QueryInterface(IUnknown *iface, REFIID riid, void **obj) { if (IsEqualIID(riid, &IID_IUnknown)) @@ -911,8 +967,8 @@ static IMFSample *create_sample(const BYTE *data, ULONG size) return sample; }
-#define check_sample(a, b, c) check_sample_(__LINE__, a, b, c) -static void check_sample_(int line, IMFSample *sample, const BYTE *expect_buf, HANDLE output_file) +#define check_sample(a, b) check_sample_(__LINE__, a, b) +static void check_sample_(int line, IMFSample *sample, const BYTE *expect_buf) { IMFMediaBuffer *media_buffer; DWORD length; @@ -925,15 +981,14 @@ static void check_sample_(int line, IMFSample *sample, const BYTE *expect_buf, H hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &length); ok_(__FILE__, line)(hr == S_OK, "Lock returned %#lx\n", hr); 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); ret = IMFMediaBuffer_Release(media_buffer); ok_(__FILE__, line)(ret == 1, "Release returned %lu\n", ret); }
-#define check_sample_rgb32(a, b, c) check_sample_rgb32_(__LINE__, a, b, c) -static void check_sample_rgb32_(int line, IMFSample *sample, const BYTE *expect_buf, HANDLE output_file) +#define check_sample_rgb32(a, b) check_sample_rgb32_(__LINE__, a, b) +static void check_sample_rgb32_(int line, IMFSample *sample, const BYTE *expect_buf) { DWORD i, length, diff = 0, max_diff; IMFMediaBuffer *media_buffer; @@ -958,15 +1013,14 @@ static void check_sample_rgb32_(int line, IMFSample *sample, const BYTE *expect_ max_diff = length * 3 * 256; ok_(__FILE__, line)(diff * 100 / max_diff == 0, "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); }
-#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) +#define check_sample_pcm16(a, b, c) check_sample_pcm16_(__LINE__, a, b, c) +static void check_sample_pcm16_(int line, IMFSample *sample, const BYTE *expect_buf, BOOL todo) { IMFMediaBuffer *media_buffer; DWORD i, length; @@ -991,7 +1045,6 @@ static void check_sample_pcm16_(int line, IMFSample *sample, const BYTE *expect_ todo_wine_if(todo && i < length / 2) 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); @@ -1467,6 +1520,17 @@ static void test_wma_encoder(void) {0}, };
+ const struct buffer_desc output_buffer_desc[] = + { + {.length = wmaenc_block_size}, + }; + const struct sample_desc output_sample_desc[] = + { + { + .buffer_count = 1, .buffers = output_buffer_desc, + }, + }; + MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float}; IMFSample *input_sample, *output_sample; @@ -1576,7 +1640,8 @@ static void test_wma_encoder(void) ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); 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(output_sample, wmaenc_data + i * wmaenc_block_size, output_file); + check_sample(output_sample, wmaenc_data + i * wmaenc_block_size); + dump_mf_sample(output_sample, output_sample_desc, output_file); winetest_pop_context(); } ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); @@ -1717,6 +1782,21 @@ static void test_wma_decoder(void) {0}, };
+ const struct buffer_desc output_buffer_desc[] = + { + {.length = wmadec_block_size}, + {.length = wmadec_block_size / 2}, + }; + const struct sample_desc output_sample_desc[] = + { + { + .buffer_count = 1, .buffers = output_buffer_desc + 0, + }, + { + .buffer_count = 1, .buffers = output_buffer_desc + 1, + }, + }; + MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8}; MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_Float}; IUnknown *unknown, *tmp_unknown, outer = {&test_unk_vtbl}; @@ -1932,7 +2012,8 @@ static void test_wma_decoder(void) ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); ok(length == wmadec_block_size, "got length %lu\n", length); ok(duration == 928798, "got duration %I64d\n", duration); - check_sample_pcm16(output_sample, wmadec_data, output_file, TRUE); + check_sample_pcm16(output_sample, wmadec_data, TRUE); + dump_mf_sample(output_sample, output_sample_desc + 0, output_file); wmadec_data += wmadec_block_size; wmadec_data_len -= wmadec_block_size; } @@ -1946,7 +2027,10 @@ static void test_wma_decoder(void) ok(duration == 464399, "got duration %I64d\n", duration);
if (length == wmadec_block_size / 2) - check_sample_pcm16(output_sample, wmadec_data, output_file, FALSE); + { + check_sample_pcm16(output_sample, wmadec_data, FALSE); + dump_mf_sample(output_sample, output_sample_desc + 1, output_file); + } wmadec_data += length; wmadec_data_len -= length; } @@ -2258,6 +2342,23 @@ static void test_h264_decoder(void) }, };
+ const struct buffer_desc output_buffer_desc_nv12 = + { + .length = actual_width * actual_height * 3 / 2, + }; + const struct sample_desc output_sample_desc_nv12 = + { + .buffer_count = 1, .buffers = &output_buffer_desc_nv12, + }; + const struct buffer_desc output_buffer_desc_i420 = + { + .length = actual_width * actual_height * 3 / 2, + }; + const struct sample_desc output_sample_desc_i420 = + { + .buffer_count = 1, .buffers = &output_buffer_desc_i420, + }; + MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_H264}; MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; const BYTE *h264_encoded_data, *nv12_frame_data, *i420_frame_data; @@ -2591,7 +2692,8 @@ static void test_h264_decoder(void) ok(hr == S_OK, "Unlock returned %#lx\n", hr); IMFMediaBuffer_Release(media_buffer);
- check_sample(output_sample, nv12_frame_data, output_file); + check_sample(output_sample, nv12_frame_data); + dump_mf_sample(output_sample, &output_sample_desc_nv12, output_file);
ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret); @@ -2694,7 +2796,8 @@ static void test_h264_decoder(void) ok(hr == S_OK, "Unlock returned %#lx\n", hr); IMFMediaBuffer_Release(media_buffer);
- check_sample(output_sample, i420_frame_data, output_file); + check_sample(output_sample, i420_frame_data); + dump_mf_sample(output_sample, &output_sample_desc_i420, output_file);
ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret); @@ -2826,9 +2929,28 @@ static void test_audio_convert(void) {0}, };
+ static const ULONG audioconv_block_size = 0x4000; + const struct buffer_desc output_buffer_desc[] = + { + {.length = audioconv_block_size}, + {.length = 0x3dd8}, + {.length = 0xfc}, + }; + const struct sample_desc output_sample_desc[] = + { + { + .buffer_count = 1, .buffers = output_buffer_desc + 0, + }, + { + .buffer_count = 1, .buffers = output_buffer_desc + 1, + }, + { + .buffer_count = 1, .buffers = output_buffer_desc + 2, + }, + }; + MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_PCM}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float}; - static const ULONG audioconv_block_size = 0x4000; ULONG audio_data_len, audioconv_data_len; IMFSample *input_sample, *output_sample; const BYTE *audio_data, *audioconv_data; @@ -3015,7 +3137,8 @@ static void test_audio_convert(void) ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == audioconv_block_size, "got length %lu\n", length); ok(audioconv_data_len > audioconv_block_size, "got remaining length %lu\n", audioconv_data_len); - check_sample_pcm16(output_sample, audioconv_data, output_file, FALSE); + check_sample_pcm16(output_sample, audioconv_data, FALSE); + dump_mf_sample(output_sample, output_sample_desc + 0, output_file); audioconv_data_len -= audioconv_block_size; audioconv_data += audioconv_block_size;
@@ -3035,7 +3158,8 @@ static void test_audio_convert(void) todo_wine ok(length == 15832, "got length %lu\n", length); ok(audioconv_data_len == 16084, "got remaining length %lu\n", audioconv_data_len); - check_sample_pcm16(output_sample, audioconv_data, output_file, FALSE); + check_sample_pcm16(output_sample, audioconv_data, FALSE); + dump_mf_sample(output_sample, output_sample_desc + 1, output_file); audioconv_data_len -= length; audioconv_data += length;
@@ -3064,7 +3188,10 @@ static void test_audio_convert(void) todo_wine ok(length == audioconv_data_len, "got length %lu\n", length); if (length == audioconv_data_len) - check_sample_pcm16(output_sample, audioconv_data, output_file, FALSE); + { + check_sample_pcm16(output_sample, audioconv_data, FALSE); + dump_mf_sample(output_sample, output_sample_desc + 2, output_file); + } }
trace("created %s\n", debugstr_w(output_path)); @@ -3256,6 +3383,15 @@ static void test_color_convert(void) {0}, };
+ const struct buffer_desc output_buffer_desc = + { + .length = actual_width * actual_height * 4, + }; + const struct sample_desc output_sample_desc = + { + .buffer_count = 1, .buffers = &output_buffer_desc, + }; + MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_I420}; ULONG nv12frame_data_len, rgb32_data_len; @@ -3412,7 +3548,8 @@ static void test_color_convert(void) hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == output_info.cbSize, "got length %lu\n", length); - check_sample_rgb32(output_sample, rgb32_data, output_file); + check_sample_rgb32(output_sample, rgb32_data); + dump_mf_sample(output_sample, &output_sample_desc, output_file); rgb32_data_len -= output_info.cbSize; rgb32_data += output_info.cbSize;
@@ -3601,9 +3738,18 @@ static void test_video_processor(void) {0}, };
+ const struct buffer_desc output_buffer_desc = + { + .length = actual_width * actual_height * 4, + }; + const struct sample_desc output_sample_desc = + { + .buffer_count = 1, .buffers = &output_buffer_desc, + }; + + DWORD input_count, output_count, input_id, output_id, flags, length, output_status; MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_I420}; - DWORD input_count, output_count, input_id, output_id, flags; DWORD input_min, input_max, output_min, output_max, i, j, k; ULONG nv12frame_data_len, rgb32_data_len; IMFSample *input_sample, *output_sample; @@ -3613,7 +3759,6 @@ static void test_video_processor(void) const GUID *expect_available_inputs; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - DWORD length, output_status; WCHAR output_path[MAX_PATH]; LONGLONG time, duration; IMFTransform *transform; @@ -4105,7 +4250,10 @@ todo_wine { if (tmp == 0x00) win_skip("Frame got resized, skipping output comparison\n"); else if (tmp == 0xcd) /* Wine doesn't flip the frame, yet */ - check_sample_rgb32(output_sample, rgb32_data, output_file); + { + check_sample_rgb32(output_sample, rgb32_data); + dump_mf_sample(output_sample, &output_sample_desc, output_file); + } rgb32_data_len -= output_info.cbSize; rgb32_data += output_info.cbSize;
@@ -4257,9 +4405,24 @@ static void test_mp3_decoder(void) {0}, };
+ static const ULONG mp3dec_block_size = 0x1200; + const struct buffer_desc output_buffer_desc[] = + { + {.length = 0x9c0}, + {.length = mp3dec_block_size}, + }; + const struct sample_desc output_sample_desc[] = + { + { + .buffer_count = 1, .buffers = output_buffer_desc + 0, + }, + { + .buffer_count = 1, .buffers = output_buffer_desc + 1, + }, + }; + MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_PCM}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_MP3}; - static const ULONG mp3dec_block_size = 0x1200; IMFSample *input_sample, *output_sample; ULONG mp3dec_data_len, mp3enc_data_len; const BYTE *mp3dec_data, *mp3enc_data; @@ -4432,7 +4595,11 @@ static void test_mp3_decoder(void) ok(length == 0x9c0 || broken(length == mp3dec_block_size) /* win8 */ || broken(length == 0x900) /* win7 */, "got length %lu\n", length); ok(mp3dec_data_len > length, "got remaining length %lu\n", mp3dec_data_len); - if (length == 0x9c0) check_sample_pcm16(output_sample, mp3dec_data, output_file, FALSE); + if (length == 0x9c0) + { + check_sample_pcm16(output_sample, mp3dec_data, FALSE); + dump_mf_sample(output_sample, output_sample_desc + 0, output_file); + } mp3dec_data_len -= 0x9c0; mp3dec_data += 0x9c0;
@@ -4462,7 +4629,11 @@ static void test_mp3_decoder(void) "got length %lu\n", length); ok(mp3dec_data_len > length || broken(mp3dec_data_len == 2304 || mp3dec_data_len == 0) /* win7 */, "got remaining length %lu\n", mp3dec_data_len); - if (length == mp3dec_block_size) check_sample_pcm16(output_sample, mp3dec_data, output_file, FALSE); + if (length == mp3dec_block_size) + { + check_sample_pcm16(output_sample, mp3dec_data, FALSE); + dump_mf_sample(output_sample, output_sample_desc + 1, output_file); + } mp3dec_data += min(mp3dec_data_len, length); mp3dec_data_len -= min(mp3dec_data_len, length);
@@ -4482,7 +4653,8 @@ static void test_mp3_decoder(void) todo_wine ok(length == mp3dec_block_size || broken(length == 0) /* win7 */, "got length %lu\n", length); ok(mp3dec_data_len == mp3dec_block_size || broken(mp3dec_data_len == 0) /* win7 */, "got remaining length %lu\n", mp3dec_data_len); - check_sample_pcm16(output_sample, mp3dec_data, output_file, FALSE); + check_sample_pcm16(output_sample, mp3dec_data, FALSE); + dump_mf_sample(output_sample, output_sample_desc + 1, output_file); mp3dec_data_len -= length; mp3dec_data += length;
@@ -4509,7 +4681,10 @@ static void test_mp3_decoder(void) todo_wine ok(length == mp3dec_data_len, "got length %lu\n", length); if (length == mp3dec_data_len) - check_sample_pcm16(output_sample, mp3dec_data, output_file, FALSE); + { + check_sample_pcm16(output_sample, mp3dec_data, FALSE); + dump_mf_sample(output_sample, output_sample_desc + 1, output_file); + } }
trace("created %s\n", debugstr_w(output_path));
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=123698
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
mf: transform.c:3174: Test failed: resampler: got output[0].dwStatus 0
=== w7u_adm (32 bit report) ===
mf: transform.c:3174: Test failed: resampler: got output[0].dwStatus 0
=== w7u_el (32 bit report) ===
mf: transform.c:3174: Test failed: resampler: got output[0].dwStatus 0
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 510 +++++++++++++++++++------------------- 1 file changed, 249 insertions(+), 261 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index bd204185172..870d012d2a3 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -361,15 +361,119 @@ static HRESULT check_mft_process_output_(int line, IMFTransform *transform, IMFS return ret; }
+typedef DWORD (*compare_cb)(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect); + +static DWORD compare_nv12(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +{ + DWORD x, y, size, diff = 0, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; + + for (y = 0; y < height; y++, data += width, expect += width) + { + if (y < rect->top || y >= rect->bottom) continue; + for (x = 0; x < width; x++) + { + if (x < rect->left || x >= rect->right) continue; + diff += abs((int)expect[x] - (int)data[x]); + } + } + + for (y = 0; y < height; y += 2, data += width, expect += width) + { + if (y < rect->top || y >= rect->bottom) continue; + for (x = 0; x < width; x += 2) + { + if (x < rect->left || x >= rect->right) continue; + diff += abs((int)expect[x + 0] - (int)data[x + 0]); + diff += abs((int)expect[x + 1] - (int)data[x + 1]); + } + } + + size = (rect->right - rect->left) * (rect->bottom - rect->top) * 3 / 2; + return diff * 100 / 256 / size; +} + +static DWORD compare_i420(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +{ + DWORD i, x, y, size, diff = 0, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; + + for (y = 0; y < height; y++, data += width, expect += width) + { + if (y < rect->top || y >= rect->bottom) continue; + for (x = 0; x < width; x++) + { + if (x < rect->left || x >= rect->right) continue; + diff += abs((int)expect[x] - (int)data[x]); + } + } + + for (i = 0; i < 2; ++i) for (y = 0; y < height; y += 2, data += width / 2, expect += width / 2) + { + if (y < rect->top || y >= rect->bottom) continue; + for (x = 0; x < width; x += 2) + { + if (x < rect->left || x >= rect->right) continue; + diff += abs((int)expect[x / 2] - (int)data[x / 2]); + } + } + + size = (rect->right - rect->left) * (rect->bottom - rect->top) * 3 / 2; + return diff * 100 / 256 / size; +} + +static DWORD compare_rgb32(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +{ + DWORD x, y, size, diff = 0, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; + + for (y = 0; y < height; y++, data += width * 4, expect += width * 4) + { + if (y < rect->top || y >= rect->bottom) continue; + for (x = 0; x < width; x++) + { + if (x < rect->left || x >= rect->right) continue; + diff += abs((int)expect[4 * x + 0] - (int)data[4 * x + 0]); + diff += abs((int)expect[4 * x + 1] - (int)data[4 * x + 1]); + diff += abs((int)expect[4 * x + 2] - (int)data[4 * x + 2]); + } + } + + size = (rect->right - rect->left) * (rect->bottom - rect->top) * 3; + return diff * 100 / 256 / size; +} + +static DWORD compare_pcm16(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +{ + const INT16 *data_pcm = (INT16 *)data, *expect_pcm = (INT16 *)expect; + DWORD i, size = length / 2, diff = 0; + + for (i = 0; i < size; i++) + diff += abs((int)*expect_pcm++ - (int)*data_pcm++); + + return diff * 100 / 65536 / size; +} + +static DWORD compare_bytes(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +{ + DWORD i, diff = 0; + + for (i = 0; i < length; i++) + diff += abs((int)*expect++ - (int)*data++); + + return diff * 100 / 256 / length; +} + struct buffer_desc { DWORD length; + BOOL todo_length; + compare_cb compare; + RECT rect; };
struct sample_desc { DWORD buffer_count; const struct buffer_desc *buffers; + BOOL todo_length; };
typedef void (*enum_mf_media_buffers_cb)(IMFMediaBuffer *buffer, const struct buffer_desc *desc, void *context); @@ -417,6 +521,83 @@ static void dump_mf_sample(IMFSample *sample, const struct sample_desc *sample_d enum_mf_media_buffers(sample, sample_desc, dump_mf_media_buffer, output); }
+#define check_mf_media_buffer(a, b, c) check_mf_media_buffer_(__LINE__, a, b, c) +static DWORD check_mf_media_buffer_(int line, IMFMediaBuffer *buffer, const struct buffer_desc *expect, + const BYTE **expect_data, DWORD *expect_data_len) +{ + DWORD length, diff = 0; + HRESULT hr; + BYTE *data; + + hr = IMFMediaBuffer_Lock(buffer, &data, NULL, &length); + ok_(__FILE__, line)(hr == S_OK, "Lock returned %#lx\n", hr); + todo_wine_if(expect->todo_length) + ok_(__FILE__, line)(length == expect->length, "got length %#lx\n", length); + + if (*expect_data_len < length) + todo_wine_if(expect->todo_length) + ok_(__FILE__, line)(0, "missing %#lx bytes\n", length - *expect_data_len); + else if (!expect->compare) + diff = compare_bytes(data, length, NULL, *expect_data); + else + diff = expect->compare(data, length, &expect->rect, *expect_data); + + hr = IMFMediaBuffer_Unlock(buffer); + ok_(__FILE__, line)(hr == S_OK, "Unlock returned %#lx\n", hr); + + *expect_data = *expect_data + min(length, *expect_data_len); + *expect_data_len = *expect_data_len - min(length, *expect_data_len); + + return diff; +} + +struct check_mf_sample_context +{ + DWORD total_length; + const BYTE *data; + DWORD data_len; + DWORD diff; + int line; +}; + +static void check_mf_sample_buffer(IMFMediaBuffer *buffer, const struct buffer_desc *expect, void *context) +{ + struct check_mf_sample_context *ctx = context; + ctx->diff += check_mf_media_buffer_(ctx->line, buffer, expect, &ctx->data, &ctx->data_len); + ctx->total_length += expect->length; +} + +#define check_mf_sample(a, b, c, d) check_mf_sample_(__LINE__, a, b, c, d) +static DWORD check_mf_sample_(int line, IMFSample *sample, const struct sample_desc *expect, + const BYTE **expect_data, DWORD *expect_data_len) +{ + struct check_mf_sample_context ctx = {.data = *expect_data, .data_len = *expect_data_len, .line = line}; + DWORD buffer_count, total_length; + HRESULT hr; + + buffer_count = 0xdeadbeef; + hr = IMFSample_GetBufferCount(sample, &buffer_count); + ok_(__FILE__, line)(hr == S_OK, "GetBufferCount returned %#lx\n", hr); + ok_(__FILE__, line)(buffer_count == expect->buffer_count, + "got %lu buffers\n", buffer_count); + + enum_mf_media_buffers(sample, expect, check_mf_sample_buffer, &ctx); + + total_length = 0xdeadbeef; + hr = IMFSample_GetTotalLength(sample, &total_length); + ok_(__FILE__, line)(hr == S_OK, "GetTotalLength returned %#lx\n", hr); + todo_wine_if(expect->todo_length) + ok_(__FILE__, line)(total_length == ctx.total_length, + "got total length %#lx\n", total_length); + ok_(__FILE__, line)(*expect_data_len >= ctx.total_length, + "missing %#lx data\n", ctx.total_length - *expect_data_len); + + *expect_data = *expect_data + min(total_length, *expect_data_len); + *expect_data_len = *expect_data_len - min(total_length, *expect_data_len); + + return ctx.diff / buffer_count; +} + static HRESULT WINAPI test_unk_QueryInterface(IUnknown *iface, REFIID riid, void **obj) { if (IsEqualIID(riid, &IID_IUnknown)) @@ -967,90 +1148,6 @@ static IMFSample *create_sample(const BYTE *data, ULONG size) return sample; }
-#define check_sample(a, b) check_sample_(__LINE__, a, b) -static void check_sample_(int line, IMFSample *sample, const BYTE *expect_buf) -{ - IMFMediaBuffer *media_buffer; - DWORD 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); - ok_(__FILE__, line)(!memcmp(expect_buf, buffer, length), "unexpected buffer data\n"); - 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); -} - -#define check_sample_rgb32(a, b) check_sample_rgb32_(__LINE__, a, b) -static void check_sample_rgb32_(int line, IMFSample *sample, const BYTE *expect_buf) -{ - DWORD i, length, diff = 0, max_diff; - IMFMediaBuffer *media_buffer; - 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 pretty big - * differences with the color converter between ffmpeg and native. - */ - for (i = 0; i < length; i++) - { - if (i % 4 == 3) continue; /* ignore alpha diff */ - if (!expect_buf[(i & ~3) + 3]) continue; /* ignore transparent pixels */ - diff += abs((int)expect_buf[i] - (int)buffer[i]); - } - max_diff = length * 3 * 256; - ok_(__FILE__, line)(diff * 100 / max_diff == 0, "unexpected buffer data\n"); - - 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); -} - -#define check_sample_pcm16(a, b, c) check_sample_pcm16_(__LINE__, a, b, c) -static void check_sample_pcm16_(int line, IMFSample *sample, const BYTE *expect_buf, 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 && i < length / 2) - ok_(__FILE__, line)(i == length, "unexpected buffer data\n"); - - 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 aac_codec_data[14] = {0x00,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x08};
static void test_aac_encoder(void) @@ -1636,14 +1733,12 @@ static void test_wma_encoder(void) winetest_push_context("%lu", i); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - 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(output_sample, wmaenc_data + i * wmaenc_block_size); + ret = check_mf_sample(output_sample, output_sample_desc, &wmaenc_data, &wmaenc_data_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, output_sample_desc, output_file); winetest_pop_context(); } + ok(wmaenc_data_len == 0, "missing %#lx bytes\n", wmaenc_data_len); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); ret = IMFSample_Release(output_sample); @@ -1784,8 +1879,8 @@ static void test_wma_decoder(void)
const struct buffer_desc output_buffer_desc[] = { - {.length = wmadec_block_size}, - {.length = wmadec_block_size / 2}, + {.length = wmadec_block_size, .compare = compare_pcm16}, + {.length = wmadec_block_size / 2, .compare = compare_pcm16, .todo_length = TRUE}, }; const struct sample_desc output_sample_desc[] = { @@ -1793,7 +1888,7 @@ static void test_wma_decoder(void) .buffer_count = 1, .buffers = output_buffer_desc + 0, }, { - .buffer_count = 1, .buffers = output_buffer_desc + 1, + .buffer_count = 1, .buffers = output_buffer_desc + 1, .todo_length = TRUE }, };
@@ -1993,8 +2088,6 @@ static void test_wma_decoder(void) hr = IMFSample_GetUINT32(output_sample, &MFSampleExtension_CleanPoint, &value); ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); ok(value == 1, "got MFSampleExtension_CleanPoint %u\n", value); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); flags = 0xdeadbeef; hr = IMFSample_GetSampleFlags(output_sample, &flags); ok(hr == S_OK, "GetSampleFlags returned %#lx\n", hr); @@ -2010,29 +2103,23 @@ static void test_wma_decoder(void) if (output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE) { ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - ok(length == wmadec_block_size, "got length %lu\n", length); ok(duration == 928798, "got duration %I64d\n", duration); - check_sample_pcm16(output_sample, wmadec_data, TRUE); + ret = check_mf_sample(output_sample, output_sample_desc + 0, &wmadec_data, &wmadec_data_len); + todo_wine_if(ret > 0 && ret <= 10) /* ffmpeg sometimes offsets the decoded data */ + ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, output_sample_desc + 0, output_file); - wmadec_data += wmadec_block_size; - wmadec_data_len -= wmadec_block_size; } else { ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); /* 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(output_sample, wmadec_data, FALSE); - dump_mf_sample(output_sample, output_sample_desc + 1, output_file); - } - wmadec_data += length; - wmadec_data_len -= length; + ret = check_mf_sample(output_sample, output_sample_desc + 1, &wmadec_data, &wmadec_data_len); + todo_wine_if(ret > 0 && ret <= 10) /* ffmpeg sometimes offsets the decoded data */ + ok(ret == 0, "Unexpected %lu%% diff\n", ret); + dump_mf_sample(output_sample, output_sample_desc + 1, output_file); } ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret); @@ -2045,7 +2132,7 @@ static void test_wma_decoder(void) /* some FFmpeg version request more input to complete decoding */ if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT && i == 2) break; } - todo_wine + todo_wine_if(wmadec_data_len == 0x1000) ok(wmadec_data_len == 0, "missing %#lx bytes\n", wmadec_data_len);
trace("created %s\n", debugstr_w(output_path)); @@ -2345,6 +2432,7 @@ static void test_h264_decoder(void) const struct buffer_desc output_buffer_desc_nv12 = { .length = actual_width * actual_height * 3 / 2, + .compare = compare_nv12, .rect = {.right = 82, .bottom = 84}, }; const struct sample_desc output_sample_desc_nv12 = { @@ -2353,6 +2441,7 @@ static void test_h264_decoder(void) const struct buffer_desc output_buffer_desc_i420 = { .length = actual_width * actual_height * 3 / 2, + .compare = compare_i420, .rect = {.right = 82, .bottom = 84}, }; const struct sample_desc output_sample_desc_i420 = { @@ -2366,9 +2455,8 @@ static void test_h264_decoder(void) DWORD input_id, output_id, input_count, output_count; IMFSample *input_sample, *output_sample; MFT_OUTPUT_STREAM_INFO output_info; - DWORD length, count, output_status; MFT_INPUT_STREAM_INFO input_info; - IMFMediaBuffer *media_buffer; + DWORD length, output_status; WCHAR output_path[MAX_PATH]; IMFAttributes *attributes; IMFMediaType *media_type; @@ -2377,7 +2465,6 @@ static void test_h264_decoder(void) ULONG i, ret, flags; HANDLE output_file; UINT32 value; - BYTE *data; HRESULT hr;
hr = CoInitialize(NULL); @@ -2651,11 +2738,6 @@ static void test_h264_decoder(void) ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); ok(value == 1, "got MFSampleExtension_CleanPoint %u\n", value);
- count = 0xdeadbeef; - hr = IMFSample_GetBufferCount(output_sample, &count); - ok(hr == S_OK, "GetBufferCount returned %#lx\n", hr); - ok(count == 1, "got count %#lx\n", count); - flags = 0xdeadbeef; hr = IMFSample_GetSampleFlags(output_sample, &flags); ok(hr == S_OK, "GetSampleFlags returned %#lx\n", hr); @@ -2672,27 +2754,8 @@ static void test_h264_decoder(void) ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); 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. */ - hr = IMFSample_ConvertToContiguousBuffer(output_sample, &media_buffer); - ok(hr == S_OK, "ConvertToContiguousBuffer returned %#lx\n", hr); - hr = IMFMediaBuffer_Lock(media_buffer, &data, NULL, &length); - ok(hr == S_OK, "Lock returned %#lx\n", hr); - ok(length == nv12_frame_len, "got length %lu\n", length); - - for (i = 0; i < actual_aperture.Area.cy; ++i) - { - memset(data + actual_width * i + actual_aperture.Area.cx, 0xcd, actual_width - actual_aperture.Area.cx); - memset(data + actual_width * (actual_height + i / 2) + actual_aperture.Area.cx, 0xcd, actual_width - actual_aperture.Area.cx); - } - memset(data + actual_width * actual_aperture.Area.cy, 0xcd, (actual_height - actual_aperture.Area.cy) * actual_width); - memset(data + actual_width * (actual_height + actual_aperture.Area.cy / 2), 0xcd, (actual_height - actual_aperture.Area.cy) / 2 * actual_width); - - hr = IMFMediaBuffer_Unlock(media_buffer); - ok(hr == S_OK, "Unlock returned %#lx\n", hr); - IMFMediaBuffer_Release(media_buffer); - - check_sample(output_sample, nv12_frame_data); + ret = check_mf_sample(output_sample, &output_sample_desc_nv12, &nv12_frame_data, &nv12_frame_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, &output_sample_desc_nv12, output_file);
ret = IMFSample_Release(output_sample); @@ -2770,33 +2833,8 @@ static void test_h264_decoder(void) ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); 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. */ - hr = IMFSample_ConvertToContiguousBuffer(output_sample, &media_buffer); - ok(hr == S_OK, "ConvertToContiguousBuffer returned %#lx\n", hr); - hr = IMFMediaBuffer_Lock(media_buffer, &data, NULL, &length); - ok(hr == S_OK, "Lock returned %#lx\n", hr); - ok(length == i420_frame_len, "got length %lu\n", length); - - for (i = 0; i < actual_aperture.Area.cy; ++i) - { - memset(data + actual_width * i + actual_aperture.Area.cx, 0xcd, actual_width - actual_aperture.Area.cx); - memset(data + actual_width * actual_height + actual_width / 2 * i + actual_aperture.Area.cx / 2, 0xcd, - actual_width / 2 - actual_aperture.Area.cx / 2); - memset(data + actual_width * actual_height + actual_width / 2 * (actual_height / 2 + i) + actual_aperture.Area.cx / 2, 0xcd, - actual_width / 2 - actual_aperture.Area.cx / 2); - } - memset(data + actual_width * actual_aperture.Area.cy, 0xcd, (actual_height - actual_aperture.Area.cy) * actual_width); - memset(data + actual_width * actual_height + actual_width / 2 * actual_aperture.Area.cy / 2, 0xcd, - (actual_height - actual_aperture.Area.cy) / 2 * actual_width / 2); - memset(data + actual_width * actual_height + actual_width / 2 * (actual_height / 2 + actual_aperture.Area.cy / 2), 0xcd, - (actual_height - actual_aperture.Area.cy) / 2 * actual_width / 2); - - hr = IMFMediaBuffer_Unlock(media_buffer); - ok(hr == S_OK, "Unlock returned %#lx\n", hr); - IMFMediaBuffer_Release(media_buffer); - - check_sample(output_sample, i420_frame_data); + ret = check_mf_sample(output_sample, &output_sample_desc_i420, &i420_frame_data, &i420_frame_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, &output_sample_desc_i420, output_file);
ret = IMFSample_Release(output_sample); @@ -2932,9 +2970,9 @@ static void test_audio_convert(void) static const ULONG audioconv_block_size = 0x4000; const struct buffer_desc output_buffer_desc[] = { - {.length = audioconv_block_size}, - {.length = 0x3dd8}, - {.length = 0xfc}, + {.length = audioconv_block_size, .compare = compare_pcm16}, + {.length = 0x3dd8, .compare = compare_pcm16, .todo_length = TRUE}, + {.length = 0xfc, .compare = compare_pcm16}, }; const struct sample_desc output_sample_desc[] = { @@ -2942,7 +2980,7 @@ static void test_audio_convert(void) .buffer_count = 1, .buffers = output_buffer_desc + 0, }, { - .buffer_count = 1, .buffers = output_buffer_desc + 1, + .buffer_count = 1, .buffers = output_buffer_desc + 1, .todo_length = TRUE, }, { .buffer_count = 1, .buffers = output_buffer_desc + 2, @@ -3133,14 +3171,10 @@ static void test_audio_convert(void) hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 928798, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - ok(length == audioconv_block_size, "got length %lu\n", length); - ok(audioconv_data_len > audioconv_block_size, "got remaining length %lu\n", audioconv_data_len); - check_sample_pcm16(output_sample, audioconv_data, FALSE); + + ret = check_mf_sample(output_sample, output_sample_desc + 0, &audioconv_data, &audioconv_data_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, output_sample_desc + 0, output_file); - audioconv_data_len -= audioconv_block_size; - audioconv_data += audioconv_block_size;
winetest_pop_context(); i++; @@ -3153,15 +3187,10 @@ static void test_audio_convert(void) ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); todo_wine ok(duration == 897506, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - todo_wine - ok(length == 15832, "got length %lu\n", length); - ok(audioconv_data_len == 16084, "got remaining length %lu\n", audioconv_data_len); - check_sample_pcm16(output_sample, audioconv_data, FALSE); + + ret = check_mf_sample(output_sample, output_sample_desc + 1, &audioconv_data, &audioconv_data_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, output_sample_desc + 1, output_file); - audioconv_data_len -= length; - audioconv_data += length;
ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret); @@ -3183,16 +3212,13 @@ static void test_audio_convert(void) ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); todo_wine ok(duration == 14286, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - todo_wine - ok(length == audioconv_data_len, "got length %lu\n", length); - if (length == audioconv_data_len) - { - check_sample_pcm16(output_sample, audioconv_data, FALSE); - dump_mf_sample(output_sample, output_sample_desc + 2, output_file); - } + + ret = check_mf_sample(output_sample, output_sample_desc + 2, &audioconv_data, &audioconv_data_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); + dump_mf_sample(output_sample, output_sample_desc + 2, output_file); } + todo_wine + ok(audioconv_data_len == 0, "missing %#lx bytes\n", audioconv_data_len);
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file); @@ -3386,6 +3412,7 @@ static void test_color_convert(void) const struct buffer_desc output_buffer_desc = { .length = actual_width * actual_height * 4, + .compare = compare_rgb32, .rect = {.right = 82, .bottom = 84}, }; const struct sample_desc output_sample_desc = { @@ -3545,13 +3572,10 @@ static void test_color_convert(void) hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 10000000, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - ok(length == output_info.cbSize, "got length %lu\n", length); - check_sample_rgb32(output_sample, rgb32_data); + + ret = check_mf_sample(output_sample, &output_sample_desc, &rgb32_data, &rgb32_data_len); + ok(ret <= 4 /* small and harmless differences in Wine vs Windows */, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, &output_sample_desc, output_file); - rgb32_data_len -= output_info.cbSize; - rgb32_data += output_info.cbSize;
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file); @@ -3741,6 +3765,7 @@ static void test_video_processor(void) const struct buffer_desc output_buffer_desc = { .length = actual_width * actual_height * 4, + .compare = compare_rgb32, .rect = {.top = 12, .right = 82, .bottom = 96}, }; const struct sample_desc output_sample_desc = { @@ -3766,7 +3791,6 @@ static void test_video_processor(void) IMFMediaEvent *event; unsigned int value; HANDLE output_file; - BYTE *ptr, tmp; UINT32 count; HRESULT hr; ULONG ret; @@ -4231,31 +4255,11 @@ todo_wine { hr = IMFSample_GetSampleDuration(output_sample, &duration); ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 10000000, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - ok(length == output_info.cbSize, "got length %lu\n", length);
- hr = IMFSample_ConvertToContiguousBuffer(output_sample, &buffer); - ok(hr == S_OK, "ConvertToContiguousBuffer returned %#lx\n", hr); - hr = IMFMediaBuffer_Lock(buffer, &ptr, NULL, &length); - ok(hr == S_OK, "Lock returned %#lx\n", hr); - tmp = *ptr; - hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Lock returned %#lx\n", hr); - IMFMediaBuffer_Release(buffer); - - /* w1064v1809 ignores MF_MT_MINIMUM_DISPLAY_APERTURE and resizes the frame */ - todo_wine - ok(tmp == 0xcd || broken(tmp == 0x00), "got %#x\n", tmp); - if (tmp == 0x00) - win_skip("Frame got resized, skipping output comparison\n"); - else if (tmp == 0xcd) /* Wine doesn't flip the frame, yet */ - { - check_sample_rgb32(output_sample, rgb32_data); - dump_mf_sample(output_sample, &output_sample_desc, output_file); - } - rgb32_data_len -= output_info.cbSize; - rgb32_data += output_info.cbSize; + ret = check_mf_sample(output_sample, &output_sample_desc, &rgb32_data, &rgb32_data_len); + todo_wine /* Wine doesn't flip the frame, yet */ + ok(ret == 0 || broken(ret == 25) /* w1064v1507 / w1064v1809 incorrectly rescale */, "got %lu%% diff\n", ret); + dump_mf_sample(output_sample, &output_sample_desc, output_file);
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file); @@ -4408,8 +4412,8 @@ static void test_mp3_decoder(void) static const ULONG mp3dec_block_size = 0x1200; const struct buffer_desc output_buffer_desc[] = { - {.length = 0x9c0}, - {.length = mp3dec_block_size}, + {.length = 0x9c0, .compare = compare_pcm16}, + {.length = mp3dec_block_size, .compare = compare_pcm16}, }; const struct sample_desc output_sample_desc[] = { @@ -4594,14 +4598,15 @@ static void test_mp3_decoder(void) ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0x9c0 || broken(length == mp3dec_block_size) /* win8 */ || broken(length == 0x900) /* win7 */, "got length %lu\n", length); - ok(mp3dec_data_len > length, "got remaining length %lu\n", mp3dec_data_len); - if (length == 0x9c0) + if (broken(length != 0x9c0)) { - check_sample_pcm16(output_sample, mp3dec_data, FALSE); - dump_mf_sample(output_sample, output_sample_desc + 0, output_file); + win_skip("Skipping MP3 decoder output sample checks on Win7 / Win8\n"); + goto skip_mp3dec_output; } - mp3dec_data_len -= 0x9c0; - mp3dec_data += 0x9c0; + + ret = check_mf_sample(output_sample, output_sample_desc + 0, &mp3dec_data, &mp3dec_data_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); + dump_mf_sample(output_sample, output_sample_desc + 0, output_file);
i = duration; while (SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status))) @@ -4623,19 +4628,10 @@ static void test_mp3_decoder(void) ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); ok(duration == 522449 || broken(261225 - duration <= 1) /* win7 */, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - ok(length == mp3dec_block_size || broken(length == 0x900) /* win7 */, - "got length %lu\n", length); - ok(mp3dec_data_len > length || broken(mp3dec_data_len == 2304 || mp3dec_data_len == 0) /* win7 */, - "got remaining length %lu\n", mp3dec_data_len); - if (length == mp3dec_block_size) - { - check_sample_pcm16(output_sample, mp3dec_data, FALSE); - dump_mf_sample(output_sample, output_sample_desc + 1, output_file); - } - mp3dec_data += min(mp3dec_data_len, length); - mp3dec_data_len -= min(mp3dec_data_len, length); + + ret = check_mf_sample(output_sample, output_sample_desc + 1, &mp3dec_data, &mp3dec_data_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); + dump_mf_sample(output_sample, output_sample_desc + 1, output_file);
winetest_pop_context(); i += duration; @@ -4648,15 +4644,10 @@ static void test_mp3_decoder(void) ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); todo_wine ok(duration == 522449 || broken(261225 - duration <= 1) /* win7 */, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - todo_wine - ok(length == mp3dec_block_size || broken(length == 0) /* win7 */, "got length %lu\n", length); - ok(mp3dec_data_len == mp3dec_block_size || broken(mp3dec_data_len == 0) /* win7 */, "got remaining length %lu\n", mp3dec_data_len); - check_sample_pcm16(output_sample, mp3dec_data, FALSE); + + ret = check_mf_sample(output_sample, output_sample_desc + 1, &mp3dec_data, &mp3dec_data_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, output_sample_desc + 1, output_file); - mp3dec_data_len -= length; - mp3dec_data += length;
IMFSample_Release(output_sample);
@@ -4676,20 +4667,17 @@ static void test_mp3_decoder(void) ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); todo_wine ok(duration == 14286, "got duration %I64d\n", duration); - hr = IMFSample_GetTotalLength(output_sample, &length); - ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - todo_wine - ok(length == mp3dec_data_len, "got length %lu\n", length); - if (length == mp3dec_data_len) - { - check_sample_pcm16(output_sample, mp3dec_data, FALSE); - dump_mf_sample(output_sample, output_sample_desc + 1, output_file); - } + + ret = check_mf_sample(output_sample, output_sample_desc + 1, &mp3dec_data, &mp3dec_data_len); + ok(ret == 0, "Unexpected %lu%% diff\n", ret); + dump_mf_sample(output_sample, output_sample_desc + 1, output_file); } + ok(mp3dec_data_len == 0, "missing %#lx bytes\n", mp3dec_data_len);
trace("created %s\n", debugstr_w(output_path)); CloseHandle(output_file);
+skip_mp3dec_output: ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=123699
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
mf: transform.c:3203: Test failed: resampler: got output[0].dwStatus 0 transform.c:3221: Test failed: resampler: missing 0xfc bytes transform.c:4686: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4687: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4690: Test failed: mp3dec: got length 2304
=== w7u_adm (32 bit report) ===
mf: transform.c:3203: Test failed: resampler: got output[0].dwStatus 0 transform.c:3221: Test failed: resampler: missing 0xfc bytes transform.c:4686: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4687: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4690: Test failed: mp3dec: got length 2304
=== w7u_el (32 bit report) ===
mf: transform.c:3203: Test failed: resampler: got output[0].dwStatus 0 transform.c:3221: Test failed: resampler: missing 0xfc bytes transform.c:4686: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4687: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4690: Test failed: mp3dec: got length 2304
=== w8 (32 bit report) ===
mf: transform.c:4686: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4687: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4690: Test failed: mp3dec: got length 4608
=== w8adm (32 bit report) ===
mf: transform.c:4686: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4687: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4690: Test failed: mp3dec: got length 4608
=== w864 (32 bit report) ===
mf: transform.c:4686: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4687: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4690: Test failed: mp3dec: got length 4608
=== w864 (64 bit report) ===
mf: transform.c:4686: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4687: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4690: Test failed: mp3dec: got length 4608
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/transform.c | 311 +++++++++++++++++++------------------- 1 file changed, 158 insertions(+), 153 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 870d012d2a3..9e00976242b 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -49,6 +49,8 @@ DEFINE_GUID(MFAudioFormat_RAW_AAC1,WAVE_FORMAT_RAW_AAC1,0x0000,0x0010,0x80,0x00, DEFINE_GUID(MFVideoFormat_ABGR32,0x00000020,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71); DEFINE_GUID(MFVideoFormat_P208,0x38303250,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71);
+DEFINE_GUID(mft_output_sample_incomplete,0xffffff,0xffff,0xffff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff); + static void load_resource(const WCHAR *filename, const BYTE **data, DWORD *length) { HRSRC resource = FindResourceW(NULL, filename, (const WCHAR *)RT_RCDATA); @@ -356,7 +358,19 @@ static HRESULT check_mft_process_output_(int line, IMFTransform *transform, IMFS ok_(__FILE__, line)(status == MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS, "got status %#lx\n", status); else + { + if (*output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE) + { + hr = IMFSample_SetUINT32(output_sample, &mft_output_sample_incomplete, 1); + ok_(__FILE__, line)(hr == S_OK, "SetUINT32 returned %#lx\n", hr); + } + else + { + hr = IMFSample_DeleteItem(output_sample, &mft_output_sample_incomplete); + ok_(__FILE__, line)(hr == S_OK, "DeleteItem returned %#lx\n", hr); + } ok_(__FILE__, line)(status == 0, "got status %#lx\n", status); + }
return ret; } @@ -471,6 +485,9 @@ struct buffer_desc
struct sample_desc { + const struct attribute_desc *attributes; + LONGLONG sample_time; + LONGLONG sample_duration; DWORD buffer_count; const struct buffer_desc *buffers; BOOL todo_length; @@ -572,15 +589,38 @@ static DWORD check_mf_sample_(int line, IMFSample *sample, const struct sample_d const BYTE **expect_data, DWORD *expect_data_len) { struct check_mf_sample_context ctx = {.data = *expect_data, .data_len = *expect_data_len, .line = line}; - DWORD buffer_count, total_length; + DWORD buffer_count, total_length, sample_flags; + LONGLONG timestamp; HRESULT hr;
+ if (expect->attributes) + check_attributes_(line, (IMFAttributes *)sample, expect->attributes, -1); + buffer_count = 0xdeadbeef; hr = IMFSample_GetBufferCount(sample, &buffer_count); ok_(__FILE__, line)(hr == S_OK, "GetBufferCount returned %#lx\n", hr); ok_(__FILE__, line)(buffer_count == expect->buffer_count, "got %lu buffers\n", buffer_count);
+ sample_flags = 0xdeadbeef; + hr = IMFSample_GetSampleFlags(sample, &sample_flags); + ok_(__FILE__, line)(hr == S_OK, "GetSampleFlags returned %#lx\n", hr); + ok_(__FILE__, line)(sample_flags == 0, + "got sample flags %#lx\n", sample_flags); + + timestamp = 0xdeadbeef; + hr = IMFSample_GetSampleTime(sample, ×tamp); + ok_(__FILE__, line)(hr == S_OK, "GetSampleTime returned %#lx\n", hr); + ok_(__FILE__, line)(llabs(timestamp - expect->sample_time) <= 50, + "got sample time %I64d\n", timestamp); + + timestamp = 0xdeadbeef; + hr = IMFSample_GetSampleDuration(sample, ×tamp); + ok_(__FILE__, line)(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); + todo_wine_if(expect->todo_length) + ok_(__FILE__, line)(llabs(timestamp - expect->sample_duration) <= 1, + "got sample duration %I64d\n", timestamp); + enum_mf_media_buffers(sample, expect, check_mf_sample_buffer, &ctx);
total_length = 0xdeadbeef; @@ -1621,9 +1661,27 @@ static void test_wma_encoder(void) { {.length = wmaenc_block_size}, }; + const struct attribute_desc output_sample_attributes[] = + { + ATTR_UINT32(mft_output_sample_incomplete, 1), + ATTR_UINT32(MFSampleExtension_CleanPoint, 1), + {0}, + }; const struct sample_desc output_sample_desc[] = { { + .attributes = output_sample_attributes, + .sample_time = 0, .sample_duration = 3250794, + .buffer_count = 1, .buffers = output_buffer_desc, + }, + { + .attributes = output_sample_attributes, + .sample_time = 3250794, .sample_duration = 3715193, + .buffer_count = 1, .buffers = output_buffer_desc, + }, + { + .attributes = output_sample_attributes, + .sample_time = 6965986, .sample_duration = 3366893, .buffer_count = 1, .buffers = output_buffer_desc, }, }; @@ -1733,9 +1791,9 @@ static void test_wma_encoder(void) winetest_push_context("%lu", i); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - ret = check_mf_sample(output_sample, output_sample_desc, &wmaenc_data, &wmaenc_data_len); + ret = check_mf_sample(output_sample, output_sample_desc + i, &wmaenc_data, &wmaenc_data_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc, output_file); + dump_mf_sample(output_sample, output_sample_desc + i, output_file); winetest_pop_context(); } ok(wmaenc_data_len == 0, "missing %#lx bytes\n", wmaenc_data_len); @@ -1882,13 +1940,39 @@ static void test_wma_decoder(void) {.length = wmadec_block_size, .compare = compare_pcm16}, {.length = wmadec_block_size / 2, .compare = compare_pcm16, .todo_length = TRUE}, }; + const struct attribute_desc output_sample_attributes[] = + { + ATTR_UINT32(mft_output_sample_incomplete, 1), + ATTR_UINT32(MFSampleExtension_CleanPoint, 1), + {0}, + }; + const struct attribute_desc output_sample_attributes_todo[] = + { + ATTR_UINT32(mft_output_sample_incomplete, 1, .todo = TRUE), + ATTR_UINT32(MFSampleExtension_CleanPoint, 1), + {0}, + }; const struct sample_desc output_sample_desc[] = { { + .attributes = output_sample_attributes + 0, + .sample_time = 0, .sample_duration = 928798, .buffer_count = 1, .buffers = output_buffer_desc + 0, }, { - .buffer_count = 1, .buffers = output_buffer_desc + 1, .todo_length = TRUE + .attributes = output_sample_attributes + 0, + .sample_time = 928798, .sample_duration = 928798, + .buffer_count = 1, .buffers = output_buffer_desc + 0, + }, + { + .attributes = output_sample_attributes_todo + 0, + .sample_time = 1857596, .sample_duration = 928798, + .buffer_count = 1, .buffers = output_buffer_desc + 0, + }, + { + .attributes = output_sample_attributes + 1, /* not MFT_OUTPUT_DATA_BUFFER_INCOMPLETE */ + .sample_time = 2786394, .sample_duration = 464399, + .buffer_count = 1, .buffers = output_buffer_desc + 1, .todo_length = TRUE, }, };
@@ -1899,17 +1983,15 @@ static void test_wma_decoder(void) ULONG wmadec_data_len, wmaenc_data_len; const BYTE *wmadec_data, *wmaenc_data; MFT_OUTPUT_STREAM_INFO output_info; - DWORD flags, length, output_status; MFT_INPUT_STREAM_INFO input_info; + DWORD length, output_status; WCHAR output_path[MAX_PATH]; IMediaObject *media_object; IPropertyBag *property_bag; IMFMediaType *media_type; IMFTransform *transform; - LONGLONG time, duration; HANDLE output_file; ULONG i, ret, ref; - UINT32 value; HRESULT hr;
hr = CoInitialize(NULL); @@ -2082,44 +2164,24 @@ static void test_wma_decoder(void) for (i = 0; i < 4; ++i) { winetest_push_context("%lu", i); - ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - value = 0xdeadbeef; - hr = IMFSample_GetUINT32(output_sample, &MFSampleExtension_CleanPoint, &value); - ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); - ok(value == 1, "got MFSampleExtension_CleanPoint %u\n", value); - flags = 0xdeadbeef; - hr = IMFSample_GetSampleFlags(output_sample, &flags); - ok(hr == S_OK, "GetSampleFlags returned %#lx\n", hr); - ok(flags == 0, "got flags %#lx\n", flags); - time = 0xdeadbeef; - hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == i * 928798, "got time %I64d\n", time); - duration = 0xdeadbeef; - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - - if (output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE) + if (!strcmp(winetest_platform, "wine") && i == 2 && (output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)) + todo_wine ok(0, "skipping bogus sample check\n"); + else if (output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE) { ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - ok(duration == 928798, "got duration %I64d\n", duration); - ret = check_mf_sample(output_sample, output_sample_desc + 0, &wmadec_data, &wmadec_data_len); + ret = check_mf_sample(output_sample, output_sample_desc + i, &wmadec_data, &wmadec_data_len); todo_wine_if(ret > 0 && ret <= 10) /* ffmpeg sometimes offsets the decoded data */ ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 0, output_file); + dump_mf_sample(output_sample, output_sample_desc + i, output_file); } else { ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); - /* FFmpeg doesn't seem to decode WMA buffers in the same way as native */ - todo_wine - ok(duration == 464399, "got duration %I64d\n", duration); - - ret = check_mf_sample(output_sample, output_sample_desc + 1, &wmadec_data, &wmadec_data_len); + ret = check_mf_sample(output_sample, output_sample_desc + i, &wmadec_data, &wmadec_data_len); todo_wine_if(ret > 0 && ret <= 10) /* ffmpeg sometimes offsets the decoded data */ ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 1, output_file); + dump_mf_sample(output_sample, output_sample_desc + i, output_file); } ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret); @@ -2429,6 +2491,11 @@ static void test_h264_decoder(void) }, };
+ const struct attribute_desc output_sample_attributes[] = + { + ATTR_UINT32(MFSampleExtension_CleanPoint, 1), + {0}, + }; const struct buffer_desc output_buffer_desc_nv12 = { .length = actual_width * actual_height * 3 / 2, @@ -2436,6 +2503,8 @@ static void test_h264_decoder(void) }; const struct sample_desc output_sample_desc_nv12 = { + .attributes = output_sample_attributes, + .sample_time = 0, .sample_duration = 333667, .buffer_count = 1, .buffers = &output_buffer_desc_nv12, }; const struct buffer_desc output_buffer_desc_i420 = @@ -2445,6 +2514,8 @@ static void test_h264_decoder(void) }; const struct sample_desc output_sample_desc_i420 = { + .attributes = output_sample_attributes, + .sample_time = 333667, .sample_duration = 333667, .buffer_count = 1, .buffers = &output_buffer_desc_i420, };
@@ -2460,11 +2531,9 @@ static void test_h264_decoder(void) WCHAR output_path[MAX_PATH]; IMFAttributes *attributes; IMFMediaType *media_type; - LONGLONG time, duration; IMFTransform *transform; ULONG i, ret, flags; HANDLE output_file; - UINT32 value; HRESULT hr;
hr = CoInitialize(NULL); @@ -2734,26 +2803,6 @@ static void test_h264_decoder(void) ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
- hr = IMFSample_GetUINT32(output_sample, &MFSampleExtension_CleanPoint, &value); - ok(hr == S_OK, "GetUINT32 MFSampleExtension_CleanPoint returned %#lx\n", hr); - ok(value == 1, "got MFSampleExtension_CleanPoint %u\n", value); - - flags = 0xdeadbeef; - hr = IMFSample_GetSampleFlags(output_sample, &flags); - ok(hr == S_OK, "GetSampleFlags returned %#lx\n", hr); - ok(flags == 0, "got flags %#lx\n", flags); - - time = 0xdeadbeef; - hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == 0, "got time %I64d\n", time); - - /* doesn't matter what frame rate we've selected, duration is defined by the stream */ - duration = 0xdeadbeef; - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - ok(duration - 333666 <= 2, "got duration %I64d\n", duration); - ret = check_mf_sample(output_sample, &output_sample_desc_nv12, &nv12_frame_data, &nv12_frame_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, &output_sample_desc_nv12, output_file); @@ -2823,16 +2872,6 @@ static void test_h264_decoder(void) ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
- hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - todo_wine_if(time == 1334666) /* when VA-API plugin is used */ - ok(time - 333666 <= 2, "got time %I64d\n", time); - - duration = 0xdeadbeef; - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - ok(duration - 333666 <= 2, "got duration %I64d\n", duration); - ret = check_mf_sample(output_sample, &output_sample_desc_i420, &i420_frame_data, &i420_frame_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, &output_sample_desc_i420, output_file); @@ -2974,21 +3013,34 @@ static void test_audio_convert(void) {.length = 0x3dd8, .compare = compare_pcm16, .todo_length = TRUE}, {.length = 0xfc, .compare = compare_pcm16}, }; + const struct attribute_desc output_sample_attributes[] = + { + ATTR_UINT32(mft_output_sample_incomplete, 1), + ATTR_UINT32(MFSampleExtension_CleanPoint, has_video_processor /* 0 on Win7 */, .todo = TRUE), + {0}, + }; const struct sample_desc output_sample_desc[] = { { + .attributes = output_sample_attributes + 0, + .sample_time = 0, .sample_duration = 928798, .buffer_count = 1, .buffers = output_buffer_desc + 0, }, { + .attributes = output_sample_attributes + 1, /* not MFT_OUTPUT_DATA_BUFFER_INCOMPLETE */ + .sample_time = 9287980, .sample_duration = 897506, .buffer_count = 1, .buffers = output_buffer_desc + 1, .todo_length = TRUE, }, { + .attributes = output_sample_attributes + 0, + .sample_time = 10185486, .sample_duration = 14286, .buffer_count = 1, .buffers = output_buffer_desc + 2, }, };
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_PCM}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float}; + struct sample_desc tmp_sample_desc = output_sample_desc[0]; ULONG audio_data_len, audioconv_data_len; IMFSample *input_sample, *output_sample; const BYTE *audio_data, *audioconv_data; @@ -2997,7 +3049,6 @@ static void test_audio_convert(void) WCHAR output_path[MAX_PATH]; DWORD length, output_status; IMFMediaType *media_type; - LONGLONG time, duration; IMFTransform *transform; HANDLE output_file; ULONG i, ret; @@ -3163,31 +3214,17 @@ static void test_audio_convert(void) winetest_pop_context(); break; } - ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == i * 928798, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - ok(duration == 928798, "got duration %I64d\n", duration); - - ret = check_mf_sample(output_sample, output_sample_desc + 0, &audioconv_data, &audioconv_data_len); + + ret = check_mf_sample(output_sample, &tmp_sample_desc, &audioconv_data, &audioconv_data_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 0, output_file); + dump_mf_sample(output_sample, &tmp_sample_desc, output_file); + tmp_sample_desc.sample_time += tmp_sample_desc.sample_duration;
winetest_pop_context(); i++; }
- hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == i * 928798, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - todo_wine - ok(duration == 897506, "got duration %I64d\n", duration); - ret = check_mf_sample(output_sample, output_sample_desc + 1, &audioconv_data, &audioconv_data_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, output_sample_desc + 1, output_file); @@ -3204,15 +3241,6 @@ static void test_audio_convert(void)
if (hr == S_OK) { - hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - todo_wine - ok(time == 10185486, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - todo_wine - ok(duration == 14286, "got duration %I64d\n", duration); - ret = check_mf_sample(output_sample, output_sample_desc + 2, &audioconv_data, &audioconv_data_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, output_sample_desc + 2, output_file); @@ -3414,8 +3442,15 @@ static void test_color_convert(void) .length = actual_width * actual_height * 4, .compare = compare_rgb32, .rect = {.right = 82, .bottom = 84}, }; + const struct attribute_desc output_sample_attributes[] = + { + ATTR_UINT32(MFSampleExtension_CleanPoint, 0, .todo = TRUE), + {0}, + }; const struct sample_desc output_sample_desc = { + .attributes = output_sample_attributes, + .sample_time = 0, .sample_duration = 10000000, .buffer_count = 1, .buffers = &output_buffer_desc, };
@@ -3429,7 +3464,6 @@ static void test_color_convert(void) WCHAR output_path[MAX_PATH]; DWORD length, output_status; IMFMediaType *media_type; - LONGLONG time, duration; IMFTransform *transform; HANDLE output_file; ULONG i, ret; @@ -3566,13 +3600,6 @@ static void test_color_convert(void) ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
- hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == 0, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - ok(duration == 10000000, "got duration %I64d\n", duration); - ret = check_mf_sample(output_sample, &output_sample_desc, &rgb32_data, &rgb32_data_len); ok(ret <= 4 /* small and harmless differences in Wine vs Windows */, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, &output_sample_desc, output_file); @@ -3767,8 +3794,15 @@ static void test_video_processor(void) .length = actual_width * actual_height * 4, .compare = compare_rgb32, .rect = {.top = 12, .right = 82, .bottom = 96}, }; + const struct attribute_desc output_sample_attributes[] = + { + ATTR_UINT32(MFSampleExtension_CleanPoint, 1, .todo = TRUE), + {0}, + }; const struct sample_desc output_sample_desc = { + .attributes = output_sample_attributes, + .sample_time = 0, .sample_duration = 10000000, .buffer_count = 1, .buffers = &output_buffer_desc, };
@@ -3785,7 +3819,6 @@ static void test_video_processor(void) MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; WCHAR output_path[MAX_PATH]; - LONGLONG time, duration; IMFTransform *transform; IMFMediaBuffer *buffer; IMFMediaEvent *event; @@ -4249,13 +4282,6 @@ todo_wine { } ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
- hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == 0, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - ok(duration == 10000000, "got duration %I64d\n", duration); - ret = check_mf_sample(output_sample, &output_sample_desc, &rgb32_data, &rgb32_data_len); todo_wine /* Wine doesn't flip the frame, yet */ ok(ret == 0 || broken(ret == 25) /* w1064v1507 / w1064v1809 incorrectly rescale */, "got %lu%% diff\n", ret); @@ -4415,18 +4441,34 @@ static void test_mp3_decoder(void) {.length = 0x9c0, .compare = compare_pcm16}, {.length = mp3dec_block_size, .compare = compare_pcm16}, }; + const struct attribute_desc output_sample_attributes[] = + { + ATTR_UINT32(mft_output_sample_incomplete, 1), + ATTR_UINT32(MFSampleExtension_CleanPoint, 1), + {0}, + }; const struct sample_desc output_sample_desc[] = { { + .attributes = output_sample_attributes + 0, + .sample_time = 0, .sample_duration = 282993, .buffer_count = 1, .buffers = output_buffer_desc + 0, }, { + .attributes = output_sample_attributes + 0, + .sample_time = 282993, .sample_duration = 522449, + .buffer_count = 1, .buffers = output_buffer_desc + 1, + }, + { + .attributes = output_sample_attributes + 1, /* not MFT_OUTPUT_DATA_BUFFER_INCOMPLETE */ + .sample_time = 10209524, .sample_duration = 522449, .buffer_count = 1, .buffers = output_buffer_desc + 1, }, };
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_PCM}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_MP3}; + struct sample_desc tmp_sample_desc = output_sample_desc[1]; IMFSample *input_sample, *output_sample; ULONG mp3dec_data_len, mp3enc_data_len; const BYTE *mp3dec_data, *mp3enc_data; @@ -4436,7 +4478,6 @@ static void test_mp3_decoder(void) DWORD length, output_status; IMFMediaType *media_type; IMFTransform *transform; - LONGLONG time, duration; HANDLE output_file; ULONG i, ret; HRESULT hr; @@ -4587,13 +4628,6 @@ static void test_mp3_decoder(void) ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status);
- hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == 0, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - ok(duration == 282993 || broken(duration == 522449) /* win8 */ || broken(duration == 261224) /* win7 */, - "got duration %I64d\n", duration); hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); ok(length == 0x9c0 || broken(length == mp3dec_block_size) /* win8 */ || broken(length == 0x900) /* win7 */, @@ -4604,11 +4638,6 @@ static void test_mp3_decoder(void) goto skip_mp3dec_output; }
- ret = check_mf_sample(output_sample, output_sample_desc + 0, &mp3dec_data, &mp3dec_data_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 0, output_file); - - i = duration; while (SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status))) { winetest_push_context("%lu", i); @@ -4619,35 +4648,20 @@ static void test_mp3_decoder(void) winetest_pop_context(); break; } - ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == i, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - ok(duration == 522449 || broken(261225 - duration <= 1) /* win7 */, - "got duration %I64d\n", duration);
- ret = check_mf_sample(output_sample, output_sample_desc + 1, &mp3dec_data, &mp3dec_data_len); + ret = check_mf_sample(output_sample, &tmp_sample_desc, &mp3dec_data, &mp3dec_data_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 1, output_file); + dump_mf_sample(output_sample, &tmp_sample_desc, output_file); + tmp_sample_desc.sample_time += tmp_sample_desc.sample_duration;
winetest_pop_context(); - i += duration; }
- hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - ok(time == i || broken(time == i - duration) /* win7 */, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - todo_wine - ok(duration == 522449 || broken(261225 - duration <= 1) /* win7 */, "got duration %I64d\n", duration); - - ret = check_mf_sample(output_sample, output_sample_desc + 1, &mp3dec_data, &mp3dec_data_len); + ok(mp3dec_data_len == mp3dec_block_size || broken(mp3dec_data_len == 0) /* win7 */, "got remaining length %lu\n", mp3dec_data_len); + ret = check_mf_sample(output_sample, output_sample_desc + 2, &mp3dec_data, &mp3dec_data_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 1, output_file); + dump_mf_sample(output_sample, output_sample_desc + 2, output_file);
IMFSample_Release(output_sample);
@@ -4659,15 +4673,6 @@ static void test_mp3_decoder(void)
if (hr == S_OK) { - hr = IMFSample_GetSampleTime(output_sample, &time); - ok(hr == S_OK, "GetSampleTime returned %#lx\n", hr); - todo_wine - ok(time == 10185486, "got time %I64d\n", time); - hr = IMFSample_GetSampleDuration(output_sample, &duration); - ok(hr == S_OK, "GetSampleDuration returned %#lx\n", hr); - todo_wine - ok(duration == 14286, "got duration %I64d\n", duration); - ret = check_mf_sample(output_sample, output_sample_desc + 1, &mp3dec_data, &mp3dec_data_len); ok(ret == 0, "Unexpected %lu%% diff\n", ret); dump_mf_sample(output_sample, output_sample_desc + 1, output_file);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=123700
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
mf: transform.c:3240: Test failed: resampler: got output[0].dwStatus 0 transform.c:3249: Test failed: resampler: missing 0xfc bytes transform.c:4691: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4692: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4695: Test failed: mp3dec: got length 2304
=== w7u_adm (32 bit report) ===
mf: transform.c:3240: Test failed: resampler: got output[0].dwStatus 0 transform.c:3249: Test failed: resampler: missing 0xfc bytes transform.c:4691: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4692: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4695: Test failed: mp3dec: got length 2304
=== w7u_el (32 bit report) ===
mf: transform.c:3240: Test failed: resampler: got output[0].dwStatus 0 transform.c:3249: Test failed: resampler: missing 0xfc bytes transform.c:4691: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4692: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4695: Test failed: mp3dec: got length 2304
=== w8 (32 bit report) ===
mf: transform.c:4691: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4692: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4695: Test failed: mp3dec: got length 4608
=== w8adm (32 bit report) ===
mf: transform.c:4691: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4692: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4695: Test failed: mp3dec: got length 4608
=== w864 (32 bit report) ===
mf: transform.c:4691: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4692: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4695: Test failed: mp3dec: got length 4608
=== w1064v1507 (32 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w1064v1809 (32 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w1064 (32 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w1064_tsign (32 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w10pro64 (32 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w864 (64 bit report) ===
mf: transform.c:4691: Test failed: mp3dec: ProcessOutput returned 0 transform.c:4692: Test failed: mp3dec: got output[0].dwStatus 0x1000000 transform.c:4695: Test failed: mp3dec: got length 4608
=== w1064v1507 (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w1064v1809 (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w1064 (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w1064_2qxl (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w1064_adm (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w1064_tsign (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w10pro64 (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w10pro64_en_AE_u8 (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w10pro64_ar (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w10pro64_ja (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
=== w10pro64_zh_CN (64 bit report) ===
mf: transform.c:4654: Test failed: mp3dec: 6: Unexpected 9% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4654: Test failed: mp3dec: 6: Unexpected 10% diff transform.c:4661: Test failed: mp3dec: got remaining length 7104 transform.c:4663: Test failed: mp3dec: Unexpected 6% diff transform.c:4680: Test failed: mp3dec: missing 0x9c0 bytes
From: Rémi Bernon rbernon@codeweavers.com
Keeping them in a IMFCollection. --- dlls/mf/tests/transform.c | 503 +++++++++++++++++--------------------- 1 file changed, 221 insertions(+), 282 deletions(-)
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 9e00976242b..9eafa1c4971 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -490,6 +490,7 @@ struct sample_desc LONGLONG sample_duration; DWORD buffer_count; const struct buffer_desc *buffers; + DWORD repeat_count; BOOL todo_length; };
@@ -515,6 +516,38 @@ static void enum_mf_media_buffers(IMFSample *sample, const struct sample_desc *s ok(hr == E_INVALIDARG, "GetBufferByIndex returned %#lx\n", hr); }
+struct enum_mf_sample_state +{ + const struct sample_desc *next_sample; + struct sample_desc sample; +}; + +typedef void (*enum_mf_sample_cb)(IMFSample *sample, const struct sample_desc *sample_desc, void *context); +static void enum_mf_samples(IMFCollection *samples, const struct sample_desc *collection_desc, + enum_mf_sample_cb callback, void *context) +{ + struct enum_mf_sample_state state = {.next_sample = collection_desc}; + IMFSample *sample; + HRESULT hr; + DWORD i; + + for (i = 0; SUCCEEDED(hr = IMFCollection_GetElement(samples, i, (IUnknown **)&sample)); i++) + { + winetest_push_context("sample %lu", i); + ok(hr == S_OK, "GetElement returned %#lx\n", hr); + + state.sample.sample_time += state.sample.sample_duration; + if (!state.sample.repeat_count--) + state.sample = *state.next_sample++; + + callback(sample, &state.sample, context); + + IMFSample_Release(sample); + winetest_pop_context(); + } + ok(hr == E_INVALIDARG, "GetElement returned %#lx\n", hr); +} + static void dump_mf_media_buffer(IMFMediaBuffer *buffer, const struct buffer_desc *buffer_desc, HANDLE output) { DWORD length, written; @@ -538,6 +571,24 @@ static void dump_mf_sample(IMFSample *sample, const struct sample_desc *sample_d enum_mf_media_buffers(sample, sample_desc, dump_mf_media_buffer, output); }
+static void dump_mf_sample_collection(IMFCollection *samples, const struct sample_desc *collection_desc, + const WCHAR *output_filename) +{ + WCHAR path[MAX_PATH]; + HANDLE output; + + GetTempPathW(ARRAY_SIZE(path), path); + lstrcatW(path, output_filename); + + output = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(output != INVALID_HANDLE_VALUE, "CreateFileW failed, error %lu\n", GetLastError()); + + enum_mf_samples(samples, collection_desc, dump_mf_sample, output); + + trace("created %s\n", debugstr_w(path)); + CloseHandle(output); +} + #define check_mf_media_buffer(a, b, c) check_mf_media_buffer_(__LINE__, a, b, c) static DWORD check_mf_media_buffer_(int line, IMFMediaBuffer *buffer, const struct buffer_desc *expect, const BYTE **expect_data, DWORD *expect_data_len) @@ -638,6 +689,31 @@ static DWORD check_mf_sample_(int line, IMFSample *sample, const struct sample_d return ctx.diff / buffer_count; }
+static void check_mf_sample_collection_enum(IMFSample *sample, const struct sample_desc *expect, void *context) +{ + struct check_mf_sample_context *ctx = context; + ctx->diff += check_mf_sample_(ctx->line, sample, expect, &ctx->data, &ctx->data_len); +} + +#define check_mf_sample_collection(a, b, c) check_mf_sample_collection_(__LINE__, a, b, c) +static DWORD check_mf_sample_collection_(int line, IMFCollection *samples, + const struct sample_desc *expect_samples, const WCHAR *expect_data_filename) +{ + struct check_mf_sample_context ctx = {.line = line}; + DWORD count; + HRESULT hr; + + load_resource(expect_data_filename, &ctx.data, &ctx.data_len); + enum_mf_samples(samples, expect_samples, check_mf_sample_collection_enum, &ctx); + + dump_mf_sample_collection(samples, expect_samples, expect_data_filename); + + hr = IMFCollection_GetElementCount(samples, &count); + ok_(__FILE__, line)(hr == S_OK, "GetElementCount returned %#lx\n", hr); + + return ctx.diff / count; +} + static HRESULT WINAPI test_unk_QueryInterface(IUnknown *iface, REFIID riid, void **obj) { if (IsEqualIID(riid, &IID_IUnknown)) @@ -1689,15 +1765,14 @@ static void test_wma_encoder(void) MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float}; IMFSample *input_sample, *output_sample; - 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; - WCHAR output_path[MAX_PATH]; + IMFCollection *output_samples; DWORD length, output_status; IMFMediaType *media_type; IMFTransform *transform; - HANDLE output_file; + const BYTE *audio_data; + ULONG audio_data_len; ULONG i, ret; HRESULT hr; LONG ref; @@ -1775,35 +1850,31 @@ static void test_wma_encoder(void) ref = IMFSample_Release(input_sample); ok(ref <= 1, "Release returned %ld\n", ref);
- output_sample = create_sample(NULL, output_info.cbSize); - - load_resource(L"wmaencdata.bin", &wmaenc_data, &wmaenc_data_len); - 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"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()); + hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr);
+ output_sample = create_sample(NULL, output_info.cbSize); for (i = 0; SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status)); i++) { winetest_push_context("%lu", i); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - ret = check_mf_sample(output_sample, output_sample_desc + i, &wmaenc_data, &wmaenc_data_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + i, output_file); + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref); + output_sample = create_sample(NULL, output_info.cbSize); winetest_pop_context(); } - ok(wmaenc_data_len == 0, "missing %#lx bytes\n", wmaenc_data_len); ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret); + ok(i == 3, "got %lu output samples\n", i);
- trace("created %s\n", debugstr_w(output_path)); - CloseHandle(output_file); + ret = check_mf_sample_collection(output_samples, output_sample_desc, L"wmaencdata.bin"); + ok(ret == 0, "got %lu%% diff\n", ret); + IMFCollection_Release(output_samples);
output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); @@ -1952,20 +2023,15 @@ static void test_wma_decoder(void) ATTR_UINT32(MFSampleExtension_CleanPoint, 1), {0}, }; - const struct sample_desc output_sample_desc[] = + struct sample_desc output_sample_desc[] = { { .attributes = output_sample_attributes + 0, .sample_time = 0, .sample_duration = 928798, - .buffer_count = 1, .buffers = output_buffer_desc + 0, + .buffer_count = 1, .buffers = output_buffer_desc + 0, .repeat_count = 1, }, { .attributes = output_sample_attributes + 0, - .sample_time = 928798, .sample_duration = 928798, - .buffer_count = 1, .buffers = output_buffer_desc + 0, - }, - { - .attributes = output_sample_attributes_todo + 0, .sample_time = 1857596, .sample_duration = 928798, .buffer_count = 1, .buffers = output_buffer_desc + 0, }, @@ -1980,17 +2046,16 @@ static void test_wma_decoder(void) MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_Float}; IUnknown *unknown, *tmp_unknown, outer = {&test_unk_vtbl}; IMFSample *input_sample, *output_sample; - ULONG wmadec_data_len, wmaenc_data_len; - const BYTE *wmadec_data, *wmaenc_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; + IMFCollection *output_samples; DWORD length, output_status; - WCHAR output_path[MAX_PATH]; IMediaObject *media_object; IPropertyBag *property_bag; IMFMediaType *media_type; IMFTransform *transform; - HANDLE output_file; + const BYTE *wmaenc_data; + ULONG wmaenc_data_len; ULONG i, ret, ref; HRESULT hr;
@@ -2148,62 +2213,36 @@ static void test_wma_decoder(void) || broken(output_status == (MFT_OUTPUT_DATA_BUFFER_INCOMPLETE|MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE)) /* Win7 */, "got output[0].dwStatus %#lx\n", output_status);
- load_resource(L"wmadecdata.bin", &wmadec_data, &wmadec_data_len); - 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()); + hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr);
- output_info.cbSize = wmadec_block_size; output_sample = create_sample(NULL, output_info.cbSize); - hr = check_mft_process_output(transform, output_sample, &output_status); - - for (i = 0; i < 4; ++i) + for (i = 0; SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status)); i++) { winetest_push_context("%lu", i); + ok(!(output_status & ~MFT_OUTPUT_DATA_BUFFER_INCOMPLETE), "got output[0].dwStatus %#lx\n", output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - if (!strcmp(winetest_platform, "wine") && i == 2 && (output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)) - todo_wine ok(0, "skipping bogus sample check\n"); - else if (output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE) - { - ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - ret = check_mf_sample(output_sample, output_sample_desc + i, &wmadec_data, &wmadec_data_len); - todo_wine_if(ret > 0 && ret <= 10) /* ffmpeg sometimes offsets the decoded data */ - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + i, output_file); - } - else - { - ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); - ret = check_mf_sample(output_sample, output_sample_desc + i, &wmadec_data, &wmadec_data_len); - todo_wine_if(ret > 0 && ret <= 10) /* ffmpeg sometimes offsets the decoded data */ - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + i, output_file); - } - ret = IMFSample_Release(output_sample); - ok(ret == 0, "Release returned %lu\n", ret); - + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref); output_sample = create_sample(NULL, output_info.cbSize); - hr = check_mft_process_output(transform, output_sample, &output_status); - winetest_pop_context(); - - /* some FFmpeg version request more input to complete decoding */ - if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT && i == 2) break; } - todo_wine_if(wmadec_data_len == 0x1000) - 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_status == 0, "got output[0].dwStatus %#lx\n", output_status); ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret); + todo_wine_if(i == 3) /* wmadec output depends on ffmpeg version used */ + ok(i == 4, "got %lu output samples\n", i); + + if (!strcmp(winetest_platform, "wine") && i == 3) + output_sample_desc[1].attributes = output_sample_attributes_todo; + + ret = check_mf_sample_collection(output_samples, output_sample_desc, L"wmadecdata.bin"); + todo_wine_if(ret > 0 && ret <= 10) /* ffmpeg sometimes offsets the decoded data */ + ok(ret == 0, "got %lu%% diff\n", ret); + IMFCollection_Release(output_samples);
output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); @@ -2512,7 +2551,7 @@ static void test_h264_decoder(void) .length = actual_width * actual_height * 3 / 2, .compare = compare_i420, .rect = {.right = 82, .bottom = 84}, }; - const struct sample_desc output_sample_desc_i420 = + const struct sample_desc expect_output_sample_i420 = { .attributes = output_sample_attributes, .sample_time = 333667, .sample_duration = 333667, @@ -2521,19 +2560,18 @@ static void test_h264_decoder(void)
MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_H264}; MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; - const BYTE *h264_encoded_data, *nv12_frame_data, *i420_frame_data; - ULONG h264_encoded_data_len, nv12_frame_len, i420_frame_len; DWORD input_id, output_id, input_count, output_count; IMFSample *input_sample, *output_sample; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; + IMFCollection *output_samples; + const BYTE *h264_encoded_data; + ULONG h264_encoded_data_len; DWORD length, output_status; - WCHAR output_path[MAX_PATH]; IMFAttributes *attributes; + ULONG i, ret, ref, flags; IMFMediaType *media_type; IMFTransform *transform; - ULONG i, ret, flags; - HANDLE output_file; HRESULT hr;
hr = CoInitialize(NULL); @@ -2723,6 +2761,7 @@ static void test_h264_decoder(void) output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); if (hr != MF_E_TRANSFORM_NEED_MORE_INPUT) break; + ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); hr = IMFSample_GetTotalLength(output_sample, &length); @@ -2789,29 +2828,21 @@ static void test_h264_decoder(void) ret = IMFMediaType_Release(media_type); ok(ret == 0, "Release returned %lu\n", ret);
- /* and generate a new one as well in a temporary directory */ - GetTempPathW(ARRAY_SIZE(output_path), output_path); - lstrcatW(output_path, L"nv12frame.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()); + hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr);
- load_resource(L"nv12frame.bin", &nv12_frame_data, &nv12_frame_len); - ok(nv12_frame_len == actual_width * actual_height * 3 / 2, "got frame length %lu\n", nv12_frame_len); - - output_sample = create_sample(NULL, nv12_frame_len); + output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref);
- ret = check_mf_sample(output_sample, &output_sample_desc_nv12, &nv12_frame_data, &nv12_frame_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, &output_sample_desc_nv12, output_file); - - ret = IMFSample_Release(output_sample); - ok(ret == 0, "Release returned %lu\n", ret); - - trace("created %s\n", debugstr_w(output_path)); - CloseHandle(output_file); + ret = check_mf_sample_collection(output_samples, &output_sample_desc_nv12, L"nv12frame.bin"); + ok(ret == 0, "got %lu%% diff\n", ret); + IMFCollection_Release(output_samples);
/* we can change it, but only with the correct frame size */ hr = MFCreateMediaType(&media_type); @@ -2859,28 +2890,21 @@ static void test_h264_decoder(void) ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret);
- GetTempPathW(ARRAY_SIZE(output_path), output_path); - lstrcatW(output_path, L"i420frame.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()); - - load_resource(L"i420frame.bin", &i420_frame_data, &i420_frame_len); - ok(i420_frame_len == actual_width * actual_height * 3 / 2, "got frame length %lu\n", i420_frame_len); + hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr);
output_sample = create_sample(NULL, actual_width * actual_height * 2); hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref);
- ret = check_mf_sample(output_sample, &output_sample_desc_i420, &i420_frame_data, &i420_frame_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, &output_sample_desc_i420, output_file); - - ret = IMFSample_Release(output_sample); - ok(ret == 0, "Release returned %lu\n", ret); - - trace("created %s\n", debugstr_w(output_path)); - CloseHandle(output_file); + ret = check_mf_sample_collection(output_samples, &expect_output_sample_i420, L"i420frame.bin"); + ok(ret == 0, "got %lu%% diff\n", ret); + IMFCollection_Release(output_samples);
output_sample = create_sample(NULL, actual_width * actual_height * 2); hr = check_mft_process_output(transform, output_sample, &output_status); @@ -3024,7 +3048,7 @@ static void test_audio_convert(void) { .attributes = output_sample_attributes + 0, .sample_time = 0, .sample_duration = 928798, - .buffer_count = 1, .buffers = output_buffer_desc + 0, + .buffer_count = 1, .buffers = output_buffer_desc + 0, .repeat_count = 9, }, { .attributes = output_sample_attributes + 1, /* not MFT_OUTPUT_DATA_BUFFER_INCOMPLETE */ @@ -3040,18 +3064,16 @@ static void test_audio_convert(void)
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_PCM}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float}; - struct sample_desc tmp_sample_desc = output_sample_desc[0]; - ULONG audio_data_len, audioconv_data_len; IMFSample *input_sample, *output_sample; - const BYTE *audio_data, *audioconv_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - WCHAR output_path[MAX_PATH]; + IMFCollection *output_samples; DWORD length, output_status; IMFMediaType *media_type; IMFTransform *transform; - HANDLE output_file; - ULONG i, ret; + const BYTE *audio_data; + ULONG audio_data_len; + ULONG i, ret, ref; HRESULT hr;
hr = CoInitialize(NULL); @@ -3192,67 +3214,32 @@ static void test_audio_convert(void) ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
- output_sample = create_sample(NULL, audioconv_block_size); - - load_resource(L"audioconvdata.bin", &audioconv_data, &audioconv_data_len); - ok(audioconv_data_len == 179924, "got length %lu\n", audioconv_data_len); + hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr);
- /* and generate a new one as well in a temporary directory */ - GetTempPathW(ARRAY_SIZE(output_path), output_path); - lstrcatW(output_path, L"audioconvdata.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()); - - i = 0; - while (SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status))) + output_sample = create_sample(NULL, audioconv_block_size); + for (i = 0; SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status)); i++) { winetest_push_context("%lu", i); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - if (!(output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)) - { - ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); - winetest_pop_context(); - break; - } - ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - - ret = check_mf_sample(output_sample, &tmp_sample_desc, &audioconv_data, &audioconv_data_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, &tmp_sample_desc, output_file); - tmp_sample_desc.sample_time += tmp_sample_desc.sample_duration; - + ok(!(output_status & ~MFT_OUTPUT_DATA_BUFFER_INCOMPLETE), "got output[0].dwStatus %#lx\n", output_status); + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref); + output_sample = create_sample(NULL, audioconv_block_size); winetest_pop_context(); - i++; } - - ret = check_mf_sample(output_sample, output_sample_desc + 1, &audioconv_data, &audioconv_data_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 1, output_file); - + ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); + ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); ret = IMFSample_Release(output_sample); ok(ret == 0, "Release returned %lu\n", ret); - - output_sample = create_sample(NULL, audioconv_block_size); - hr = check_mft_process_output(transform, output_sample, &output_status); - todo_wine - ok(hr == S_OK || broken(hr == MF_E_TRANSFORM_NEED_MORE_INPUT) /* win7 */, "ProcessOutput returned %#lx\n", hr); - todo_wine - ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - - if (hr == S_OK) - { - ret = check_mf_sample(output_sample, output_sample_desc + 2, &audioconv_data, &audioconv_data_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 2, output_file); - } todo_wine - ok(audioconv_data_len == 0, "missing %#lx bytes\n", audioconv_data_len); + ok(i == 12 || broken(i == 11) /* Win7 */, "got %lu output samples\n", i);
- trace("created %s\n", debugstr_w(output_path)); - CloseHandle(output_file); - - ret = IMFSample_Release(output_sample); - ok(ret == 0, "Release returned %lu\n", ret); + ret = check_mf_sample_collection(output_samples, output_sample_desc, L"audioconvdata.bin"); + ok(ret == 0, "got %lu%% diff\n", ret); + IMFCollection_Release(output_samples);
output_sample = create_sample(NULL, audioconv_block_size); hr = check_mft_process_output(transform, output_sample, &output_status); @@ -3456,17 +3443,16 @@ static void test_color_convert(void)
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_I420}; - ULONG nv12frame_data_len, rgb32_data_len; - const BYTE *nv12frame_data, *rgb32_data; IMFSample *input_sample, *output_sample; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - WCHAR output_path[MAX_PATH]; + IMFCollection *output_samples; DWORD length, output_status; + const BYTE *nv12frame_data; + ULONG nv12frame_data_len; IMFMediaType *media_type; IMFTransform *transform; - HANDLE output_file; - ULONG i, ret; + ULONG i, ret, ref; HRESULT hr;
hr = CoInitialize(NULL); @@ -3586,29 +3572,21 @@ static void test_color_convert(void) ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
- load_resource(L"rgb32frame.bin", &rgb32_data, &rgb32_data_len); - ok(rgb32_data_len == output_info.cbSize, "got length %lu\n", rgb32_data_len); - - /* and generate a new one as well in a temporary directory */ - GetTempPathW(ARRAY_SIZE(output_path), output_path); - lstrcatW(output_path, L"rgb32frame.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()); + hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr);
output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref);
- ret = check_mf_sample(output_sample, &output_sample_desc, &rgb32_data, &rgb32_data_len); - ok(ret <= 4 /* small and harmless differences in Wine vs Windows */, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, &output_sample_desc, output_file); - - trace("created %s\n", debugstr_w(output_path)); - CloseHandle(output_file); - - ret = IMFSample_Release(output_sample); - ok(ret == 0, "Release returned %lu\n", ret); + ret = check_mf_sample_collection(output_samples, &output_sample_desc, L"rgb32frame.bin"); + ok(ret <= 4 /* small and harmless diff in Wine vs Windows */, "got %lu%% diff\n", ret); + IMFCollection_Release(output_samples);
output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); @@ -3810,20 +3788,19 @@ static void test_video_processor(void) MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_NV12}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_I420}; DWORD input_min, input_max, output_min, output_max, i, j, k; - ULONG nv12frame_data_len, rgb32_data_len; + IMFAttributes *attributes, *attributes2; IMFSample *input_sample, *output_sample; IMFMediaType *media_type, *media_type2; - IMFAttributes *attributes, *attributes2; - const BYTE *nv12frame_data, *rgb32_data; const GUID *expect_available_inputs; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - WCHAR output_path[MAX_PATH]; + IMFCollection *output_samples; + const BYTE *nv12frame_data; + ULONG nv12frame_data_len; IMFTransform *transform; IMFMediaBuffer *buffer; IMFMediaEvent *event; unsigned int value; - HANDLE output_file; UINT32 count; HRESULT hr; ULONG ret; @@ -4262,36 +4239,28 @@ todo_wine { ret = IMFSample_Release(input_sample); ok(ret <= 1, "Release returned %ld\n", ret);
- load_resource(L"rgb32frame-vp.bin", &rgb32_data, &rgb32_data_len); - ok(rgb32_data_len == output_info.cbSize, "got length %lu\n", rgb32_data_len); + hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr);
- /* and generate a new one as well in a temporary directory */ - GetTempPathW(ARRAY_SIZE(output_path), output_path); - lstrcatW(output_path, L"rgb32frame-vp.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()); - - output_sample = create_sample(NULL, rgb32_data_len); + output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK || broken(hr == MF_E_SHUTDOWN) /* w8 */, "ProcessOutput returned %#lx\n", hr); if (hr != S_OK) { win_skip("ProcessOutput returned MF_E_SHUTDOWN, skipping tests.\n"); - CloseHandle(output_file); goto skip_output; } ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status);
- ret = check_mf_sample(output_sample, &output_sample_desc, &rgb32_data, &rgb32_data_len); - todo_wine /* Wine doesn't flip the frame, yet */ - ok(ret == 0 || broken(ret == 25) /* w1064v1507 / w1064v1809 incorrectly rescale */, "got %lu%% diff\n", ret); - dump_mf_sample(output_sample, &output_sample_desc, output_file); - - trace("created %s\n", debugstr_w(output_path)); - CloseHandle(output_file); + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref);
- ret = IMFSample_Release(output_sample); - ok(ret == 0, "Release returned %lu\n", ret); + ret = check_mf_sample_collection(output_samples, &output_sample_desc, L"rgb32frame-vp.bin"); + todo_wine + ok(ret == 0 || broken(ret == 25) /* w1064v1507 / w1064v1809 incorrectly rescale */, "got %lu%% diff\n", ret); + IMFCollection_Release(output_samples);
output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); @@ -4457,7 +4426,7 @@ static void test_mp3_decoder(void) { .attributes = output_sample_attributes + 0, .sample_time = 282993, .sample_duration = 522449, - .buffer_count = 1, .buffers = output_buffer_desc + 1, + .buffer_count = 1, .buffers = output_buffer_desc + 1, .repeat_count = 18, }, { .attributes = output_sample_attributes + 1, /* not MFT_OUTPUT_DATA_BUFFER_INCOMPLETE */ @@ -4468,18 +4437,16 @@ static void test_mp3_decoder(void)
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_PCM}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_MP3}; - struct sample_desc tmp_sample_desc = output_sample_desc[1]; IMFSample *input_sample, *output_sample; - ULONG mp3dec_data_len, mp3enc_data_len; - const BYTE *mp3dec_data, *mp3enc_data; MFT_OUTPUT_STREAM_INFO output_info; MFT_INPUT_STREAM_INFO input_info; - WCHAR output_path[MAX_PATH]; + IMFCollection *output_samples; DWORD length, output_status; IMFMediaType *media_type; IMFTransform *transform; - HANDLE output_file; - ULONG i, ret; + const BYTE *mp3enc_data; + ULONG mp3enc_data_len; + ULONG i, ret, ref; HRESULT hr;
hr = CoInitialize(NULL); @@ -4610,81 +4577,53 @@ static void test_mp3_decoder(void) ret = IMFSample_Release(input_sample); ok(ret == 0, "Release returned %lu\n", ret);
- output_sample = create_sample(NULL, mp3dec_block_size); - - load_resource(L"mp3decdata.bin", &mp3dec_data, &mp3dec_data_len); - ok(mp3dec_data_len == 94656, "got length %lu\n", mp3dec_data_len); - - /* and generate a new one as well in a temporary directory */ - GetTempPathW(ARRAY_SIZE(output_path), output_path); - lstrcatW(output_path, L"mp3decdata.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()); - hr = IMFTransform_ProcessMessage(transform, MFT_MESSAGE_COMMAND_DRAIN, 0); ok(hr == S_OK, "ProcessMessage returned %#lx\n", hr);
+ hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr); + + /* first sample is broken */ + output_sample = create_sample(NULL, output_info.cbSize); hr = check_mft_process_output(transform, output_sample, &output_status); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - hr = IMFSample_GetTotalLength(output_sample, &length); ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); - ok(length == 0x9c0 || broken(length == mp3dec_block_size) /* win8 */ || broken(length == 0x900) /* win7 */, + ok(length == mp3dec_block_size /* Win8 */ || length == 0x9c0 /* Win10 */ || length == 0x900 /* Win7 */, "got length %lu\n", length); - if (broken(length != 0x9c0)) - { - win_skip("Skipping MP3 decoder output sample checks on Win7 / Win8\n"); - goto skip_mp3dec_output; - } + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref);
- while (SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status))) + output_sample = create_sample(NULL, output_info.cbSize); + for (i = 0; SUCCEEDED(hr = check_mft_process_output(transform, output_sample, &output_status)); i++) { winetest_push_context("%lu", i); ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); - if (!(output_status & MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)) - { - ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); - winetest_pop_context(); - break; - } - ok(output_status == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got output[0].dwStatus %#lx\n", output_status); - - ret = check_mf_sample(output_sample, &tmp_sample_desc, &mp3dec_data, &mp3dec_data_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, &tmp_sample_desc, output_file); - tmp_sample_desc.sample_time += tmp_sample_desc.sample_duration; - + ok(!(output_status & ~MFT_OUTPUT_DATA_BUFFER_INCOMPLETE), "got output[0].dwStatus %#lx\n", output_status); + hr = IMFCollection_AddElement(output_samples, (IUnknown *)output_sample); + ok(hr == S_OK, "AddElement returned %#lx\n", hr); + ref = IMFSample_Release(output_sample); + ok(ref == 1, "Release returned %ld\n", ref); + output_sample = create_sample(NULL, output_info.cbSize); winetest_pop_context(); } - - ok(mp3dec_data_len == mp3dec_block_size || broken(mp3dec_data_len == 0) /* win7 */, "got remaining length %lu\n", mp3dec_data_len); - ret = check_mf_sample(output_sample, output_sample_desc + 2, &mp3dec_data, &mp3dec_data_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 2, output_file); - - IMFSample_Release(output_sample); - - output_sample = create_sample(NULL, mp3dec_block_size); - hr = check_mft_process_output(transform, output_sample, &output_status); - todo_wine - ok(hr == S_OK || broken(hr == MF_E_TRANSFORM_NEED_MORE_INPUT) /* win7 */, "ProcessOutput returned %#lx\n", hr); + ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#lx\n", hr); ok(output_status == 0, "got output[0].dwStatus %#lx\n", output_status); + ret = IMFSample_Release(output_sample); + ok(ret == 0, "Release returned %lu\n", ret); + ok(i == 20 || broken(i == 41) /* Win7 */, "got %lu output samples\n", i);
- if (hr == S_OK) + if (broken(length != 0x9c0)) + win_skip("Skipping MP3 decoder output sample checks on Win7 / Win8\n"); + else { - ret = check_mf_sample(output_sample, output_sample_desc + 1, &mp3dec_data, &mp3dec_data_len); - ok(ret == 0, "Unexpected %lu%% diff\n", ret); - dump_mf_sample(output_sample, output_sample_desc + 1, output_file); + ret = check_mf_sample_collection(output_samples, output_sample_desc, L"mp3decdata.bin"); + ok(ret == 0, "got %lu%% diff\n", ret); } - ok(mp3dec_data_len == 0, "missing %#lx bytes\n", mp3dec_data_len); - - trace("created %s\n", debugstr_w(output_path)); - CloseHandle(output_file); - -skip_mp3dec_output: - ret = IMFSample_Release(output_sample); - ok(ret == 0, "Release returned %lu\n", ret); + IMFCollection_Release(output_samples);
output_sample = create_sample(NULL, mp3dec_block_size); hr = check_mft_process_output(transform, output_sample, &output_status);
From: Rémi Bernon rbernon@codeweavers.com
Allowing easier preview of NV12 / I420 images as well. --- dlls/mf/tests/i420frame.bin | 1 - dlls/mf/tests/i420frame.bmp | Bin 0 -> 50742 bytes dlls/mf/tests/nv12frame.bin | 1 - dlls/mf/tests/nv12frame.bmp | Bin 0 -> 50742 bytes dlls/mf/tests/resource.rc | 16 +- .../{rgb32frame-vp.bin => rgb32frame-vp.bmp} | Bin 36864 -> 36918 bytes .../tests/{rgb32frame.bin => rgb32frame.bmp} | Bin 36864 -> 36918 bytes dlls/mf/tests/transform.c | 153 +++++++++++++++--- 8 files changed, 136 insertions(+), 35 deletions(-) delete mode 100644 dlls/mf/tests/i420frame.bin create mode 100644 dlls/mf/tests/i420frame.bmp delete mode 100644 dlls/mf/tests/nv12frame.bin create mode 100644 dlls/mf/tests/nv12frame.bmp rename dlls/mf/tests/{rgb32frame-vp.bin => rgb32frame-vp.bmp} (62%) rename dlls/mf/tests/{rgb32frame.bin => rgb32frame.bmp} (50%)
diff --git a/dlls/mf/tests/i420frame.bin b/dlls/mf/tests/i420frame.bin deleted file mode 100644 index 58cefb87913..00000000000 --- a/dlls/mf/tests/i420frame.bin +++ /dev/null @@ -1 +0,0 @@ -��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������� ������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ������������������������������� ������������������� ����������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ�� ��������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ��������������������������������������������������� ������������������� ��������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑���������������������� ������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������� ������������������� ������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑������������������������������������������ ����������������������������������������������������͑�����������������������������������������������������������������������������������������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj jjjjjjjjjjjjjjjjjjjjjjjj���������� �����jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ������������ ���QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ�������������� ��QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))���������������������������������������������������������������������������� ������������������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������̀����������������������������������������������̀����������������������������������������������̀����������������������������������������������̀����������������������������������������������̀����������������������������������������������̀������������������������������������������� ������ �����������������������������������������ͦ����������������������������������������������ͦ����������������������������������������������ͦ����������������������������������������������ͦ����������������������������������������������ͦ������������������������������������ ������������ͦ�����������������������������������������������66666666666666666666666666666666666666666�������66666666666666666666666666666666666666666�������66666666666666666666666666666666666666666�������66666666666666666666666666666666666666666�������66666666666666666666666666666666666666666�������66666666666666666666666666666666666666666������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������ �������������������������������������������������������������������������������������������������������������������������ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ�������ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ�������ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ�������ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ�������ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ�������ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ������������������������������������������������������������������������������������������������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������� ������������������������������������������������������������������������������������������������������������������������������������������̀����������������������������������������������̀����������������������������������������������̀����������������������������������������������̀����������������������������������������������̀��������� ��������������������������������������̀����������������������������������������������͒����������������������������������������������͒����������������������������������������������͒����������������������������������������������͒����������������������������������������������͒����������������������������������������������͒��������������� ������������������� ���������������������������������������������������������"""""""""""""""""""""""""""""""""""""""""�������"""""""""""""""""""""""""""""""""""""""""�������"""""""""""""""""""""""""""""""""""""""""�������"""""""""""""""""""""""""""""""""""""""""�������"""""""""""""""""""""""""""""""""""""""""�������"""""""""""""""""""""""""""""""""""""""""����������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������ �������������������������������������������������������������������������������������������������������������������������������������������������������������nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn�������nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn�������nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn�������nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn�������nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn�������nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn������������������������������������������������������������ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� \ No newline at end of file diff --git a/dlls/mf/tests/i420frame.bmp b/dlls/mf/tests/i420frame.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d56f2c502b5cbbcc8e683947b8dc75ebf9b7072c GIT binary patch literal 50742 zcmeI!p{>GD7>41F&=Cj<7U%$Y1hxu|V1|wW41wq<l?>1YFx}wL0Qxr-CmfzH`5SJU zYu-HJ-rc^rRPQzOb2H!ZdsVfXKh68T|NQWIKD#bC4H#g60R|XgfB^;=V1NMz7+`>b zat%D{TXGsOzyJdbFu(u<3^2d|0}L?000ZS3=<juM8Zf{B0}L?000Rs#zyJdbFu(u< z<r=s)>*O?GfB^;=V1NMz7+`<_1{h#~0S3x7a2m$sG+=-M1{h#~0R|XgfB^;=V1NMz z$~ACkr{pwXfB^;=V1NMz7+`<_1{h#~0S3x7u$|7yX}|yj3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu=fX8hDxl3Mi1Nz{3<!K!HpJdQ(6F1u_-5ngR+a zkg34Q6i`5cOa%_6fC36+DzG&L6i`3`1r$)=&kA%F7N{*OaJR5PV_|{8!UC;@1twEq lL4oj(zn9(3!UEwxM_$%z3k!@E7Fh7r{ujS`HU$<GcmWa@Bi#T1
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/nv12frame.bin b/dlls/mf/tests/nv12frame.bin deleted file mode 100644 index d6640023fb9..00000000000 --- a/dlls/mf/tests/nv12frame.bin +++ /dev/null @@ -1 +0,0 @@ -��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������� ������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ������������������������������� ������������������� ����������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ�� ��������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ����������������������������������������������������������������������������������������������ͪ��������������������������������������������������� ������������������� ��������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑���������������������� ������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������� ������������������� ������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑����������������������������������������������������������������������������������������������͑������������������������������������������ ����������������������������������������������������͑�����������������������������������������������������������������������������������������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj jjjjjjjjjjjjjjjjjjjjjjjj���������� �����jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ������������ ���QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ�������������� ��QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))��������������))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))���������������������������������������������������������������������������� ������������������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������̀����������������������������������������������������������������������������������������������̀����������������������������������������������������������������������������������������������̀��������������������������������������������������������������������������������������� ���������̀���������� ��������������������������������������������������������������������������������������̀����������������������������������������������������������������������������������������������̀������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������� ����ͦ�����������������������������������������������������ͦ�����������������������������������������������������ͦ�����������������������������������������������������ͦ�����������������������������������������������������ͦ���������������������������������������������� ��������ͦ������������������������������������������������������6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"��������������6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"��������������6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"��������������6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"��������������6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"��������������6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"6"����������������������� ������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z���������������Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z� Z�Z�Z�Z�Z�Z����������� �����Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z���������������Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z���������������Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z���������������Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z����������������n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n� ��n���������������n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n���������������n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n���������������n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n���������������n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n���������������n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n�n �n�n�n�n�n�n�n�n�n������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� \ No newline at end of file diff --git a/dlls/mf/tests/nv12frame.bmp b/dlls/mf/tests/nv12frame.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dadece8b145379a2a6fbdd990809524c357d9f00 GIT binary patch literal 50742 zcmeI5v5g`@5Jd@LLO5X^2}}UzpMi^YHU=>e!a@)jgo1=a03?7j8O+VxuCa|#(*6Ew zX-cnKjcB#%Q}y=w`|EfAvHG|A>GS7w{(PO)>c{kLT3_#<m(S1F@i=no8QkypQ8}=$ zXFoGk*v~cahkphK@ZaOH>H_@Xuey_=4*&5#gU9L&_>cdpI~nTmf0_P2y7S1XXQ28I z`+D{>L->0*sy@OW{;E3}>hK@`GkC1dfdBZfx|5*}|M5SA$Lb9DzfAwHmu}?LGf@49 zeLee`A^bfYRUhFGf7P7~b@-3}89Y{Jz<>N#-N{gg|M;K5V|51nU#9=3em!#P8L0ll zzMlQe5dI#Hs*mu8zv@ngI{e4~3?8d9;6MJW?qsOLfBetju{s0(FVp}1?KyJl8L0ll zzMlQe5dI#Hs*mu8zv@ngI{e4~3?8d9;6MJW?qsOLfBetju{s0(FVp|+ZWuZB3{?MN zU(bGK2!9Vp)kpZlUv(!#9sc8g29MPl@E`wGcQVxBKmKR%Se*g?m+AjzIE<Wn2CDzC zuV+6qgujQQ>LdK&uey_=4*&5#gU9L&_>cdpI~nTmAOACWtj>V{%k*FUyHTh8zjwI7 z4F_-l2XFufZ~zBz00(dY2XFufaG<pVFZ-G%__plvuW#YgSMuKpz~`Mvd52HQ<Nel_ z&%?gT{_XJ(@?)m(flo{zer@Z|)xOI9?eSOgW2W$dPfQ?wZR^j;zRLdX@h9?QrtpDJ zOdx)3>(Ac4%Kq)~d-7wZ@PSWEAbxG@&(^-m{_XKw@?)m(flo{zer@Z|#=gq_?eQD( zW2W$dPfQ?wZR=0@Yuq3J0SL4saI~+ocYFMi{FrH5KHb^9%l_Tz-I@HDX<I&*&b`b2 z-RYN({FrH5KK<Ig%l_Tz{hIukX<I(Gr+b(EyVGw^@?)lL`RoSwF8g<<?*{T?rfvBQ Z2lp=fcc%{r@?)lL`INuL4Fdm1;4i8^`3(R7
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/resource.rc b/dlls/mf/tests/resource.rc index 3cc0f875452..43493319046 100644 --- a/dlls/mf/tests/resource.rc +++ b/dlls/mf/tests/resource.rc @@ -55,17 +55,17 @@ mp3decdata.bin RCDATA mp3decdata.bin h264data.bin RCDATA h264data.bin
/* Generated from running the tests on Windows */ -/* @makedep: nv12frame.bin */ -nv12frame.bin RCDATA nv12frame.bin +/* @makedep: nv12frame.bmp */ +nv12frame.bmp RCDATA nv12frame.bmp
/* Generated from running the tests on Windows */ -/* @makedep: i420frame.bin */ -i420frame.bin RCDATA i420frame.bin +/* @makedep: i420frame.bmp */ +i420frame.bmp RCDATA i420frame.bmp
/* Generated from running the tests on Windows */ -/* @makedep: rgb32frame.bin */ -rgb32frame.bin RCDATA rgb32frame.bin +/* @makedep: rgb32frame.bmp */ +rgb32frame.bmp RCDATA rgb32frame.bmp
/* Generated from running the tests on Windows */ -/* @makedep: rgb32frame-vp.bin */ -rgb32frame-vp.bin RCDATA rgb32frame-vp.bin +/* @makedep: rgb32frame-vp.bmp */ +rgb32frame-vp.bmp RCDATA rgb32frame-vp.bmp diff --git a/dlls/mf/tests/rgb32frame-vp.bin b/dlls/mf/tests/rgb32frame-vp.bmp similarity index 62% rename from dlls/mf/tests/rgb32frame-vp.bin rename to dlls/mf/tests/rgb32frame-vp.bmp index 46d93a9c40b5d875c821580dd1db984d3b97217a..3361ed3f4a0a6d5df0d345b02afc327e2ca1ba49 100644 GIT binary patch delta 70 xcmZozz_e`vlbMsR*#rhKFawerK%4-@3=9fD77#$?Ash&~k@3Ia=Kq3>bpT{%3D^Jt
delta 17 ZcmdnCfT>{t(?*AHf)fL{7Mlsx0RTdu2FCyZ
diff --git a/dlls/mf/tests/rgb32frame.bin b/dlls/mf/tests/rgb32frame.bmp similarity index 50% rename from dlls/mf/tests/rgb32frame.bin rename to dlls/mf/tests/rgb32frame.bmp index 3ad7556ef7886011bce680f90127f150b081502d..0e50c30b8d02f3b6f226b21a1b51423c7115c980 100644 GIT binary patch delta 63 qcmZozz_e`vlbMsR*#rhKFawerK%4-@3=9fD77#$?Ash&~U;+Rqod*N}
delta 18 acmdnCfT>{t(?&Z7#)*C$o9h^N^Z@`v$p;Dm
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 9eafa1c4971..2f1e7c60cc6 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -375,12 +375,16 @@ static HRESULT check_mft_process_output_(int line, IMFTransform *transform, IMFS return ret; }
-typedef DWORD (*compare_cb)(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect); +typedef DWORD (*compare_cb)(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect);
-static DWORD compare_nv12(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +static DWORD compare_nv12(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) { DWORD x, y, size, diff = 0, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf;
+ /* skip BMP header and RGB data from the dump */ + expect = expect + *(DWORD *)(expect + 2); + *length = *length + *(DWORD *)(expect + 2); + for (y = 0; y < height; y++, data += width, expect += width) { if (y < rect->top || y >= rect->bottom) continue; @@ -406,10 +410,14 @@ static DWORD compare_nv12(const BYTE *data, DWORD length, const RECT *rect, cons return diff * 100 / 256 / size; }
-static DWORD compare_i420(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +static DWORD compare_i420(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) { DWORD i, x, y, size, diff = 0, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf;
+ /* skip BMP header and RGB data from the dump */ + expect = expect + *(DWORD *)(expect + 2); + *length = *length + *(DWORD *)(expect + 2); + for (y = 0; y < height; y++, data += width, expect += width) { if (y < rect->top || y >= rect->bottom) continue; @@ -434,10 +442,14 @@ static DWORD compare_i420(const BYTE *data, DWORD length, const RECT *rect, cons return diff * 100 / 256 / size; }
-static DWORD compare_rgb32(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +static DWORD compare_rgb32(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) { DWORD x, y, size, diff = 0, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf;
+ /* skip BMP header from the dump */ + expect = expect + *(DWORD *)(expect + 2 + 2 * sizeof(DWORD)); + *length = *length + *(DWORD *)(expect + 2 + 2 * sizeof(DWORD)); + for (y = 0; y < height; y++, data += width * 4, expect += width * 4) { if (y < rect->top || y >= rect->bottom) continue; @@ -454,10 +466,10 @@ static DWORD compare_rgb32(const BYTE *data, DWORD length, const RECT *rect, con return diff * 100 / 256 / size; }
-static DWORD compare_pcm16(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +static DWORD compare_pcm16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) { const INT16 *data_pcm = (INT16 *)data, *expect_pcm = (INT16 *)expect; - DWORD i, size = length / 2, diff = 0; + DWORD i, size = *length / 2, diff = 0;
for (i = 0; i < size; i++) diff += abs((int)*expect_pcm++ - (int)*data_pcm++); @@ -465,14 +477,93 @@ static DWORD compare_pcm16(const BYTE *data, DWORD length, const RECT *rect, con return diff * 100 / 65536 / size; }
-static DWORD compare_bytes(const BYTE *data, DWORD length, const RECT *rect, const BYTE *expect) +static DWORD compare_bytes(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) { - DWORD i, diff = 0; + DWORD i, size = *length, diff = 0;
- for (i = 0; i < length; i++) + for (i = 0; i < size; i++) diff += abs((int)*expect++ - (int)*data++);
- return diff * 100 / 256 / length; + return diff * 100 / 256 / size; +} + +typedef void (*dump_cb)(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); + +static void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) +{ + DWORD width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; + static const char magic[2] = "BM"; + struct + { + DWORD length; + DWORD reserved; + DWORD offset; + BITMAPINFOHEADER biHeader; + } header = + { + .length = length + sizeof(header) + 2, .offset = sizeof(header) + 2, + .biHeader = + { + .biSize = sizeof(BITMAPINFOHEADER), .biWidth = width, .biHeight = height, + .biBitCount = 32, .biCompression = BI_RGB, .biSizeImage = width * height * 4, + }, + }; + DWORD written; + BOOL ret; + + ret = WriteFile(output, magic, sizeof(magic), &written, NULL); + ok(ret, "WriteFile failed, error %lu\n", GetLastError()); + ok(written == sizeof(magic), "written %lu bytes\n", written); + ret = WriteFile(output, &header, sizeof(header), &written, NULL); + ok(ret, "WriteFile failed, error %lu\n", GetLastError()); + ok(written == sizeof(header), "written %lu bytes\n", written); + ret = WriteFile(output, data, length, &written, NULL); + ok(ret, "WriteFile failed, error %lu\n", GetLastError()); + ok(written == length, "written %lu bytes\n", written); +} + +static void dump_nv12(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) +{ + DWORD written, x, y, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; + BYTE *rgb32_data = malloc(width * height * 4), *rgb32 = rgb32_data; + BOOL ret; + + for (y = 0; y < height; y++) for (x = 0; x < width; x++) + { + *rgb32++ = data[width * y + x]; + *rgb32++ = data[width * height + width * (y / 2) + (x & ~1) + 0]; + *rgb32++ = data[width * height + width * (y / 2) + (x & ~1) + 1]; + *rgb32++ = 0xff; + } + + dump_rgb32(rgb32_data, width * height * 4, rect, output); + free(rgb32_data); + + ret = WriteFile(output, data, length, &written, NULL); + ok(ret, "WriteFile failed, error %lu\n", GetLastError()); + ok(written == length, "written %lu bytes\n", written); +} + +static void dump_i420(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) +{ + DWORD written, x, y, width = (rect->right + 0xf) & ~0xf, height = (rect->bottom + 0xf) & ~0xf; + BYTE *rgb32_data = malloc(width * height * 4), *rgb32 = rgb32_data; + BOOL ret; + + for (y = 0; y < height; y++) for (x = 0; x < width; x++) + { + *rgb32++ = data[width * y + x]; + *rgb32++ = data[width * height + (width / 2) * (y / 2) + x / 2]; + *rgb32++ = data[width * height + (width / 2) * (y / 2) + (width / 2) * (height / 2) + x / 2]; + *rgb32++ = 0xff; + } + + dump_rgb32(rgb32_data, width * height * 4, rect, output); + free(rgb32_data); + + ret = WriteFile(output, data, length, &written, NULL); + ok(ret, "WriteFile failed, error %lu\n", GetLastError()); + ok(written == length, "written %lu bytes\n", written); }
struct buffer_desc @@ -480,6 +571,7 @@ struct buffer_desc DWORD length; BOOL todo_length; compare_cb compare; + dump_cb dump; RECT rect; };
@@ -558,9 +650,14 @@ static void dump_mf_media_buffer(IMFMediaBuffer *buffer, const struct buffer_des hr = IMFMediaBuffer_Lock(buffer, &data, NULL, &length); ok(hr == S_OK, "Lock returned %#lx\n", hr);
- ret = WriteFile(output, data, length, &written, NULL); - ok(ret, "WriteFile failed, error %lu\n", GetLastError()); - ok(written == length, "written %lu bytes\n", written); + if (buffer_desc->dump) + buffer_desc->dump(data, length, &buffer_desc->rect, output); + else + { + ret = WriteFile(output, data, length, &written, NULL); + ok(ret, "WriteFile failed, error %lu\n", GetLastError()); + ok(written == length, "written %lu bytes\n", written); + }
hr = IMFMediaBuffer_Unlock(buffer); ok(hr == S_OK, "Unlock returned %#lx\n", hr); @@ -606,9 +703,9 @@ static DWORD check_mf_media_buffer_(int line, IMFMediaBuffer *buffer, const stru todo_wine_if(expect->todo_length) ok_(__FILE__, line)(0, "missing %#lx bytes\n", length - *expect_data_len); else if (!expect->compare) - diff = compare_bytes(data, length, NULL, *expect_data); + diff = compare_bytes(data, &length, NULL, *expect_data); else - diff = expect->compare(data, length, &expect->rect, *expect_data); + diff = expect->compare(data, &length, &expect->rect, *expect_data);
hr = IMFMediaBuffer_Unlock(buffer); ok_(__FILE__, line)(hr == S_OK, "Unlock returned %#lx\n", hr); @@ -2538,7 +2635,7 @@ static void test_h264_decoder(void) const struct buffer_desc output_buffer_desc_nv12 = { .length = actual_width * actual_height * 3 / 2, - .compare = compare_nv12, .rect = {.right = 82, .bottom = 84}, + .compare = compare_nv12, .dump = dump_nv12, .rect = {.right = 82, .bottom = 84}, }; const struct sample_desc output_sample_desc_nv12 = { @@ -2549,7 +2646,7 @@ static void test_h264_decoder(void) const struct buffer_desc output_buffer_desc_i420 = { .length = actual_width * actual_height * 3 / 2, - .compare = compare_i420, .rect = {.right = 82, .bottom = 84}, + .compare = compare_i420, .dump = dump_i420, .rect = {.right = 82, .bottom = 84}, }; const struct sample_desc expect_output_sample_i420 = { @@ -2840,7 +2937,7 @@ static void test_h264_decoder(void) ref = IMFSample_Release(output_sample); ok(ref == 1, "Release returned %ld\n", ref);
- ret = check_mf_sample_collection(output_samples, &output_sample_desc_nv12, L"nv12frame.bin"); + ret = check_mf_sample_collection(output_samples, &output_sample_desc_nv12, L"nv12frame.bmp"); ok(ret == 0, "got %lu%% diff\n", ret); IMFCollection_Release(output_samples);
@@ -2902,7 +2999,7 @@ static void test_h264_decoder(void) ref = IMFSample_Release(output_sample); ok(ref == 1, "Release returned %ld\n", ref);
- ret = check_mf_sample_collection(output_samples, &expect_output_sample_i420, L"i420frame.bin"); + ret = check_mf_sample_collection(output_samples, &expect_output_sample_i420, L"i420frame.bmp"); ok(ret == 0, "got %lu%% diff\n", ret); IMFCollection_Release(output_samples);
@@ -3427,7 +3524,7 @@ static void test_color_convert(void) const struct buffer_desc output_buffer_desc = { .length = actual_width * actual_height * 4, - .compare = compare_rgb32, .rect = {.right = 82, .bottom = 84}, + .compare = compare_rgb32, .dump = dump_rgb32, .rect = {.right = 82, .bottom = 84}, }; const struct attribute_desc output_sample_attributes[] = { @@ -3555,7 +3652,10 @@ static void test_color_convert(void) ok(output_info.cbSize == actual_width * actual_height * 4, "got cbSize %#lx\n", output_info.cbSize); ok(output_info.cbAlignment == 1, "got cbAlignment %#lx\n", output_info.cbAlignment);
- load_resource(L"nv12frame.bin", &nv12frame_data, &nv12frame_data_len); + load_resource(L"nv12frame.bmp", &nv12frame_data, &nv12frame_data_len); + /* skip BMP header and RGB data from the dump */ + nv12frame_data_len = nv12frame_data_len - *(DWORD *)(nv12frame_data + 2); + nv12frame_data = nv12frame_data + *(DWORD *)(nv12frame_data + 2); ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len);
input_sample = create_sample(nv12frame_data, nv12frame_data_len); @@ -3584,7 +3684,7 @@ static void test_color_convert(void) ref = IMFSample_Release(output_sample); ok(ref == 1, "Release returned %ld\n", ref);
- ret = check_mf_sample_collection(output_samples, &output_sample_desc, L"rgb32frame.bin"); + ret = check_mf_sample_collection(output_samples, &output_sample_desc, L"rgb32frame.bmp"); ok(ret <= 4 /* small and harmless diff in Wine vs Windows */, "got %lu%% diff\n", ret); IMFCollection_Release(output_samples);
@@ -3770,7 +3870,7 @@ static void test_video_processor(void) const struct buffer_desc output_buffer_desc = { .length = actual_width * actual_height * 4, - .compare = compare_rgb32, .rect = {.top = 12, .right = 82, .bottom = 96}, + .compare = compare_rgb32, .dump = dump_rgb32, .rect = {.top = 12, .right = 82, .bottom = 96}, }; const struct attribute_desc output_sample_attributes[] = { @@ -4222,7 +4322,10 @@ todo_wine { ok(output_info.cbSize == actual_width * actual_height * 4, "got cbSize %#lx\n", output_info.cbSize); ok(output_info.cbAlignment == 0, "got cbAlignment %#lx\n", output_info.cbAlignment);
- load_resource(L"nv12frame.bin", &nv12frame_data, &nv12frame_data_len); + load_resource(L"nv12frame.bmp", &nv12frame_data, &nv12frame_data_len); + /* skip BMP header and RGB data from the dump */ + nv12frame_data_len = nv12frame_data_len - *(DWORD *)(nv12frame_data + 2); + nv12frame_data = nv12frame_data + *(DWORD *)(nv12frame_data + 2); ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len);
input_sample = create_sample(nv12frame_data, nv12frame_data_len); @@ -4257,7 +4360,7 @@ todo_wine { ref = IMFSample_Release(output_sample); ok(ref == 1, "Release returned %ld\n", ref);
- ret = check_mf_sample_collection(output_samples, &output_sample_desc, L"rgb32frame-vp.bin"); + ret = check_mf_sample_collection(output_samples, &output_sample_desc, L"rgb32frame-vp.bmp"); todo_wine ok(ret == 0 || broken(ret == 25) /* w1064v1507 / w1064v1809 incorrectly rescale */, "got %lu%% diff\n", ret); IMFCollection_Release(output_samples);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=123702
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/mf/tests/i420frame.bin:1 error: patch failed: dlls/mf/tests/nv12frame.bin:1 Task: Patch failed to apply
=== debian11 (build log) ===
error: patch failed: dlls/mf/tests/i420frame.bin:1 error: patch failed: dlls/mf/tests/nv12frame.bin:1 Task: Patch failed to apply
=== debian11 (build log) ===
error: patch failed: dlls/mf/tests/i420frame.bin:1 error: patch failed: dlls/mf/tests/nv12frame.bin:1 Task: Patch failed to apply