Search in sources :

Example 1 with C

use of androidx.media3.common.C in project media by androidx.

the class ServerSideAdInsertionMediaSource method setAdPlaybackStates.

/**
 * Sets the map of {@link AdPlaybackState ad playback states} published by this source. The key is
 * the period UID of a period in the {@link
 * AdPlaybackStateUpdater#onAdPlaybackStateUpdateRequested(Timeline)} content timeline}.
 *
 * <p>Each period has an {@link AdPlaybackState} that tells where in the period the ad groups
 * start and end. Must only contain server-side inserted ad groups. The number of ad groups and
 * the number of ads within an ad group may only increase. The durations of ads may change and the
 * positions of future ad groups may change. Post-roll ad groups with {@link C#TIME_END_OF_SOURCE}
 * must be empty and can be used as a placeholder for a future ad group.
 *
 * <p>May be called from any thread.
 *
 * @param adPlaybackStates The map of {@link AdPlaybackState} keyed by their period UID.
 */
public void setAdPlaybackStates(ImmutableMap<Object, AdPlaybackState> adPlaybackStates) {
    checkArgument(!adPlaybackStates.isEmpty());
    Object adsId = checkNotNull(adPlaybackStates.values().asList().get(0).adsId);
    for (Map.Entry<Object, AdPlaybackState> entry : adPlaybackStates.entrySet()) {
        Object periodUid = entry.getKey();
        AdPlaybackState adPlaybackState = entry.getValue();
        checkArgument(Util.areEqual(adsId, adPlaybackState.adsId));
        @Nullable AdPlaybackState oldAdPlaybackState = this.adPlaybackStates.get(periodUid);
        if (oldAdPlaybackState != null) {
            for (int i = adPlaybackState.removedAdGroupCount; i < adPlaybackState.adGroupCount; i++) {
                AdPlaybackState.AdGroup adGroup = adPlaybackState.getAdGroup(i);
                checkArgument(adGroup.isServerSideInserted);
                if (i < oldAdPlaybackState.adGroupCount) {
                    checkArgument(getAdCountInGroup(adPlaybackState, /* adGroupIndex= */
                    i) >= getAdCountInGroup(oldAdPlaybackState, /* adGroupIndex= */
                    i));
                }
                if (adGroup.timeUs == C.TIME_END_OF_SOURCE) {
                    checkArgument(getAdCountInGroup(adPlaybackState, /* adGroupIndex= */
                    i) == 0);
                }
            }
        }
    }
    synchronized (this) {
        if (playbackHandler == null) {
            this.adPlaybackStates = adPlaybackStates;
        } else {
            playbackHandler.post(() -> {
                for (SharedMediaPeriod mediaPeriod : mediaPeriods.values()) {
                    @Nullable AdPlaybackState adPlaybackState = adPlaybackStates.get(mediaPeriod.periodUid);
                    if (adPlaybackState != null) {
                        mediaPeriod.updateAdPlaybackState(adPlaybackState);
                    }
                }
                if (lastUsedMediaPeriod != null) {
                    @Nullable AdPlaybackState adPlaybackState = adPlaybackStates.get(lastUsedMediaPeriod.periodUid);
                    if (adPlaybackState != null) {
                        lastUsedMediaPeriod.updateAdPlaybackState(adPlaybackState);
                    }
                }
                this.adPlaybackStates = adPlaybackStates;
                if (contentTimeline != null) {
                    refreshSourceInfo(new ServerSideAdInsertionTimeline(contentTimeline, adPlaybackStates));
                }
            });
        }
    }
}
Also used : AdPlaybackState(androidx.media3.common.AdPlaybackState) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap) HashMap(java.util.HashMap) Nullable(androidx.annotation.Nullable)

Example 2 with C

use of androidx.media3.common.C in project media by androidx.

the class AdaptiveTrackSelection method determineIdealSelectedIndex.

/**
 * Computes the ideal selected index ignoring buffer health.
 *
 * @param nowMs The current time in the timebase of {@link Clock#elapsedRealtime()}, or {@link
 *     Long#MIN_VALUE} to ignore track exclusion.
 * @param chunkDurationUs The duration of a media chunk in microseconds, or {@link C#TIME_UNSET}
 *     if unknown.
 */
private int determineIdealSelectedIndex(long nowMs, long chunkDurationUs) {
    long effectiveBitrate = getAllocatedBandwidth(chunkDurationUs);
    int lowestBitrateAllowedIndex = 0;
    for (int i = 0; i < length; i++) {
        if (nowMs == Long.MIN_VALUE || !isBlacklisted(i, nowMs)) {
            Format format = getFormat(i);
            if (canSelectFormat(format, format.bitrate, effectiveBitrate)) {
                return i;
            } else {
                lowestBitrateAllowedIndex = i;
            }
        }
    }
    return lowestBitrateAllowedIndex;
}
Also used : Format(androidx.media3.common.Format)

Example 3 with C

use of androidx.media3.common.C in project media by androidx.

the class BaseUrlExclusionListTest method getPriorityCount_correctPriorityCount.

