StreamTime StreamBuffer::GetEnd() const { StreamTime t = mTracksKnownTime; for (uint32_t i = 0; i < mTracks.Length(); ++i) { Track* track = mTracks[i]; if (!track->IsEnded()) { t = std::min(t, track->GetEnd()); } } return t; }
void StreamBuffer::ForgetUpTo(StreamTime aTime) { // Only prune if there is a reasonable chunk (50ms @ 48kHz) to forget, so we // don't spend too much time pruning segments. const StreamTime minChunkSize = 2400; if (aTime < mForgottenTime + minChunkSize) { return; } mForgottenTime = aTime; for (uint32_t i = 0; i < mTracks.Length(); ++i) { Track* track = mTracks[i]; if (track->IsEnded() && track->GetEnd() <= aTime) { mTracks.RemoveElementAt(i); --i; continue; } StreamTime forgetTo = std::min(track->GetEnd() - 1, aTime); track->ForgetUpTo(forgetTo); } }
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->GetEnd())); } } }
StreamTime StreamBuffer::GetAllTracksEnd() const { if (mTracksKnownTime < STREAM_TIME_MAX) { // A track might be added. return STREAM_TIME_MAX; } StreamTime t = 0; for (uint32_t i = 0; i < mTracks.Length(); ++i) { Track* track = mTracks[i]; if (!track->IsEnded()) { return STREAM_TIME_MAX; } t = std::max(t, track->GetEnd()); } return t; }
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); } }