From ebe9ae6b13126cb12aa595aefc35daab195e6704 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Thu, 16 Jul 2015 19:30:14 +0100 Subject: [PATCH] In continueBuffering, return whether a particular track has samples. Issue: #595 --- .../ext/opus/LibopusAudioTrackRenderer.java | 2 +- .../ext/vp9/LibvpxVideoTrackRenderer.java | 2 +- .../exoplayer/FrameworkSampleSource.java | 2 +- .../exoplayer/MediaCodecTrackRenderer.java | 2 +- .../android/exoplayer/SampleSource.java | 7 ++-- .../exoplayer/chunk/ChunkSampleSource.java | 3 +- .../extractor/ExtractorSampleSource.java | 40 +++++++------------ .../exoplayer/hls/HlsSampleSource.java | 26 +++++++----- .../metadata/MetadataTrackRenderer.java | 2 +- .../exoplayer/text/TextTrackRenderer.java | 2 +- .../text/eia608/Eia608TrackRenderer.java | 2 +- 11 files changed, 44 insertions(+), 46 deletions(-) diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/LibopusAudioTrackRenderer.java b/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/LibopusAudioTrackRenderer.java index 58e2019e28..96ce46f4f2 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/LibopusAudioTrackRenderer.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer/ext/opus/LibopusAudioTrackRenderer.java @@ -153,7 +153,7 @@ public class LibopusAudioTrackRenderer extends TrackRenderer implements MediaClo return; } try { - sourceIsReady = source.continueBuffering(positionUs); + sourceIsReady = source.continueBuffering(trackIndex, positionUs); checkForDiscontinuity(); if (format == null) { readFormat(); diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/LibvpxVideoTrackRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/LibvpxVideoTrackRenderer.java index 5ceff05548..b6b3cc06a1 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/LibvpxVideoTrackRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer/ext/vp9/LibvpxVideoTrackRenderer.java @@ -179,7 +179,7 @@ public class LibvpxVideoTrackRenderer extends TrackRenderer { return; } try { - sourceIsReady = source.continueBuffering(positionUs); + sourceIsReady = source.continueBuffering(trackIndex, positionUs); checkForDiscontinuity(positionUs); if (format == null) { readFormat(positionUs); diff --git a/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java b/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java index dbc5ccbc42..02d599aca4 100644 --- a/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java @@ -174,7 +174,7 @@ public final class FrameworkSampleSource implements SampleSource, SampleSourceRe } @Override - public boolean continueBuffering(long positionUs) { + public boolean continueBuffering(int track, long positionUs) { // MediaExtractor takes care of buffering and blocks until it has samples, so we can always // return true here. Although note that the blocking behavior is itself as bug, as per the // TODO further up this file. This method will need to return something else as part of fixing diff --git a/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java index eeb2f48ef6..7ebfd795e9 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaCodecTrackRenderer.java @@ -490,7 +490,7 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer { @Override protected void doSomeWork(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { try { - sourceState = source.continueBuffering(positionUs) + sourceState = source.continueBuffering(trackIndex, positionUs) ? (sourceState == SOURCE_STATE_NOT_READY ? SOURCE_STATE_READY : sourceState) : SOURCE_STATE_NOT_READY; checkForDiscontinuity(positionUs); diff --git a/library/src/main/java/com/google/android/exoplayer/SampleSource.java b/library/src/main/java/com/google/android/exoplayer/SampleSource.java index f79961be02..3463dc9fcf 100644 --- a/library/src/main/java/com/google/android/exoplayer/SampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/SampleSource.java @@ -117,14 +117,15 @@ public interface SampleSource { public void disable(int track); /** - * Indicates to the source that it should still be buffering data. + * Indicates to the source that it should still be buffering data for the specified track. * + * @param track The track to continue buffering. * @param positionUs The current playback position. - * @return True if the source has available samples, or if the end of the stream has been + * @return True if the track has available samples, or if the end of the stream has been * reached. False if more data needs to be buffered for samples to become available. * @throws IOException If an error occurred reading from the source. */ - public boolean continueBuffering(long positionUs) throws IOException; + public boolean continueBuffering(int track, long positionUs) throws IOException; /** * Attempts to read either a sample, a new format or or a discontinuity from the source. diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java index 7a269a0c30..4837f0a5d5 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java @@ -188,8 +188,9 @@ public class ChunkSampleSource implements SampleSource, SampleSourceReader, Load } @Override - public boolean continueBuffering(long positionUs) throws IOException { + public boolean continueBuffering(int track, long positionUs) throws IOException { Assertions.checkState(state == STATE_ENABLED); + Assertions.checkState(track == 0); downstreamPositionUs = positionUs; chunkSource.continueBuffering(positionUs); updateLoadControl(); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java index c17e3f30ad..37e2ccba18 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java @@ -180,7 +180,7 @@ public class ExtractorSampleSource implements SampleSource, SampleSourceReader, loader = new Loader("Loader:ExtractorSampleSource"); } - continueBufferingInternal(); + maybeStartLoading(); if (seekMap != null && tracksBuilt && haveFormatsForAllTracks()) { int trackCount = sampleQueues.size(); @@ -246,12 +246,23 @@ public class ExtractorSampleSource implements SampleSource, SampleSourceReader, } @Override - public boolean continueBuffering(long playbackPositionUs) throws IOException { + public boolean continueBuffering(int track, long playbackPositionUs) throws IOException { Assertions.checkState(prepared); - Assertions.checkState(enabledTrackCount > 0); + Assertions.checkState(trackEnabledStates[track]); downstreamPositionUs = playbackPositionUs; discardSamplesForDisabledTracks(downstreamPositionUs); - return loadingFinished || continueBufferingInternal(); + if (loadingFinished) { + return true; + } + maybeStartLoading(); + if (isPendingReset()) { + return false; + } + if (sampleQueues.valueAt(track).isEmpty()) { + maybeThrowLoadableException(); + return false; + } + return true; } @Override @@ -411,18 +422,6 @@ public class ExtractorSampleSource implements SampleSource, SampleSourceReader, // Internal stuff. - private boolean continueBufferingInternal() throws IOException { - maybeStartLoading(); - if (isPendingReset()) { - return false; - } - boolean haveSamples = prepared && haveSampleForOneEnabledTrack(); - if (!haveSamples) { - maybeThrowLoadableException(); - } - return haveSamples; - } - private void restartFrom(long positionUs) { pendingResetPositionUs = positionUs; loadingFinished = false; @@ -532,15 +531,6 @@ public class ExtractorSampleSource implements SampleSource, SampleSourceReader, return true; } - private boolean haveSampleForOneEnabledTrack() { - for (int i = 0; i < trackEnabledStates.length; i++) { - if (trackEnabledStates[i] && !sampleQueues.valueAt(i).isEmpty()) { - return true; - } - } - return false; - } - private void discardSamplesForDisabledTracks(long timeUs) { for (int i = 0; i < trackEnabledStates.length; i++) { if (!trackEnabledStates[i]) { diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java index 5ab4c60ef2..b3a2dbdc34 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java @@ -218,26 +218,32 @@ public class HlsSampleSource implements SampleSource, SampleSourceReader, Loader } @Override - public boolean continueBuffering(long playbackPositionUs) throws IOException { + public boolean continueBuffering(int track, long playbackPositionUs) throws IOException { Assertions.checkState(prepared); - Assertions.checkState(enabledTrackCount > 0); + Assertions.checkState(trackEnabledStates[track]); downstreamPositionUs = playbackPositionUs; if (!extractors.isEmpty()) { discardSamplesForDisabledTracks(getCurrentExtractor(), downstreamPositionUs); } - return loadingFinished || continueBufferingInternal(); - } - - private boolean continueBufferingInternal() throws IOException { + if (loadingFinished) { + return true; + } maybeStartLoading(); if (isPendingReset() || extractors.isEmpty()) { return false; } - boolean haveSamples = prepared && haveSamplesForEnabledTracks(getCurrentExtractor()); - if (!haveSamples) { - maybeThrowLoadableException(); + + for (int extractorIndex = 0; extractorIndex < extractors.size(); extractorIndex++) { + HlsExtractorWrapper extractor = extractors.get(extractorIndex); + if (!extractor.isPrepared()) { + break; + } + if (extractor.hasSamples(track)) { + return true; + } } - return haveSamples; + maybeThrowLoadableException(); + return false; } @Override diff --git a/library/src/main/java/com/google/android/exoplayer/metadata/MetadataTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/metadata/MetadataTrackRenderer.java index 012ac88b77..38db32746b 100644 --- a/library/src/main/java/com/google/android/exoplayer/metadata/MetadataTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/metadata/MetadataTrackRenderer.java @@ -129,7 +129,7 @@ public class MetadataTrackRenderer extends TrackRenderer implements Callback protected void doSomeWork(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { try { - source.continueBuffering(positionUs); + source.continueBuffering(trackIndex, positionUs); } catch (IOException e) { throw new ExoPlaybackException(e); } diff --git a/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java index 0eae41bc13..ef0195d6e3 100644 --- a/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/text/TextTrackRenderer.java @@ -129,7 +129,7 @@ public class TextTrackRenderer extends TrackRenderer implements Callback { @Override protected void doSomeWork(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { try { - source.continueBuffering(positionUs); + source.continueBuffering(trackIndex, positionUs); } catch (IOException e) { throw new ExoPlaybackException(e); } diff --git a/library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608TrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608TrackRenderer.java index baae0f7aa9..3dd37ab51a 100644 --- a/library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608TrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608TrackRenderer.java @@ -134,7 +134,7 @@ public class Eia608TrackRenderer extends TrackRenderer implements Callback { @Override protected void doSomeWork(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { try { - source.continueBuffering(positionUs); + source.continueBuffering(trackIndex, positionUs); } catch (IOException e) { throw new ExoPlaybackException(e); }