mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-15 21:37:17 +00:00
winegstreamer: Support zero-copy wg_transform_read_data in quartz_transform.c.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
This commit is contained in:
parent
6c110bd398
commit
ca0719f440
|
@ -136,6 +136,7 @@ HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sampl
|
||||||
struct wg_sample_queue *queue);
|
struct wg_sample_queue *queue);
|
||||||
HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *sample,
|
HRESULT wg_transform_read_mf(struct wg_transform *transform, struct wg_sample *sample,
|
||||||
struct wg_format *format);
|
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);
|
HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj);
|
||||||
|
|
||||||
|
|
|
@ -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 transform *filter = impl_from_strmbase_filter(pin->pin.filter);
|
||||||
struct wg_sample *wg_sample;
|
struct wg_sample *wg_sample;
|
||||||
REFERENCE_TIME start_time;
|
|
||||||
REFERENCE_TIME end_time;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
/* We do not expect pin connection state to change while the filter is
|
/* 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;
|
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)
|
if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT)
|
||||||
{
|
{
|
||||||
wg_sample_release(wg_sample);
|
|
||||||
IMediaSample_Release(output_sample);
|
IMediaSample_Release(output_sample);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -345,36 +344,12 @@ static HRESULT WINAPI transform_sink_receive(struct strmbase_sink *pin, IMediaSa
|
||||||
{
|
{
|
||||||
if (hr == MF_E_TRANSFORM_STREAM_CHANGE)
|
if (hr == MF_E_TRANSFORM_STREAM_CHANGE)
|
||||||
FIXME("Unexpected stream format change!\n");
|
FIXME("Unexpected stream format change!\n");
|
||||||
wg_sample_release(wg_sample);
|
|
||||||
IMediaSample_Release(output_sample);
|
IMediaSample_Release(output_sample);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
wg_sample_queue_flush(filter->sample_queue, false);
|
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);
|
hr = IMemInputPin_Receive(filter->source.pMemInputPin, output_sample);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
|
|
|
@ -329,3 +329,38 @@ HRESULT wg_transform_push_quartz(struct wg_transform *transform, struct wg_sampl
|
||||||
|
|
||||||
return hr;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue