[PATCH v2 1/4] strmbase: Use a separate critical section for the SourceSeeking structure.

Zebediah Figura z.figura12 at gmail.com
Mon Dec 2 22:00:35 CST 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/strmbase/seeking.c         | 53 +++++++++++++++++++--------------
 dlls/winegstreamer/gstdemux.c   |  5 ++--
 dlls/wineqtdecoder/qtsplitter.c |  3 +-
 include/wine/strmbase.h         |  7 +++--
 4 files changed, 40 insertions(+), 28 deletions(-)

diff --git a/dlls/strmbase/seeking.c b/dlls/strmbase/seeking.c
index 8a773b51d5..d87e4f8516 100644
--- a/dlls/strmbase/seeking.c
+++ b/dlls/strmbase/seeking.c
@@ -18,7 +18,6 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
-/* FIXME: critical sections */
 
 #include "strmbase_private.h"
 
@@ -29,7 +28,9 @@ static inline SourceSeeking *impl_from_IMediaSeeking(IMediaSeeking *iface)
     return CONTAINING_RECORD(iface, SourceSeeking, IMediaSeeking_iface);
 }
 
-HRESULT SourceSeeking_Init(SourceSeeking *pSeeking, const IMediaSeekingVtbl *Vtbl, SourceSeeking_ChangeStop fnChangeStop, SourceSeeking_ChangeStart fnChangeStart, SourceSeeking_ChangeRate fnChangeRate, PCRITICAL_SECTION crit_sect)
+HRESULT strmbase_seeking_init(SourceSeeking *pSeeking, const IMediaSeekingVtbl *Vtbl,
+        SourceSeeking_ChangeStop fnChangeStop, SourceSeeking_ChangeStart fnChangeStart,
+        SourceSeeking_ChangeRate fnChangeRate)
 {
     assert(fnChangeStop && fnChangeStart && fnChangeRate);
 
@@ -48,10 +49,16 @@ HRESULT SourceSeeking_Init(SourceSeeking *pSeeking, const IMediaSeekingVtbl *Vtb
     pSeeking->llDuration = pSeeking->llStop;
     pSeeking->dRate = 1.0;
     pSeeking->timeformat = TIME_FORMAT_MEDIA_TIME;
-    pSeeking->crst = crit_sect;
+    InitializeCriticalSection(&pSeeking->cs);
+    pSeeking->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SourceSeeking.cs");
     return S_OK;
 }
 
+void strmbase_seeking_cleanup(SourceSeeking *seeking)
+{
+    DeleteCriticalSection(&seeking->cs);
+}
+
 HRESULT WINAPI SourceSeekingImpl_GetCapabilities(IMediaSeeking * iface, DWORD * pCapabilities)
 {
     SourceSeeking *This = impl_from_IMediaSeeking(iface);
@@ -104,9 +111,9 @@ HRESULT WINAPI SourceSeekingImpl_GetTimeFormat(IMediaSeeking * iface, GUID * pFo
     SourceSeeking *This = impl_from_IMediaSeeking(iface);
     TRACE("(%s)\n", debugstr_guid(pFormat));
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     *pFormat = This->timeformat;
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return S_OK;
 }
@@ -118,10 +125,10 @@ HRESULT WINAPI SourceSeekingImpl_IsUsingTimeFormat(IMediaSeeking * iface, const
 
     TRACE("(%s)\n", debugstr_guid(pFormat));
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     if (!IsEqualIID(pFormat, &This->timeformat))
         hr = S_FALSE;
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return hr;
 }
@@ -140,9 +147,9 @@ HRESULT WINAPI SourceSeekingImpl_GetDuration(IMediaSeeking * iface, LONGLONG * p
 
     TRACE("(%p)\n", pDuration);
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     *pDuration = This->llDuration;
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return S_OK;
 }
@@ -153,9 +160,9 @@ HRESULT WINAPI SourceSeekingImpl_GetStopPosition(IMediaSeeking * iface, LONGLONG
 
     TRACE("(%p)\n", pStop);
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     *pStop = This->llStop;
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return S_OK;
 }
@@ -167,9 +174,9 @@ HRESULT WINAPI SourceSeekingImpl_GetCurrentPosition(IMediaSeeking * iface, LONGL
 
     TRACE("(%p)\n", pCurrent);
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     *pCurrent = This->llCurrent;
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return S_OK;
 }
@@ -214,7 +221,7 @@ HRESULT WINAPI SourceSeekingImpl_SetPositions(IMediaSeeking * iface, LONGLONG *
     LONGLONG llNewCurrent, llNewStop;
 
     TRACE("(%p, %x, %p, %x)\n", pCurrent, dwCurrentFlags, pStop, dwStopFlags);
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
 
     llNewCurrent = Adjust(This->llCurrent, pCurrent, dwCurrentFlags);
     llNewStop = Adjust(This->llStop, pStop, dwStopFlags);
@@ -233,7 +240,7 @@ HRESULT WINAPI SourceSeekingImpl_SetPositions(IMediaSeeking * iface, LONGLONG *
         *pCurrent = llNewCurrent;
     if (pStop && (dwStopFlags & AM_SEEKING_ReturnTime))
         *pStop = llNewStop;
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     if (bChangeCurrent)
         This->fnChangeStart(iface);
@@ -249,10 +256,10 @@ HRESULT WINAPI SourceSeekingImpl_GetPositions(IMediaSeeking * iface, LONGLONG *
 
     TRACE("(%p, %p)\n", pCurrent, pStop);
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     IMediaSeeking_GetCurrentPosition(iface, pCurrent);
     IMediaSeeking_GetStopPosition(iface, pStop);
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return S_OK;
 }
@@ -263,10 +270,10 @@ HRESULT WINAPI SourceSeekingImpl_GetAvailable(IMediaSeeking * iface, LONGLONG *
 
     TRACE("(%p, %p)\n", pEarliest, pLatest);
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     *pEarliest = 0;
     *pLatest = This->llDuration;
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return S_OK;
 }
@@ -285,11 +292,11 @@ HRESULT WINAPI SourceSeekingImpl_SetRate(IMediaSeeking * iface, double dRate)
         return VFW_E_UNSUPPORTED_AUDIO;
     }
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     This->dRate = dRate;
     if (bChangeRate)
         hr = This->fnChangeRate(iface);
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return hr;
 }
@@ -300,10 +307,10 @@ HRESULT WINAPI SourceSeekingImpl_GetRate(IMediaSeeking * iface, double * dRate)
 
     TRACE("(%p)\n", dRate);
 
-    EnterCriticalSection(This->crst);
+    EnterCriticalSection(&This->cs);
     /* Forward? */
     *dRate = This->dRate;
-    LeaveCriticalSection(This->crst);
+    LeaveCriticalSection(&This->cs);
 
     return S_OK;
 }
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 479077b48f..5fa9d66c93 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -1884,6 +1884,7 @@ static void free_source_pin(struct gstdemux_source *pin)
     FreeMediaType(&pin->mt);
     gst_segment_free(pin->segment);
 
+    strmbase_seeking_cleanup(&pin->seek);
     strmbase_source_cleanup(&pin->pin);
     heap_free(pin);
 }
