From: Ziqing Hui <zhui(a)codeweavers.com> --- dlls/mfreadwrite/tests/mfplat.c | 3 --- dlls/mfreadwrite/writer.c | 44 ++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index a33ebd23194..7c256109ec0 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1772,14 +1772,11 @@ 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_nv12_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); 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_ENCODER), "Unexpected guid %s.\n", debugstr_guid(&guid)); if (hr == S_OK) IMFTransform_Release(transform); diff --git a/dlls/mfreadwrite/writer.c b/dlls/mfreadwrite/writer.c index 2fef43dbee2..51476b5cde6 100644 --- a/dlls/mfreadwrite/writer.c +++ b/dlls/mfreadwrite/writer.c @@ -243,10 +243,46 @@ static HRESULT stream_enumerate_transforms(struct stream *stream, IMFMediaType * return hr; } +static HRESULT stream_set_transform(struct stream *stream, IMFTransform *transform, + IMFMediaType *input_type, IMFMediaType *output_type, BOOL use_encoder) +{ + IMFMediaType *output_current_type; + HRESULT hr; + + /* Set the output type on transform. */ + if (FAILED(hr = IMFTransform_SetOutputType(transform, 0, output_type, 0)) + || FAILED(hr = IMFTransform_GetOutputCurrentType(transform, 0, &output_current_type))) + return hr; + + /* Set the input type on transform. */ + if (FAILED(hr = update_media_type(input_type, output_current_type, FALSE)) + || FAILED(hr = IMFTransform_SetInputType(transform, 0, input_type, 0))) + { + IMFMediaType_Release(output_current_type); + return hr; + } + + /* Set the transform to stream. */ + if (use_encoder) + { + TRACE("Created encoder %p.\n", transform); + stream->encoder = transform; + } + else + { + TRACE("Created converter %p.\n", transform); + stream->converter = transform; + } + + IMFMediaType_Release(output_current_type); + return hr; +} + static HRESULT stream_create_transforms(struct stream *stream, IMFMediaType *input_type, IMFMediaType *output_type, BOOL use_encoder) { IMFActivate **activates; + IMFTransform *transform; UINT32 count = 0, i; HRESULT hr; @@ -255,9 +291,11 @@ static HRESULT stream_create_transforms(struct stream *stream, return hr; for (i = 0; i < count; i++) { - /* TODO: Create transform from activates. */ - hr = E_NOTIMPL; - break; + if (FAILED(hr = IMFActivate_ActivateObject(activates[i], &IID_IMFTransform, (void **)&transform))) + continue; + if (SUCCEEDED(hr = stream_set_transform(stream, transform, input_type, output_type, use_encoder))) + break; + IMFTransform_Release(transform); } for (i = 0; i < count; ++i) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9633