use of com.google.android.exoplayer2.ext.ima.ImaServerSideAdInsertionMediaSource.AdsLoader.State in project ExoPlayer by google.
the class CastPlayer method updateInternalStateAndNotifyIfChanged.
// Internal methods.
// Call deprecated callbacks.
@SuppressWarnings("deprecation")
private void updateInternalStateAndNotifyIfChanged() {
if (remoteMediaClient == null) {
// There is no session. We leave the state of the player as it is now.
return;
}
int oldWindowIndex = this.currentWindowIndex;
@Nullable Object oldPeriodUid = !getCurrentTimeline().isEmpty() ? getCurrentTimeline().getPeriod(oldWindowIndex, period, /* setIds= */
true).uid : null;
updatePlayerStateAndNotifyIfChanged(/* resultCallback= */
null);
updateRepeatModeAndNotifyIfChanged(/* resultCallback= */
null);
updatePlaybackRateAndNotifyIfChanged(/* resultCallback= */
null);
boolean playingPeriodChangedByTimelineChange = updateTimelineAndNotifyIfChanged();
Timeline currentTimeline = getCurrentTimeline();
currentWindowIndex = fetchCurrentWindowIndex(remoteMediaClient, currentTimeline);
@Nullable Object currentPeriodUid = !currentTimeline.isEmpty() ? currentTimeline.getPeriod(currentWindowIndex, period, /* setIds= */
true).uid : null;
if (!playingPeriodChangedByTimelineChange && !Util.areEqual(oldPeriodUid, currentPeriodUid) && pendingSeekCount == 0) {
// Report discontinuity and media item auto transition.
currentTimeline.getPeriod(oldWindowIndex, period, /* setIds= */
true);
currentTimeline.getWindow(oldWindowIndex, window);
long windowDurationMs = window.getDurationMs();
PositionInfo oldPosition = new PositionInfo(window.uid, period.windowIndex, window.mediaItem, period.uid, period.windowIndex, /* positionMs= */
windowDurationMs, /* contentPositionMs= */
windowDurationMs, /* adGroupIndex= */
C.INDEX_UNSET, /* adIndexInAdGroup= */
C.INDEX_UNSET);
currentTimeline.getPeriod(currentWindowIndex, period, /* setIds= */
true);
currentTimeline.getWindow(currentWindowIndex, window);
PositionInfo newPosition = new PositionInfo(window.uid, period.windowIndex, window.mediaItem, period.uid, period.windowIndex, /* positionMs= */
window.getDefaultPositionMs(), /* contentPositionMs= */
window.getDefaultPositionMs(), /* adGroupIndex= */
C.INDEX_UNSET, /* adIndexInAdGroup= */
C.INDEX_UNSET);
listeners.queueEvent(Player.EVENT_POSITION_DISCONTINUITY, listener -> {
listener.onPositionDiscontinuity(DISCONTINUITY_REASON_AUTO_TRANSITION);
listener.onPositionDiscontinuity(oldPosition, newPosition, DISCONTINUITY_REASON_AUTO_TRANSITION);
});
listeners.queueEvent(Player.EVENT_MEDIA_ITEM_TRANSITION, listener -> listener.onMediaItemTransition(getCurrentMediaItem(), MEDIA_ITEM_TRANSITION_REASON_AUTO));
}
if (updateTracksAndSelectionsAndNotifyIfChanged()) {
listeners.queueEvent(Player.EVENT_TRACKS_CHANGED, listener -> listener.onTracksChanged(currentTrackGroups, currentTrackSelection));
listeners.queueEvent(Player.EVENT_TRACKS_CHANGED, listener -> listener.onTracksInfoChanged(currentTracksInfo));
}
updateAvailableCommandsAndNotifyIfChanged();
listeners.flushEvents();
}
use of com.google.android.exoplayer2.ext.ima.ImaServerSideAdInsertionMediaSource.AdsLoader.State in project ExoPlayer by google.
the class CastPlayerTest method autoTransition_notifiesPositionDiscontinuity.
@Test
// Mocks deprecated method used by the CastPlayer.
@SuppressWarnings("deprecation")
public void autoTransition_notifiesPositionDiscontinuity() {
int[] mediaQueueItemIds = new int[] { 1, 2 };
int[] streamTypes = { MediaInfo.STREAM_TYPE_BUFFERED, MediaInfo.STREAM_TYPE_BUFFERED };
long[] durationsFirstMs = { 12500, C.TIME_UNSET };
// When the remote Cast player transitions to an item that wasn't played before, the media state
// delivers the duration for that media item which updates the timeline accordingly.
long[] durationsSecondMs = { 12500, 22000 };
List<MediaItem> mediaItems = createMediaItems(mediaQueueItemIds);
castPlayer.addMediaItems(mediaItems);
updateTimeLine(mediaItems, mediaQueueItemIds, /* currentItemId= */
1, /* streamTypes= */
streamTypes, /* durationsMs= */
durationsFirstMs, /* positionMs= */
C.TIME_UNSET);
updateTimeLine(mediaItems, mediaQueueItemIds, /* currentItemId= */
2, /* streamTypes= */
streamTypes, /* durationsMs= */
durationsSecondMs, /* positionMs= */
C.TIME_UNSET);
Player.PositionInfo oldPosition = new Player.PositionInfo(/* windowUid= */
1, /* windowIndex= */
0, new MediaItem.Builder().setUri(Uri.EMPTY).setTag(1).build(), /* periodUid= */
1, /* periodIndex= */
0, /* positionMs= */
12500, /* contentPositionMs= */
12500, /* adGroupIndex= */
C.INDEX_UNSET, /* adIndexInAdGroup= */
C.INDEX_UNSET);
Player.PositionInfo newPosition = new Player.PositionInfo(/* windowUid= */
2, /* windowIndex= */
1, new MediaItem.Builder().setUri(Uri.EMPTY).setTag(2).build(), /* periodUid= */
2, /* periodIndex= */
1, /* positionMs= */
0, /* contentPositionMs= */
0, /* adGroupIndex= */
C.INDEX_UNSET, /* adIndexInAdGroup= */
C.INDEX_UNSET);
InOrder inOrder = Mockito.inOrder(mockListener);
inOrder.verify(mockListener).onPositionDiscontinuity(eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
inOrder.verify(mockListener).onPositionDiscontinuity(eq(oldPosition), eq(newPosition), eq(Player.DISCONTINUITY_REASON_AUTO_TRANSITION));
inOrder.verify(mockListener, never()).onPositionDiscontinuity(anyInt());
inOrder.verify(mockListener, never()).onPositionDiscontinuity(any(), any(), anyInt());
}
use of com.google.android.exoplayer2.ext.ima.ImaServerSideAdInsertionMediaSource.AdsLoader.State in project ExoPlayer by google.
the class ServerSideAdInsertionUtilTest method getStreamPositionUsForContent_returnsCorrectPositions.
@Test
public void getStreamPositionUsForContent_returnsCorrectPositions() {
// stream: 0-- ad1 --200-- content --2100-- ad2 --2300-- content --4300-- ad3 --4500-- content
// content timeline: 0 - [ad1] - 100-2000 -[ad2] - 2000-4000 - [ad3] - 4400-end
AdPlaybackState state = new AdPlaybackState(ADS_ID, /* adGroupTimesUs...= */
0, 0, 0, 2000, 4000).withRemovedAdGroupCount(2).withAdCount(/* adGroupIndex= */
2, /* adCount= */
2).withAdCount(/* adGroupIndex= */
3, /* adCount= */
1).withAdCount(/* adGroupIndex= */
4, /* adCount= */
3).withContentResumeOffsetUs(/* adGroupIndex= */
2, /* contentResumeOffsetUs= */
100).withContentResumeOffsetUs(/* adGroupIndex= */
3, /* contentResumeOffsetUs= */
0).withContentResumeOffsetUs(/* adGroupIndex= */
4, /* contentResumeOffsetUs= */
400).withAdDurationsUs(/* adGroupIndex= */
2, /* adDurationsUs...= */
150, 50).withAdDurationsUs(/* adGroupIndex= */
3, /* adDurationsUs...= */
200).withAdDurationsUs(/* adGroupIndex= */
4, /* adDurationsUs...= */
50, 50, 100);
assertThat(getStreamPositionUsForContent(/* positionUs= */
0, /* nextAdGroupIndex= */
2, state)).isEqualTo(0);
assertThat(getStreamPositionUsForContent(/* positionUs= */
0, /* nextAdGroupIndex= */
3, state)).isEqualTo(100);
assertThat(getStreamPositionUsForContent(/* positionUs= */
0, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(100);
assertThat(getStreamPositionUsForContent(/* positionUs= */
50, /* nextAdGroupIndex= */
2, state)).isEqualTo(50);
assertThat(getStreamPositionUsForContent(/* positionUs= */
50, /* nextAdGroupIndex= */
3, state)).isEqualTo(150);
assertThat(getStreamPositionUsForContent(/* positionUs= */
50, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(150);
assertThat(getStreamPositionUsForContent(/* positionUs= */
100, /* nextAdGroupIndex= */
3, state)).isEqualTo(200);
assertThat(getStreamPositionUsForContent(/* positionUs= */
100, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(200);
assertThat(getStreamPositionUsForContent(/* positionUs= */
1999, /* nextAdGroupIndex= */
3, state)).isEqualTo(2099);
assertThat(getStreamPositionUsForContent(/* positionUs= */
1999, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(2099);
assertThat(getStreamPositionUsForContent(/* positionUs= */
2000, /* nextAdGroupIndex= */
3, state)).isEqualTo(2100);
assertThat(getStreamPositionUsForContent(/* positionUs= */
2000, /* nextAdGroupIndex= */
4, state)).isEqualTo(2300);
assertThat(getStreamPositionUsForContent(/* positionUs= */
2000, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(2300);
assertThat(getStreamPositionUsForContent(/* positionUs= */
3999, /* nextAdGroupIndex= */
4, state)).isEqualTo(4299);
assertThat(getStreamPositionUsForContent(/* positionUs= */
3999, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(4299);
assertThat(getStreamPositionUsForContent(/* positionUs= */
4000, /* nextAdGroupIndex= */
4, state)).isEqualTo(4300);
assertThat(getStreamPositionUsForContent(/* positionUs= */
4000, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(4300);
assertThat(getStreamPositionUsForContent(/* positionUs= */
4200, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(4300);
assertThat(getStreamPositionUsForContent(/* positionUs= */
4300, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(4400);
assertThat(getStreamPositionUsForContent(/* positionUs= */
4400, /* nextAdGroupIndex= */
C.INDEX_UNSET, state)).isEqualTo(4500);
}
use of com.google.android.exoplayer2.ext.ima.ImaServerSideAdInsertionMediaSource.AdsLoader.State in project ExoPlayer by google.
the class ServerSideAdInsertionUtilTest method getAdCountInGroup_withSetCount_returnsCount.
@Test
public void getAdCountInGroup_withSetCount_returnsCount() {
AdPlaybackState state = new AdPlaybackState(ADS_ID, /* adGroupTimesUs...= */
0, 2000).withAdCount(/* adGroupIndex= */
0, /* adCount= */
4).withAdCount(/* adGroupIndex= */
1, /* adCount= */
6);
assertThat(getAdCountInGroup(state, /* adGroupIndex= */
0)).isEqualTo(4);
assertThat(getAdCountInGroup(state, /* adGroupIndex= */
1)).isEqualTo(6);
}
use of com.google.android.exoplayer2.ext.ima.ImaServerSideAdInsertionMediaSource.AdsLoader.State in project ExoPlayer by google.
the class ServerSideAdInsertionUtilTest method getStreamPositionUsForAd_returnsCorrectPositions.
@Test
public void getStreamPositionUsForAd_returnsCorrectPositions() {
// stream: 0-- ad1 --200-- content --2100-- ad2 --2300-- content --4300-- ad3 --4500-- content
// content timeline: 0 - [ad1] - 100-2000 -[ad2] - 2000-4000 - [ad3] - 4400-end
AdPlaybackState state = new AdPlaybackState(ADS_ID, /* adGroupTimesUs...= */
0, 0, 0, 2000, 4000).withRemovedAdGroupCount(2).withAdCount(/* adGroupIndex= */
2, /* adCount= */
2).withAdCount(/* adGroupIndex= */
3, /* adCount= */
1).withAdCount(/* adGroupIndex= */
4, /* adCount= */
3).withContentResumeOffsetUs(/* adGroupIndex= */
2, /* contentResumeOffsetUs= */
100).withContentResumeOffsetUs(/* adGroupIndex= */
3, /* contentResumeOffsetUs= */
0).withContentResumeOffsetUs(/* adGroupIndex= */
4, /* contentResumeOffsetUs= */
400).withAdDurationsUs(/* adGroupIndex= */
2, /* adDurationsUs...= */
150, 50).withAdDurationsUs(/* adGroupIndex= */
3, /* adDurationsUs...= */
200).withAdDurationsUs(/* adGroupIndex= */
4, /* adDurationsUs...= */
50, 50, 100);
assertThat(getStreamPositionUsForAd(/* positionUs= */
0, /* adGroupIndex= */
2, /* adIndexInAdGroup= */
0, state)).isEqualTo(0);
assertThat(getStreamPositionUsForAd(/* positionUs= */
100, /* adGroupIndex= */
2, /* adIndexInAdGroup= */
0, state)).isEqualTo(100);
assertThat(getStreamPositionUsForAd(/* positionUs= */
200, /* adGroupIndex= */
2, /* adIndexInAdGroup= */
0, state)).isEqualTo(200);
assertThat(getStreamPositionUsForAd(/* positionUs= */
-50, /* adGroupIndex= */
2, /* adIndexInAdGroup= */
1, state)).isEqualTo(100);
assertThat(getStreamPositionUsForAd(/* positionUs= */
0, /* adGroupIndex= */
2, /* adIndexInAdGroup= */
1, state)).isEqualTo(150);
assertThat(getStreamPositionUsForAd(/* positionUs= */
100, /* adGroupIndex= */
2, /* adIndexInAdGroup= */
1, state)).isEqualTo(250);
assertThat(getStreamPositionUsForAd(/* positionUs= */
-50, /* adGroupIndex= */
3, /* adIndexInAdGroup= */
0, state)).isEqualTo(2050);
assertThat(getStreamPositionUsForAd(/* positionUs= */
0, /* adGroupIndex= */
3, /* adIndexInAdGroup= */
0, state)).isEqualTo(2100);
assertThat(getStreamPositionUsForAd(/* positionUs= */
200, /* adGroupIndex= */
3, /* adIndexInAdGroup= */
0, state)).isEqualTo(2300);
assertThat(getStreamPositionUsForAd(/* positionUs= */
300, /* adGroupIndex= */
3, /* adIndexInAdGroup= */
0, state)).isEqualTo(2400);
assertThat(getStreamPositionUsForAd(/* positionUs= */
-50, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
0, state)).isEqualTo(4250);
assertThat(getStreamPositionUsForAd(/* positionUs= */
0, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
0, state)).isEqualTo(4300);
assertThat(getStreamPositionUsForAd(/* positionUs= */
100, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
0, state)).isEqualTo(4400);
assertThat(getStreamPositionUsForAd(/* positionUs= */
-50, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
1, state)).isEqualTo(4300);
assertThat(getStreamPositionUsForAd(/* positionUs= */
0, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
1, state)).isEqualTo(4350);
assertThat(getStreamPositionUsForAd(/* positionUs= */
100, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
1, state)).isEqualTo(4450);
assertThat(getStreamPositionUsForAd(/* positionUs= */
-50, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
2, state)).isEqualTo(4350);
assertThat(getStreamPositionUsForAd(/* positionUs= */
50, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
2, state)).isEqualTo(4450);
assertThat(getStreamPositionUsForAd(/* positionUs= */
150, /* adGroupIndex= */
4, /* adIndexInAdGroup= */
2, state)).isEqualTo(4550);
}
Aggregations