StreamTime StreamBuffer::GetEnd() const { StreamTime t = mTracksKnownTime; for (PRUint32 i = 0; i < mTracks.Length(); ++i) { Track* track = mTracks[i]; if (!track->IsEnded()) { t = NS_MIN(t, track->GetEndTimeRoundDown()); } } return t; }
void StreamBuffer::DumpTrackInfo() const { STREAM_LOG(PR_LOG_ALWAYS, ("DumpTracks: mTracksKnownTime %lld", mTracksKnownTime)); for (uint32_t i = 0; i < mTracks.Length(); ++i) { Track* track = mTracks[i]; if (track->IsEnded()) { STREAM_LOG(PR_LOG_ALWAYS, ("Track[%d] %d: ended", i, track->GetID())); } else { STREAM_LOG(PR_LOG_ALWAYS, ("Track[%d] %d: %lld", i, track->GetID(), track->GetEndTimeRoundDown())); } } }
void StreamBuffer::ForgetUpTo(StreamTime aTime) { // Round to nearest 50ms so we don't spend too much time pruning segments. const int roundTo = MillisecondsToMediaTime(50); StreamTime forget = (aTime/roundTo)*roundTo; if (forget <= mForgottenTime) { return; } mForgottenTime = forget; for (PRUint32 i = 0; i < mTracks.Length(); ++i) { Track* track = mTracks[i]; if (track->IsEnded() && track->GetEndTimeRoundDown() <= forget) { mTracks.RemoveElementAt(i); --i; continue; } TrackTicks forgetTo = NS_MIN(track->GetEnd() - 1, track->TimeToTicksRoundDown(forget)); track->ForgetUpTo(forgetTo); } }