[PATCH v2 4/6] winegstreamer: Support zero-copy wg_transform_push_data in quartz_transform.c.
Rémi Bernon
wine at gitlab.winehq.org
Mon Jun 13 08:14:00 CDT 2022
From: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/winegstreamer/gst_private.h | 2 ++
dlls/winegstreamer/quartz_transform.c | 18 +++-------------
dlls/winegstreamer/wg_sample.c | 31 +++++++++++++++++++++++++++
3 files changed, 36 insertions(+), 15 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 21bd4f25028..a72d72bab18 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -132,6 +132,8 @@ void wg_sample_release(struct wg_sample *wg_sample);
HRESULT wg_transform_push_mf(struct wg_transform *transform, struct wg_sample *sample,
struct wg_sample_queue *queue);
+HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sample *sample,
+ struct wg_sample_queue *queue);
HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *sample,
struct wg_format *format);
diff --git a/dlls/winegstreamer/quartz_transform.c b/dlls/winegstreamer/quartz_transform.c
index 2dd7d038f2f..5617e904bf7 100644
--- a/dlls/winegstreamer/quartz_transform.c
+++ b/dlls/winegstreamer/quartz_transform.c
@@ -315,21 +315,7 @@ static HRESULT WINAPI transform_sink_receive(struct strmbase_sink *pin, IMediaSa
if (FAILED(hr))
return hr;
- hr = IMediaSample_GetTime(sample, &start_time, &end_time);
- if (SUCCEEDED(hr))
- {
- wg_sample->pts = start_time;
- wg_sample->flags |= WG_SAMPLE_FLAG_HAS_PTS;
- }
- if (hr == S_OK)
- {
- wg_sample->duration = end_time - start_time;
- wg_sample->flags |= WG_SAMPLE_FLAG_HAS_DURATION;
- }
-
- hr = wg_transform_push_data(filter->transform, wg_sample);
- wg_sample_release(wg_sample);
-
+ hr = wg_transform_push_quartz(filter->transform, wg_sample, filter->sample_queue);
if (FAILED(hr))
return hr;
@@ -364,6 +350,8 @@ static HRESULT WINAPI transform_sink_receive(struct strmbase_sink *pin, IMediaSa
return hr;
}
+ wg_sample_queue_flush(filter->sample_queue, false);
+
hr = IMediaSample_SetActualDataLength(output_sample, wg_sample->size);
if (FAILED(hr))
{
diff --git a/dlls/winegstreamer/wg_sample.c b/dlls/winegstreamer/wg_sample.c
index dded264b079..cd17b88cdd3 100644
--- a/dlls/winegstreamer/wg_sample.c
+++ b/dlls/winegstreamer/wg_sample.c
@@ -298,3 +298,34 @@ HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *w
return S_OK;
}
+
+HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sample *wg_sample,
+ struct wg_sample_queue *queue)
+{
+ struct sample *sample = unsafe_quartz_from_wg_sample(wg_sample);
+ REFERENCE_TIME start_time, end_time;
+ HRESULT hr;
+
+ TRACE_(quartz)("transform %p, wg_sample %p, queue %p.\n", transform, wg_sample, queue);
+
+ hr = IMediaSample_GetTime(sample->u.quartz.sample, &start_time, &end_time);
+ if (SUCCEEDED(hr))
+ {
+ wg_sample->pts = start_time;
+ wg_sample->flags |= WG_SAMPLE_FLAG_HAS_PTS;
+ }
+ if (hr == S_OK)
+ {
+ wg_sample->duration = end_time - start_time;
+ wg_sample->flags |= WG_SAMPLE_FLAG_HAS_DURATION;
+ }
+
+ if (IMediaSample_IsSyncPoint(sample->u.quartz.sample) == S_OK)
+ wg_sample->flags |= WG_SAMPLE_FLAG_SYNC_POINT;
+
+ wg_sample_queue_begin_append(queue, wg_sample);
+ hr = wg_transform_push_data(transform, wg_sample);
+ wg_sample_queue_end_append(queue, wg_sample);
+
+ return hr;
+}
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/220
More information about the wine-devel
mailing list