Search in sources :

Example 51 with State

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();
}
Also used : Timeline(com.google.android.exoplayer2.Timeline) Nullable(androidx.annotation.Nullable)

Example 52 with State

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());
}
Also used : Player(com.google.android.exoplayer2.Player) InOrder(org.mockito.InOrder) MediaItem(com.google.android.exoplayer2.MediaItem) Test(org.junit.Test)

Example 53 with State

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);
}
Also used : ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState(com.google.android.exoplayer2.source.ads.ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState) Test(org.junit.Test)

Example 54 with State

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);
}
Also used : ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState(com.google.android.exoplayer2.source.ads.ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState) Test(org.junit.Test)

Example 55 with State

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);
}
Also used : ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState(com.google.android.exoplayer2.source.ads.ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)26 TestExoPlayerBuilder (com.google.android.exoplayer2.testutil.TestExoPlayerBuilder)10 Nullable (androidx.annotation.Nullable)9 ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState (com.google.android.exoplayer2.source.ads.ServerSideAdInsertionUtil.addAdGroupToAdPlaybackState)9 ActionSchedule (com.google.android.exoplayer2.testutil.ActionSchedule)9 SinglePeriodTimeline (com.google.android.exoplayer2.source.SinglePeriodTimeline)8 PlayerRunnable (com.google.android.exoplayer2.testutil.ActionSchedule.PlayerRunnable)8 SuppressLint (android.annotation.SuppressLint)7 ExoPlayerTestRunner (com.google.android.exoplayer2.testutil.ExoPlayerTestRunner)7 FakeTimeline (com.google.android.exoplayer2.testutil.FakeTimeline)7 NoUidTimeline (com.google.android.exoplayer2.testutil.NoUidTimeline)7 AdPlaybackState (com.google.android.exoplayer2.source.ads.AdPlaybackState)6 FakeMediaSource (com.google.android.exoplayer2.testutil.FakeMediaSource)6 ArrayList (java.util.ArrayList)6 AnalyticsListener (com.google.android.exoplayer2.analytics.AnalyticsListener)5 Listener (com.google.android.exoplayer2.Player.Listener)4 MediaSource (com.google.android.exoplayer2.source.MediaSource)4 TrackSelection (com.google.android.exoplayer2.trackselection.TrackSelection)4 IOException (java.io.IOException)4 Pair (android.util.Pair)3