[PATCH 4/5] winegstreamer: Introduce new wg_transform_push_data function.
Rémi Bernon
rbernon at codeweavers.com
Tue Feb 22 16:48:18 CST 2022
And use it in WMA decoder ProcessInput to push the input samples.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/winegstreamer/gst_private.h | 1 +
dlls/winegstreamer/main.c | 11 +++++++++++
dlls/winegstreamer/unix_private.h | 1 +
dlls/winegstreamer/unixlib.h | 9 +++++++++
dlls/winegstreamer/wg_parser.c | 2 ++
dlls/winegstreamer/wg_transform.c | 22 +++++++++++++++++++++-
dlls/winegstreamer/wma_decoder.c | 6 ++++++
7 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 7ad3434fd1d..f0774d53613 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -99,6 +99,7 @@ void wg_parser_stream_seek(struct wg_parser_stream *stream, double rate,
struct wg_transform *wg_transform_create(const struct wg_format *input_format,
const struct wg_format *output_format);
void wg_transform_destroy(struct wg_transform *transform);
+HRESULT wg_transform_push_data(struct wg_transform *transform, struct wg_sample *sample);
unsigned int wg_format_get_max_size(const struct wg_format *format);
diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c
index f85e9995525..a3a59e62b98 100644
--- a/dlls/winegstreamer/main.c
+++ b/dlls/winegstreamer/main.c
@@ -273,6 +273,17 @@ void wg_transform_destroy(struct wg_transform *transform)
__wine_unix_call(unix_handle, unix_wg_transform_destroy, transform);
}
+HRESULT wg_transform_push_data(struct wg_transform *transform, struct wg_sample *sample)
+{
+ struct wg_transform_push_data_params params =
+ {
+ .transform = transform,
+ .sample = sample,
+ };
+
+ return __wine_unix_call(unix_handle, unix_wg_transform_push_data, ¶ms);
+}
+
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
{
if (reason == DLL_PROCESS_ATTACH)
diff --git a/dlls/winegstreamer/unix_private.h b/dlls/winegstreamer/unix_private.h
index d3f32484ee6..4f197787baa 100644
--- a/dlls/winegstreamer/unix_private.h
+++ b/dlls/winegstreamer/unix_private.h
@@ -34,5 +34,6 @@ extern GstCaps *wg_format_to_caps(const struct wg_format *format) DECLSPEC_HIDDE
extern NTSTATUS wg_transform_create(void *args) DECLSPEC_HIDDEN;
extern NTSTATUS wg_transform_destroy(void *args) DECLSPEC_HIDDEN;
+extern NTSTATUS wg_transform_push_data(void *args) DECLSPEC_HIDDEN;
#endif /* __WINE_WINEGSTREAMER_UNIX_PRIVATE_H */
diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h
index 59b15df7d08..0162ed8f550 100644
--- a/dlls/winegstreamer/unixlib.h
+++ b/dlls/winegstreamer/unixlib.h
@@ -29,6 +29,7 @@
#include "mmreg.h"
#include "wine/unixlib.h"
+#include "wine/list.h"
struct wg_format
{
@@ -244,6 +245,12 @@ struct wg_transform_create_params
const struct wg_format *output_format;
};
+struct wg_transform_push_data_params
+{
+ struct wg_transform *transform;
+ struct wg_sample *sample;
+};
+
enum unix_funcs
{
unix_wg_parser_create,
@@ -275,6 +282,8 @@ enum unix_funcs
unix_wg_transform_create,
unix_wg_transform_destroy,
+
+ unix_wg_transform_push_data,
};
#endif /* __WINE_WINEGSTREAMER_UNIXLIB_H */
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index d9bbc60964e..5fa49c0219b 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -1660,4 +1660,6 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
X(wg_transform_create),
X(wg_transform_destroy),
+
+ X(wg_transform_push_data),
};
diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c
index a4a4d886865..7a26e0e4774 100644
--- a/dlls/winegstreamer/wg_transform.c
+++ b/dlls/winegstreamer/wg_transform.c
@@ -35,7 +35,7 @@
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "winternl.h"
-#include "dshow.h"
+#include "mferror.h"
#include "unix_private.h"
@@ -309,3 +309,23 @@ out_free_transform:
GST_ERROR("Failed to create winegstreamer transform.");
return status;
}
+
+NTSTATUS wg_transform_push_data(void *args)
+{
+ struct wg_transform_push_data_params *params = args;
+ struct wg_transform *transform = params->transform;
+ struct wg_sample *sample = params->sample;
+ GstFlowReturn ret;
+ GstBuffer *buffer;
+
+ buffer = gst_buffer_new_and_alloc(sample->size);
+ if (!buffer)
+ return STATUS_NO_MEMORY;
+
+ gst_buffer_fill(buffer, 0, sample->data, sample->size);
+ if ((ret = gst_pad_push(transform->my_src, buffer)))
+ return MF_E_NOTACCEPTING;
+
+ GST_DEBUG("Pushed %u bytes", sample->size);
+ return STATUS_SUCCESS;
+}
diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c
index f84faad669d..55b827ed3cd 100644
--- a/dlls/winegstreamer/wma_decoder.c
+++ b/dlls/winegstreamer/wma_decoder.c
@@ -553,6 +553,12 @@ static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFS
return S_OK;
}
+ if (FAILED(hr = wg_transform_push_data(decoder->wg_transform, wg_sample)))
+ {
+ mf_destroy_wg_sample(wg_sample);
+ return hr;
+ }
+
decoder->input_sample = wg_sample;
return S_OK;
}
--
2.34.1
More information about the wine-devel
mailing list