@Test public void testNoClipping() throws IOException { Timeline timeline = new SinglePeriodTimeline(TEST_PERIOD_DURATION_US, true, false); Timeline clippedTimeline = getClippedTimeline(timeline, 0, TEST_PERIOD_DURATION_US); assertThat(clippedTimeline.getWindowCount()).isEqualTo(1); assertThat(clippedTimeline.getPeriodCount()).isEqualTo(1); assertThat(clippedTimeline.getWindow(0, window).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US); assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US); }
@Test public void testClippingStartAndEnd() throws IOException { Timeline timeline = new SinglePeriodTimeline(TEST_PERIOD_DURATION_US, true, false); Timeline clippedTimeline = getClippedTimeline( timeline, TEST_CLIP_AMOUNT_US, TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 2); assertThat(clippedTimeline.getWindow(0, window).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 3); assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 2); }
@Test public void testClippingFromDefaultPosition() throws IOException { Timeline timeline = new SinglePeriodTimeline( /* periodDurationUs= */ 3 * TEST_PERIOD_DURATION_US, /* windowDurationUs= */ TEST_PERIOD_DURATION_US, /* windowPositionInPeriodUs= */ TEST_PERIOD_DURATION_US, /* windowDefaultStartPositionUs= */ TEST_CLIP_AMOUNT_US, /* isSeekable= */ true, /* isDynamic= */ true, /* tag= */ null); Timeline clippedTimeline = getClippedTimeline(timeline, /* durationUs= */ TEST_CLIP_AMOUNT_US); assertThat(clippedTimeline.getWindow(0, window).getDurationUs()).isEqualTo(TEST_CLIP_AMOUNT_US); assertThat(clippedTimeline.getWindow(0, window).getDefaultPositionUs()).isEqualTo(0); assertThat(clippedTimeline.getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(TEST_PERIOD_DURATION_US + TEST_CLIP_AMOUNT_US); assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US + 2 * TEST_CLIP_AMOUNT_US); }
return null; long contentDurationUs = period.getDurationUs(); return getMediaPeriodInfoForAd( currentPeriodId.periodUid,
assertThat(clippedTimelines[0].getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(TEST_PERIOD_DURATION_US + TEST_CLIP_AMOUNT_US); assertThat(clippedTimelines[0].getPeriod(0, period).getDurationUs()) .isEqualTo(2 * TEST_PERIOD_DURATION_US); assertThat(clippedTimelines[1].getWindow(0, window).getDurationUs()) assertThat(clippedTimelines[1].getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(3 * TEST_PERIOD_DURATION_US + TEST_CLIP_AMOUNT_US); assertThat(clippedTimelines[1].getPeriod(0, period).getDurationUs()) .isEqualTo(4 * TEST_PERIOD_DURATION_US);
assertThat(clippedTimelines[0].getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(TEST_PERIOD_DURATION_US + TEST_CLIP_AMOUNT_US); assertThat(clippedTimelines[0].getPeriod(0, period).getDurationUs()) .isEqualTo(2 * TEST_PERIOD_DURATION_US); assertThat(clippedTimelines[1].getWindow(0, window).getDurationUs()) assertThat(clippedTimelines[1].getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(2 * TEST_PERIOD_DURATION_US + TEST_CLIP_AMOUNT_US); assertThat(clippedTimelines[1].getPeriod(0, period).getDurationUs()) .isEqualTo(3 * TEST_PERIOD_DURATION_US);
assertThat(clippedTimelines[0].getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(TEST_PERIOD_DURATION_US + TEST_CLIP_AMOUNT_US); assertThat(clippedTimelines[0].getPeriod(0, period).getDurationUs()) .isEqualTo(2 * TEST_PERIOD_DURATION_US); assertThat(clippedTimelines[1].getWindow(0, window).getDurationUs()).isEqualTo(0); assertThat(clippedTimelines[1].getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(3 * TEST_PERIOD_DURATION_US); assertThat(clippedTimelines[1].getPeriod(0, period).getDurationUs()) .isEqualTo(3 * TEST_PERIOD_DURATION_US);
assertThat(clippedTimelines[0].getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(TEST_PERIOD_DURATION_US + TEST_CLIP_AMOUNT_US); assertThat(clippedTimelines[0].getPeriod(0, period).getDurationUs()) .isEqualTo(2 * TEST_PERIOD_DURATION_US); assertThat(clippedTimelines[1].getWindow(0, window).getDurationUs()) assertThat(clippedTimelines[1].getWindow(0, window).getPositionInFirstPeriodUs()) .isEqualTo(2 * TEST_PERIOD_DURATION_US); assertThat(clippedTimelines[1].getPeriod(0, period).getDurationUs()) .isEqualTo(2 * TEST_PERIOD_DURATION_US + TEST_CLIP_AMOUNT_US);
long periodDurationUs = getPeriod(periodIndex, period, /* setIds= */ true).getDurationUs(); while (periodDurationUs != C.TIME_UNSET && periodPositionUs >= periodDurationUs && periodIndex < window.lastPeriodIndex) { periodPositionUs -= periodDurationUs; periodDurationUs = getPeriod(++periodIndex, period, /* setIds= */ true).getDurationUs();
/** * Returns new media period info based on specified {@code mediaPeriodInfo} but taking into * account the current timeline. This method must only be called if the period is still part of * the current timeline. * * @param info Media period info for a media period based on an old timeline. * @return The updated media period info for the current timeline. */ public MediaPeriodInfo getUpdatedMediaPeriodInfo(MediaPeriodInfo info) { boolean isLastInPeriod = isLastInPeriod(info.id); boolean isLastInTimeline = isLastInTimeline(info.id, isLastInPeriod); timeline.getPeriodByUid(info.id.periodUid, period); long durationUs = info.id.isAd() ? period.getAdDurationUs(info.id.adGroupIndex, info.id.adIndexInAdGroup) : (info.id.endPositionUs == C.TIME_END_OF_SOURCE ? period.getDurationUs() : info.id.endPositionUs); return new MediaPeriodInfo( info.id, info.startPositionUs, info.contentPositionUs, durationUs, isLastInPeriod, isLastInTimeline); }
@Test public void testClippingStartAndEndInitial() throws IOException { // Timeline that's dynamic and not seekable. A child source might report such a timeline prior // to it having loaded sufficient data to establish its duration and seekability. Such timelines // should not result in clipping failure. Timeline timeline = new SinglePeriodTimeline(C.TIME_UNSET, /* isSeekable= */ false, /* isDynamic= */ true); Timeline clippedTimeline = getClippedTimeline( timeline, TEST_CLIP_AMOUNT_US, TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 2); assertThat(clippedTimeline.getWindow(0, window).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 3); assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US * 2); }
private MediaPeriodInfo getMediaPeriodInfoForContent( Object periodUid, long startPositionUs, long windowSequenceNumber) { int nextAdGroupIndex = period.getAdGroupIndexAfterPositionUs(startPositionUs); long endPositionUs = nextAdGroupIndex == C.INDEX_UNSET ? C.TIME_END_OF_SOURCE : period.getAdGroupTimeUs(nextAdGroupIndex); MediaPeriodId id = new MediaPeriodId(periodUid, windowSequenceNumber, endPositionUs); timeline.getPeriodByUid(id.periodUid, period); boolean isLastInPeriod = isLastInPeriod(id); boolean isLastInTimeline = isLastInTimeline(id, isLastInPeriod); long durationUs = endPositionUs == C.TIME_END_OF_SOURCE ? period.getDurationUs() : endPositionUs; return new MediaPeriodInfo( id, startPositionUs, C.TIME_UNSET, durationUs, isLastInPeriod, isLastInTimeline); }
private static long[][] getAdDurations(Timeline[][] adTimelines, Timeline.Period period) { long[][] adDurations = new long[adTimelines.length][]; for (int i = 0; i < adTimelines.length; i++) { adDurations[i] = new long[adTimelines[i].length]; for (int j = 0; j < adTimelines[i].length; j++) { adDurations[i][j] = adTimelines[i][j] == null ? C.TIME_UNSET : adTimelines[i][j].getPeriod(/* periodIndex= */ 0, period).getDurationUs(); } } return adDurations; }
@Test public void testClippingEnd() throws IOException { Timeline timeline = new SinglePeriodTimeline(TEST_PERIOD_DURATION_US, true, false); Timeline clippedTimeline = getClippedTimeline(timeline, 0, TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US); assertThat(clippedTimeline.getWindow(0, window).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US); assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US); }
@Test public void testClippingStart() throws IOException { Timeline timeline = new SinglePeriodTimeline(TEST_PERIOD_DURATION_US, true, false); Timeline clippedTimeline = getClippedTimeline(timeline, TEST_CLIP_AMOUNT_US, TEST_PERIOD_DURATION_US); assertThat(clippedTimeline.getWindow(0, window).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US - TEST_CLIP_AMOUNT_US); assertThat(clippedTimeline.getPeriod(0, period).getDurationUs()) .isEqualTo(TEST_PERIOD_DURATION_US); }