From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 114 +++++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 10 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 9e89d680ca4..8c3fc101cc0 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1630,30 +1630,124 @@ static void test_sink_writer_create(void) IMFAttributes_Release(attr); }
-static void test_sink_writer_mp4(void) +static void test_sink_writer_get_object(void) { - WCHAR tmp_file[MAX_PATH]; + static const struct attribute_desc video_stream_type_desc[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_H264), + ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), + ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001), + ATTR_UINT32(MF_MT_AVG_BITRATE, 193540), + ATTR_UINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive), + {0}, + }; + static const struct attribute_desc video_input_type_desc[] = + { + ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Video), + ATTR_GUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32), + ATTR_RATIO(MF_MT_FRAME_SIZE, 96, 96), + ATTR_RATIO(MF_MT_FRAME_RATE, 30000, 1001), + {0}, + }; + WCHAR temp_path[MAX_PATH], temp_file[MAX_PATH]; + IMFMediaType *stream_type, *input_type; + IMFSinkWriterEx *writer_ex = NULL; + IMFTransform *transform; IMFSinkWriter *writer; IMFMediaSink *sink; + DWORD index; HRESULT hr; + GUID guid; + + GetTempPathW(ARRAY_SIZE(temp_path), temp_path); + GetTempFileNameW(temp_path, L"mf", 0, temp_file); + wcscat(temp_file, L".mp4"); + hr = MFCreateSinkWriterFromURL(temp_file, NULL, NULL, &writer); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- GetTempPathW(ARRAY_SIZE(tmp_file), tmp_file); - wcscat(tmp_file, L"tmp.mp4"); + hr = IMFSinkWriter_QueryInterface(writer, &IID_IMFSinkWriterEx, (void **)&writer_ex); + todo_wine + ok(hr == S_OK, "QueryInterface returned %#lx.\n", hr);
- hr = MFCreateSinkWriterFromURL(tmp_file, NULL, NULL, &writer); + hr = MFCreateMediaType(&stream_type); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(stream_type, video_stream_type_desc, -1); + hr = IMFSinkWriter_AddStream(writer, stream_type, &index); + ok(hr == S_OK, "AddStream returned %#lx.\n", hr); + IMFMediaType_Release(stream_type);
- /* Test GetServiceForStream. */ + /* Get transform before SetInputMediaType. */ + transform = (void *)0xdeadbeef; + hr = IMFSinkWriter_GetServiceForStream(writer, 0, &GUID_NULL, &IID_IMFTransform, (void **)&transform); + todo_wine + ok(hr == MF_E_UNSUPPORTED_SERVICE, "GetServiceForStream returned %#lx.\n", hr); + ok(!transform, "Unexpected transform %p.\n", transform); + + if (writer_ex) + { + transform = (void *)0xdeadbeef; + hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 0, &guid, &transform); + ok(hr == MF_E_INVALIDINDEX, "GetTransformForStream returned %#lx.\n", hr); + ok(!transform, "Unexpected transform %p.\n", transform); + } + + hr = MFCreateMediaType(&input_type); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + init_media_type(input_type, video_input_type_desc, -1); + hr = IMFSinkWriter_SetInputMediaType(writer, 0, input_type, NULL); + todo_wine + ok(hr == S_OK, "SetInputMediaType returned %#lx.\n", hr); + IMFMediaType_Release(input_type); + + /* Get transform after SetInputMediaType. */ + hr = IMFSinkWriter_GetServiceForStream(writer, 0, &GUID_NULL, &IID_IMFTransform, (void **)&transform); + todo_wine + ok(hr == S_OK, "GetServiceForStream returned %#lx.\n", hr); + if (hr == S_OK) + IMFTransform_Release(transform); + + if (writer_ex) + { + hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 0, &guid, &transform); + ok(hr == S_OK, "GetTransformForStream returned %#lx.\n", hr); + ok(IsEqualGUID(&guid, &MFT_CATEGORY_VIDEO_PROCESSOR), "Unexpected guid %s.\n", debugstr_guid(&guid)); + IMFTransform_Release(transform); + + hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 1, &guid, &transform); + ok(hr == S_OK, "GetTransformForStream returned %#lx.\n", hr); + ok(IsEqualGUID(&guid, &MFT_CATEGORY_VIDEO_ENCODER), "Unexpected guid %s.\n", debugstr_guid(&guid)); + IMFTransform_Release(transform); + + transform = (void *)0xdeadbeef; + hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 2, &guid, &transform); + ok(hr == MF_E_INVALIDINDEX, "GetTransformForStream returned %#lx.\n", hr); + ok(!transform, "Unexpected transform %p.\n", transform); + } + + /* Get media sink before BeginWriting. */ sink = (void *)0xdeadbeef; hr = IMFSinkWriter_GetServiceForStream(writer, MF_SINK_WRITER_MEDIASINK, &GUID_NULL, &IID_IMFMediaSink, (void **)&sink); todo_wine - ok(hr == MF_E_UNSUPPORTED_SERVICE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_UNSUPPORTED_SERVICE, "GetServiceForStream returned %#lx.\n", hr); todo_wine - ok(!sink, "Unexpected pointer %p.\n", sink); + ok(!sink, "Unexpected sink %p.\n", sink); + + hr = IMFSinkWriter_BeginWriting(writer); + todo_wine + ok(hr == S_OK, "BeginWriting returned %#lx.\n", hr); + + /* Get media sink after BeginWriting. */ + hr = IMFSinkWriter_GetServiceForStream(writer, MF_SINK_WRITER_MEDIASINK, + &GUID_NULL, &IID_IMFMediaSink, (void **)&sink); + ok(hr == S_OK, "GetServiceForStream returned %#lx.\n", hr); + IMFMediaSink_Release(sink);
- DeleteFileW(tmp_file); + if (writer_ex) + IMFSinkWriterEx_Release(writer_ex); IMFSinkWriter_Release(writer); + DeleteFileW(temp_file); }
static void test_interfaces(void) @@ -3562,7 +3656,7 @@ START_TEST(mfplat) test_source_reader_transforms_d3d11(); test_reader_d3d9(); test_sink_writer_create(); - test_sink_writer_mp4(); + test_sink_writer_get_object();
hr = MFShutdown(); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);