bool WebMBufferedState::GetStartTime(uint64_t *aTime) { ReentrantMonitorAutoEnter mon(mReentrantMonitor); if (mTimeMapping.IsEmpty()) { return false; } uint32_t idx = mTimeMapping.IndexOfFirstElementGt(0, SyncOffsetComparator()); if (idx == mTimeMapping.Length()) { return false; } *aTime = mTimeMapping[idx].mTimecode; return true; }
bool WebMBufferedState::GetNextKeyframeTime(uint64_t aTime, uint64_t* aKeyframeTime) { ReentrantMonitorAutoEnter mon(mReentrantMonitor); int64_t offset = 0; bool rv = GetOffsetForTime(aTime, &offset); if (!rv) { return false; } uint32_t idx = mTimeMapping.IndexOfFirstElementGt(offset, SyncOffsetComparator()); if (idx == mTimeMapping.Length()) { return false; } *aKeyframeTime = mTimeMapping[idx].mTimecode; return true; }
bool WebMBufferedState::CalculateBufferedForRange(int64_t aStartOffset, int64_t aEndOffset, uint64_t* aStartTime, uint64_t* aEndTime) { ReentrantMonitorAutoEnter mon(mReentrantMonitor); // Find the first WebMTimeDataOffset at or after aStartOffset. uint32_t start = mTimeMapping.IndexOfFirstElementGt(aStartOffset - 1, SyncOffsetComparator()); if (start == mTimeMapping.Length()) { return false; } // Find the first WebMTimeDataOffset at or before aEndOffset. uint32_t end = mTimeMapping.IndexOfFirstElementGt(aEndOffset); if (end > 0) { end -= 1; } // Range is empty. if (end <= start) { return false; } NS_ASSERTION(mTimeMapping[start].mSyncOffset >= aStartOffset && mTimeMapping[end].mEndOffset <= aEndOffset, "Computed time range must lie within data range."); if (start > 0) { NS_ASSERTION(mTimeMapping[start - 1].mSyncOffset < aStartOffset, "Must have found least WebMTimeDataOffset for start"); } if (end < mTimeMapping.Length() - 1) { NS_ASSERTION(mTimeMapping[end + 1].mEndOffset > aEndOffset, "Must have found greatest WebMTimeDataOffset for end"); } MOZ_ASSERT(mTimeMapping[end].mTimecode >= mTimeMapping[end - 1].mTimecode); uint64_t frameDuration = mTimeMapping[end].mTimecode - mTimeMapping[end - 1].mTimecode; *aStartTime = mTimeMapping[start].mTimecode; *aEndTime = mTimeMapping[end].mTimecode + frameDuration; return true; }