From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/Makefile.in | 2 +- dlls/mf/tests/iv50frame.bin | Bin 0 -> 744 bytes dlls/mf/tests/mf_test.h | 2 + dlls/mf/tests/resource.rc | 8 ++ dlls/mf/tests/rgb24frame.bmp | Bin 0 -> 27702 bytes dlls/mf/tests/transform.c | 207 +++++++++++++++++++++++++++++++++++ 6 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 dlls/mf/tests/iv50frame.bin create mode 100644 dlls/mf/tests/rgb24frame.bmp
diff --git a/dlls/mf/tests/Makefile.in b/dlls/mf/tests/Makefile.in index c684d033207..d6219219f67 100644 --- a/dlls/mf/tests/Makefile.in +++ b/dlls/mf/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = mf.dll -IMPORTS = mf mfplat dmoguids mfuuid strmiids uuid wmcodecdspuuid ole32 user32 propsys msdmo d3d11 +IMPORTS = mf mfplat dmoguids mfuuid strmiids uuid wmcodecdspuuid ole32 user32 propsys msdmo d3d11 msvfw32
C_SRCS = \ mf.c \ diff --git a/dlls/mf/tests/iv50frame.bin b/dlls/mf/tests/iv50frame.bin new file mode 100644 index 0000000000000000000000000000000000000000..a7054eaf5bfe9ac9d4f9afd1846546dcd9495adb GIT binary patch literal 744 zcmb1VXyjq2FkoP7V&*p!xcY*LK`?;fLIxuPE3*=(HkUQu8nOTXJR>8o9{t7r&z+Tl zAu4<A-XJf{_j8KRWv|`(%}aCXp5k+s%;HnMiY#XEJX^4&t@&gEU)9PWPd@g^2W6&Q zDKL;c<ES61b@E|?(TwIvQhaL7mM@lisaneTuoVXc9X^<1z`i$RrAj+UpH~*x5Z6}U z+wtz9q6ua4(l65r9!`0BYu)?TOZ;9S&@;ZjUJr6_n|dDo!?w?tb!}dh;p#<Mm%AcG zLuZGbS+(NUmZUJ(tII?;YiYSiaA~Y|P*^@sZRJ&<Xy{a+=&DsFYiERpF3mi;W|fw& zcAD<%RFOcNa{>OGcQ0kmMMAZEHe~*O9ddPv;Qg0-`(~}_UYer8s2b{SG^IiBMUtkZ zmxJfki9D(cxOYW(wFw0Tm8v*%zG%{$HfbTtln~jI0Zh9VAZuAMf%iO5{`=NTe<x~j zO`6WYz|8uRU7N#p`@~JF)5OHZm{!36@9{^!``b-?4_A0xHt9hy_81)az071yQu0Et zU?g-{<{f|D!Gc*PYfkZWG+O|Xhx5r_zAC)zKX|$pTL6*Q;RUfj?9{!S3(&P1>GS9D zDlI>`RZSHLR4$!iU|{8##C4GQF}oh8oQFUY_cMgMoVHiA_;z0sG}HBRzp+I_Hu3VJ z5}?4LQ`}9QE+W^2o|jB{hCm{HCK7vmJWRQ^{NVU4wAB5^bPd}>`&?cMepB`8-=H7( z!(kSSotMJ#z#Wr*aO?&tm<m*|4yd3Eq(D2c;;h^U4VgrdR@S4IvP+RrtM1_ks{C1h mJU?<R*Yygw$PL_eD6{*Ls9*Gybp^K`^|v25pxmd-00jWkFGAh`
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/mf_test.h b/dlls/mf/tests/mf_test.h index 75a09b1dd15..0f23e2aeb02 100644 --- a/dlls/mf/tests/mf_test.h +++ b/dlls/mf/tests/mf_test.h @@ -65,11 +65,13 @@ typedef DWORD (*compare_cb)(const BYTE *data, DWORD *length, const RECT *rect, c extern DWORD compare_nv12(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_i420(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_rgb32(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); +extern DWORD compare_rgb24(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_rgb16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect); extern DWORD compare_pcm16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect);
typedef void (*dump_cb)(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); +extern void dump_rgb24(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_rgb16(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_nv12(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); extern void dump_i420(const BYTE *data, DWORD length, const RECT *rect, HANDLE output); diff --git a/dlls/mf/tests/resource.rc b/dlls/mf/tests/resource.rc index b20363acc60..e3df92e375f 100644 --- a/dlls/mf/tests/resource.rc +++ b/dlls/mf/tests/resource.rc @@ -99,6 +99,14 @@ rgb555frame.bmp RCDATA rgb555frame.bmp /* @makedep: rgb555frame-flip.bmp */ rgb555frame-flip.bmp RCDATA rgb555frame-flip.bmp
+/* Generated from running the tests on Windows */ +/* @makedep: iv50frame.bin */ +iv50frame.bin RCDATA iv50frame.bin + +/* Generated from running the tests on Windows */ +/* @makedep: rgb24frame.bmp */ +rgb24frame.bmp RCDATA rgb24frame.bmp + /* Generated with: * gst-launch-1.0 videotestsrc num-buffers=60 pattern=smpte100 ! \ * video/x-raw,format=I420,width=64,height=64,framerate=30000/1001 ! \ diff --git a/dlls/mf/tests/rgb24frame.bmp b/dlls/mf/tests/rgb24frame.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c2676ee6a83e2cfc0d279fb6734400eebe3bc6ce GIT binary patch literal 27702 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 MhPya$_#H(07jZUNtpET3
literal 0 HcmV?d00001
diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 1acc7d1e826..a18aec15b07 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -35,6 +35,7 @@ #include "wmcodecdsp.h" #include "mediaerr.h" #include "amvideo.h" +#include "vfw.h"
#include "mf_test.h"
@@ -54,6 +55,7 @@ DEFINE_GUID(MFVideoFormat_ABGR32,0x00000020,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x DEFINE_GUID(MFVideoFormat_P208,0x38303250,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71); DEFINE_GUID(MFVideoFormat_VC1S,0x53314356,0x0000,0x0010,0x80,0x00,0x00,0xaa,0x00,0x38,0x9b,0x71); DEFINE_GUID(MFVideoFormat_WMV_Unknown,0x7ce12ca9,0xbfbf,0x43d9,0x9d,0x00,0x82,0xb8,0xed,0x54,0x31,0x6b); +DEFINE_MEDIATYPE_GUID(MEDIASUBTYPE_IV50,MAKEFOURCC('I','V','5','0'));
DEFINE_GUID(mft_output_sample_incomplete,0xffffff,0xffff,0xffff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
@@ -888,6 +890,11 @@ DWORD compare_rgb32(const BYTE *data, DWORD *length, const RECT *rect, const BYT return compare_rgb(data, length, rect, expect, 32); }
+DWORD compare_rgb24(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) +{ + return compare_rgb(data, length, rect, expect, 24); +} + DWORD compare_rgb16(const BYTE *data, DWORD *length, const RECT *rect, const BYTE *expect) { return compare_rgb(data, length, rect, expect, 16); @@ -952,6 +959,11 @@ void dump_rgb32(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) return dump_rgb(data, length, rect, output, 32); }
+void dump_rgb24(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) +{ + return dump_rgb(data, length, rect, output, 24); +} + void dump_rgb16(const BYTE *data, DWORD length, const RECT *rect, HANDLE output) { return dump_rgb(data, length, rect, output, 16); @@ -7418,6 +7430,198 @@ failed: CoUninitialize(); }
+static void test_iv50_encoder(void) +{ + static const BITMAPINFOHEADER expect_iv50 = + { + .biSize = sizeof(BITMAPINFOHEADER), + .biWidth = 0x60, .biHeight = 0x60, + .biPlanes = 1, .biBitCount = 0x18, + .biCompression = mmioFOURCC('I','V','5','0'), + .biSizeImage = 0x5100, + }; + const struct buffer_desc iv50_buffer_desc = + { + .length = 0x2e8, + }; + const struct sample_desc iv50_sample_desc = + { + .buffer_count = 1, .buffers = &iv50_buffer_desc, + }; + const BYTE *res_data; + BYTE rgb_data[0x6c00], iv50_data[0x5100]; + BITMAPINFO rgb_info, iv50_info; + IMFCollection *collection; + DWORD flags, res_len, ret; + IMFSample *sample; + LRESULT res; + HRESULT hr; + HIC hic; + + load_resource(L"rgb555frame.bmp", (const BYTE **)&res_data, &res_len); + res_data += 2 + 3 * sizeof(DWORD); + res_len -= 2 + 3 * sizeof(DWORD); + rgb_info.bmiHeader = *(BITMAPINFOHEADER *)res_data; + memcpy(rgb_data, res_data + sizeof(BITMAPINFOHEADER), res_len - sizeof(BITMAPINFOHEADER)); + + hic = ICOpen(ICTYPE_VIDEO, expect_iv50.biCompression, ICMODE_COMPRESS); + if (!hic) + { + todo_wine + win_skip("ICOpen failed to created IV50 compressor.\n"); + return; + } + + res = ICCompressQuery(hic, &rgb_info, NULL); + todo_wine + ok(!res, "got res %#Ix\n", res); + if (res) + goto done; + + res = ICCompressGetSize(hic, &rgb_info, NULL); + ok(res == expect_iv50.biSizeImage, "got res %#Ix\n", res); + + res = ICCompressGetFormatSize(hic, &rgb_info); + ok(res == sizeof(BITMAPINFOHEADER), "got res %#Ix\n", res); + res = ICCompressGetFormat(hic, &rgb_info, &iv50_info); + ok(!res, "got res %#Ix\n", res); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biSize); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biWidth); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biHeight); + check_member(iv50_info.bmiHeader, expect_iv50, "%#x", biPlanes); + check_member(iv50_info.bmiHeader, expect_iv50, "%#x", biBitCount); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biCompression); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biSizeImage); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biXPelsPerMeter); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biYPelsPerMeter); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biClrUsed); + check_member(iv50_info.bmiHeader, expect_iv50, "%#lx", biClrImportant); + res = ICCompressQuery(hic, &rgb_info, &iv50_info); + ok(!res, "got res %#Ix\n", res); + + res = ICCompressBegin(hic, &rgb_info, &iv50_info); + ok(!res, "got res %#Ix\n", res); + memset(iv50_data, 0xcd, sizeof(iv50_data)); + res = ICCompress(hic, ICCOMPRESS_KEYFRAME, &iv50_info.bmiHeader, iv50_data, &rgb_info.bmiHeader, rgb_data, + NULL, &flags, 1, 0, 0, NULL, NULL); + ok(!res, "got res %#Ix\n", res); + ok(flags == 0x10, "got flags %#lx\n", flags); + ok(iv50_info.bmiHeader.biSizeImage == 0x2e8, "got res %#Ix\n", res); + res = ICCompressEnd(hic); + ok(!res, "got res %#Ix\n", res); + + hr = MFCreateCollection(&collection); + ok(hr == S_OK, "got hr %#lx\n", hr); + sample = create_sample(iv50_data, iv50_info.bmiHeader.biSizeImage); + ok(!!sample, "got sample %p\n", sample); + hr = IMFSample_SetSampleTime(sample, 0); + ok(hr == S_OK, "got hr %#lx\n", hr); + hr = IMFSample_SetSampleDuration(sample, 0); + ok(hr == S_OK, "got hr %#lx\n", hr); + hr = IMFCollection_AddElement(collection, (IUnknown *)sample); + ok(hr == S_OK, "got hr %#lx\n", hr); + ret = check_mf_sample_collection(collection, &iv50_sample_desc, L"iv50frame.bin"); + ok(ret == 0, "got %lu%% diff\n", ret); + IMFCollection_Release(collection); + +done: + res = ICClose(hic); + ok(!res, "got res %#Ix\n", res); +} + +static void test_iv50_decoder(void) +{ + static const BITMAPINFOHEADER expect_iv50 = + { + .biSize = sizeof(BITMAPINFOHEADER), + .biWidth = 0x60, .biHeight = 0x60, + .biPlanes = 1, .biBitCount = 24, + .biCompression = mmioFOURCC('I','V','5','0'), + .biSizeImage = 0x2e8, + }; + static const BITMAPINFOHEADER expect_rgb = + { + .biSize = sizeof(BITMAPINFOHEADER), + .biWidth = 0x60, .biHeight = 0x60, + .biPlanes = 1, .biBitCount = 24, + .biCompression = BI_RGB, + .biSizeImage = 96 * 96 * 3, + }; + const struct buffer_desc rgb_buffer_desc = + { + .length = 96 * 96 * 3, .compare = compare_rgb24, .dump = dump_rgb24, + .rect = {.right = 82, .bottom = 84}, + }; + const struct sample_desc rgb_sample_desc = + { + .buffer_count = 1, .buffers = &rgb_buffer_desc, + }; + const BYTE *res_data; + BYTE rgb_data[0x6c00], iv50_data[0x5100]; + BITMAPINFO rgb_info, iv50_info; + IMFCollection *collection; + DWORD res_len, ret; + IMFSample *sample; + LRESULT res; + HRESULT hr; + HIC hic; + + load_resource(L"iv50frame.bin", (const BYTE **)&res_data, &res_len); + memcpy(iv50_data, res_data, res_len); + + iv50_info.bmiHeader = expect_iv50; + hic = ICOpen(ICTYPE_VIDEO, expect_iv50.biCompression, ICMODE_DECOMPRESS); + if (!hic) + { + todo_wine + win_skip("ICOpen failed to created IV50 decompressor.\n"); + return; + } + + res = ICDecompressGetFormat(hic, &iv50_info, &rgb_info); + ok(!res, "got res %#Ix\n", res); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biSize); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biWidth); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biHeight); + check_member(rgb_info.bmiHeader, expect_rgb, "%#x", biPlanes); + todo_wine + check_member(rgb_info.bmiHeader, expect_rgb, "%#x", biBitCount); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biCompression); + todo_wine + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biSizeImage); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biXPelsPerMeter); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biYPelsPerMeter); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biClrUsed); + check_member(rgb_info.bmiHeader, expect_rgb, "%#lx", biClrImportant); + rgb_info.bmiHeader = expect_rgb; + + res = ICDecompressBegin(hic, &iv50_info, &rgb_info); + ok(!res, "got res %#Ix\n", res); + res = ICDecompress(hic, 0, &iv50_info.bmiHeader, iv50_data, &rgb_info.bmiHeader, rgb_data); + ok(!res, "got res %#Ix\n", res); + res = ICDecompressEnd(hic); + todo_wine + ok(!res, "got res %#Ix\n", res); + + res = ICClose(hic); + ok(!res, "got res %#Ix\n", res); + + + hr = MFCreateCollection(&collection); + ok(hr == S_OK, "got hr %#lx\n", hr); + sample = create_sample(rgb_data, rgb_info.bmiHeader.biSizeImage); + ok(!!sample, "got sample %p\n", sample); + hr = IMFSample_SetSampleTime(sample, 0); + ok(hr == S_OK, "got hr %#lx\n", hr); + hr = IMFSample_SetSampleDuration(sample, 0); + ok(hr == S_OK, "got hr %#lx\n", hr); + hr = IMFCollection_AddElement(collection, (IUnknown *)sample); + ok(hr == S_OK, "got hr %#lx\n", hr); + ret = check_mf_sample_collection(collection, &rgb_sample_desc, L"rgb24frame.bmp"); + ok(ret <= 4, "got %lu%% diff\n", ret); + IMFCollection_Release(collection); +} + START_TEST(transform) { init_functions(); @@ -7436,5 +7640,8 @@ START_TEST(transform) test_color_convert(); test_video_processor(); test_mp3_decoder(); + test_iv50_encoder(); + test_iv50_decoder(); + test_h264_with_dxgi_manager(); }