// dir is the direction of our pin. // pReceivePin is the pin we are connecting to. HRESULT CTransInPlaceFilter::CompleteConnect(PIN_DIRECTION dir,IPin *pReceivePin) { UNREFERENCED_PARAMETER(pReceivePin); ASSERT(m_pInput); ASSERT(m_pOutput); // if we are not part of a graph, then don't indirect the pointer // this probably prevents use of the filter without a filtergraph if (!m_pGraph) { return VFW_E_NOT_IN_GRAPH; } // Always reconnect the input to account for buffering changes // // Because we don't get to suggest a type on ReceiveConnection // we need another way of making sure the right type gets used. // // One way would be to have our EnumMediaTypes return our output // connection type first but more deterministic and simple is to // call ReconnectEx passing the type we want to reconnect with // via the base class ReconeectPin method. if (dir == PINDIR_OUTPUT) { if( m_pInput->IsConnected() ) { return ReconnectPin( m_pInput, &m_pOutput->CurrentMediaType() ); } return NOERROR; } ASSERT(dir == PINDIR_INPUT); // Reconnect output if necessary if( m_pOutput->IsConnected() ) { if ( m_pInput->CurrentMediaType() != m_pOutput->CurrentMediaType() ) { return ReconnectPin( m_pOutput, &m_pInput->CurrentMediaType() ); } } return NOERROR; } // ComnpleteConnect
HRESULT CBaseSplitterFilter::RenameOutputPin(DWORD TrackNumSrc, DWORD TrackNumDst, std::vector<CMediaType> mts, BOOL bNeedReconnect /*= FALSE*/) { CAutoLock cAutoLock(&m_csPinMap); CBaseSplitterOutputPin* pPin; if (m_pPinMap.Lookup(TrackNumSrc, pPin)) { AM_MEDIA_TYPE* pmt = NULL; HRESULT hr = S_OK; if (CComQIPtr<IPin> pPinTo = pPin->GetConnected()) { for (size_t i = 0; i < mts.size(); i++) { if (S_OK == pPinTo->QueryAccept(&mts[i])) { pmt = &mts[i]; break; } } if (!pmt) { pmt = &mts[0]; } if (bNeedReconnect) { hr = ReconnectPin(pPinTo, pmt); } } m_pPinMap.RemoveKey(TrackNumSrc); m_pPinMap[TrackNumDst] = pPin; if (pmt) { CAutoLock cAutoLock(&m_csmtnew); m_mtnew[TrackNumDst] = *pmt; } return hr; } return E_FAIL; }