HRESULT CBaseSplitterFilter::DeliverPacket(CAutoPtr<Packet> p) { HRESULT hr = S_FALSE; CBaseSplitterOutputPin* pPin = GetOutputPin(p->TrackNumber); if (!pPin || !pPin->IsConnected() || !m_pActivePins.Find(pPin)) { return S_FALSE; } if (p->rtStart != Packet::INVALID_TIME) { m_rtCurrent = p->rtStart; p->rtStart -= m_rtStart; p->rtStop -= m_rtStart; ASSERT(p->rtStart <= p->rtStop); } { CAutoLock cAutoLock(&m_csmtnew); CMediaType mt; if (m_mtnew.Lookup(p->TrackNumber, mt)) { p->pmt = CreateMediaType(&mt); m_mtnew.RemoveKey(p->TrackNumber); } } if (!m_bDiscontinuitySent.Find(p->TrackNumber)) { p->bDiscontinuity = TRUE; } DWORD TrackNumber = p->TrackNumber; BOOL bDiscontinuity = p->bDiscontinuity; #if defined(_DEBUG) && 0 TRACE(_T("[%d]: d%d s%d p%d, b=%d, [%20I64d - %20I64d]\n"), p->TrackNumber, p->bDiscontinuity, p->bSyncPoint, p->rtStart != Packet::INVALID_TIME && p->rtStart < 0, p->GetCount(), p->rtStart, p->rtStop); #endif hr = pPin->QueuePacket(p); if (S_OK != hr) { if (POSITION pos = m_pActivePins.Find(pPin)) { m_pActivePins.RemoveAt(pos); } if (!m_pActivePins.IsEmpty()) { // only die when all pins are down hr = S_OK; } return hr; } if (bDiscontinuity) { m_bDiscontinuitySent.AddTail(TrackNumber); } return hr; }