Commit 4f640bc6 by tonihei Committed by Oliver Woodman

Add SequencableLoader.isLoading

This method allows the player to figure out whether we still have an ongoing
load even if LoadControl.shouldContinueLoading returns false.

PiperOrigin-RevId: 272445577
parent 9f781876
Showing with 90 additions and 0 deletions
...@@ -91,6 +91,7 @@ ...@@ -91,6 +91,7 @@
([#6476](https://github.com/google/ExoPlayer/issues/6476)). ([#6476](https://github.com/google/ExoPlayer/issues/6476)).
* Fail more explicitly when local-file Uris contain invalid parts (e.g. * Fail more explicitly when local-file Uris contain invalid parts (e.g.
fragment) ([#6470](https://github.com/google/ExoPlayer/issues/6470)). fragment) ([#6470](https://github.com/google/ExoPlayer/issues/6470)).
* Add `MediaPeriod.isLoading` to improve `Player.isLoading` state.
### 2.10.5 (2019-09-20) ### ### 2.10.5 (2019-09-20) ###
......
...@@ -211,6 +211,11 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb ...@@ -211,6 +211,11 @@ public final class ClippingMediaPeriod implements MediaPeriod, MediaPeriod.Callb
return mediaPeriod.continueLoading(positionUs); return mediaPeriod.continueLoading(positionUs);
} }
@Override
public boolean isLoading() {
return mediaPeriod.isLoading();
}
// MediaPeriod.Callback implementation. // MediaPeriod.Callback implementation.
@Override @Override
......
...@@ -83,4 +83,13 @@ public class CompositeSequenceableLoader implements SequenceableLoader { ...@@ -83,4 +83,13 @@ public class CompositeSequenceableLoader implements SequenceableLoader {
return madeProgress; return madeProgress;
} }
@Override
public boolean isLoading() {
for (SequenceableLoader loader : loaders) {
if (loader.isLoading()) {
return true;
}
}
return false;
}
} }
...@@ -212,6 +212,11 @@ public final class MaskingMediaPeriod implements MediaPeriod, MediaPeriod.Callba ...@@ -212,6 +212,11 @@ public final class MaskingMediaPeriod implements MediaPeriod, MediaPeriod.Callba
} }
@Override @Override
public boolean isLoading() {
return mediaPeriod != null && mediaPeriod.isLoading();
}
@Override
public void onContinueLoadingRequested(MediaPeriod source) { public void onContinueLoadingRequested(MediaPeriod source) {
castNonNull(callback).onContinueLoadingRequested(this); castNonNull(callback).onContinueLoadingRequested(this);
} }
......
...@@ -231,6 +231,9 @@ public interface MediaPeriod extends SequenceableLoader { ...@@ -231,6 +231,9 @@ public interface MediaPeriod extends SequenceableLoader {
@Override @Override
boolean continueLoading(long positionUs); boolean continueLoading(long positionUs);
/** Returns whether the media period is currently loading. */
boolean isLoading();
/** /**
* Re-evaluates the buffer given the playback position. * Re-evaluates the buffer given the playback position.
* *
......
...@@ -170,6 +170,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; ...@@ -170,6 +170,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
} }
@Override @Override
public boolean isLoading() {
return compositeSequenceableLoader.isLoading();
}
@Override
public long getNextLoadPositionUs() { public long getNextLoadPositionUs() {
return compositeSequenceableLoader.getNextLoadPositionUs(); return compositeSequenceableLoader.getNextLoadPositionUs();
} }
......
...@@ -359,6 +359,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; ...@@ -359,6 +359,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
} }
@Override @Override
public boolean isLoading() {
return loader.isLoading() && loadCondition.isOpen();
}
@Override
public long getNextLoadPositionUs() { public long getNextLoadPositionUs() {
return enabledTrackCount == 0 ? C.TIME_END_OF_SOURCE : getBufferedPositionUs(); return enabledTrackCount == 0 ? C.TIME_END_OF_SOURCE : getBufferedPositionUs();
} }
......
...@@ -60,6 +60,9 @@ public interface SequenceableLoader { ...@@ -60,6 +60,9 @@ public interface SequenceableLoader {
*/ */
boolean continueLoading(long positionUs); boolean continueLoading(long positionUs);
/** Returns whether the loader is currently loading. */
boolean isLoading();
/** /**
* Re-evaluates the buffer given the playback position. * Re-evaluates the buffer given the playback position.
* *
......
...@@ -173,6 +173,11 @@ public final class SilenceMediaSource extends BaseMediaSource { ...@@ -173,6 +173,11 @@ public final class SilenceMediaSource extends BaseMediaSource {
} }
@Override @Override
public boolean isLoading() {
return false;
}
@Override
public void reevaluateBuffer(long positionUs) {} public void reevaluateBuffer(long positionUs) {}
private long constrainSeekPosition(long positionUs) { private long constrainSeekPosition(long positionUs) {
......
...@@ -173,6 +173,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -173,6 +173,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
} }
@Override @Override
public boolean isLoading() {
return loader.isLoading();
}
@Override
public long readDiscontinuity() { public long readDiscontinuity() {
if (!notifiedReadingStarted) { if (!notifiedReadingStarted) {
eventDispatcher.readingStarted(); eventDispatcher.readingStarted();
......
...@@ -578,6 +578,11 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -578,6 +578,11 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
} }
@Override @Override
public boolean isLoading() {
return loader.isLoading();
}
@Override
public long getNextLoadPositionUs() { public long getNextLoadPositionUs() {
if (isPendingReset()) { if (isPendingReset()) {
return pendingResetPositionUs; return pendingResetPositionUs;
......
...@@ -76,4 +76,8 @@ public final class ConditionVariable { ...@@ -76,4 +76,8 @@ public final class ConditionVariable {
return isOpen; return isOpen;
} }
/** Returns whether the condition is opened. */
public synchronized boolean isOpen() {
return isOpen;
}
} }
...@@ -262,6 +262,11 @@ public final class CompositeSequenceableLoaderTest { ...@@ -262,6 +262,11 @@ public final class CompositeSequenceableLoaderTest {
} }
@Override @Override
public boolean isLoading() {
return nextChunkDurationUs != 0;
}
@Override
public void reevaluateBuffer(long positionUs) { public void reevaluateBuffer(long positionUs) {
// Do nothing. // Do nothing.
} }
......
...@@ -298,6 +298,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; ...@@ -298,6 +298,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
} }
@Override @Override
public boolean isLoading() {
return compositeSequenceableLoader.isLoading();
}
@Override
public long getNextLoadPositionUs() { public long getNextLoadPositionUs() {
return compositeSequenceableLoader.getNextLoadPositionUs(); return compositeSequenceableLoader.getNextLoadPositionUs();
} }
......
...@@ -360,6 +360,11 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper ...@@ -360,6 +360,11 @@ public final class HlsMediaPeriod implements MediaPeriod, HlsSampleStreamWrapper
} }
@Override @Override
public boolean isLoading() {
return compositeSequenceableLoader.isLoading();
}
@Override
public long getNextLoadPositionUs() { public long getNextLoadPositionUs() {
return compositeSequenceableLoader.getNextLoadPositionUs(); return compositeSequenceableLoader.getNextLoadPositionUs();
} }
......
...@@ -664,6 +664,11 @@ import java.util.Set; ...@@ -664,6 +664,11 @@ import java.util.Set;
} }
@Override @Override
public boolean isLoading() {
return loader.isLoading();
}
@Override
public void reevaluateBuffer(long positionUs) { public void reevaluateBuffer(long positionUs) {
// Do nothing. // Do nothing.
} }
......
...@@ -185,6 +185,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; ...@@ -185,6 +185,11 @@ import org.checkerframework.checker.nullness.compatqual.NullableType;
} }
@Override @Override
public boolean isLoading() {
return compositeSequenceableLoader.isLoading();
}
@Override
public long getNextLoadPositionUs() { public long getNextLoadPositionUs() {
return compositeSequenceableLoader.getNextLoadPositionUs(); return compositeSequenceableLoader.getNextLoadPositionUs();
} }
......
...@@ -139,6 +139,11 @@ public class FakeAdaptiveMediaPeriod extends FakeMediaPeriod ...@@ -139,6 +139,11 @@ public class FakeAdaptiveMediaPeriod extends FakeMediaPeriod
} }
@Override @Override
public boolean isLoading() {
return sequenceableLoader.isLoading();
}
@Override
protected SampleStream createSampleStream(TrackSelection trackSelection) { protected SampleStream createSampleStream(TrackSelection trackSelection) {
FakeChunkSource chunkSource = FakeChunkSource chunkSource =
chunkSourceFactory.createChunkSource(trackSelection, durationUs, transferListener); chunkSourceFactory.createChunkSource(trackSelection, durationUs, transferListener);
......
...@@ -217,6 +217,11 @@ public class FakeMediaPeriod implements MediaPeriod { ...@@ -217,6 +217,11 @@ public class FakeMediaPeriod implements MediaPeriod {
return false; return false;
} }
@Override
public boolean isLoading() {
return false;
}
protected SampleStream createSampleStream(TrackSelection selection) { protected SampleStream createSampleStream(TrackSelection selection) {
return new FakeSampleStream( return new FakeSampleStream(
selection.getSelectedFormat(), eventDispatcher, /* shouldOutputSample= */ true); selection.getSelectedFormat(), eventDispatcher, /* shouldOutputSample= */ true);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment