[PATCH 4/5] strmbase/renderer: Store the sink pin inline in the BaseRenderer structure.

Zebediah Figura z.figura12 at gmail.com
Thu Jun 20 20:13:19 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/dsoundrender.c  |  28 ++++---
 dlls/quartz/videorenderer.c |  15 ++--
 dlls/quartz/vmr9.c          |  18 ++---
 dlls/strmbase/renderer.c    | 144 +++++++++++++++++-------------------
 include/wine/strmbase.h     |   2 +-
 5 files changed, 98 insertions(+), 109 deletions(-)

diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index 49de73fe3ce..78af8266267 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -99,14 +99,14 @@ static inline DSoundRenderImpl *impl_from_IAMDirectSound(IAMDirectSound *iface)
 }
 
 static REFERENCE_TIME time_from_pos(DSoundRenderImpl *This, DWORD pos) {
-    WAVEFORMATEX *wfx = (WAVEFORMATEX*)This->renderer.pInputPin->pin.mtCurrent.pbFormat;
+    WAVEFORMATEX *wfx = (WAVEFORMATEX *)This->renderer.sink.pin.mtCurrent.pbFormat;
     REFERENCE_TIME ret = 10000000;
     ret = ret * pos / wfx->nAvgBytesPerSec;
     return ret;
 }
 
 static DWORD pos_from_time(DSoundRenderImpl *This, REFERENCE_TIME time) {
-    WAVEFORMATEX *wfx = (WAVEFORMATEX*)This->renderer.pInputPin->pin.mtCurrent.pbFormat;
+    WAVEFORMATEX *wfx = (WAVEFORMATEX *)This->renderer.sink.pin.mtCurrent.pbFormat;
     REFERENCE_TIME ret = time;
     ret *= wfx->nAvgBytesPerSec;
     ret /= 10000000;
@@ -115,7 +115,7 @@ static DWORD pos_from_time(DSoundRenderImpl *This, REFERENCE_TIME time) {
 }
 
 static void DSoundRender_UpdatePositions(DSoundRenderImpl *This, DWORD *seqwritepos, DWORD *minwritepos) {
-    WAVEFORMATEX *wfx = (WAVEFORMATEX*)This->renderer.pInputPin->pin.mtCurrent.pbFormat;
+    WAVEFORMATEX *wfx = (WAVEFORMATEX *)This->renderer.sink.pin.mtCurrent.pbFormat;
     BYTE *buf1, *buf2;
     DWORD size1, size2, playpos, writepos, old_writepos, old_playpos, adv;
     BOOL writepos_set = This->writepos < This->buf_size;
@@ -153,7 +153,7 @@ static void DSoundRender_UpdatePositions(DSoundRenderImpl *This, DWORD *seqwrite
 
 static HRESULT DSoundRender_GetWritePos(DSoundRenderImpl *This, DWORD *ret_writepos, REFERENCE_TIME write_at, DWORD *pfree, DWORD *skip)
 {
-    WAVEFORMATEX *wfx = (WAVEFORMATEX*)This->renderer.pInputPin->pin.mtCurrent.pbFormat;
+    WAVEFORMATEX *wfx = (WAVEFORMATEX *)This->renderer.sink.pin.mtCurrent.pbFormat;
     DWORD writepos, min_writepos, playpos;
     REFERENCE_TIME max_lag = 50 * 10000;
     REFERENCE_TIME min_lag = 25 * 10000;
@@ -273,10 +273,8 @@ static HRESULT DSoundRender_SendSampleData(DSoundRenderImpl* This, REFERENCE_TIM
             ret = WaitForSingleObject(This->blocked, 10);
             EnterCriticalSection(&This->renderer.csRenderLock);
             This->in_loop = 0;
-            if (This->renderer.pInputPin->flushing ||
-                This->renderer.filter.state == State_Stopped) {
+            if (This->renderer.sink.flushing || This->renderer.filter.state == State_Stopped)
                 return This->renderer.filter.state == State_Paused ? S_OK : VFW_E_WRONG_STATE;
-            }
             if (ret != WAIT_TIMEOUT)
                 ERR("%x\n", ret);
             continue;
@@ -322,7 +320,7 @@ static HRESULT WINAPI DSoundRender_PrepareReceive(BaseRenderer *iface, IMediaSam
 
     if (IMediaSample_GetMediaType(pSample, &amt) == S_OK)
     {
-        AM_MEDIA_TYPE *orig = &This->renderer.pInputPin->pin.mtCurrent;
+        AM_MEDIA_TYPE *orig = &This->renderer.sink.pin.mtCurrent;
         WAVEFORMATEX *origfmt = (WAVEFORMATEX *)orig->pbFormat;
         WAVEFORMATEX *newfmt = (WAVEFORMATEX *)amt->pbFormat;
 
@@ -445,7 +443,7 @@ static VOID WINAPI DSoundRender_OnStartStreaming(BaseRenderer * iface)
 
     TRACE("(%p)\n", This);
 
-    if (This->renderer.pInputPin->pin.pConnectedTo)
+    if (This->renderer.sink.pin.pConnectedTo)
     {
         if (This->renderer.filter.state == State_Paused)
         {
@@ -460,7 +458,7 @@ static VOID WINAPI DSoundRender_OnStartStreaming(BaseRenderer * iface)
 static HRESULT WINAPI DSoundRender_CompleteConnect(BaseRenderer * iface, IPin * pReceivePin)
 {
     DSoundRenderImpl *This = impl_from_BaseRenderer(iface);
-    const AM_MEDIA_TYPE * pmt = &This->renderer.pInputPin->pin.mtCurrent;
+    const AM_MEDIA_TYPE *pmt = &This->renderer.sink.pin.mtCurrent;
     HRESULT hr = S_OK;
     WAVEFORMATEX *format;
     DSBUFFERDESC buf_desc;
@@ -519,9 +517,9 @@ static HRESULT WINAPI DSoundRender_BreakConnect(BaseRenderer* iface)
 
     if (This->threadid) {
         PostThreadMessageW(This->threadid, WM_APP, 0, 0);
-        LeaveCriticalSection(This->renderer.pInputPin->pin.pCritSec);
+        LeaveCriticalSection(This->renderer.sink.pin.pCritSec);
         WaitForSingleObject(This->advisethread, INFINITE);
-        EnterCriticalSection(This->renderer.pInputPin->pin.pCritSec);
+        EnterCriticalSection(This->renderer.sink.pin.pCritSec);
         CloseHandle(This->advisethread);
     }
     if (This->dsbuffer)
@@ -728,9 +726,9 @@ static HRESULT WINAPI DSoundRender_Pause(IBaseFilter * iface)
     {
         if (This->renderer.filter.state == State_Stopped)
         {
-            if (This->renderer.pInputPin->pin.pConnectedTo)
+            if (This->renderer.sink.pin.pConnectedTo)
                 ResetEvent(This->renderer.evComplete);
-            This->renderer.pInputPin->end_of_stream = 0;
+            This->renderer.sink.end_of_stream = 0;
         }
 
         hr = IDirectSoundBuffer_Stop(This->dsbuffer);
@@ -1050,7 +1048,7 @@ static HRESULT WINAPI ReferenceClock_GetTime(IReferenceClock *iface,
         DWORD writepos1, writepos2;
         EnterCriticalSection(&This->renderer.filter.csFilter);
         DSoundRender_UpdatePositions(This, &writepos1, &writepos2);
-        if (This->renderer.pInputPin && This->renderer.pInputPin->pin.mtCurrent.pbFormat)
+        if (This->renderer.sink.pin.mtCurrent.pbFormat)
         {
             *pTime = This->play_time + time_from_pos(This, This->last_playpos);
             hr = S_OK;
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c
index 21e56b42b26..a64fffe7a00 100644
--- a/dlls/quartz/videorenderer.c
+++ b/dlls/quartz/videorenderer.c
@@ -201,7 +201,7 @@ static DWORD VideoRenderer_SendSampleData(VideoRendererImpl* This, LPBYTE data,
 
     TRACE("(%p)->(%p, %d)\n", This, data, size);
 
-    hr = IPin_ConnectionMediaType(&This->renderer.pInputPin->pin.IPin_iface, &amt);
+    hr = IPin_ConnectionMediaType(&This->renderer.sink.pin.IPin_iface, &amt);
     if (FAILED(hr)) {
         ERR("Unable to retrieve media type\n");
         return hr;
@@ -424,7 +424,8 @@ static VOID WINAPI VideoRenderer_OnStartStreaming(BaseRenderer* iface)
 
     TRACE("(%p)\n", This);
 
-    if (This->renderer.pInputPin->pin.pConnectedTo && (This->renderer.filter.state == State_Stopped || !This->renderer.pInputPin->end_of_stream))
+    if (This->renderer.sink.pin.pConnectedTo
+        && (This->renderer.filter.state == State_Stopped || !This->renderer.sink.end_of_stream))
     {
         if (This->renderer.filter.state == State_Stopped)
         {
@@ -511,9 +512,9 @@ static HRESULT WINAPI VideoRenderer_GetSourceRect(BaseControlVideo* iface, RECT
 static HRESULT WINAPI VideoRenderer_GetStaticImage(BaseControlVideo* iface, LONG *pBufferSize, LONG *pDIBImage)
 {
     VideoRendererImpl *This = impl_from_BaseControlVideo(iface);
+    AM_MEDIA_TYPE *amt = &This->renderer.sink.pin.mtCurrent;
     BITMAPINFOHEADER *bmiHeader;
     LONG needed_size;
-    AM_MEDIA_TYPE *amt = &This->renderer.pInputPin->pin.mtCurrent;
     char *ptr;
 
     FIXME("(%p/%p)->(%p, %p): partial stub\n", This, iface, pBufferSize, pDIBImage);
@@ -581,7 +582,7 @@ static VIDEOINFOHEADER* WINAPI VideoRenderer_GetVideoFormat(BaseControlVideo* if
 
     TRACE("(%p/%p)\n", This, iface);
 
-    pmt = &This->renderer.pInputPin->pin.mtCurrent;
+    pmt = &This->renderer.sink.pin.mtCurrent;
     if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) {
         return (VIDEOINFOHEADER*)pmt->pbFormat;
     } else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2)) {
@@ -674,7 +675,7 @@ static HRESULT WINAPI VideoRenderer_Pause(IBaseFilter * iface)
     {
         if (This->renderer.filter.state == State_Stopped)
         {
-            This->renderer.pInputPin->end_of_stream = 0;
+            This->renderer.sink.end_of_stream = 0;
             ResetEvent(This->hEvent);
             VideoRenderer_AutoShowWindow(This);
         }
@@ -824,13 +825,13 @@ HRESULT VideoRenderer_create(IUnknown *outer, void **out)
 
     hr = BaseControlWindow_Init(&pVideoRenderer->baseControlWindow, &IVideoWindow_VTable,
             &pVideoRenderer->renderer.filter, &pVideoRenderer->renderer.filter.csFilter,
-            &pVideoRenderer->renderer.pInputPin->pin, &renderer_BaseWindowFuncTable);
+            &pVideoRenderer->renderer.sink.pin, &renderer_BaseWindowFuncTable);
     if (FAILED(hr))
         goto fail;
 
     hr = strmbase_video_init(&pVideoRenderer->baseControlVideo,
             &pVideoRenderer->renderer.filter, &pVideoRenderer->renderer.filter.csFilter,
-            &pVideoRenderer->renderer.pInputPin->pin, &renderer_BaseControlVideoFuncTable);
+            &pVideoRenderer->renderer.sink.pin, &renderer_BaseControlVideoFuncTable);
     if (FAILED(hr))
         goto fail;
 
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index 845b1c4f76e..38c708b14e8 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -204,7 +204,7 @@ static DWORD VMR9_SendSampleData(struct quartz_vmr *This, VMR9PresentationInfo *
 
     TRACE("%p %p %d\n", This, data, size);
 
-    amt = &This->renderer.pInputPin->pin.mtCurrent;
+    amt = &This->renderer.sink.pin.mtCurrent;
 
     if (IsEqualIID(&amt->formattype, &FORMAT_VideoInfo))
     {
@@ -381,7 +381,7 @@ static HRESULT VMR9_maybe_init(struct quartz_vmr *This, BOOL force)
     HRESULT hr;
 
     TRACE("my mode: %u, my window: %p, my last window: %p\n", This->mode, This->baseControlWindow.baseWindow.hWnd, This->hWndClippingWindow);
-    if (This->baseControlWindow.baseWindow.hWnd || !This->renderer.pInputPin->pin.pConnectedTo)
+    if (This->baseControlWindow.baseWindow.hWnd || !This->renderer.sink.pin.pConnectedTo)
         return S_OK;
 
     if (This->mode == VMR9Mode_Windowless && !This->hWndClippingWindow)
@@ -486,7 +486,7 @@ static HRESULT WINAPI VMR9_BreakConnect(BaseRenderer *This)
 
     if (!pVMR9->mode)
         return S_FALSE;
-     if (This->pInputPin->pin.pConnectedTo && pVMR9->allocator && pVMR9->presenter)
+     if (This->sink.pin.pConnectedTo && pVMR9->allocator && pVMR9->presenter)
     {
         if (pVMR9->renderer.filter.state != State_Stopped)
         {
@@ -635,9 +635,9 @@ static HRESULT WINAPI VMR9_GetSourceRect(BaseControlVideo* This, RECT *pSourceRe
 static HRESULT WINAPI VMR9_GetStaticImage(BaseControlVideo* This, LONG *pBufferSize, LONG *pDIBImage)
 {
     struct quartz_vmr* pVMR9 = impl_from_BaseControlVideo(This);
+    AM_MEDIA_TYPE *amt = &pVMR9->renderer.sink.pin.mtCurrent;
     BITMAPINFOHEADER *bmiHeader;
     LONG needed_size;
-    AM_MEDIA_TYPE *amt = &pVMR9->renderer.pInputPin->pin.mtCurrent;
     char *ptr;
 
     FIXME("(%p/%p)->(%p, %p): partial stub\n", pVMR9, This, pBufferSize, pDIBImage);
@@ -705,7 +705,7 @@ static VIDEOINFOHEADER* WINAPI VMR9_GetVideoFormat(BaseControlVideo* This)
 
     TRACE("(%p/%p)\n", pVMR9, This);
 
-    pmt = &pVMR9->renderer.pInputPin->pin.mtCurrent;
+    pmt = &pVMR9->renderer.sink.pin.mtCurrent;
     if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) {
         return (VIDEOINFOHEADER*)pmt->pbFormat;
     } else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2)) {
@@ -2181,14 +2181,14 @@ static HRESULT vmr_create(IUnknown *outer, void **out, const CLSID *clsid)
     if (FAILED(hr))
         goto fail;
 
-    hr = BaseControlWindow_Init(&pVMR->baseControlWindow, &IVideoWindow_VTable, &pVMR->renderer.filter,
-                                &pVMR->renderer.filter.csFilter, &pVMR->renderer.pInputPin->pin,
-                                &renderer_BaseWindowFuncTable);
+    hr = BaseControlWindow_Init(&pVMR->baseControlWindow, &IVideoWindow_VTable,
+            &pVMR->renderer.filter, &pVMR->renderer.filter.csFilter,
+            &pVMR->renderer.sink.pin, &renderer_BaseWindowFuncTable);
     if (FAILED(hr))
         goto fail;
 
     hr = strmbase_video_init(&pVMR->baseControlVideo, &pVMR->renderer.filter,
-            &pVMR->renderer.filter.csFilter, &pVMR->renderer.pInputPin->pin,
+            &pVMR->renderer.filter.csFilter, &pVMR->renderer.sink.pin,
             &renderer_BaseControlVideoFuncTable);
     if (FAILED(hr))
         goto fail;
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 38e1b6c0adb..f7aaaef2891 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -22,11 +22,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(strmbase);
 
-static inline BaseInputPin *impl_BaseInputPin_from_IPin( IPin *iface )
-{
-    return CONTAINING_RECORD(iface, BaseInputPin, pin.IPin_iface);
-}
-
 static inline BaseRenderer *impl_from_IBaseFilter(IBaseFilter *iface)
 {
     return CONTAINING_RECORD(iface, BaseRenderer, filter.IBaseFilter_iface);
@@ -45,54 +40,56 @@ static const IQualityControlVtbl Renderer_QualityControl_Vtbl = {
     QualityControlImpl_SetSink
 };
 
-static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
+static inline BaseRenderer *impl_from_IPin(IPin *iface)
+{
+    return CONTAINING_RECORD(iface, BaseRenderer, sink.pin.IPin_iface);
+}
+
+static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
 {
-    BaseInputPin *This = impl_BaseInputPin_from_IPin(iface);
-    BaseRenderer *renderer = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
+    BaseRenderer *filter = impl_from_IPin(iface);
     HRESULT hr;
 
-    TRACE("(%p/%p)->(%p, %p)\n", This, renderer, pReceivePin, pmt);
+    TRACE("iface %p, peer %p, mt %p.\n", iface, peer, mt);
 
-    EnterCriticalSection(This->pin.pCritSec);
-    hr = BaseInputPinImpl_ReceiveConnection(iface, pReceivePin, pmt);
+    EnterCriticalSection(filter->sink.pin.pCritSec);
+    hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt);
     if (SUCCEEDED(hr))
     {
-        if (renderer->pFuncsTable->pfnCompleteConnect)
-            hr = renderer->pFuncsTable->pfnCompleteConnect(renderer, pReceivePin);
+        if (filter->pFuncsTable->pfnCompleteConnect)
+            hr = filter->pFuncsTable->pfnCompleteConnect(filter, peer);
     }
-    LeaveCriticalSection(This->pin.pCritSec);
+    LeaveCriticalSection(filter->sink.pin.pCritSec);
 
     return hr;
 }
 
 static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
 {
-    BaseInputPin *This = impl_BaseInputPin_from_IPin(iface);
-    BaseRenderer *renderer = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
+    BaseRenderer *filter = impl_from_IPin(iface);
     HRESULT hr;
 
-    TRACE("(%p/%p)\n", This, renderer);
+    TRACE("iface %p.\n", iface);
 
-    EnterCriticalSection(This->pin.pCritSec);
+    EnterCriticalSection(filter->sink.pin.pCritSec);
     hr = BasePinImpl_Disconnect(iface);
     if (SUCCEEDED(hr))
     {
-        if (renderer->pFuncsTable->pfnBreakConnect)
-            hr = renderer->pFuncsTable->pfnBreakConnect(renderer);
+        if (filter->pFuncsTable->pfnBreakConnect)
+            hr = filter->pFuncsTable->pfnBreakConnect(filter);
     }
-    BaseRendererImpl_ClearPendingSample(renderer);
-    LeaveCriticalSection(This->pin.pCritSec);
+    BaseRendererImpl_ClearPendingSample(filter);
+    LeaveCriticalSection(filter->sink.pin.pCritSec);
 
     return hr;
 }
 
 static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
 {
+    BaseRenderer *pFilter = impl_from_IPin(iface);
     HRESULT hr;
-    BaseInputPin* This = impl_BaseInputPin_from_IPin(iface);
-    BaseRenderer *pFilter = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
 
-    TRACE("(%p/%p)->()\n", This, pFilter);
+    TRACE("iface %p.\n", iface);
 
     EnterCriticalSection(&pFilter->csRenderLock);
     EnterCriticalSection(&pFilter->filter.csFilter);
@@ -111,11 +108,10 @@ static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
 
 static HRESULT WINAPI BaseRenderer_InputPin_BeginFlush(IPin * iface)
 {
-    BaseInputPin* This = impl_BaseInputPin_from_IPin(iface);
-    BaseRenderer *pFilter = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
+    BaseRenderer *pFilter = impl_from_IPin(iface);
     HRESULT hr;
 
-    TRACE("(%p/%p)->()\n", This, iface);
+    TRACE("iface %p.\n", iface);
 
     EnterCriticalSection(&pFilter->csRenderLock);
     EnterCriticalSection(&pFilter->filter.csFilter);
@@ -134,11 +130,10 @@ static HRESULT WINAPI BaseRenderer_InputPin_BeginFlush(IPin * iface)
 
 static HRESULT WINAPI BaseRenderer_InputPin_EndFlush(IPin * iface)
 {
-    BaseInputPin* This = impl_BaseInputPin_from_IPin(iface);
-    BaseRenderer *pFilter = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
+    BaseRenderer *pFilter = impl_from_IPin(iface);
     HRESULT hr;
 
-    TRACE("(%p/%p)->()\n", This, pFilter);
+    TRACE("iface %p.\n", iface);
 
     EnterCriticalSection(&pFilter->csRenderLock);
     EnterCriticalSection(&pFilter->filter.csFilter);
@@ -179,12 +174,11 @@ static const IPinVtbl BaseRenderer_InputPin_Vtbl =
 
 static IPin *renderer_get_pin(BaseFilter *iface, unsigned int index)
 {
-    BaseRenderer *This = impl_from_BaseFilter(iface);
-
-    if (index >= 1)
-        return NULL;
+    BaseRenderer *filter = impl_from_BaseFilter(iface);
 
-    return &This->pInputPin->pin.IPin_iface;
+    if (index == 0)
+        return &filter->sink.pin.IPin_iface;
+    return NULL;
 }
 
 static void renderer_destroy(BaseFilter *iface)
@@ -221,16 +215,16 @@ static const BaseFilterFuncTable RendererBaseFilterFuncTable = {
     .filter_query_interface = renderer_query_interface,
 };
 
-static HRESULT WINAPI BaseRenderer_Input_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE * pmt)
+static HRESULT WINAPI BaseRenderer_Input_CheckMediaType(BasePin *pin, const AM_MEDIA_TYPE *mt)
 {
-    BaseRenderer *This = impl_from_IBaseFilter(pin->pinInfo.pFilter);
-    return This->pFuncsTable->pfnCheckMediaType(This, pmt);
+    BaseRenderer *filter = impl_from_IPin(&pin->IPin_iface);
+    return filter->pFuncsTable->pfnCheckMediaType(filter, mt);
 }
 
-static HRESULT WINAPI BaseRenderer_Receive(BaseInputPin *pin, IMediaSample * pSample)
+static HRESULT WINAPI BaseRenderer_Receive(BaseInputPin *pin, IMediaSample *sample)
 {
-    BaseRenderer *This = impl_from_IBaseFilter(pin->pin.pinInfo.pFilter);
-    return BaseRendererImpl_Receive(This, pSample);
+    BaseRenderer *filter = impl_from_IPin(&pin->pin.IPin_iface);
+    return BaseRendererImpl_Receive(filter, sample);
 }
 
 static const BaseInputPinFuncTable input_BaseInputFuncTable = {
@@ -242,57 +236,53 @@ static const BaseInputPinFuncTable input_BaseInputFuncTable = {
 };
 
 
-HRESULT WINAPI strmbase_renderer_init(BaseRenderer *This, const IBaseFilterVtbl *vtbl,
+HRESULT WINAPI strmbase_renderer_init(BaseRenderer *filter, const IBaseFilterVtbl *vtbl,
         IUnknown *outer, const CLSID *clsid, const WCHAR *sink_name, DWORD_PTR debug_info,
         const BaseRendererFuncTable *pBaseFuncsTable)
 {
     PIN_INFO piInput;
     HRESULT hr;
 
-    strmbase_filter_init(&This->filter, vtbl, outer, clsid, debug_info, &RendererBaseFilterFuncTable);
+    strmbase_filter_init(&filter->filter, vtbl, outer, clsid, debug_info, &RendererBaseFilterFuncTable);
 
-    This->pFuncsTable = pBaseFuncsTable;
+    filter->pFuncsTable = pBaseFuncsTable;
 
     /* construct input pin */
     piInput.dir = PINDIR_INPUT;
-    piInput.pFilter = &This->filter.IBaseFilter_iface;
+    piInput.pFilter = &filter->filter.IBaseFilter_iface;
     lstrcpynW(piInput.achName, sink_name, ARRAY_SIZE(piInput.achName));
 
-    hr = BaseInputPin_Construct(&BaseRenderer_InputPin_Vtbl, sizeof(BaseInputPin), &piInput,
-            &input_BaseInputFuncTable, &This->filter.csFilter, NULL, (IPin **)&This->pInputPin);
+    strmbase_sink_init(&filter->sink, &BaseRenderer_InputPin_Vtbl, &piInput,
+            &input_BaseInputFuncTable, &filter->filter.csFilter, NULL);
 
-    if (SUCCEEDED(hr))
+    hr = CreatePosPassThru(outer ? outer : (IUnknown *)&filter->filter.IBaseFilter_iface, TRUE,
+            &filter->sink.pin.IPin_iface, &filter->pPosition);
+    if (FAILED(hr))
     {
-        hr = CreatePosPassThru(outer ? outer : (IUnknown *)&This->filter.IBaseFilter_iface, TRUE,
-                &This->pInputPin->pin.IPin_iface, &This->pPosition);
-        if (FAILED(hr))
-            return hr;
+        strmbase_sink_cleanup(&filter->sink);
+        strmbase_filter_cleanup(&filter->filter);
+        return hr;
+    }
 
-        InitializeCriticalSection(&This->csRenderLock);
-        This->csRenderLock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__": BaseRenderer.csRenderLock");
-        This->evComplete = CreateEventW(NULL, TRUE, TRUE, NULL);
-        This->ThreadSignal = CreateEventW(NULL, TRUE, TRUE, NULL);
-        This->RenderEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
-        This->pMediaSample = NULL;
+    InitializeCriticalSection(&filter->csRenderLock);
+    filter->csRenderLock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__": BaseRenderer.csRenderLock");
+    filter->evComplete = CreateEventW(NULL, TRUE, TRUE, NULL);
+    filter->ThreadSignal = CreateEventW(NULL, TRUE, TRUE, NULL);
+    filter->RenderEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+    filter->pMediaSample = NULL;
 
-        QualityControlImpl_Create(&This->pInputPin->pin.IPin_iface, &This->filter.IBaseFilter_iface, &This->qcimpl);
-        This->qcimpl->IQualityControl_iface.lpVtbl = &Renderer_QualityControl_Vtbl;
-    }
+    QualityControlImpl_Create(&filter->sink.pin.IPin_iface, &filter->filter.IBaseFilter_iface, &filter->qcimpl);
+    filter->qcimpl->IQualityControl_iface.lpVtbl = &Renderer_QualityControl_Vtbl;
 
-    return hr;
+    return S_OK;
 }
 
 void strmbase_renderer_cleanup(BaseRenderer *filter)
 {
-    IPin *peer;
-
-    if (SUCCEEDED(IPin_ConnectedTo(&filter->pInputPin->pin.IPin_iface, &peer)))
-    {
-        IPin_Disconnect(peer);
-        IPin_Release(peer);
-    }
-    IPin_Disconnect(&filter->pInputPin->pin.IPin_iface);
-    BaseInputPin_Destroy(filter->pInputPin);
+    if (filter->sink.pin.pConnectedTo)
+        IPin_Disconnect(filter->sink.pin.pConnectedTo);
+    IPin_Disconnect(&filter->sink.pin.IPin_iface);
+    strmbase_sink_cleanup(&filter->sink);
 
     if (filter->pPosition)
         IUnknown_Release(filter->pPosition);
@@ -316,7 +306,7 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
 
     TRACE("(%p)->%p\n", This, pSample);
 
-    if (This->pInputPin->end_of_stream || This->pInputPin->flushing)
+    if (This->sink.end_of_stream || This->sink.flushing)
         return S_FALSE;
 
     if (This->filter.state == State_Stopped)
@@ -436,9 +426,9 @@ HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
     SetEvent(This->evComplete);
     ResetEvent(This->ThreadSignal);
 
-    if (This->pInputPin->pin.pConnectedTo)
+    if (This->sink.pin.pConnectedTo)
     {
-        This->pInputPin->end_of_stream = FALSE;
+        This->sink.end_of_stream = FALSE;
     }
     else if (This->filter.filterInfo.pGraph)
     {
@@ -479,9 +469,9 @@ HRESULT WINAPI BaseRendererImpl_Pause(IBaseFilter * iface)
         {
             if (This->filter.state == State_Stopped)
             {
-                if (This->pInputPin->pin.pConnectedTo)
+                if (This->sink.pin.pConnectedTo)
                     ResetEvent(This->evComplete);
-                This->pInputPin->end_of_stream = FALSE;
+                This->sink.end_of_stream = FALSE;
             }
             else if (This->pFuncsTable->pfnOnStopStreaming)
                 This->pFuncsTable->pfnOnStopStreaming(This);
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 9c60e4c1fd6..8de92b2826b 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -534,7 +534,7 @@ typedef struct BaseRendererTag
 {
 	BaseFilter filter;
 
-	BaseInputPin *pInputPin;
+	BaseInputPin sink;
 	IUnknown *pPosition;
 	CRITICAL_SECTION csRenderLock;
 	HANDLE evComplete;
-- 
2.21.0




More information about the wine-devel mailing list