qcap/avimux: Use BaseOutputPinImpl_Connect().

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Zebediah Figura 2019-12-07 22:20:37 -06:00 committed by Alexandre Julliard
parent 47e64825fe
commit 5ea2267f28
1 changed files with 21 additions and 37 deletions

View File

@ -1132,19 +1132,35 @@ static HRESULT source_query_accept(struct strmbase_pin *base, const AM_MEDIA_TYP
return S_OK;
}
static HRESULT WINAPI AviMuxOut_AttemptConnection(struct strmbase_source *base,
static HRESULT WINAPI AviMuxOut_AttemptConnection(struct strmbase_source *iface,
IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
{
AviMux *filter = impl_from_source_pin(&iface->pin);
PIN_DIRECTION dir;
unsigned int i;
HRESULT hr;
TRACE("(%p)->(%p AM_MEDIA_TYPE(%p))\n", base, pReceivePin, pmt);
hr = IPin_QueryDirection(pReceivePin, &dir);
if(hr==S_OK && dir!=PINDIR_INPUT)
return VFW_E_INVALID_DIRECTION;
return BaseOutputPinImpl_AttemptConnection(base, pReceivePin, pmt);
if (FAILED(hr = BaseOutputPinImpl_AttemptConnection(iface, pReceivePin, pmt)))
return hr;
for (i = 0; i < filter->input_pin_no; ++i)
{
if (!filter->in[i]->pin.pin.peer)
continue;
hr = IFilterGraph_Reconnect(filter->filter.filterInfo.pGraph, &filter->in[i]->pin.pin.IPin_iface);
if (FAILED(hr))
{
IPin_Disconnect(&iface->pin.IPin_iface);
break;
}
}
return hr;
}
static HRESULT source_get_media_type(struct strmbase_pin *base, unsigned int iPosition, AM_MEDIA_TYPE *amt)
@ -1201,43 +1217,11 @@ static const struct strmbase_source_ops source_ops =
.pfnDecideAllocator = AviMuxOut_DecideAllocator,
};
static inline AviMux *impl_from_out_IPin(IPin *iface)
{
return CONTAINING_RECORD(iface, AviMux, source.pin.IPin_iface);
}
static HRESULT WINAPI AviMuxOut_Connect(IPin *iface,
IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
{
AviMux *This = impl_from_out_IPin(iface);
HRESULT hr;
int i;
TRACE("(%p)->(%p AM_MEDIA_TYPE(%p))\n", This, pReceivePin, pmt);
hr = BaseOutputPinImpl_Connect(iface, pReceivePin, pmt);
if(FAILED(hr))
return hr;
for(i=0; i<This->input_pin_no; i++) {
if(!This->in[i]->pin.pin.peer)
continue;
hr = IFilterGraph_Reconnect(This->filter.filterInfo.pGraph, &This->in[i]->pin.pin.IPin_iface);
if(FAILED(hr)) {
BaseOutputPinImpl_Disconnect(iface);
break;
}
}
return hr;
}
static const IPinVtbl AviMuxOut_PinVtbl = {
BasePinImpl_QueryInterface,
BasePinImpl_AddRef,
BasePinImpl_Release,
AviMuxOut_Connect,
BaseOutputPinImpl_Connect,
BaseOutputPinImpl_ReceiveConnection,
BaseOutputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,