From: Ziqing Hui zhui@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;