From ac54b4f696d65fe03533af6e7428c751ceb51b35 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Fri, 22 May 2015 21:45:13 +0100 Subject: [PATCH] Cleanup/Sync with internal tree --- .../demo/player/DashRendererBuilder.java | 3 +-- library/build.gradle | 10 +++++++++ .../android/exoplayer/MediaCodecUtil.java | 3 +-- .../exoplayer/dash/DashChunkSource.java | 21 ++++++++++++------- .../exoplayer/hls/HlsExtractorWrapper.java | 2 +- .../SmoothStreamingChunkSource.java | 21 +++++++++++-------- .../text/eia608/Eia608TrackRenderer.java | 7 +++++-- .../exoplayer/upstream/cache/CacheSpan.java | 3 ++- library/src/test/.classpath | 1 - library/src/test/AndroidManifest.xml | 7 +++++-- .../text/webvtt/WebvttSubtitleTest.java | 1 - library/src/test/project.properties | 1 + 12 files changed, 51 insertions(+), 29 deletions(-) diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/DashRendererBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/DashRendererBuilder.java index 29424e51a4..bfd203c5fa 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/DashRendererBuilder.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/DashRendererBuilder.java @@ -131,8 +131,7 @@ public class DashRendererBuilder implements RendererBuilder, this.callback = callback; MediaPresentationDescriptionParser parser = new MediaPresentationDescriptionParser(); manifestDataSource = new DefaultUriDataSource(context, userAgent); - manifestFetcher = new ManifestFetcher<>(url, manifestDataSource, - parser); + manifestFetcher = new ManifestFetcher<>(url, manifestDataSource, parser); manifestFetcher.singleLoad(player.getMainHandler().getLooper(), this); } diff --git a/library/build.gradle b/library/build.gradle index 6673253faa..a6c2fa6414 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -38,9 +38,19 @@ android { lintOptions { abortOnError false } + + sourceSets { + androidTest { + assets.srcDirs = ['src/test/assets'] + java.srcDirs = ['src/test/java'] + } + } } dependencies { + androidTestCompile 'com.google.dexmaker:dexmaker:1.2' + androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2' + androidTestCompile 'org.mockito:mockito-core:1.9.5' } android.libraryVariants.all { variant -> diff --git a/library/src/main/java/com/google/android/exoplayer/MediaCodecUtil.java b/library/src/main/java/com/google/android/exoplayer/MediaCodecUtil.java index e101d8c5c7..c3f3fc85f2 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaCodecUtil.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaCodecUtil.java @@ -52,8 +52,7 @@ public class MediaCodecUtil { private static final String TAG = "MediaCodecUtil"; - private static final HashMap> codecs = - new HashMap<>(); + private static final HashMap> codecs = new HashMap<>(); /** * Get information about the decoder that will be used for a given mime type. diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java index 0f426773c5..8bf7199da8 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java @@ -101,7 +101,7 @@ public class DashChunkSource implements ChunkSource { private final TrackInfo trackInfo; private final DataSource dataSource; - private final FormatEvaluator evaluator; + private final FormatEvaluator formatEvaluator; private final Evaluation evaluation; private final Clock systemClock; private final StringBuilder headerBuilder; @@ -117,13 +117,14 @@ public class DashChunkSource implements ChunkSource { private final int adaptationSetIndex; private final int[] representationIndices; - private DrmInitData drmInitData; private MediaPresentationDescription currentManifest; + private boolean finishedCurrentManifest; + + private DrmInitData drmInitData; private TimeRange seekRange; private long[] seekRangeValues; private int firstAvailableSegmentNum; private int lastAvailableSegmentNum; - private boolean finishedCurrentManifest; private boolean lastChunkWasInitialization; private IOException fatalError; @@ -214,7 +215,7 @@ public class DashChunkSource implements ChunkSource { this.adaptationSetIndex = adaptationSetIndex; this.representationIndices = representationIndices; this.dataSource = dataSource; - this.evaluator = formatEvaluator; + this.formatEvaluator = formatEvaluator; this.systemClock = systemClock; this.liveEdgeLatencyUs = liveEdgeLatencyUs; this.elapsedRealtimeOffsetUs = elapsedRealtimeOffsetUs; @@ -268,7 +269,8 @@ public class DashChunkSource implements ChunkSource { @Override public void enable() { - evaluator.enable(); + fatalError = null; + formatEvaluator.enable(); if (manifestFetcher != null) { manifestFetcher.enable(); } @@ -286,7 +288,7 @@ public class DashChunkSource implements ChunkSource { @Override public void disable(List queue) { - evaluator.disable(); + formatEvaluator.disable(); if (manifestFetcher != null) { manifestFetcher.disable(); } @@ -347,7 +349,7 @@ public class DashChunkSource implements ChunkSource { evaluation.queueSize = queue.size(); if (evaluation.format == null || !lastChunkWasInitialization) { - evaluator.evaluate(queue, playbackPositionUs, formats, evaluation); + formatEvaluator.evaluate(queue, playbackPositionUs, formats, evaluation); } Format selectedFormat = evaluation.format; out.queueSize = evaluation.queueSize; @@ -362,6 +364,9 @@ public class DashChunkSource implements ChunkSource { return; } + // In all cases where we return before instantiating a new chunk, we want out.chunk to be null. + out.chunk = null; + RepresentationHolder representationHolder = representationHolders.get(selectedFormat.id); Representation selectedRepresentation = representationHolder.representation; DashSegmentIndex segmentIndex = representationHolder.segmentIndex; @@ -426,7 +431,7 @@ public class DashChunkSource implements ChunkSource { } if (segmentNum == -1) { - out.chunk = null; + // We've reached the end of the stream. return; } diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsExtractorWrapper.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsExtractorWrapper.java index 48308ac4b9..b802d9fb9b 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsExtractorWrapper.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsExtractorWrapper.java @@ -70,7 +70,7 @@ public final class HlsExtractorWrapper implements ExtractorOutput { */ public void init(Allocator allocator) { this.allocator = allocator; - this.extractor.init(this); + extractor.init(this); } /** 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 2527f1efb4..c7a3f2e517 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 @@ -59,14 +59,11 @@ public class SmoothStreamingChunkSource implements ChunkSource { private static final int MINIMUM_MANIFEST_REFRESH_PERIOD_MS = 5000; private static final int INITIALIZATION_VECTOR_SIZE = 8; - private final ManifestFetcher manifestFetcher; - private final int streamElementIndex; private final TrackInfo trackInfo; private final DataSource dataSource; private final FormatEvaluator formatEvaluator; private final Evaluation evaluation; private final long liveEdgeLatencyUs; - private final int maxWidth; private final int maxHeight; @@ -75,6 +72,9 @@ public class SmoothStreamingChunkSource implements ChunkSource { private final DrmInitData drmInitData; private final Format[] formats; + private final ManifestFetcher manifestFetcher; + private final int streamElementIndex; + private SmoothStreamingManifest currentManifest; private int currentManifestChunkOffset; private boolean finishedCurrentManifest; @@ -174,8 +174,8 @@ public class SmoothStreamingChunkSource implements ChunkSource { extractorWrappers.put(trackIndex, new ChunkExtractorWrapper(extractor)); mediaFormats.put(trackIndex, mediaFormat); } - this.maxHeight = maxHeight; this.maxWidth = maxWidth; + this.maxHeight = maxHeight; Arrays.sort(formats, new DecreasingBandwidthComparator()); } @@ -194,6 +194,7 @@ public class SmoothStreamingChunkSource implements ChunkSource { @Override public void enable() { fatalError = null; + formatEvaluator.enable(); if (manifestFetcher != null) { manifestFetcher.enable(); } @@ -201,6 +202,7 @@ public class SmoothStreamingChunkSource implements ChunkSource { @Override public void disable(List queue) { + formatEvaluator.disable(); if (manifestFetcher != null) { manifestFetcher.disable(); } @@ -248,14 +250,13 @@ public class SmoothStreamingChunkSource implements ChunkSource { out.chunk = null; return; } else if (out.queueSize == queue.size() && out.chunk != null - && out.chunk.format.equals(evaluation.format)) { + && out.chunk.format.equals(selectedFormat)) { // We already have a chunk, and the evaluation hasn't changed either the format or the size - // of the queue. Do nothing. + // of the queue. Leave unchanged. return; } - // In all cases where we return before instantiating a new chunk at the bottom of this method, - // we want out.chunk to be null. + // In all cases where we return before instantiating a new chunk, we want out.chunk to be null. out.chunk = null; StreamElement streamElement = getElement(currentManifest); @@ -290,7 +291,9 @@ public class SmoothStreamingChunkSource implements ChunkSource { // but continue to return the final chunk. finishedCurrentManifest = true; } - } else if (chunkIndex == -1) { + } + + if (chunkIndex == -1) { // We've reached the end of the stream. return; } 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 85fffc046e..dbd5859c36 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 @@ -230,8 +230,11 @@ public class Eia608TrackRenderer extends TrackRenderer implements Callback { } private void invokeRendererInternal(String cueText) { - Cue cue = new Cue(cueText); - textRenderer.onCues(Collections.singletonList(cue)); + if (cueText == null) { + textRenderer.onCues(Collections.emptyList()); + } else { + textRenderer.onCues(Collections.singletonList(new Cue(cueText))); + } } private void maybeParsePendingSample() { diff --git a/library/src/main/java/com/google/android/exoplayer/upstream/cache/CacheSpan.java b/library/src/main/java/com/google/android/exoplayer/upstream/cache/CacheSpan.java index 4d2ce48afb..ddde6b003c 100644 --- a/library/src/main/java/com/google/android/exoplayer/upstream/cache/CacheSpan.java +++ b/library/src/main/java/com/google/android/exoplayer/upstream/cache/CacheSpan.java @@ -92,7 +92,8 @@ public final class CacheSpan implements Comparable { return new CacheSpan(key, position, file.length(), true, lastAccessTimestamp, file); } - private CacheSpan(String key, long position, long length, boolean isCached, + // Visible for testing. + CacheSpan(String key, long position, long length, boolean isCached, long lastAccessTimestamp, File file) { this.key = key; this.position = position; diff --git a/library/src/test/.classpath b/library/src/test/.classpath index 171a8c3ec8..be2dd156ff 100644 --- a/library/src/test/.classpath +++ b/library/src/test/.classpath @@ -5,6 +5,5 @@ - diff --git a/library/src/test/AndroidManifest.xml b/library/src/test/AndroidManifest.xml index 71bb5c3a66..c9c12992a1 100644 --- a/library/src/test/AndroidManifest.xml +++ b/library/src/test/AndroidManifest.xml @@ -15,16 +15,19 @@ --> - + diff --git a/library/src/test/java/com/google/android/exoplayer/text/webvtt/WebvttSubtitleTest.java b/library/src/test/java/com/google/android/exoplayer/text/webvtt/WebvttSubtitleTest.java index 0943b3a6f6..e8ce0b387c 100644 --- a/library/src/test/java/com/google/android/exoplayer/text/webvtt/WebvttSubtitleTest.java +++ b/library/src/test/java/com/google/android/exoplayer/text/webvtt/WebvttSubtitleTest.java @@ -54,7 +54,6 @@ public class WebvttSubtitleTest extends TestCase { } private WebvttSubtitle overlappingSubtitle = new WebvttSubtitle(overlappingSubtitleCues, 0); - @SuppressWarnings("unused") private ArrayList nestedSubtitleCues = new ArrayList<>(); { WebvttCue firstCue = new WebvttCue(1000000, 4000000, FIRST_SUBTITLE_STRING); diff --git a/library/src/test/project.properties b/library/src/test/project.properties index 00cf62bacc..ef6eb035b6 100644 --- a/library/src/test/project.properties +++ b/library/src/test/project.properties @@ -12,3 +12,4 @@ # Project target. target=android-22 +android.library.reference.1=../main