diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/SmoothStreamingRendererBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/SmoothStreamingRendererBuilder.java index 300a48e197..7691ebda5b 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/SmoothStreamingRendererBuilder.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/SmoothStreamingRendererBuilder.java @@ -24,17 +24,16 @@ import com.google.android.exoplayer.audio.AudioCapabilities; import com.google.android.exoplayer.chunk.ChunkSampleSource; import com.google.android.exoplayer.chunk.ChunkSource; import com.google.android.exoplayer.chunk.FormatEvaluator.AdaptiveEvaluator; -import com.google.android.exoplayer.chunk.VideoFormatSelectorUtil; import com.google.android.exoplayer.demo.player.DemoPlayer.RendererBuilder; import com.google.android.exoplayer.drm.DrmSessionManager; import com.google.android.exoplayer.drm.MediaDrmCallback; import com.google.android.exoplayer.drm.StreamingDrmSessionManager; import com.google.android.exoplayer.drm.UnsupportedDrmException; +import com.google.android.exoplayer.smoothstreaming.DefaultSmoothStreamingTrackSelector; import com.google.android.exoplayer.smoothstreaming.SmoothStreamingChunkSource; import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifest; import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifest.StreamElement; import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifestParser; -import com.google.android.exoplayer.smoothstreaming.SmoothStreamingTrackSelector; import com.google.android.exoplayer.text.TextTrackRenderer; import com.google.android.exoplayer.upstream.DataSource; import com.google.android.exoplayer.upstream.DefaultAllocator; @@ -49,7 +48,6 @@ import android.media.MediaCodec; import android.os.Handler; import java.io.IOException; -import java.util.Arrays; /** * A {@link RendererBuilder} for SmoothStreaming. @@ -160,8 +158,8 @@ public class SmoothStreamingRendererBuilder implements RendererBuilder { // Build the video renderer. DataSource videoDataSource = new DefaultUriDataSource(context, bandwidthMeter, userAgent); ChunkSource videoChunkSource = new SmoothStreamingChunkSource(manifestFetcher, - new TrackSelector(context, StreamElement.TYPE_VIDEO), videoDataSource, - new AdaptiveEvaluator(bandwidthMeter), LIVE_EDGE_LATENCY_MS); + new DefaultSmoothStreamingTrackSelector(context, StreamElement.TYPE_VIDEO), + videoDataSource, new AdaptiveEvaluator(bandwidthMeter), LIVE_EDGE_LATENCY_MS); ChunkSampleSource videoSampleSource = new ChunkSampleSource(videoChunkSource, loadControl, VIDEO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_VIDEO); @@ -172,8 +170,8 @@ public class SmoothStreamingRendererBuilder implements RendererBuilder { // Build the audio renderer. DataSource audioDataSource = new DefaultUriDataSource(context, bandwidthMeter, userAgent); ChunkSource audioChunkSource = new SmoothStreamingChunkSource(manifestFetcher, - new TrackSelector(context, StreamElement.TYPE_AUDIO), audioDataSource, null, - LIVE_EDGE_LATENCY_MS); + new DefaultSmoothStreamingTrackSelector(context, StreamElement.TYPE_AUDIO), + audioDataSource, null, LIVE_EDGE_LATENCY_MS); ChunkSampleSource audioSampleSource = new ChunkSampleSource(audioChunkSource, loadControl, AUDIO_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_AUDIO); @@ -183,8 +181,8 @@ public class SmoothStreamingRendererBuilder implements RendererBuilder { // Build the text renderer. DataSource textDataSource = new DefaultUriDataSource(context, bandwidthMeter, userAgent); ChunkSource textChunkSource = new SmoothStreamingChunkSource(manifestFetcher, - new TrackSelector(context, StreamElement.TYPE_TEXT), textDataSource, null, - LIVE_EDGE_LATENCY_MS); + new DefaultSmoothStreamingTrackSelector(context, StreamElement.TYPE_TEXT), + textDataSource, null, LIVE_EDGE_LATENCY_MS); ChunkSampleSource textSampleSource = new ChunkSampleSource(textChunkSource, loadControl, TEXT_BUFFER_SEGMENTS * BUFFER_SEGMENT_SIZE, mainHandler, player, DemoPlayer.TYPE_TEXT); @@ -201,36 +199,4 @@ public class SmoothStreamingRendererBuilder implements RendererBuilder { } - private static final class TrackSelector implements SmoothStreamingTrackSelector { - - private final Context context; - private final int elementType; - - private TrackSelector(Context context, int type) { - this.context = context; - this.elementType = type; - } - - @Override - public void selectTracks(SmoothStreamingManifest manifest, Output output) throws IOException { - for (int i = 0; i < manifest.streamElements.length; i++) { - if (manifest.streamElements[i].type == elementType) { - if (elementType == StreamElement.TYPE_VIDEO) { - int[] trackIndices = VideoFormatSelectorUtil.selectVideoFormatsForDefaultDisplay( - context, Arrays.asList(manifest.streamElements[i].tracks), null, false); - output.adaptiveTrack(manifest, i, trackIndices); - for (int j = 0; j < trackIndices.length; j++) { - output.fixedTrack(manifest, i, trackIndices[j]); - } - } else { - for (int j = 0; j < manifest.streamElements[i].tracks.length; j++) { - output.fixedTrack(manifest, i, j); - } - } - } - } - } - - } - } diff --git a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/DefaultSmoothStreamingTrackSelector.java b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/DefaultSmoothStreamingTrackSelector.java new file mode 100644 index 0000000000..33691bbcfc --- /dev/null +++ b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/DefaultSmoothStreamingTrackSelector.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer.smoothstreaming; + +import com.google.android.exoplayer.chunk.VideoFormatSelectorUtil; +import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifest.StreamElement; + +import android.content.Context; + +import java.io.IOException; +import java.util.Arrays; + +/** + * A default {@link SmoothStreamingTrackSelector} implementation. + */ +// TODO: Add configuration options (e.g. ability to disable adaptive track output, disable format +// filtering etc). +public final class DefaultSmoothStreamingTrackSelector implements SmoothStreamingTrackSelector { + + private final Context context; + private final int streamElementType; + + /** + * @param context A context. + * @param streamElementType The type of stream to select. One of {@link StreamElement#TYPE_AUDIO}, + * {@link StreamElement#TYPE_VIDEO} and {@link StreamElement#TYPE_TEXT}. + */ + public DefaultSmoothStreamingTrackSelector(Context context, int streamElementType) { + this.context = context; + this.streamElementType = streamElementType; + } + + @Override + public void selectTracks(SmoothStreamingManifest manifest, Output output) throws IOException { + for (int i = 0; i < manifest.streamElements.length; i++) { + if (manifest.streamElements[i].type == streamElementType) { + if (streamElementType == StreamElement.TYPE_VIDEO) { + int[] trackIndices = VideoFormatSelectorUtil.selectVideoFormatsForDefaultDisplay( + context, Arrays.asList(manifest.streamElements[i].tracks), null, false); + output.adaptiveTrack(manifest, i, trackIndices); + for (int j = 0; j < trackIndices.length; j++) { + output.fixedTrack(manifest, i, trackIndices[j]); + } + } else { + for (int j = 0; j < manifest.streamElements[i].tracks.length; j++) { + output.fixedTrack(manifest, i, j); + } + } + } + } + } + +} 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 8baf1e6986..8c06486579 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 @@ -185,8 +185,6 @@ public class SmoothStreamingChunkSource implements ChunkSource, @Override public void enable(int track) { - fatalError = null; - evaluation.format = null; enabledTrack = tracks.get(track); if (enabledTrack.isAdaptive()) { adaptiveFormatEvaluator.enable(); @@ -339,6 +337,8 @@ public class SmoothStreamingChunkSource implements ChunkSource, if (manifestFetcher != null) { manifestFetcher.disable(); } + evaluation.format = null; + fatalError = null; } // SmoothStreamingTrackSelector.Output implementation.