From: Brendan McGrath <bmcgrath@codeweavers.com> --- dlls/iyuv_32/iyuv.c | 81 +++++++++++++++++++++++++++++++++++- dlls/iyuv_32/tests/iyuv_32.c | 2 - 2 files changed, 79 insertions(+), 4 deletions(-) diff --git a/dlls/iyuv_32/iyuv.c b/dlls/iyuv_32/iyuv.c index bd7265bc447..ff9821b54a8 100644 --- a/dlls/iyuv_32/iyuv.c +++ b/dlls/iyuv_32/iyuv.c @@ -193,9 +193,86 @@ done: static LRESULT IYUV_Decompress(IMFTransform *transform, const ICDECOMPRESS *params) { - FIXME("ICM_DECOMPRESS %p %p\n", transform, params); + IMFSample *in_sample = NULL, *out_sample = NULL; + IMFMediaBuffer *in_buf = NULL, *out_buf = NULL; + MFT_OUTPUT_DATA_BUFFER mft_buf; + LRESULT r = ICERR_INTERNAL; + DWORD mft_status; + BYTE *data; + HRESULT hr; + + TRACE("transform %p, params %p.\n", transform, params); + + if (FAILED(MFCreateSample(&in_sample))) + return ICERR_INTERNAL; + + if (FAILED(MFCreateMemoryBuffer(params->lpbiInput->biSizeImage, &in_buf))) + goto done; + + if (FAILED(IMFSample_AddBuffer(in_sample, in_buf))) + goto done; + + if (FAILED(MFCreateSample(&out_sample))) + goto done; + + if (FAILED(MFCreateMemoryBuffer(params->lpbiOutput->biSizeImage, &out_buf))) + goto done; + + if (FAILED(IMFSample_AddBuffer(out_sample, out_buf))) + goto done; + + if (FAILED(IMFMediaBuffer_Lock(in_buf, &data, NULL, NULL))) + goto done; + + memcpy(data, params->lpInput, params->lpbiInput->biSizeImage); + + if (FAILED(IMFMediaBuffer_Unlock(in_buf))) + goto done; - return ICERR_UNSUPPORTED; + if (FAILED(IMFMediaBuffer_SetCurrentLength(in_buf, params->lpbiInput->biSizeImage))) + goto done; + + if (FAILED(IMFTransform_ProcessInput(transform, 0, in_sample, 0))) + goto done; + + memset(&mft_buf, 0, sizeof(mft_buf)); + mft_buf.pSample = out_sample; + + hr = IMFTransform_ProcessOutput(transform, 0, 1, &mft_buf, &mft_status); + if (hr == MF_E_TRANSFORM_STREAM_CHANGE) + hr = IMFTransform_ProcessOutput(transform, 0, 1, &mft_buf, &mft_status); + + if (SUCCEEDED(hr)) + { + LONG depth = params->lpbiOutput->biBitCount / 8; + LONG width = params->lpbiOutput->biWidth * depth; + LONG stride = (width + 3) & ~3; + + if (FAILED(IMFMediaBuffer_Lock(out_buf, &data, NULL, NULL))) + goto done; + + MFCopyImage(params->lpOutput, stride, data, stride, width, params->lpbiOutput->biHeight); + + IMFMediaBuffer_Unlock(out_buf); + r = ICERR_OK; + } + else if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) + { + TRACE("no output received.\n"); + r = ICERR_OK; + } + +done: + if (in_buf) + IMFMediaBuffer_Release(in_buf); + if (in_sample) + IMFSample_Release(in_sample); + if (out_buf) + IMFMediaBuffer_Release(out_buf); + if (out_sample) + IMFSample_Release(out_sample); + + return r; } static LRESULT IYUV_GetInfo(ICINFO *icinfo, DWORD size) diff --git a/dlls/iyuv_32/tests/iyuv_32.c b/dlls/iyuv_32/tests/iyuv_32.c index cc8edca386b..6bc565c4293 100644 --- a/dlls/iyuv_32/tests/iyuv_32.c +++ b/dlls/iyuv_32/tests/iyuv_32.c @@ -331,7 +331,6 @@ static void test_decompress(DWORD handler) ok(res == ICERR_OK, "Got %ld.\n", res); res = ICDecompress(hic, 0, &i420_info, i420_data, &rgb_info, rgb_data); - todo_wine ok(res == ICERR_OK, "Got %ld.\n", res); res = ICDecompressEnd(hic); ok(res == ICERR_OK, "Got %ld.\n", res); @@ -346,7 +345,6 @@ static void test_decompress(DWORD handler) for (unsigned int i = 0; i < rgb_info.biSizeImage; ++i) diff += abs((int)rgb_data[i] - (int)expect_rgb_data[i]); diff = diff * 100 / 256 / rgb_info.biSizeImage; - todo_wine ok(diff == 0, "Got %lu%% difference.\n", diff); res = ICClose(hic); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10549