/** * @see DashSegmentIndex#getSegmentNum(long) */ public int getSegmentNum(long timeUs) { final int firstSegmentNum = getFirstSegmentNum(); int lowIndex = firstSegmentNum; int highIndex = getLastSegmentNum(); if (segmentTimeline == null) { // All segments are of equal duration (with the possible exception of the last one). long durationUs = (duration * C.MICROS_PER_SECOND) / timescale; int segmentNum = startNumber + (int) (timeUs / durationUs); // Ensure we stay within bounds. return segmentNum < lowIndex ? lowIndex : highIndex != DashSegmentIndex.INDEX_UNBOUNDED && segmentNum > highIndex ? highIndex : segmentNum; } else { // The high index cannot be unbounded. Identify the segment using binary search. while (lowIndex <= highIndex) { int midIndex = (lowIndex + highIndex) / 2; long midTimeUs = getSegmentTimeUs(midIndex); if (midTimeUs < timeUs) { lowIndex = midIndex + 1; } else if (midTimeUs > timeUs) { highIndex = midIndex - 1; } else { return midIndex; } } return lowIndex == firstSegmentNum ? lowIndex : highIndex; } }
@Override public int getLastSegmentNum() { if (segmentTimeline != null) { return segmentTimeline.size() + startNumber - 1; } else if (periodDurationMs == -1) { return DashSegmentIndex.INDEX_UNBOUNDED; } else { long durationMs = (duration * 1000) / timescale; return startNumber + (int) Util.ceilDivide(periodDurationMs, durationMs) - 1; } }
/** * @see DashSegmentIndex#getSegmentNum(long, long) */ public int getSegmentNum(long timeUs, long periodDurationUs) { final int firstSegmentNum = getFirstSegmentNum(); int lowIndex = firstSegmentNum; int highIndex = getLastSegmentNum(periodDurationUs); if (segmentTimeline == null) { // All segments are of equal duration (with the possible exception of the last one). long durationUs = (duration * C.MICROS_PER_SECOND) / timescale; int segmentNum = startNumber + (int) (timeUs / durationUs); // Ensure we stay within bounds. return segmentNum < lowIndex ? lowIndex : highIndex != DashSegmentIndex.INDEX_UNBOUNDED && segmentNum > highIndex ? highIndex : segmentNum; } else { // The high index cannot be unbounded. Identify the segment using binary search. while (lowIndex <= highIndex) { int midIndex = (lowIndex + highIndex) / 2; long midTimeUs = getSegmentTimeUs(midIndex); if (midTimeUs < timeUs) { lowIndex = midIndex + 1; } else if (midTimeUs > timeUs) { highIndex = midIndex - 1; } else { return midIndex; } } return lowIndex == firstSegmentNum ? lowIndex : highIndex; } }
@Override public int getLastSegmentNum(long periodDurationUs) { if (segmentTimeline != null) { return segmentTimeline.size() + startNumber - 1; } else if (periodDurationUs == C.UNKNOWN_TIME_US) { return DashSegmentIndex.INDEX_UNBOUNDED; } else { long durationUs = (duration * C.MICROS_PER_SECOND) / timescale; return startNumber + (int) Util.ceilDivide(periodDurationUs, durationUs) - 1; } }
/** * @see DashSegmentIndex#getSegmentNum(long) */ public int getSegmentNum(long timeUs) { int lowIndex = getFirstSegmentNum(); int highIndex = getLastSegmentNum(); if (segmentTimeline == null) { // All segments are of equal duration (with the possible exception of the last one). long durationUs = (duration * C.MICROS_PER_SECOND) / timescale; int segmentNum = startNumber + (int) (timeUs / durationUs); // Ensure we stay within bounds. return segmentNum < lowIndex ? lowIndex : highIndex != DashSegmentIndex.INDEX_UNBOUNDED && segmentNum > highIndex ? highIndex : segmentNum; } else { // The high index cannot be unbounded. Identify the segment using binary search. while (lowIndex <= highIndex) { int midIndex = (lowIndex + highIndex) / 2; long midTimeUs = getSegmentTimeUs(midIndex); if (midTimeUs < timeUs) { lowIndex = midIndex + 1; } else if (midTimeUs > timeUs) { highIndex = midIndex - 1; } else { return midIndex; } } return lowIndex - 1; } }
@Override public int getLastSegmentNum() { if (segmentTimeline != null) { return segmentTimeline.size() + startNumber - 1; } else if (periodDurationMs == -1) { return DashSegmentIndex.INDEX_UNBOUNDED; } else { long durationMs = (duration * 1000) / timescale; return startNumber + (int) ((periodDurationMs + durationMs - 1) / durationMs) - 1; } }
@Override public DashSegmentIndex getIndex() { return segmentIndex; }
@Override public DashSegmentIndex getIndex() { return this; }
@Override public DashSegmentIndex getIndex() { return null; }
/** * Gets a segment index, if the representation is able to provide one directly. Null if the * segment index is defined externally. * * @return The segment index, or null. */ public abstract DashSegmentIndex getIndex();