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; +}