mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Add simplified FakeTimeline constructor.
This is helpful for tests which don't care about detailled timeline set-ups besides the number of windows. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=176097369
This commit is contained in:
parent
e349905039
commit
525ae7fed7
@ -27,7 +27,6 @@ import com.google.android.exoplayer2.testutil.FakeMediaSource;
|
||||
import com.google.android.exoplayer2.testutil.FakeRenderer;
|
||||
import com.google.android.exoplayer2.testutil.FakeShuffleOrder;
|
||||
import com.google.android.exoplayer2.testutil.FakeTimeline;
|
||||
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
|
||||
import com.google.android.exoplayer2.testutil.FakeTrackSelection;
|
||||
import com.google.android.exoplayer2.testutil.FakeTrackSelector;
|
||||
import java.util.ArrayList;
|
||||
@ -68,7 +67,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
* Tests playback of a source that exposes a single period.
|
||||
*/
|
||||
public void testPlaySinglePeriodTimeline() throws Exception {
|
||||
Timeline timeline = new FakeTimeline(new TimelineWindowDefinition(false, false, 0));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
|
||||
Object manifest = new Object();
|
||||
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
ExoPlayerTestRunner testRunner = new ExoPlayerTestRunner.Builder()
|
||||
@ -87,10 +86,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
* Tests playback of a source that exposes three periods.
|
||||
*/
|
||||
public void testPlayMultiPeriodTimeline() throws Exception {
|
||||
Timeline timeline = new FakeTimeline(
|
||||
new TimelineWindowDefinition(false, false, 0),
|
||||
new TimelineWindowDefinition(false, false, 0),
|
||||
new TimelineWindowDefinition(false, false, 0));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 3);
|
||||
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
ExoPlayerTestRunner testRunner = new ExoPlayerTestRunner.Builder()
|
||||
.setTimeline(timeline).setRenderers(renderer)
|
||||
@ -107,10 +103,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
* source.
|
||||
*/
|
||||
public void testReadAheadToEndDoesNotResetRenderer() throws Exception {
|
||||
Timeline timeline = new FakeTimeline(
|
||||
new TimelineWindowDefinition(false, false, 10),
|
||||
new TimelineWindowDefinition(false, false, 10),
|
||||
new TimelineWindowDefinition(false, false, 10));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 3);
|
||||
final FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
FakeMediaClockRenderer audioRenderer = new FakeMediaClockRenderer(Builder.AUDIO_FORMAT) {
|
||||
|
||||
@ -151,7 +144,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testRepreparationGivesFreshSourceInfo() throws Exception {
|
||||
Timeline timeline = new FakeTimeline(new TimelineWindowDefinition(false, false, 0));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
|
||||
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
Object firstSourceManifest = new Object();
|
||||
MediaSource firstSource = new FakeMediaSource(timeline, firstSourceManifest,
|
||||
@ -218,10 +211,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testRepeatModeChanges() throws Exception {
|
||||
Timeline timeline = new FakeTimeline(
|
||||
new TimelineWindowDefinition(true, false, 100000),
|
||||
new TimelineWindowDefinition(true, false, 100000),
|
||||
new TimelineWindowDefinition(true, false, 100000));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 3);
|
||||
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
ActionSchedule actionSchedule = new ActionSchedule.Builder("testRepeatMode") // 0 -> 1
|
||||
.waitForPositionDiscontinuity().setRepeatMode(Player.REPEAT_MODE_ONE) // 1 -> 1
|
||||
@ -241,7 +231,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testShuffleModeEnabledChanges() throws Exception {
|
||||
Timeline fakeTimeline = new FakeTimeline(new TimelineWindowDefinition(true, false, 100000));
|
||||
Timeline fakeTimeline = new FakeTimeline(/* windowCount= */ 1);
|
||||
MediaSource[] fakeMediaSources = {
|
||||
new FakeMediaSource(fakeTimeline, null, Builder.VIDEO_FORMAT),
|
||||
new FakeMediaSource(fakeTimeline, null, Builder.VIDEO_FORMAT),
|
||||
@ -264,7 +254,6 @@ public final class ExoPlayerTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testPeriodHoldersReleasedAfterSeekWithRepeatModeAll() throws Exception {
|
||||
Timeline fakeTimeline = new FakeTimeline(new TimelineWindowDefinition(true, false, 100000));
|
||||
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
ActionSchedule actionSchedule = new ActionSchedule.Builder("testPeriodHoldersReleased")
|
||||
.setRepeatMode(Player.REPEAT_MODE_ALL)
|
||||
@ -274,15 +263,13 @@ public final class ExoPlayerTest extends TestCase {
|
||||
.setRepeatMode(Player.REPEAT_MODE_OFF) // Turn off repeat so that playback can finish.
|
||||
.build();
|
||||
new ExoPlayerTestRunner.Builder()
|
||||
.setTimeline(fakeTimeline).setRenderers(renderer).setActionSchedule(actionSchedule)
|
||||
.setRenderers(renderer).setActionSchedule(actionSchedule)
|
||||
.build().start().blockUntilEnded(TIMEOUT_MS);
|
||||
assertTrue(renderer.isEnded);
|
||||
}
|
||||
|
||||
public void testSeekProcessedCallback() throws Exception {
|
||||
Timeline timeline = new FakeTimeline(
|
||||
new TimelineWindowDefinition(true, false, 100000),
|
||||
new TimelineWindowDefinition(true, false, 100000));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 2);
|
||||
ActionSchedule actionSchedule = new ActionSchedule.Builder("testSeekProcessedCallback")
|
||||
// Initial seek before timeline preparation finished.
|
||||
.pause().seek(10).waitForPlaybackState(Player.STATE_READY)
|
||||
@ -314,8 +301,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testAllActivatedTrackSelectionAreReleasedForSinglePeriod() throws Exception {
|
||||
Timeline timeline =
|
||||
new FakeTimeline(new TimelineWindowDefinition(false, false, /* durationUs= */ 500_000));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
|
||||
MediaSource mediaSource =
|
||||
new FakeMediaSource(timeline, null, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT);
|
||||
FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
@ -343,9 +329,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
}
|
||||
|
||||
public void testAllActivatedTrackSelectionAreReleasedForMultiPeriods() throws Exception {
|
||||
Timeline timeline =
|
||||
new FakeTimeline(new TimelineWindowDefinition(false, false, /* durationUs= */ 500_000),
|
||||
new TimelineWindowDefinition(false, false, /* durationUs= */ 500_000));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 2);
|
||||
MediaSource mediaSource =
|
||||
new FakeMediaSource(timeline, null, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT);
|
||||
FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
@ -374,8 +358,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
|
||||
public void testAllActivatedTrackSelectionAreReleasedWhenTrackSelectionsAreRemade()
|
||||
throws Exception {
|
||||
Timeline timeline =
|
||||
new FakeTimeline(new TimelineWindowDefinition(false, false, /* durationUs= */ 500_000));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
|
||||
MediaSource mediaSource =
|
||||
new FakeMediaSource(timeline, null, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT);
|
||||
FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
@ -414,8 +397,7 @@ public final class ExoPlayerTest extends TestCase {
|
||||
|
||||
public void testAllActivatedTrackSelectionAreReleasedWhenTrackSelectionsAreUsed()
|
||||
throws Exception {
|
||||
Timeline timeline =
|
||||
new FakeTimeline(new TimelineWindowDefinition(false, false, /* durationUs= */ 500_000));
|
||||
Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
|
||||
MediaSource mediaSource =
|
||||
new FakeMediaSource(timeline, null, Builder.VIDEO_FORMAT, Builder.AUDIO_FORMAT);
|
||||
FakeRenderer videoRenderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||
|
@ -32,7 +32,6 @@ import com.google.android.exoplayer2.metadata.MetadataOutput;
|
||||
import com.google.android.exoplayer2.source.MediaSource;
|
||||
import com.google.android.exoplayer2.source.TrackGroupArray;
|
||||
import com.google.android.exoplayer2.testutil.ExoPlayerTestRunner.Builder.PlayerFactory;
|
||||
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
|
||||
import com.google.android.exoplayer2.text.TextOutput;
|
||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
||||
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
|
||||
@ -103,8 +102,9 @@ public final class ExoPlayerTestRunner extends Player.DefaultEventListener {
|
||||
|
||||
/**
|
||||
* Sets a {@link Timeline} to be used by a {@link FakeMediaSource} in the test runner. The
|
||||
* default value is a non-seekable, non-dynamic {@link FakeTimeline} with zero duration. Setting
|
||||
* the timeline is not allowed after a call to {@link #setMediaSource(MediaSource)}.
|
||||
* default value is a seekable, non-dynamic {@link FakeTimeline} with a duration of
|
||||
* {@link FakeTimeline.TimelineWindowDefinition#DEFAULT_WINDOW_DURATION_US}. Setting the
|
||||
* timeline is not allowed after a call to {@link #setMediaSource(MediaSource)}.
|
||||
*
|
||||
* @param timeline A {@link Timeline} to be used by a {@link FakeMediaSource} in the test
|
||||
* runner.
|
||||
@ -294,7 +294,7 @@ public final class ExoPlayerTestRunner extends Player.DefaultEventListener {
|
||||
}
|
||||
if (mediaSource == null) {
|
||||
if (timeline == null) {
|
||||
timeline = new FakeTimeline(new TimelineWindowDefinition(false, false, 0));
|
||||
timeline = new FakeTimeline(1);
|
||||
}
|
||||
mediaSource = new FakeMediaSource(timeline, manifest, supportedFormats);
|
||||
}
|
||||
|
@ -30,7 +30,10 @@ public final class FakeTimeline extends Timeline {
|
||||
*/
|
||||
public static final class TimelineWindowDefinition {
|
||||
|
||||
private static final int WINDOW_DURATION_US = 100000;
|
||||
/**
|
||||
* Default test window duration in microseconds.
|
||||
*/
|
||||
public static final int DEFAULT_WINDOW_DURATION_US = 100_000;
|
||||
|
||||
public final int periodCount;
|
||||
public final Object id;
|
||||
@ -40,19 +43,65 @@ public final class FakeTimeline extends Timeline {
|
||||
public final int adGroupsPerPeriodCount;
|
||||
public final int adsPerAdGroupCount;
|
||||
|
||||
public TimelineWindowDefinition(int periodCount, Object id) {
|
||||
this(periodCount, id, true, false, WINDOW_DURATION_US);
|
||||
/**
|
||||
* Creates a seekable, non-dynamic window definition with one period with a duration of
|
||||
* {@link #DEFAULT_WINDOW_DURATION_US}.
|
||||
*/
|
||||
public TimelineWindowDefinition() {
|
||||
this(1, 0, true, false, DEFAULT_WINDOW_DURATION_US);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a seekable, non-dynamic window definition with a duration of
|
||||
* {@link #DEFAULT_WINDOW_DURATION_US}.
|
||||
*
|
||||
* @param periodCount The number of periods in the window. Each period get an equal slice of the
|
||||
* total window duration.
|
||||
* @param id The UID of the window.
|
||||
*/
|
||||
public TimelineWindowDefinition(int periodCount, Object id) {
|
||||
this(periodCount, id, true, false, DEFAULT_WINDOW_DURATION_US);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a window definition with one period.
|
||||
*
|
||||
* @param isSeekable Whether the window is seekable.
|
||||
* @param isDynamic Whether the window is dynamic.
|
||||
* @param durationUs The duration of the window in microseconds.
|
||||
*/
|
||||
public TimelineWindowDefinition(boolean isSeekable, boolean isDynamic, long durationUs) {
|
||||
this(1, 0, isSeekable, isDynamic, durationUs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a window definition.
|
||||
*
|
||||
* @param periodCount The number of periods in the window. Each period get an equal slice of the
|
||||
* total window duration.
|
||||
* @param id The UID of the window.
|
||||
* @param isSeekable Whether the window is seekable.
|
||||
* @param isDynamic Whether the window is dynamic.
|
||||
* @param durationUs The duration of the window in microseconds.
|
||||
*/
|
||||
public TimelineWindowDefinition(int periodCount, Object id, boolean isSeekable,
|
||||
boolean isDynamic, long durationUs) {
|
||||
this(periodCount, id, isSeekable, isDynamic, durationUs, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a window definition with ad groups.
|
||||
*
|
||||
* @param periodCount The number of periods in the window. Each period get an equal slice of the
|
||||
* total window duration.
|
||||
* @param id The UID of the window.
|
||||
* @param isSeekable Whether the window is seekable.
|
||||
* @param isDynamic Whether the window is dynamic.
|
||||
* @param durationUs The duration of the window in microseconds.
|
||||
* @param adGroupsCountPerPeriod The number of ad groups in each period. The position of the ad
|
||||
* groups is equally distributed in each period starting.
|
||||
* @param adsPerAdGroupCount The number of ads in each ad group.
|
||||
*/
|
||||
public TimelineWindowDefinition(int periodCount, Object id, boolean isSeekable,
|
||||
boolean isDynamic, long durationUs, int adGroupsCountPerPeriod, int adsPerAdGroupCount) {
|
||||
this.periodCount = periodCount;
|
||||
@ -71,6 +120,21 @@ public final class FakeTimeline extends Timeline {
|
||||
private final TimelineWindowDefinition[] windowDefinitions;
|
||||
private final int[] periodOffsets;
|
||||
|
||||
/**
|
||||
* Creates a fake timeline with the given number of seekable, non-dynamic windows with one period
|
||||
* with a duration of {@link TimelineWindowDefinition#DEFAULT_WINDOW_DURATION_US} each.
|
||||
*
|
||||
* @param windowCount The number of windows.
|
||||
*/
|
||||
public FakeTimeline(int windowCount) {
|
||||
this(createDefaultWindowDefinitions(windowCount));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a fake timeline with the given window definitions.
|
||||
*
|
||||
* @param windowDefinitions A list of {@link TimelineWindowDefinition}s.
|
||||
*/
|
||||
public FakeTimeline(TimelineWindowDefinition... windowDefinitions) {
|
||||
this.windowDefinitions = windowDefinitions;
|
||||
periodOffsets = new int[windowDefinitions.length + 1];
|
||||
@ -141,4 +205,10 @@ public final class FakeTimeline extends Timeline {
|
||||
return index >= 0 && index < getPeriodCount() ? index : C.INDEX_UNSET;
|
||||
}
|
||||
|
||||
private static TimelineWindowDefinition[] createDefaultWindowDefinitions(int windowCount) {
|
||||
TimelineWindowDefinition[] windowDefinitions = new TimelineWindowDefinition[windowCount];
|
||||
Arrays.fill(windowDefinitions, new TimelineWindowDefinition());
|
||||
return windowDefinitions;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user