Zebediah Figura : strmbase/transform: Hold the streaming lock for the entirety of Receive().
Module: wine Branch: master Commit: 3a7f54947e77e6a3bed4f74ae61759f731b1451a URL: https://source.winehq.org/git/wine.git/?a=commit;h=3a7f54947e77e6a3bed4f74ae... Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Sat Nov 30 19:48:32 2019 -0600 strmbase/transform: Hold the streaming lock for the entirety of Receive(). Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/quartz/acmwrapper.c | 4 ---- dlls/quartz/avidec.c | 22 +++++++++------------- dlls/strmbase/transform.c | 2 +- dlls/winegstreamer/gsttffilter.c | 3 --- 4 files changed, 10 insertions(+), 21 deletions(-) diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c index 64e0018980..8eea6ab147 100644 --- a/dlls/quartz/acmwrapper.c +++ b/dlls/quartz/acmwrapper.c @@ -66,12 +66,10 @@ static HRESULT WINAPI ACMWrapper_Receive(TransformFilter *tf, IMediaSample *pSam LONGLONG tStart = -1, tStop = -1, tMed; LONGLONG mtStart = -1, mtStop = -1, mtMed; - EnterCriticalSection(&This->tf.csReceive); hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) { ERR("Cannot get pointer to sample data (%x)\n", hr); - LeaveCriticalSection(&This->tf.csReceive); return hr; } @@ -107,7 +105,6 @@ static HRESULT WINAPI ACMWrapper_Receive(TransformFilter *tf, IMediaSample *pSam if (FAILED(hr)) { ERR("Unable to get delivery buffer (%x)\n", hr); - LeaveCriticalSection(&This->tf.csReceive); return hr; } IMediaSample_SetPreroll(pOutSample, preroll); @@ -224,7 +221,6 @@ error: This->lasttime_real = tStop; This->lasttime_sent = tMed; - LeaveCriticalSection(&This->tf.csReceive); return hr; } diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c index cbe109df2b..32969a3473 100644 --- a/dlls/quartz/avidec.c +++ b/dlls/quartz/avidec.c @@ -111,12 +111,11 @@ static HRESULT WINAPI AVIDec_Receive(TransformFilter *tf, IMediaSample *pSample) LONGLONG tStart, tStop; DWORD flags = 0; - EnterCriticalSection(&This->tf.csReceive); hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) { ERR("Cannot get pointer to sample data (%x)\n", hr); - goto error; + return hr; } cbSrcStream = IMediaSample_GetActualDataLength(pSample); @@ -129,7 +128,7 @@ static HRESULT WINAPI AVIDec_Receive(TransformFilter *tf, IMediaSample *pSample) hr = BaseOutputPinImpl_GetDeliveryBuffer(&This->tf.source, &pOutSample, NULL, NULL, 0); if (FAILED(hr)) { ERR("Unable to get delivery buffer (%x)\n", hr); - goto error; + return hr; } hr = IMediaSample_SetActualDataLength(pOutSample, 0); @@ -138,13 +137,14 @@ static HRESULT WINAPI AVIDec_Receive(TransformFilter *tf, IMediaSample *pSample) hr = IMediaSample_GetPointer(pOutSample, &pbDstStream); if (FAILED(hr)) { ERR("Unable to get pointer to buffer (%x)\n", hr); - goto error; + IMediaSample_Release(pOutSample); + return hr; } cbDstStream = IMediaSample_GetSize(pOutSample); if (cbDstStream < This->pBihOut->biSizeImage) { ERR("Sample size is too small %d < %d\n", cbDstStream, This->pBihOut->biSizeImage); - hr = E_FAIL; - goto error; + IMediaSample_Release(pOutSample); + return E_FAIL; } if (IMediaSample_IsPreroll(pSample) == S_OK) @@ -161,8 +161,8 @@ static HRESULT WINAPI AVIDec_Receive(TransformFilter *tf, IMediaSample *pSample) /* Drop sample if it's intended to be dropped */ if (flags & ICDECOMPRESS_HURRYUP) { - hr = S_OK; - goto error; + IMediaSample_Release(pOutSample); + return S_OK; } IMediaSample_SetActualDataLength(pOutSample, This->pBihOut->biSizeImage); @@ -187,11 +187,7 @@ static HRESULT WINAPI AVIDec_Receive(TransformFilter *tf, IMediaSample *pSample) if (hr != S_OK && hr != VFW_E_NOT_CONNECTED) ERR("Error sending sample (%x)\n", hr); -error: - if (pOutSample) - IMediaSample_Release(pOutSample); - - LeaveCriticalSection(&This->tf.csReceive); + IMediaSample_Release(pOutSample); return hr; } diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index 7650232c44..9e2582a0db 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -82,12 +82,12 @@ static HRESULT WINAPI TransformFilter_Input_Receive(struct strmbase_sink *This, return S_FALSE; } - LeaveCriticalSection(&pTransform->csReceive); if (pTransform->pFuncsTable->pfnReceive) hr = pTransform->pFuncsTable->pfnReceive(pTransform, pInSample); else hr = S_FALSE; + LeaveCriticalSection(&pTransform->csReceive); return hr; } diff --git a/dlls/winegstreamer/gsttffilter.c b/dlls/winegstreamer/gsttffilter.c index baa4c0c2c5..9ff5f8741d 100644 --- a/dlls/winegstreamer/gsttffilter.c +++ b/dlls/winegstreamer/gsttffilter.c @@ -227,7 +227,6 @@ static HRESULT WINAPI Gstreamer_transform_ProcessData(TransformFilter *iface, IM mark_wine_thread(); - EnterCriticalSection(&This->tf.csReceive); IMediaSample_GetPointer(sample, &data); IMediaSample_AddRef(sample); @@ -235,7 +234,6 @@ static HRESULT WINAPI Gstreamer_transform_ProcessData(TransformFilter *iface, IM buf = gst_buffer_new_wrapped_full(0, data, bufsize, 0, bufsize, sample, release_sample_wrapper); if (!buf) { IMediaSample_Release(sample); - LeaveCriticalSection(&This->tf.csReceive); return S_OK; } @@ -259,7 +257,6 @@ static HRESULT WINAPI Gstreamer_transform_ProcessData(TransformFilter *iface, IM GST_BUFFER_FLAG_SET(buf, GST_BUFFER_FLAG_LIVE); if (IMediaSample_IsSyncPoint(sample) != S_OK) GST_BUFFER_FLAG_SET(buf, GST_BUFFER_FLAG_DELTA_UNIT); - LeaveCriticalSection(&This->tf.csReceive); ret = gst_pad_push(This->my_src, buf); if (ret) WARN("Sending returned: %i\n", ret);
participants (1)
-
Alexandre Julliard