@@ -1936,8 +1937,8 @@ static struct gstdemux_source *create_pin(struct gstdemux *filter, const WCHAR *
     pin->segment = gst_segment_new();
     gst_segment_init(pin->segment, GST_FORMAT_TIME);
     pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
-    SourceSeeking_Init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop,
-            GST_ChangeCurrent, GST_ChangeRate, &filter->filter.csFilter);
+    strmbase_seeking_init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop,
+            GST_ChangeCurrent, GST_ChangeRate);
     BaseFilterImpl_IncrementPinVersion(&filter->filter);
 
     sprintf(pad_name, "qz_sink_%u", filter->cStreams);
diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c
index fbec10a912..81e18d3420 100644
--- a/dlls/wineqtdecoder/qtsplitter.c
+++ b/dlls/wineqtdecoder/qtsplitter.c
@@ -340,7 +340,8 @@ IUnknown * CALLBACK QTSplitter_create(IUnknown *outer, HRESULT *phr)
     This->pInputPin.pin.peer = NULL;
     This->pInputPin.pin.pFuncsTable = &sink_ops;
 
-    SourceSeeking_Init(&This->sourceSeeking, &QT_Seeking_Vtbl, QTSplitter_ChangeStop, QTSplitter_ChangeStart, QTSplitter_ChangeRate,  &This->filter.csFilter);
+    strmbase_seeking_init(&This->sourceSeeking, &QT_Seeking_Vtbl,
+            QTSplitter_ChangeStop, QTSplitter_ChangeStart, QTSplitter_ChangeRate);
 
     *phr = S_OK;
     return &This->filter.IUnknown_inner;
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index b08303f93d..7949e6670a 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -272,10 +272,13 @@ typedef struct SourceSeeking
 	double dRate;
 	LONGLONG llCurrent, llStop, llDuration;
 	GUID timeformat;
-	PCRITICAL_SECTION crst;
+	CRITICAL_SECTION cs;
 } SourceSeeking;
 
-HRESULT SourceSeeking_Init(SourceSeeking *pSeeking, const IMediaSeekingVtbl *Vtbl, SourceSeeking_ChangeStop fnChangeStop, SourceSeeking_ChangeStart fnChangeStart, SourceSeeking_ChangeRate fnChangeRate, PCRITICAL_SECTION crit_sect);
+HRESULT strmbase_seeking_init(SourceSeeking *seeking, const IMediaSeekingVtbl *vtbl,
+        SourceSeeking_ChangeStop fnChangeStop, SourceSeeking_ChangeStart fnChangeStart,
+        SourceSeeking_ChangeRate fnChangeRate);
+void strmbase_seeking_cleanup(SourceSeeking *seeking);
 
 HRESULT WINAPI SourceSeekingImpl_GetCapabilities(IMediaSeeking * iface, DWORD * pCapabilities);
 HRESULT WINAPI SourceSeekingImpl_CheckCapabilities(IMediaSeeking * iface, DWORD * pCapabilities);
-- 
2.24.0




More information about the wine-devel mailing list