-- v2: winegstreamer/video_encoder: Implement ProcessMessage. winegstreamer/video_encoder: Implement ProcessInput. winegstreamer/video_encoder: Create wg_transform. winegstreamer/video_encoder: Clear input type when setting output type. winegstreamer/video_encoder: Rename create_input_type to video_encoder_create_input_type.
From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/video_encoder.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/winegstreamer/video_encoder.c b/dlls/winegstreamer/video_encoder.c index 2cb73ca89db..1e70a38c7a4 100644 --- a/dlls/winegstreamer/video_encoder.c +++ b/dlls/winegstreamer/video_encoder.c @@ -56,7 +56,8 @@ static inline struct video_encoder *impl_from_IMFTransform(IMFTransform *iface) return CONTAINING_RECORD(iface, struct video_encoder, IMFTransform_iface); }
-static HRESULT create_input_type(struct video_encoder *encoder, const GUID *subtype, IMFMediaType **out) +static HRESULT video_encoder_create_input_type(struct video_encoder *encoder, + const GUID *subtype, IMFMediaType **out) { IMFVideoMediaType *input_type; UINT64 ratio; @@ -239,7 +240,7 @@ static HRESULT WINAPI transform_GetInputAvailableType(IMFTransform *iface, DWORD if (index >= encoder->input_type_count) return MF_E_NO_MORE_TYPES;
- return create_input_type(encoder, encoder->input_types[index], type); + return video_encoder_create_input_type(encoder, encoder->input_types[index], type); }
static HRESULT WINAPI transform_GetOutputAvailableType(IMFTransform *iface, DWORD id, @@ -293,7 +294,7 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM if (i == encoder->input_type_count) return MF_E_INVALIDMEDIATYPE;
- if (FAILED(hr = create_input_type(encoder, &subtype, &good_input_type))) + if (FAILED(hr = video_encoder_create_input_type(encoder, &subtype, &good_input_type))) return hr; hr = IMFMediaType_Compare(good_input_type, (IMFAttributes *)type, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &result);
From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/video_encoder.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/dlls/winegstreamer/video_encoder.c b/dlls/winegstreamer/video_encoder.c index 1e70a38c7a4..ce9a82dff2f 100644 --- a/dlls/winegstreamer/video_encoder.c +++ b/dlls/winegstreamer/video_encoder.c @@ -361,6 +361,12 @@ static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMF || FAILED(IMFMediaType_GetUINT32(type, &MF_MT_INTERLACE_MODE, &uint32_value))) return MF_E_INVALIDMEDIATYPE;
+ if (encoder->input_type) + { + IMFMediaType_Release(encoder->input_type); + encoder->input_type = NULL; + } + if (encoder->output_type) IMFMediaType_Release(encoder->output_type); IMFMediaType_AddRef((encoder->output_type = type));
From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/video_encoder.c | 49 ++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-)
diff --git a/dlls/winegstreamer/video_encoder.c b/dlls/winegstreamer/video_encoder.c index ce9a82dff2f..984be4dcd3a 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) @@ -96,6 +100,18 @@ done: return hr; }
+static HRESULT video_encoder_try_create_wg_transform(struct video_encoder *encoder) +{ + if (encoder->wg_transform) + { + wg_transform_destroy(encoder->wg_transform); + encoder->wg_transform = 0; + } + + return wg_transform_create_mf(encoder->input_type, encoder->output_type, + &encoder->wg_transform_attrs, &encoder->wg_transform); +} + static HRESULT WINAPI transform_QueryInterface(IMFTransform *iface, REFIID iid, void **out) { struct video_encoder *encoder = impl_from_IMFTransform(iface); @@ -139,6 +155,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); }
@@ -274,7 +293,11 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM IMFMediaType_Release(encoder->input_type); encoder->input_type = NULL; } - + if (encoder->wg_transform) + { + wg_transform_destroy(encoder->wg_transform); + encoder->wg_transform = 0; + } return S_OK; }
@@ -309,7 +332,13 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM IMFMediaType_Release(encoder->input_type); IMFMediaType_AddRef((encoder->input_type = type));
- return S_OK; + if (FAILED(hr = video_encoder_try_create_wg_transform(encoder))) + { + IMFMediaType_Release(encoder->input_type); + encoder->input_type = NULL; + } + + return hr; }
static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) @@ -334,6 +363,11 @@ static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMF IMFMediaType_Release(encoder->output_type); encoder->output_type = NULL; } + if (encoder->wg_transform) + { + wg_transform_destroy(encoder->wg_transform); + encoder->wg_transform = 0; + } return S_OK; }
@@ -373,6 +407,12 @@ static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMF
/* FIXME: Add MF_MT_MPEG_SEQUENCE_HEADER attribute. */
+ if (encoder->wg_transform) + { + wg_transform_destroy(encoder->wg_transform); + encoder->wg_transform = 0; + } + return S_OK; }
@@ -499,11 +539,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;
From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/video_encoder.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/winegstreamer/video_encoder.c b/dlls/winegstreamer/video_encoder.c index 984be4dcd3a..874e89d4423 100644 --- a/dlls/winegstreamer/video_encoder.c +++ b/dlls/winegstreamer/video_encoder.c @@ -481,8 +481,14 @@ static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_
static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) { - FIXME("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags); - return E_NOTIMPL; + struct video_encoder *encoder = impl_from_IMFTransform(iface); + + TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags); + + if (!encoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + return wg_transform_push_mf(encoder->wg_transform, sample, encoder->wg_sample_queue); }
static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count,
From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/video_encoder.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/winegstreamer/video_encoder.c b/dlls/winegstreamer/video_encoder.c index 874e89d4423..ee27175ee4f 100644 --- a/dlls/winegstreamer/video_encoder.c +++ b/dlls/winegstreamer/video_encoder.c @@ -475,8 +475,22 @@ static HRESULT WINAPI transform_ProcessEvent(IMFTransform *iface, DWORD id, IMFM
static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) { - FIXME("iface %p, message %#x, param %Ix.\n", iface, message, param); - return E_NOTIMPL; + struct video_encoder *encoder = impl_from_IMFTransform(iface); + + TRACE("iface %p, message %#x, param %Ix.\n", iface, message, param); + + switch (message) + { + case MFT_MESSAGE_COMMAND_DRAIN: + return wg_transform_drain(encoder->wg_transform); + + case MFT_MESSAGE_COMMAND_FLUSH: + return wg_transform_flush(encoder->wg_transform); + + default: + FIXME("Ignoring message %#x.\n", message); + return S_OK; + } }
static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags)
This merge request was approved by Rémi Bernon.