From: Ziqing Hui <zhui(a)codeweavers.com> --- dlls/winegstreamer/video_encoder.c | 36 +++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/dlls/winegstreamer/video_encoder.c b/dlls/winegstreamer/video_encoder.c index b1e51016dd5..62603bddeba 100644 --- a/dlls/winegstreamer/video_encoder.c +++ b/dlls/winegstreamer/video_encoder.c @@ -49,6 +49,10 @@ struct video_encoder MFT_OUTPUT_STREAM_INFO output_info; IMFAttributes *attributes; + + wg_transform_t wg_transform; + struct wg_transform_attrs wg_transform_attrs; + struct wg_sample_queue *wg_sample_queue; }; static inline struct video_encoder *impl_from_IMFTransform(IMFTransform *iface) @@ -114,6 +118,21 @@ static void video_encoder_clear_output_type(struct video_encoder *encoder) } } +static HRESULT video_encoder_create_wg_transform(struct video_encoder *encoder) +{ + return wg_transform_create_mf(encoder->input_type, encoder->output_type, + &encoder->wg_transform_attrs, &encoder->wg_transform); +} + +static void video_encoder_destroy_wg_transform(struct video_encoder *encoder) +{ + if (encoder->wg_transform) + { + wg_transform_destroy(encoder->wg_transform); + encoder->wg_transform = 0; + } +} + static HRESULT WINAPI transform_QueryInterface(IMFTransform *iface, REFIID iid, void **out) { struct video_encoder *encoder = impl_from_IMFTransform(iface); @@ -157,6 +176,9 @@ static ULONG WINAPI transform_Release(IMFTransform *iface) if (encoder->output_type) IMFMediaType_Release(encoder->output_type); IMFAttributes_Release(encoder->attributes); + if (encoder->wg_transform) + wg_transform_destroy(encoder->wg_transform); + wg_sample_queue_destroy(encoder->wg_sample_queue); free(encoder); } @@ -288,6 +310,7 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM if (!type) { video_encoder_clear_input_type(encoder); + video_encoder_destroy_wg_transform(encoder); return S_OK; } @@ -319,9 +342,13 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM return S_OK; video_encoder_clear_input_type(encoder); + video_encoder_destroy_wg_transform(encoder); IMFMediaType_AddRef((encoder->input_type = type)); - return S_OK; + if (FAILED(hr = video_encoder_create_wg_transform(encoder))) + video_encoder_clear_input_type(encoder); + + return hr; } static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) @@ -338,6 +365,7 @@ static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMF { video_encoder_clear_input_type(encoder); video_encoder_clear_output_type(encoder); + video_encoder_destroy_wg_transform(encoder); return S_OK; } @@ -367,6 +395,7 @@ static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMF video_encoder_clear_input_type(encoder); video_encoder_clear_output_type(encoder); + video_encoder_destroy_wg_transform(encoder); IMFMediaType_AddRef((encoder->output_type = type)); /* FIXME: Add MF_MT_MPEG_SEQUENCE_HEADER attribute. */ @@ -497,11 +526,16 @@ static HRESULT video_encoder_create(const GUID *const *input_types, UINT input_t encoder->output_types = output_types; encoder->output_type_count = output_type_count; + encoder->wg_transform_attrs.input_queue_length = 15; + if (FAILED(hr = MFCreateAttributes(&encoder->attributes, 16))) goto failed; if (FAILED(hr = IMFAttributes_SetUINT32(encoder->attributes, &MFT_ENCODER_SUPPORTS_CONFIG_EVENT, TRUE))) goto failed; + if (FAILED(hr = wg_sample_queue_create(&encoder->wg_sample_queue))) + goto failed; + *out = encoder; TRACE("Created video encoder %p\n", encoder); return S_OK; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/5991