Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/vmr9.c | 8 +++-- dlls/strmbase/renderer.c | 63 ++++++++++++++-------------------------- 2 files changed, 26 insertions(+), 45 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 0177f7e36fa..bdba8f3a7e3 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -356,7 +356,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->num_surfaces || !This->renderer.sink.pin.peer) + if (This->num_surfaces) return S_OK;
if (This->mode == VMR9Mode_Windowless && !This->hWndClippingWindow) @@ -410,7 +410,8 @@ static void vmr_start_stream(struct strmbase_renderer *iface)
TRACE("(%p)\n", This);
- VMR9_maybe_init(This, TRUE); + if (This->renderer.sink.pin.peer) + VMR9_maybe_init(This, TRUE); IVMRImagePresenter9_StartPresenting(This->presenter, This->cookie); SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL, This->source_rect.left, @@ -1760,7 +1761,8 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoClippingWindow(IVMRWindowles
EnterCriticalSection(&This->renderer.filter.csFilter); This->hWndClippingWindow = hwnd; - VMR9_maybe_init(This, FALSE); + if (This->renderer.sink.pin.peer) + VMR9_maybe_init(This, FALSE); if (!hwnd) IVMRSurfaceAllocatorEx9_TerminateDevice(This->allocator, This->cookie); LeaveCriticalSection(&This->renderer.filter.csFilter); diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index cedcd9a62a0..7b9736ccfb2 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -40,46 +40,6 @@ static inline struct strmbase_renderer *impl_from_IPin(IPin *iface) return CONTAINING_RECORD(iface, struct strmbase_renderer, sink.pin.IPin_iface); }
-static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt) -{ - struct strmbase_renderer *filter = impl_from_IPin(iface); - HRESULT hr; - - TRACE("iface %p, peer %p, mt %p.\n", iface, peer, mt); - strmbase_dump_media_type(mt); - - EnterCriticalSection(&filter->filter.csFilter); - hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt); - if (SUCCEEDED(hr)) - { - if (filter->pFuncsTable->renderer_connect) - hr = filter->pFuncsTable->renderer_connect(filter, mt); - } - LeaveCriticalSection(&filter->filter.csFilter); - - return hr; -} - -static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface) -{ - struct strmbase_renderer *filter = impl_from_IPin(iface); - HRESULT hr; - - TRACE("iface %p.\n", iface); - - EnterCriticalSection(&filter->filter.csFilter); - hr = BasePinImpl_Disconnect(iface); - if (SUCCEEDED(hr)) - { - if (filter->pFuncsTable->pfnBreakConnect) - hr = filter->pFuncsTable->pfnBreakConnect(filter); - } - BaseRendererImpl_ClearPendingSample(filter); - LeaveCriticalSection(&filter->filter.csFilter); - - return hr; -} - static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface) { struct strmbase_renderer *filter = impl_from_IPin(iface); @@ -157,8 +117,8 @@ static const IPinVtbl BaseRenderer_InputPin_Vtbl = BasePinImpl_AddRef, BasePinImpl_Release, BaseInputPinImpl_Connect, - BaseRenderer_InputPin_ReceiveConnection, - BaseRenderer_InputPin_Disconnect, + BaseInputPinImpl_ReceiveConnection, + BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, BasePinImpl_QueryPinInfo, @@ -312,12 +272,31 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp return BaseRendererImpl_Receive(filter, sample); }
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt) +{ + struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface); + + if (filter->pFuncsTable->renderer_connect) + return filter->pFuncsTable->renderer_connect(filter, mt); + return S_OK; +} + +static void sink_disconnect(struct strmbase_sink *iface) +{ + struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface); + + if (filter->pFuncsTable->pfnBreakConnect) + filter->pFuncsTable->pfnBreakConnect(filter); +} + static const struct strmbase_sink_ops sink_ops = { .base.pin_query_accept = sink_query_accept, .base.pin_query_interface = sink_query_interface, .base.pin_get_media_type = strmbase_pin_get_media_type, .pfnReceive = BaseRenderer_Receive, + .sink_connect = sink_connect, + .sink_disconnect = sink_disconnect, };
void strmbase_renderer_cleanup(struct strmbase_renderer *filter)