[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