@Test
public void getPriorityCount_correctPriorityCount() {
    List<BaseUrl> baseUrls = ImmutableList.of(new BaseUrl(/* url= */
    "a", /* serviceLocation= */
    "a", /* priority= */
    1, /* weight= */
    1), new BaseUrl(/* url= */
    "b", /* serviceLocation= */
    "b", /* priority= */
    2, /* weight= */
    1), new BaseUrl(/* url= */
    "c", /* serviceLocation= */
    "c", /* priority= */
    2, /* weight= */
    1), new BaseUrl(/* url= */
    "d", /* serviceLocation= */
    "d", /* priority= */
    3, /* weight= */
    1));
    assertThat(BaseUrlExclusionList.getPriorityCount(baseUrls)).isEqualTo(3);
    assertThat(BaseUrlExclusionList.getPriorityCount(ImmutableList.of())).isEqualTo(0);
}
Also used : BaseUrl(androidx.media3.exoplayer.dash.manifest.BaseUrl) Test(org.junit.Test)

Example 4 with C

use of androidx.media3.common.C in project media by androidx.

the class BaseUrlExclusionListTest method getPriorityCountAfterExclusion_correctPriorityCount.

@Test
public void getPriorityCountAfterExclusion_correctPriorityCount() {
    List<BaseUrl> baseUrls = ImmutableList.of(new BaseUrl(/* url= */
    "a", /* serviceLocation= */
    "a", /* priority= */
    1, /* weight= */
    1), new BaseUrl(/* url= */
    "b", /* serviceLocation= */
    "b", /* priority= */
    2, /* weight= */
    1), new BaseUrl(/* url= */
    "c", /* serviceLocation= */
    "c", /* priority= */
    2, /* weight= */
    1), new BaseUrl(/* url= */
    "d", /* serviceLocation= */
    "d", /* priority= */
    3, /* weight= */
    1), new BaseUrl(/* url= */
    "e", /* serviceLocation= */
    "e", /* priority= */
    3, /* weight= */
    1));
    BaseUrlExclusionList baseUrlExclusionList = new BaseUrlExclusionList();
    // Empty base URL list.
    assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(ImmutableList.of())).isEqualTo(0);
    assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(3);
    // Exclude base urls.
    baseUrlExclusionList.exclude(baseUrls.get(0), DEFAULT_LOCATION_EXCLUSION_MS);
    assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(2);
    baseUrlExclusionList.exclude(baseUrls.get(1), 2 * DEFAULT_LOCATION_EXCLUSION_MS);
    assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(1);
    baseUrlExclusionList.exclude(baseUrls.get(3), 3 * DEFAULT_LOCATION_EXCLUSION_MS);
    assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(0);
    // Time passes.
    ShadowSystemClock.advanceBy(Duration.ofMillis(DEFAULT_LOCATION_EXCLUSION_MS));
    assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(1);
    ShadowSystemClock.advanceBy(Duration.ofMillis(DEFAULT_LOCATION_EXCLUSION_MS));
    assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(2);
    ShadowSystemClock.advanceBy(Duration.ofMillis(DEFAULT_LOCATION_EXCLUSION_MS));
    assertThat(baseUrlExclusionList.getPriorityCountAfterExclusion(baseUrls)).isEqualTo(3);
}
Also used : BaseUrl(androidx.media3.exoplayer.dash.manifest.BaseUrl) Test(org.junit.Test)

Example 5 with C

use of androidx.media3.common.C in project media by androidx.

the class BaseUrlExclusionListTest method selectBaseUrl_excludeByServiceLocation_excludesAllBaseUrlOfSameServiceLocation.

@Test
public void selectBaseUrl_excludeByServiceLocation_excludesAllBaseUrlOfSameServiceLocation() {
    BaseUrlExclusionList baseUrlExclusionList = new BaseUrlExclusionList();
    List<BaseUrl> baseUrls = ImmutableList.of(new BaseUrl(/* url= */
    "a", /* serviceLocation= */
    "a", /* priority= */
    1, /* weight= */
    1), new BaseUrl(/* url= */
    "b", /* serviceLocation= */
    "a", /* priority= */
    2, /* weight= */
    1), new BaseUrl(/* url= */
    "c", /* serviceLocation= */
    "c", /* priority= */
    3, /* weight= */
    1));
    baseUrlExclusionList.exclude(baseUrls.get(0), 5000);
    ShadowSystemClock.advanceBy(Duration.ofMillis(4999));
    assertThat(baseUrlExclusionList.selectBaseUrl(baseUrls).url).isEqualTo("c");
    ShadowSystemClock.advanceBy(Duration.ofMillis(1));
    assertThat(baseUrlExclusionList.selectBaseUrl(baseUrls).url).isEqualTo("a");
}
Also used : BaseUrl(androidx.media3.exoplayer.dash.manifest.BaseUrl) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)16 BaseUrl (androidx.media3.exoplayer.dash.manifest.BaseUrl)6 Format (androidx.media3.common.Format)5 SeekPoint (androidx.media3.extractor.SeekPoint)5 Nullable (androidx.annotation.Nullable)4 TrackGroupArray (androidx.media3.common.TrackGroupArray)4 Timeline (androidx.media3.common.Timeline)3 RendererCapabilities (androidx.media3.exoplayer.RendererCapabilities)3 IOException (java.io.IOException)3 HashMap (java.util.HashMap)3 QueueItem (android.support.v4.media.session.MediaSessionCompat.QueueItem)2 AdPlaybackState (androidx.media3.common.AdPlaybackState)2 FlagSet (androidx.media3.common.FlagSet)2 MediaItem (androidx.media3.common.MediaItem)2 Metadata (androidx.media3.common.Metadata)2 Player (androidx.media3.common.Player)2 Events (androidx.media3.common.Player.Events)2 EventStream (androidx.media3.exoplayer.dash.manifest.EventStream)2 LargeTest (androidx.test.filters.LargeTest)2 InterruptedIOException (java.io.InterruptedIOException)2