From: Ziqing Hui <zhui(a)codeweavers.com> --- dlls/mfreadwrite/tests/mfplat.c | 8 -------- dlls/mfreadwrite/writer.c | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 7c256109ec0..6743347993d 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1735,29 +1735,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); @@ -1878,7 +1872,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); @@ -1938,7 +1931,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 51476b5cde6..3eea6727e13 100644 --- a/dlls/mfreadwrite/writer.c +++ b/dlls/mfreadwrite/writer.c @@ -281,6 +281,7 @@ static HRESULT stream_set_transform(struct stream *stream, IMFTransform *transfo static HRESULT stream_create_transforms(struct stream *stream, IMFMediaType *input_type, IMFMediaType *output_type, BOOL use_encoder) { + IMFMediaType *encoder_input_type; IMFActivate **activates; IMFTransform *transform; UINT32 count = 0, i; @@ -295,6 +296,22 @@ static HRESULT stream_create_transforms(struct stream *stream, continue; if (SUCCEEDED(hr = stream_set_transform(stream, transform, input_type, output_type, use_encoder))) break; + + /* Failed to use a single encoder, try using an encoder and a converter. */ + if (use_encoder && SUCCEEDED(hr = IMFTransform_GetInputAvailableType(transform, 0, 0, &encoder_input_type))) + { + /* Create the converter with a recursive call. */ + hr = stream_create_transforms(stream, input_type, encoder_input_type, FALSE); + IMFMediaType_Release(encoder_input_type); + if (SUCCEEDED(hr)) + { + /* Converter is already set in the recursive call, set encoder here. */ + stream->encoder = transform; + TRACE("Created encoder %p.", transform); + break; + } + } + IMFTransform_Release(transform); } @@ -486,6 +503,7 @@ static HRESULT WINAPI sink_writer_SetInputMediaType(IMFSinkWriterEx *iface, DWOR } /* Types are not compatible, create transforms. */ + stream_release_transforms(stream); if (!(flags & MF_MEDIATYPE_EQUAL_FORMAT_DATA)) { /* Try only using converter first, then try again with encoder. */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9633