From: Ziqing Hui zhui@codeweavers.com
--- dlls/mfreadwrite/tests/mfplat.c | 8 -------- dlls/mfreadwrite/writer.c | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 81bfc3eda76..afcc1b86970 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1723,29 +1723,23 @@ static void test_sink_writer_get_object(void) 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);
hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 0, &guid, &transform); - todo_wine ok(hr == S_OK, "GetTransformForStream returned %#lx.\n", hr); - todo_wine ok(IsEqualGUID(&guid, &MFT_CATEGORY_VIDEO_PROCESSOR), "Unexpected guid %s.\n", debugstr_guid(&guid)); if (hr == S_OK) IMFTransform_Release(transform);
hr = IMFSinkWriterEx_GetTransformForStream(writer_ex, 0, 1, &guid, &transform); - todo_wine ok(hr == S_OK, "GetTransformForStream returned %#lx.\n", hr); - todo_wine ok(IsEqualGUID(&guid, &MFT_CATEGORY_VIDEO_ENCODER), "Unexpected guid %s.\n", debugstr_guid(&guid)); if (hr == S_OK) IMFTransform_Release(transform); @@ -1849,7 +1843,6 @@ static void test_sink_writer_add_stream(void) ok(hr == MF_E_INVALIDSTREAMNUMBER, "SetInputMediaType returned %#lx.\n", hr);
hr = IMFSinkWriter_SetInputMediaType(writer, 0, input_type, NULL); - todo_wine ok(hr == S_OK, "SetInputMediaType returned %#lx.\n", hr);
IMFMediaType_Release(input_type); @@ -1909,7 +1902,6 @@ static void test_sink_writer_sample_process(void) 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);
diff --git a/dlls/mfreadwrite/writer.c b/dlls/mfreadwrite/writer.c index b494d2edd0c..22595a62c7e 100644 --- a/dlls/mfreadwrite/writer.c +++ b/dlls/mfreadwrite/writer.c @@ -211,7 +211,20 @@ static HRESULT stream_get_type(struct stream *stream, IMFMediaType **out_type)
static HRESULT transform_set_types(struct transform *transform, IMFMediaType *input_type, IMFMediaType *output_type) { - return E_NOTIMPL; + IMFMediaType *output_current_type = NULL; + HRESULT hr; + + /* Set output type on transform. */ + if (FAILED(hr = IMFTransform_SetOutputType(transform->transform, 0, output_type, 0)) + || FAILED(hr = IMFTransform_GetOutputCurrentType(transform->transform, 0, &output_current_type))) + return hr; + + /* Set input type on transform. */ + if (SUCCEEDED(hr = update_media_type(input_type, output_current_type))) + hr = IMFTransform_SetInputType(transform->transform, 0, input_type, 0); + + IMFMediaType_Release(output_current_type); + return hr; }
static HRESULT stream_enumerate_transforms(struct stream *stream, IMFMediaType *input_type, IMFMediaType *output_type,