From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mf/tests/resource.rc | 3 ++ dlls/mf/tests/transform.c | 94 ++++++++++++++++++++++++++++++++++- dlls/mf/tests/wmvencdata.bin | Bin 0 -> 911 bytes 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 dlls/mf/tests/wmvencdata.bin
diff --git a/dlls/mf/tests/resource.rc b/dlls/mf/tests/resource.rc index 08d123d5c8f..6cbf64d4528 100644 --- a/dlls/mf/tests/resource.rc +++ b/dlls/mf/tests/resource.rc @@ -38,6 +38,9 @@ wmaencdata.bin RCDATA wmaencdata.bin /* @makedep: wmadecdata.bin */ wmadecdata.bin RCDATA wmadecdata.bin
+/* @makedep: wmvencdata.bin */ +wmvencdata.bin RCDATA wmvencdata.bin + /* Generated with: * gst-launch-1.0 filesrc location=dlls/mf/tests/audiodata.bin ! \ * audio/x-raw,format=F32LE,rate=22050,channels=2,layout=interleaved ! \ diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index 8daa2ce1d3a..dc3ae2b7201 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -572,7 +572,7 @@ static HRESULT check_mft_process_output_(int line, IMFTransform *transform, IMFS { 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]; + MFT_OUTPUT_DATA_BUFFER output[3]; HRESULT hr, ret; DWORD status;
@@ -3917,12 +3917,47 @@ static void test_wmv_encoder(void) .cbAlignment = 1, };
+ const struct buffer_desc output_buffer_desc[] = + { + {.length = -1 /* variable */}, + }; + const struct attribute_desc output_sample_attributes_key[] = + { + ATTR_UINT32(MFSampleExtension_CleanPoint, 1), + {0}, + }; + const struct attribute_desc output_sample_attributes[] = + { + ATTR_UINT32(MFSampleExtension_CleanPoint, 0), + {0}, + }; + const struct sample_desc output_sample_desc[] = + { + { + .attributes = output_sample_attributes_key, + .sample_time = 0, .sample_duration = 333333, + .buffer_count = 1, .buffers = output_buffer_desc, + }, + { + .attributes = output_sample_attributes, + .sample_time = 333333, .sample_duration = 333333, + .buffer_count = 1, .buffers = output_buffer_desc, .repeat_count = 4 + }, + }; + MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Video, MFVideoFormat_WMV1}; MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Video, MFVideoFormat_NV12}; + IMFSample *input_sample, *output_sample; + DWORD status, length, output_status; + MFT_OUTPUT_DATA_BUFFER output; + IMFCollection *output_samples; + const BYTE *nv12frame_data; IMFMediaType *media_type; + ULONG nv12frame_data_len; IMFTransform *transform; ULONG i, ret; HRESULT hr; + LONG ref;
hr = CoInitialize(NULL); ok(hr == S_OK, "Failed to initialize, hr %#lx.\n", hr); @@ -3986,6 +4021,63 @@ static void test_wmv_encoder(void) check_mft_get_input_stream_info(transform, S_OK, &expect_input_info); check_mft_get_output_stream_info(transform, S_OK, &expect_output_info);
+ if (!has_video_processor) + { + win_skip("Skipping WMV encoder tests on Win7\n"); + goto done; + } + + load_resource(L"nv12frame.bmp", &nv12frame_data, &nv12frame_data_len); + /* skip BMP header and RGB data from the dump */ + length = *(DWORD *)(nv12frame_data + 2); + nv12frame_data_len = nv12frame_data_len - length; + nv12frame_data = nv12frame_data + length; + ok(nv12frame_data_len == 13824, "got length %lu\n", nv12frame_data_len); + + hr = MFCreateCollection(&output_samples); + ok(hr == S_OK, "MFCreateCollection returned %#lx\n", hr); + + for (i = 0; i < 5; i++) + { + input_sample = create_sample(nv12frame_data, nv12frame_data_len); + hr = IMFSample_SetSampleTime(input_sample, i * 333333); + ok(hr == S_OK, "SetSampleTime returned %#lx\n", hr); + hr = IMFSample_SetSampleDuration(input_sample, 333333); + ok(hr == S_OK, "SetSampleDuration returned %#lx\n", hr); + hr = IMFTransform_ProcessInput(transform, 0, input_sample, 0); + ok(hr == S_OK, "ProcessInput returned %#lx\n", hr); + ref = IMFSample_Release(input_sample); + ok(ref <= 1, "Release returned %ld\n", ref); + + output_sample = create_sample(NULL, expect_output_info.cbSize); + hr = check_mft_process_output(transform, output_sample, &output_status); + ok(hr == S_OK, "ProcessOutput returned %#lx\n", hr); + 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_collection(output_samples, output_sample_desc, L"wmvencdata.bin"); + ok(ret == 0, "got %lu%% diff\n", ret); + IMFCollection_Release(output_samples); + + output_sample = create_sample(NULL, expect_output_info.cbSize); + status = 0xdeadbeef; + memset(&output, 0, sizeof(output)); + output.pSample = output_sample; + hr = IMFTransform_ProcessOutput(transform, 0, 1, &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); + hr = IMFSample_GetTotalLength(output.pSample, &length); + ok(hr == S_OK, "GetTotalLength returned %#lx\n", hr); + ok(length == 0, "got length %lu\n", length); + ret = IMFSample_Release(output_sample); + ok(ret == 0, "Release returned %lu\n", ret); + +done: ret = IMFTransform_Release(transform); ok(ret == 0, "Release returned %lu\n", ret);
diff --git a/dlls/mf/tests/wmvencdata.bin b/dlls/mf/tests/wmvencdata.bin new file mode 100644 index 0000000000000000000000000000000000000000..a409afaf143822627e2bf775fb88900cca342dda GIT binary patch literal 911 zcmV;A191GB0ssIBu8bT3fq~%AIYNR{@QN4swwy9rXSC6Bn@H;gbL$uN9-_s+55w^M z0|=XmP^i!grpsU@(aAO7fD?8|_kts#Mar;W-7X4$TBhXxDKb!H)InM*%YslMgPCv; zNC*hnO9VxArkjgt^X0c~BB9js-Np}rFXILS3>ZOhVk5zv4Z#sI3<1zEl7PepgE<%Y zejkV6TpXe-nAONM7k4E@otHr;kwA=9ksFKU$gvxC*pf=+B#Od%9v{nT{P)D86ar%I z-J)Bn%oO(2i@)l`DhWPZQh(6C52p4I-uRR!1dn8H2M6F40zlzBAI1y`7%*cXfDA-H z2ZJ{cf+AcH!Q1*MF#JCc!|*N+TD#YP5KWif9HK0mHD^$B-7E?}2>wuHkBcY~Szt;; zP-6fBL_};xf7`byqS}0a^X;kuz?Q(^`~sjz94Fw2=mrFg7&(wY1|lE>ft!cH5g&>K zFm}F*j6V;<@cavjemIp*{1GZ@`Ju~Odhh}XvitKBn4;AXPP$wa{)S6)@{=SyT}9H% zE(t)24qy;S2n~SC!}&_aOd{9}IAv3e9|B*-3<el5g5bnQgE$+4B4ii?pkXBehz$mE zFYx?755TxNL|HUyN?f8<JMcuQtLCv*L~bvaBF}0~u_TqsNfm_jJU^Dx`R|EFC<MiW zT0mLc_bOUxf{Ikzkg!>e3vz|eM1_I#+nD0Fz9dkeFdoR*7#~oS2Pl*fXp|yElyEu> z52?WsC2}g$!E1e7oc~skGuDuDuvXF_9^AB>2K+w{!|*!6kU<3)K?D%^91WL(C?XC) z)(2TL3Irbx8wU=UYrQPtUwDpi|A!=#B$6haa#miffBLMwU(40js<nT={mhep{kJ9% z05t#r07qxQS57%HAA?qVCjOPdqF`uU^c+)_9}mI0VUvFWT{%(k#gl(Z;L$KNF8Wl1 zLU9N}92}4U002aQZ4xJev`C%?(IR*oM2X;S5+{LQ5V%*uaA<ayPioD?CtGcSUmBHz zQ*_WYux@6Eku*e!q9jcbB4~*d2OL5|&k4bxh~A&o+o(=~v`C%?(IR*oM2X;S5+{MQ zNS+0J6|9hhL$<GU_N?4P(Q|FNUk0KnGz}~j%!rv0G9qL|$cbMZCgDSoq7G6wc;FKN l002d2|4mFo^w4Nu|I<?=2ATK-W(fcQ07Vb~|No|gRepa*iw^(*
literal 0 HcmV?d00001