[PATCH v2 5/6] winegstreamer: Support zero-copy wg_transform_read_data in quartz_transform.c.
Rémi Bernon
wine at gitlab.winehq.org
Mon Jun 13 08:14:01 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 | 1 +
dlls/winegstreamer/quartz_transform.c | 31 +++---------------------
dlls/winegstreamer/wg_sample.c | 35 +++++++++++++++++++++++++++
3 files changed, 39 insertions(+), 28 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index a72d72bab18..da0f1b103b3 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -136,6 +136,7 @@ HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sampl
struct wg_sample_queue *queue);
HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *sample,
struct wg_format *format);
+HRESULT wg_transform_read_quartz(struct wg_transform *transform, struct wg_sample *sample);
HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj);
diff --git a/dlls/winegstreamer/quartz_transform.c b/dlls/winegstreamer/quartz_transform.c
index 5617e904bf7..30cfb7b855b 100644
--- a/dlls/winegstreamer/quartz_transform.c
+++ b/dlls/winegstreamer/quartz_transform.c
@@ -291,8 +291,6 @@ static HRESULT WINAPI transform_sink_receive(struct strmbase_sink *pin, IMediaSa
{
struct transform *filter = impl_from_strmbase_filter(pin->pin.filter);
struct wg_sample *wg_sample;
- REFERENCE_TIME start_time;
- REFERENCE_TIME end_time;
HRESULT hr;
/* We do not expect pin connection state to change while the filter is
@@ -334,10 +332,11 @@ static HRESULT WINAPI transform_sink_receive(struct strmbase_sink *pin, IMediaSa
return hr;
}
- hr = wg_transform_read_data(filter->transform, wg_sample, NULL);
+ hr = wg_transform_read_quartz(filter->transform, wg_sample);
+ wg_sample_release(wg_sample);
+
if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT)
{
- wg_sample_release(wg_sample);
IMediaSample_Release(output_sample);
break;
}
@@ -345,36 +344,12 @@ static HRESULT WINAPI transform_sink_receive(struct strmbase_sink *pin, IMediaSa
{
if (hr == MF_E_TRANSFORM_STREAM_CHANGE)
FIXME("Unexpected stream format change!\n");
- wg_sample_release(wg_sample);
IMediaSample_Release(output_sample);
return hr;
}
wg_sample_queue_flush(filter->sample_queue, false);
- hr = IMediaSample_SetActualDataLength(output_sample, wg_sample->size);
- if (FAILED(hr))
- {
- wg_sample_release(wg_sample);
- IMediaSample_Release(output_sample);
- return hr;
- }
-
- if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_PTS)
- {
- start_time = wg_sample->pts;
- if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_DURATION)
- {
- end_time = start_time + wg_sample->duration;
- IMediaSample_SetTime(output_sample, &start_time, &end_time);
- }
- else
- {
- IMediaSample_SetTime(output_sample, &start_time, NULL);
- }
- }
- wg_sample_release(wg_sample);
-
hr = IMemInputPin_Receive(filter->source.pMemInputPin, output_sample);
if (FAILED(hr))
{
diff --git a/dlls/winegstreamer/wg_sample.c b/dlls/winegstreamer/wg_sample.c
index cd17b88cdd3..47892b71796 100644
--- a/dlls/winegstreamer/wg_sample.c
+++ b/dlls/winegstreamer/wg_sample.c
@@ -329,3 +329,38 @@ HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sampl
return hr;
}
+
+HRESULT wg_transform_read_quartz(struct wg_transform *transform, struct wg_sample *wg_sample)
+{
+ struct sample *sample = unsafe_quartz_from_wg_sample(wg_sample);
+ REFERENCE_TIME start_time, end_time;
+ HRESULT hr;
+ BOOL value;
+
+ TRACE_(mfplat)("transform %p, wg_sample %p.\n", transform, wg_sample);
+
+ if (FAILED(hr = wg_transform_read_data(transform, wg_sample, NULL)))
+ return hr;
+
+ if (FAILED(hr = IMediaSample_SetActualDataLength(sample->u.quartz.sample, wg_sample->size)))
+ return hr;
+
+ if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_PTS)
+ {
+ start_time = wg_sample->pts;
+ if (wg_sample->flags & WG_SAMPLE_FLAG_HAS_DURATION)
+ {
+ end_time = start_time + wg_sample->duration;
+ IMediaSample_SetTime(sample->u.quartz.sample, &start_time, &end_time);
+ }
+ else
+ {
+ IMediaSample_SetTime(sample->u.quartz.sample, &start_time, NULL);
+ }
+ }
+
+ value = !!(wg_sample->flags & WG_SAMPLE_FLAG_SYNC_POINT);
+ IMediaSample_SetSyncPoint(sample->u.quartz.sample, value);
+
+ return S_OK;
+}
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/220
More information about the wine-devel
mailing list