From 47c0bbd6b57bc26b92dbb5ec0fad514db46f7392 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Fri, 4 Jul 2014 01:06:20 +0100 Subject: [PATCH] Propagate erors to ChunkSource implementations. This can help custom ChunkSource implementations to act on this information. For example an adaptive implementation may choose to blacklist a problematic format if loads of that format keep failing. --- .../android/exoplayer/chunk/ChunkSampleSource.java | 1 + .../com/google/android/exoplayer/chunk/ChunkSource.java | 9 +++++++++ .../android/exoplayer/chunk/MultiTrackChunkSource.java | 5 +++++ .../android/exoplayer/dash/DashMp4ChunkSource.java | 5 +++++ .../android/exoplayer/dash/DashWebmChunkSource.java | 5 +++++ .../smoothstreaming/SmoothStreamingChunkSource.java | 5 +++++ 6 files changed, 30 insertions(+) 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 d9f3923495..b874f09597 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 @@ -430,6 +430,7 @@ public class ChunkSampleSource implements SampleSource, Loader.Listener { currentLoadableExceptionCount++; currentLoadableExceptionTimestamp = SystemClock.elapsedRealtime(); notifyUpstreamError(e); + chunkSource.onChunkLoadError(currentLoadableHolder.chunk, e); updateLoadControl(); } diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSource.java b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSource.java index c06fcb3661..67330957ba 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSource.java @@ -100,4 +100,13 @@ public interface ChunkSource { */ IOException getError(); + /** + * Invoked when the {@link ChunkSampleSource} encounters an error loading a chunk obtained from + * this source. + * + * @param chunk The chunk whose load encountered the error. + * @param e The error. + */ + void onChunkLoadError(Chunk chunk, Exception e); + } diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/MultiTrackChunkSource.java b/library/src/main/java/com/google/android/exoplayer/chunk/MultiTrackChunkSource.java index 06b1ac4b5a..2c7cf33649 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/MultiTrackChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/MultiTrackChunkSource.java @@ -102,4 +102,9 @@ public class MultiTrackChunkSource implements ChunkSource, ExoPlayerComponent { } } + @Override + public void onChunkLoadError(Chunk chunk, Exception e) { + selectedSource.onChunkLoadError(chunk, e); + } + } diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashMp4ChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashMp4ChunkSource.java index fb2bbd19f2..9eafebbb8f 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashMp4ChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashMp4ChunkSource.java @@ -192,6 +192,11 @@ public class DashMp4ChunkSource implements ChunkSource { return null; } + @Override + public void onChunkLoadError(Chunk chunk, Exception e) { + // Do nothing. + } + private static Chunk newInitializationChunk(Representation representation, FragmentedMp4Extractor extractor, DataSource dataSource, int trigger) { DataSpec dataSpec = new DataSpec(representation.uri, 0, representation.indexEnd + 1, diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashWebmChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashWebmChunkSource.java index 95db7488d9..410f720f3c 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashWebmChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashWebmChunkSource.java @@ -173,6 +173,11 @@ public class DashWebmChunkSource implements ChunkSource { return null; } + @Override + public void onChunkLoadError(Chunk chunk, Exception e) { + // Do nothing. + } + private static Chunk newInitializationChunk(Representation representation, WebmExtractor extractor, DataSource dataSource, int trigger) { DataSpec dataSpec = new DataSpec(representation.uri, 0, representation.indexEnd + 1, diff --git a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java index e996366ae2..ebf181adf8 100644 --- a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java @@ -196,6 +196,11 @@ public class SmoothStreamingChunkSource implements ChunkSource { return null; } + @Override + public void onChunkLoadError(Chunk chunk, Exception e) { + // Do nothing. + } + private static MediaFormat getMediaFormat(StreamElement streamElement, int trackIndex) { TrackElement trackElement = streamElement.tracks[trackIndex]; String mimeType = trackElement.mimeType;