bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) { if (cue->startMediaTime() < MediaTime::zeroTime() || cue->endMediaTime() < MediaTime::zeroTime()) return false; if (!m_cues || !m_cues->length()) return false; size_t searchStart = 0; size_t searchEnd = m_cues->length(); while (1) { ASSERT(searchStart <= m_cues->length()); ASSERT(searchEnd <= m_cues->length()); TextTrackCue* existingCue; // Cues in the TextTrackCueList are maintained in start time order. if (searchStart == searchEnd) { if (!searchStart) return false; // If there is more than one cue with the same start time, back up to first one so we // consider all of them. while (searchStart >= 2 && cue->hasEquivalentStartTime(*m_cues->item(searchStart - 2))) --searchStart; bool firstCompare = true; while (1) { if (!firstCompare) ++searchStart; firstCompare = false; if (searchStart > m_cues->length()) return false; existingCue = m_cues->item(searchStart - 1); if (!existingCue) return false; if (cue->startMediaTime() > (existingCue->startMediaTime() + startTimeVariance())) return false; if (existingCue->isEqual(*cue, match)) return true; } } size_t index = (searchStart + searchEnd) / 2; existingCue = m_cues->item(index); if ((cue->startMediaTime() + startTimeVariance()) < existingCue->startMediaTime() || (match != TextTrackCue::IgnoreDuration && cue->hasEquivalentStartTime(*existingCue) && cue->endMediaTime() > existingCue->endMediaTime())) searchEnd = index; else searchStart = index + 1; } ASSERT_NOT_REACHED(); return false; }
bool TextTrackCue::doesExtendCue(const TextTrackCue& cue) const { if (!cueContentsMatch(cue)) return false; if (endMediaTime() != cue.startMediaTime()) return false; return true; }
bool TextTrackCue::hasEquivalentStartTime(const TextTrackCue& cue) const { MediaTime startTimeVariance = MediaTime::zeroTime(); if (track()) startTimeVariance = track()->startTimeVariance(); else if (cue.track()) startTimeVariance = cue.track()->startTimeVariance(); return abs(abs(startMediaTime()) - abs(cue.startMediaTime())) <= startTimeVariance; }