From 9558a4cb997d9a4413417565eada24439831e823 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 11 Jul 2016 02:08:17 -0700 Subject: [PATCH] Rename TrackRenderer -> Renderer ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=127065122 --- .../android/exoplayer2/demo/EventLogger.java | 18 +- .../exoplayer2/demo/PlayerActivity.java | 2 +- .../exoplayer2/demo/TrackSelectionHelper.java | 8 +- extensions/ffmpeg/README.md | 8 +- ...Renderer.java => FfmpegAudioRenderer.java} | 16 +- extensions/flac/README.md | 4 +- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 8 +- ...enderer.java => LibflacAudioRenderer.java} | 16 +- extensions/opus/README.md | 4 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 8 +- ...enderer.java => LibopusAudioRenderer.java} | 16 +- extensions/vp9/README.md | 8 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 10 +- ...Renderer.java => LibvpxVideoRenderer.java} | 20 +- ...r.java => AudioRendererEventListener.java} | 10 +- .../java/com/google/android/exoplayer2/C.java | 6 +- .../exoplayer2/DefaultLoadControl.java | 2 +- .../DefaultTrackSelectionPolicy.java | 10 +- .../exoplayer2/DefaultTrackSelector.java | 84 +++--- .../exoplayer2/ExoPlaybackException.java | 2 +- .../google/android/exoplayer2/ExoPlayer.java | 14 +- .../android/exoplayer2/ExoPlayerFactory.java | 12 +- .../android/exoplayer2/ExoPlayerImpl.java | 4 +- .../exoplayer2/ExoPlayerImplInternal.java | 58 ++-- .../android/exoplayer2/LoadControl.java | 2 +- ...erer.java => MediaCodecAudioRenderer.java} | 24 +- ...kRenderer.java => MediaCodecRenderer.java} | 8 +- ...erer.java => MediaCodecVideoRenderer.java} | 24 +- .../{TrackRenderer.java => Renderer.java} | 36 +-- .../android/exoplayer2/SimpleExoPlayer.java | 78 +++-- .../exoplayer2/TrackSelectionPolicy.java | 12 +- .../android/exoplayer2/TrackSelector.java | 6 +- ...r.java => VideoRendererEventListener.java} | 10 +- ...enderer.java => AudioDecoderRenderer.java} | 22 +- ...ackRenderer.java => MetadataRenderer.java} | 44 ++- .../android/exoplayer2/text/TextRenderer.java | 268 ++++++++++++++++- .../exoplayer2/text/TextTrackRenderer.java | 276 ------------------ .../text/webvtt/WebvttCueParser.java | 2 +- .../exoplayer2/util/PlayerControl.java | 6 +- .../playbacktests/gts/DashTest.java | 10 +- ...java => DebugMediaCodecVideoRenderer.java} | 12 +- 41 files changed, 579 insertions(+), 609 deletions(-) rename extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/{FfmpegAudioTrackRenderer.java => FfmpegAudioRenderer.java} (84%) rename extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/{LibflacAudioTrackRenderer.java => LibflacAudioRenderer.java} (82%) rename extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/{LibopusAudioTrackRenderer.java => LibopusAudioRenderer.java} (83%) rename extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/{LibvpxVideoTrackRenderer.java => LibvpxVideoRenderer.java} (95%) rename library/src/main/java/com/google/android/exoplayer2/{AudioTrackRendererEventListener.java => AudioRendererEventListener.java} (93%) rename library/src/main/java/com/google/android/exoplayer2/{MediaCodecAudioTrackRenderer.java => MediaCodecAudioRenderer.java} (94%) rename library/src/main/java/com/google/android/exoplayer2/{MediaCodecTrackRenderer.java => MediaCodecRenderer.java} (99%) rename library/src/main/java/com/google/android/exoplayer2/{MediaCodecVideoTrackRenderer.java => MediaCodecVideoRenderer.java} (95%) rename library/src/main/java/com/google/android/exoplayer2/{TrackRenderer.java => Renderer.java} (91%) rename library/src/main/java/com/google/android/exoplayer2/{VideoTrackRendererEventListener.java => VideoRendererEventListener.java} (95%) rename library/src/main/java/com/google/android/exoplayer2/extensions/{AudioDecoderTrackRenderer.java => AudioDecoderRenderer.java} (94%) rename library/src/main/java/com/google/android/exoplayer2/metadata/{MetadataTrackRenderer.java => MetadataRenderer.java} (71%) delete mode 100644 library/src/main/java/com/google/android/exoplayer2/text/TextTrackRenderer.java rename playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/util/{DebugMediaCodecVideoTrackRenderer.java => DebugMediaCodecVideoRenderer.java} (86%) diff --git a/demo/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java b/demo/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java index 4a6248a9ea..c99b1c9bea 100644 --- a/demo/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java +++ b/demo/src/main/java/com/google/android/exoplayer2/demo/EventLogger.java @@ -22,10 +22,10 @@ import com.google.android.exoplayer2.DefaultTrackSelector.TrackInfo; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.TrackGroup; import com.google.android.exoplayer2.TrackGroupArray; -import com.google.android.exoplayer2.TrackRenderer; import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.drm.StreamingDrmSessionManager; import com.google.android.exoplayer2.extractor.ExtractorMediaSource; @@ -130,7 +130,7 @@ public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.Deb TrackGroup trackGroup = trackGroups.get(groupIndex); for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { String status = getTrackStatusString(false); - String formatSupport = getFormatSupportString(TrackRenderer.FORMAT_UNSUPPORTED_TYPE); + String formatSupport = getFormatSupportString(Renderer.FORMAT_UNSUPPORTED_TYPE); Log.d(TAG, " " + status + " Track:" + trackIndex + ", " + getFormatString(trackGroup.getFormat(trackIndex)) + ", supported=" + formatSupport); @@ -291,13 +291,13 @@ public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.Deb private static String getFormatSupportString(int formatSupport) { switch (formatSupport) { - case TrackRenderer.FORMAT_HANDLED: + case Renderer.FORMAT_HANDLED: return "YES"; - case TrackRenderer.FORMAT_EXCEEDS_CAPABILITIES: + case Renderer.FORMAT_EXCEEDS_CAPABILITIES: return "NO_EXCEEDS_CAPABILITIES"; - case TrackRenderer.FORMAT_UNSUPPORTED_SUBTYPE: + case Renderer.FORMAT_UNSUPPORTED_SUBTYPE: return "NO_UNSUPPORTED_TYPE"; - case TrackRenderer.FORMAT_UNSUPPORTED_TYPE: + case Renderer.FORMAT_UNSUPPORTED_TYPE: return "NO"; default: return "?"; @@ -309,11 +309,11 @@ public class EventLogger implements ExoPlayer.EventListener, SimpleExoPlayer.Deb return "N/A"; } switch (adaptiveSupport) { - case TrackRenderer.ADAPTIVE_SEAMLESS: + case Renderer.ADAPTIVE_SEAMLESS: return "YES"; - case TrackRenderer.ADAPTIVE_NOT_SEAMLESS: + case Renderer.ADAPTIVE_NOT_SEAMLESS: return "YES_NOT_SEAMLESS"; - case TrackRenderer.ADAPTIVE_NOT_SUPPORTED: + case Renderer.ADAPTIVE_NOT_SUPPORTED: return "NO"; default: return "?"; diff --git a/demo/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demo/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index b043b9a39b..3db0894b8e 100644 --- a/demo/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demo/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -25,7 +25,7 @@ import com.google.android.exoplayer2.DefaultTrackSelector.TrackInfo; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.MediaCodecTrackRenderer.DecoderInitializationException; +import com.google.android.exoplayer2.MediaCodecRenderer.DecoderInitializationException; import com.google.android.exoplayer2.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.MediaSource; import com.google.android.exoplayer2.SimpleExoPlayer; diff --git a/demo/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java b/demo/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java index 3ff57ba7f6..00778708c7 100644 --- a/demo/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java +++ b/demo/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionHelper.java @@ -18,9 +18,9 @@ package com.google.android.exoplayer2.demo; import com.google.android.exoplayer2.DefaultTrackSelector; import com.google.android.exoplayer2.DefaultTrackSelector.TrackInfo; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.TrackGroup; import com.google.android.exoplayer2.TrackGroupArray; -import com.google.android.exoplayer2.TrackRenderer; import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.util.MimeTypes; @@ -45,7 +45,7 @@ import java.util.Locale; DialogInterface.OnClickListener { private final DefaultTrackSelector selector; - + private TrackInfo trackInfo; private int rendererIndex; private TrackGroupArray trackGroups; @@ -81,7 +81,7 @@ import java.util.Locale; trackGroupsAdaptive = new boolean[trackGroups.length]; for (int i = 0; i < trackGroups.length; i++) { trackGroupsAdaptive[i] = trackInfo.getAdaptiveSupport(rendererIndex, i, false) - != TrackRenderer.ADAPTIVE_NOT_SUPPORTED; + != Renderer.ADAPTIVE_NOT_SUPPORTED; } isDisabled = selector.getRendererDisabled(rendererIndex); override = selector.hasSelectionOverride(rendererIndex, trackGroups) @@ -133,7 +133,7 @@ import java.util.Locale; trackViewLayoutId, root, false); trackView.setText(buildTrackName(group.getFormat(trackIndex))); if (trackInfo.getTrackFormatSupport(rendererIndex, groupIndex, trackIndex) - == TrackRenderer.FORMAT_HANDLED) { + == Renderer.FORMAT_HANDLED) { haveSupportedTracks = true; trackView.setTag(Pair.create(groupIndex, trackIndex)); trackView.setOnClickListener(this); diff --git a/extensions/ffmpeg/README.md b/extensions/ffmpeg/README.md index 0ae576ba1c..f0ce07bdf7 100644 --- a/extensions/ffmpeg/README.md +++ b/extensions/ffmpeg/README.md @@ -1,11 +1,11 @@ -# FfmpegAudioTrackRenderer # +# FfmpegAudioRenderer # ## Description ## -The FFmpeg extension is a [TrackRenderer][] implementation that uses FFmpeg to -decode audio. +The FFmpeg extension is a [Renderer][] implementation that uses FFmpeg to decode +audio. -[TrackRenderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/TrackRenderer.html +[Renderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Renderer.html ## Build instructions ## diff --git a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioTrackRenderer.java b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java similarity index 84% rename from extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioTrackRenderer.java rename to extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java index d9f6d6a9b8..73f7afebfb 100644 --- a/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioTrackRenderer.java +++ b/extensions/ffmpeg/src/main/java/com/google/android/exoplayer2/ext/ffmpeg/FfmpegAudioRenderer.java @@ -15,12 +15,12 @@ */ package com.google.android.exoplayer2.ext.ffmpeg; -import com.google.android.exoplayer2.AudioTrackRendererEventListener; +import com.google.android.exoplayer2.AudioRendererEventListener; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioTrack; -import com.google.android.exoplayer2.extensions.AudioDecoderTrackRenderer; +import com.google.android.exoplayer2.extensions.AudioDecoderRenderer; import com.google.android.exoplayer2.util.MimeTypes; import android.os.Handler; @@ -28,14 +28,14 @@ import android.os.Handler; /** * Decodes and renders audio using FFmpeg. */ -public final class FfmpegAudioTrackRenderer extends AudioDecoderTrackRenderer { +public final class FfmpegAudioRenderer extends AudioDecoderRenderer { private static final int NUM_BUFFERS = 16; private static final int INITIAL_INPUT_BUFFER_SIZE = 960 * 6; private FfmpegDecoder decoder; - public FfmpegAudioTrackRenderer() { + public FfmpegAudioRenderer() { this(null, null); } @@ -44,8 +44,7 @@ public final class FfmpegAudioTrackRenderer extends AudioDecoderTrackRenderer { * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. */ - public FfmpegAudioTrackRenderer(Handler eventHandler, - AudioTrackRendererEventListener eventListener) { + public FfmpegAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener) { super(eventHandler, eventListener); } @@ -57,9 +56,8 @@ public final class FfmpegAudioTrackRenderer extends AudioDecoderTrackRenderer { * default capabilities (no encoded audio passthrough support) should be assumed. * @param streamType The type of audio stream for the {@link AudioTrack}. */ - public FfmpegAudioTrackRenderer(Handler eventHandler, - AudioTrackRendererEventListener eventListener, AudioCapabilities audioCapabilities, - int streamType) { + public FfmpegAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener, + AudioCapabilities audioCapabilities, int streamType) { super(eventHandler, eventListener, audioCapabilities, streamType); } diff --git a/extensions/flac/README.md b/extensions/flac/README.md index c85c8f51d4..2f3b067d6f 100644 --- a/extensions/flac/README.md +++ b/extensions/flac/README.md @@ -2,11 +2,11 @@ ## Description ## -The Flac Extension is a [TrackRenderer][] implementation that helps you bundle +The Flac Extension is a [Renderer][] implementation that helps you bundle libFLAC (the Flac decoding library) into your app and use it along with ExoPlayer to play Flac audio on Android devices. -[TrackRenderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/TrackRenderer.html +[Renderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Renderer.html ## Build Instructions ## diff --git a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java index c327b5d822..6c0a51677f 100644 --- a/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java +++ b/extensions/flac/src/androidTest/java/com/google/android/exoplayer2/ext/flac/FlacPlaybackTest.java @@ -20,7 +20,7 @@ import com.google.android.exoplayer2.DefaultTrackSelector; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.TrackRenderer; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.extractor.ExtractorMediaSource; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; @@ -31,7 +31,7 @@ import android.os.Looper; import android.test.InstrumentationTestCase; /** - * Playback tests using {@link LibflacAudioTrackRenderer}. + * Playback tests using {@link LibflacAudioRenderer}. */ public class FlacPlaybackTest extends InstrumentationTestCase { @@ -71,10 +71,10 @@ public class FlacPlaybackTest extends InstrumentationTestCase { @Override public void run() { Looper.prepare(); - LibflacAudioTrackRenderer audioRenderer = new LibflacAudioTrackRenderer(); + LibflacAudioRenderer audioRenderer = new LibflacAudioRenderer(); DefaultTrackSelector trackSelector = new DefaultTrackSelector( new DefaultTrackSelectionPolicy(), null); - player = ExoPlayerFactory.newInstance(new TrackRenderer[] {audioRenderer}, trackSelector); + player = ExoPlayerFactory.newInstance(new Renderer[] {audioRenderer}, trackSelector); player.addListener(this); ExtractorMediaSource mediaSource = new ExtractorMediaSource( uri, diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioTrackRenderer.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java similarity index 82% rename from extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioTrackRenderer.java rename to extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java index de2ff7690d..bee5ef2866 100644 --- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioTrackRenderer.java +++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java @@ -15,11 +15,11 @@ */ package com.google.android.exoplayer2.ext.flac; -import com.google.android.exoplayer2.AudioTrackRendererEventListener; +import com.google.android.exoplayer2.AudioRendererEventListener; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioTrack; -import com.google.android.exoplayer2.extensions.AudioDecoderTrackRenderer; +import com.google.android.exoplayer2.extensions.AudioDecoderRenderer; import com.google.android.exoplayer2.util.MimeTypes; import android.os.Handler; @@ -27,7 +27,7 @@ import android.os.Handler; /** * Decodes and renders audio using the native Flac decoder. */ -public class LibflacAudioTrackRenderer extends AudioDecoderTrackRenderer { +public class LibflacAudioRenderer extends AudioDecoderRenderer { private static final int NUM_BUFFERS = 16; @@ -38,7 +38,7 @@ public class LibflacAudioTrackRenderer extends AudioDecoderTrackRenderer { return FlacJni.IS_AVAILABLE; } - public LibflacAudioTrackRenderer() { + public LibflacAudioRenderer() { this(null, null); } @@ -47,8 +47,7 @@ public class LibflacAudioTrackRenderer extends AudioDecoderTrackRenderer { * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. */ - public LibflacAudioTrackRenderer(Handler eventHandler, - AudioTrackRendererEventListener eventListener) { + public LibflacAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener) { super(eventHandler, eventListener); } @@ -60,9 +59,8 @@ public class LibflacAudioTrackRenderer extends AudioDecoderTrackRenderer { * default capabilities (no encoded audio passthrough support) should be assumed. * @param streamType The type of audio stream for the {@link AudioTrack}. */ - public LibflacAudioTrackRenderer(Handler eventHandler, - AudioTrackRendererEventListener eventListener, AudioCapabilities audioCapabilities, - int streamType) { + public LibflacAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener, + AudioCapabilities audioCapabilities, int streamType) { super(eventHandler, eventListener, audioCapabilities, streamType); } diff --git a/extensions/opus/README.md b/extensions/opus/README.md index 3a2bdcf04a..36ca2b7261 100644 --- a/extensions/opus/README.md +++ b/extensions/opus/README.md @@ -2,11 +2,11 @@ ## Description ## -The Opus Extension is a [TrackRenderer][] implementation that helps you bundle +The Opus Extension is a [Renderer][] implementation that helps you bundle libopus (the Opus decoding library) into your app and use it along with ExoPlayer to play Opus audio on Android devices. -[TrackRenderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/TrackRenderer.html +[Renderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Renderer.html ## Build Instructions ## diff --git a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java index 98784c23ad..380de6be64 100644 --- a/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java +++ b/extensions/opus/src/androidTest/java/com/google/android/exoplayer2/ext/opus/OpusPlaybackTest.java @@ -20,7 +20,7 @@ import com.google.android.exoplayer2.DefaultTrackSelector; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.TrackRenderer; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.extractor.ExtractorMediaSource; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; @@ -31,7 +31,7 @@ import android.os.Looper; import android.test.InstrumentationTestCase; /** - * Playback tests using {@link LibopusAudioTrackRenderer}. + * Playback tests using {@link LibopusAudioRenderer}. */ public class OpusPlaybackTest extends InstrumentationTestCase { @@ -71,10 +71,10 @@ public class OpusPlaybackTest extends InstrumentationTestCase { @Override public void run() { Looper.prepare(); - LibopusAudioTrackRenderer audioRenderer = new LibopusAudioTrackRenderer(); + LibopusAudioRenderer audioRenderer = new LibopusAudioRenderer(); DefaultTrackSelector trackSelector = new DefaultTrackSelector( new DefaultTrackSelectionPolicy(), null); - player = ExoPlayerFactory.newInstance(new TrackRenderer[] {audioRenderer}, trackSelector); + player = ExoPlayerFactory.newInstance(new Renderer[] {audioRenderer}, trackSelector); player.addListener(this); ExtractorMediaSource mediaSource = new ExtractorMediaSource( uri, diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioTrackRenderer.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java similarity index 83% rename from extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioTrackRenderer.java rename to extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java index 44af0f49a4..a9f71bc66c 100644 --- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioTrackRenderer.java +++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java @@ -15,11 +15,11 @@ */ package com.google.android.exoplayer2.ext.opus; -import com.google.android.exoplayer2.AudioTrackRendererEventListener; +import com.google.android.exoplayer2.AudioRendererEventListener; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioTrack; -import com.google.android.exoplayer2.extensions.AudioDecoderTrackRenderer; +import com.google.android.exoplayer2.extensions.AudioDecoderRenderer; import com.google.android.exoplayer2.util.MimeTypes; import android.os.Handler; @@ -27,7 +27,7 @@ import android.os.Handler; /** * Decodes and renders audio using the native Opus decoder. */ -public final class LibopusAudioTrackRenderer extends AudioDecoderTrackRenderer { +public final class LibopusAudioRenderer extends AudioDecoderRenderer { private static final int NUM_BUFFERS = 16; private static final int INITIAL_INPUT_BUFFER_SIZE = 960 * 6; @@ -46,7 +46,7 @@ public final class LibopusAudioTrackRenderer extends AudioDecoderTrackRenderer { return isLibopusAvailable() ? OpusDecoder.getLibopusVersion() : null; } - public LibopusAudioTrackRenderer() { + public LibopusAudioRenderer() { this(null, null); } @@ -55,8 +55,7 @@ public final class LibopusAudioTrackRenderer extends AudioDecoderTrackRenderer { * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. */ - public LibopusAudioTrackRenderer(Handler eventHandler, - AudioTrackRendererEventListener eventListener) { + public LibopusAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener) { super(eventHandler, eventListener); } @@ -68,9 +67,8 @@ public final class LibopusAudioTrackRenderer extends AudioDecoderTrackRenderer { * default capabilities (no encoded audio passthrough support) should be assumed. * @param streamType The type of audio stream for the {@link AudioTrack}. */ - public LibopusAudioTrackRenderer(Handler eventHandler, - AudioTrackRendererEventListener eventListener, AudioCapabilities audioCapabilities, - int streamType) { + public LibopusAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener, + AudioCapabilities audioCapabilities, int streamType) { super(eventHandler, eventListener, audioCapabilities, streamType); } diff --git a/extensions/vp9/README.md b/extensions/vp9/README.md index d181bf0585..97c6b46280 100644 --- a/extensions/vp9/README.md +++ b/extensions/vp9/README.md @@ -2,11 +2,11 @@ ## Description ## -The VP9 Extension is a [TrackRenderer][] implementation that helps you bundle -libvpx (the VP9 decoding library) into your app and use it along with ExoPlayer -to play VP9 video on Android devices. +The VP9 Extension is a [Renderer][] implementation that helps you bundle libvpx +(the VP9 decoding library) into your app and use it along with ExoPlayer to play +VP9 video on Android devices. -[TrackRenderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/TrackRenderer.html +[Renderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Renderer.html ## Build Instructions ## diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index 811a9557ad..176c43d95f 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -20,7 +20,7 @@ import com.google.android.exoplayer2.DefaultTrackSelector; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.TrackRenderer; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.extractor.ExtractorMediaSource; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; @@ -31,7 +31,7 @@ import android.os.Looper; import android.test.InstrumentationTestCase; /** - * Playback tests using {@link LibvpxVideoTrackRenderer}. + * Playback tests using {@link LibvpxVideoRenderer}. */ public class VpxPlaybackTest extends InstrumentationTestCase { @@ -87,10 +87,10 @@ public class VpxPlaybackTest extends InstrumentationTestCase { @Override public void run() { Looper.prepare(); - LibvpxVideoTrackRenderer videoRenderer = new LibvpxVideoTrackRenderer(true, 0); + LibvpxVideoRenderer videoRenderer = new LibvpxVideoRenderer(true, 0); DefaultTrackSelector trackSelector = new DefaultTrackSelector( new DefaultTrackSelectionPolicy(), null); - player = ExoPlayerFactory.newInstance(new TrackRenderer[] {videoRenderer}, trackSelector); + player = ExoPlayerFactory.newInstance(new Renderer[] {videoRenderer}, trackSelector); player.addListener(this); ExtractorMediaSource mediaSource = new ExtractorMediaSource( uri, @@ -100,7 +100,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { null, null); player.sendMessages(new ExoPlayer.ExoPlayerMessage(videoRenderer, - LibvpxVideoTrackRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER, + LibvpxVideoRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER, new VpxVideoSurfaceView(context))); player.setMediaSource(mediaSource); player.setPlayWhenReady(true); diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoTrackRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java similarity index 95% rename from extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoTrackRenderer.java rename to extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java index dc91d71968..4fcf9b9fe9 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoTrackRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java @@ -22,10 +22,10 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; -import com.google.android.exoplayer2.TrackRenderer; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.TrackStream; -import com.google.android.exoplayer2.VideoTrackRendererEventListener; -import com.google.android.exoplayer2.VideoTrackRendererEventListener.EventDispatcher; +import com.google.android.exoplayer2.VideoRendererEventListener; +import com.google.android.exoplayer2.VideoRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; @@ -38,7 +38,7 @@ import android.view.Surface; /** * Decodes and renders video using the native VP9 decoder. */ -public final class LibvpxVideoTrackRenderer extends TrackRenderer { +public final class LibvpxVideoRenderer extends Renderer { /** * The type of a message that can be passed to an instance of this class via @@ -48,7 +48,7 @@ public final class LibvpxVideoTrackRenderer extends TrackRenderer { public static final int MSG_SET_OUTPUT_BUFFER_RENDERER = C.MSG_CUSTOM_BASE; /** - * The number of input buffers and the number of output buffers. The track renderer may limit the + * The number of input buffers and the number of output buffers. The renderer may limit the * minimum possible value due to requiring multiple output buffers to be dequeued at a time for it * to make progress. */ @@ -90,7 +90,7 @@ public final class LibvpxVideoTrackRenderer extends TrackRenderer { * @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer * can attempt to seamlessly join an ongoing playback. */ - public LibvpxVideoTrackRenderer(boolean scaleToFit, long allowedJoiningTimeMs) { + public LibvpxVideoRenderer(boolean scaleToFit, long allowedJoiningTimeMs) { this(scaleToFit, allowedJoiningTimeMs, null, null, 0); } @@ -102,10 +102,10 @@ public final class LibvpxVideoTrackRenderer extends TrackRenderer { * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. * @param maxDroppedFrameCountToNotify The maximum number of frames that can be dropped between - * invocations of {@link VideoTrackRendererEventListener#onDroppedFrames(int, long)}. + * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. */ - public LibvpxVideoTrackRenderer(boolean scaleToFit, long allowedJoiningTimeMs, - Handler eventHandler, VideoTrackRendererEventListener eventListener, + public LibvpxVideoRenderer(boolean scaleToFit, long allowedJoiningTimeMs, + Handler eventHandler, VideoRendererEventListener eventListener, int maxDroppedFrameCountToNotify) { this.scaleToFit = scaleToFit; this.allowedJoiningTimeMs = allowedJoiningTimeMs; @@ -234,7 +234,7 @@ public final class LibvpxVideoTrackRenderer extends TrackRenderer { return false; } - if (getState() == TrackRenderer.STATE_STARTED + if (getState() == Renderer.STATE_STARTED && outputBuffer.timestampUs <= positionUs + 30000) { renderBuffer(); } diff --git a/library/src/main/java/com/google/android/exoplayer2/AudioTrackRendererEventListener.java b/library/src/main/java/com/google/android/exoplayer2/AudioRendererEventListener.java similarity index 93% rename from library/src/main/java/com/google/android/exoplayer2/AudioTrackRendererEventListener.java rename to library/src/main/java/com/google/android/exoplayer2/AudioRendererEventListener.java index 49dc79f4c4..68c918e115 100644 --- a/library/src/main/java/com/google/android/exoplayer2/AudioTrackRendererEventListener.java +++ b/library/src/main/java/com/google/android/exoplayer2/AudioRendererEventListener.java @@ -22,9 +22,9 @@ import android.os.Handler; import android.os.SystemClock; /** - * Interface definition for a callback to be notified of audio {@link TrackRenderer} events. + * Interface definition for a callback to be notified of audio {@link Renderer} events. */ -public interface AudioTrackRendererEventListener { +public interface AudioRendererEventListener { /** * Invoked when the renderer is enabled. @@ -71,14 +71,14 @@ public interface AudioTrackRendererEventListener { void onAudioDisabled(CodecCounters counters); /** - * Dispatches events to a {@link AudioTrackRendererEventListener}. + * Dispatches events to a {@link AudioRendererEventListener}. */ final class EventDispatcher { private final Handler handler; - private final AudioTrackRendererEventListener listener; + private final AudioRendererEventListener listener; - public EventDispatcher(Handler handler, AudioTrackRendererEventListener listener) { + public EventDispatcher(Handler handler, AudioRendererEventListener listener) { this.handler = listener != null ? Assertions.checkNotNull(handler) : null; this.listener = listener; } diff --git a/library/src/main/java/com/google/android/exoplayer2/C.java b/library/src/main/java/com/google/android/exoplayer2/C.java index fed993c360..c80964cd0f 100644 --- a/library/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/src/main/java/com/google/android/exoplayer2/C.java @@ -271,21 +271,21 @@ public interface C { UUID PLAYREADY_UUID = new UUID(0x9A04F07998404286L, 0xAB92E65BE0885F95L); /** - * The type of a message that can be passed to a video {@link TrackRenderer} via + * The type of a message that can be passed to a video {@link Renderer} via * {@link ExoPlayer#sendMessages} or {@link ExoPlayer#blockingSendMessages}. The message object * should be the target {@link Surface}, or null. */ int MSG_SET_SURFACE = 1; /** - * The type of a message that can be passed to an audio {@link TrackRenderer} via + * The type of a message that can be passed to an audio {@link Renderer} via * {@link ExoPlayer#sendMessages} or {@link ExoPlayer#blockingSendMessages}. The message object * should be a {@link Float} with 0 being silence and 1 being unity gain. */ int MSG_SET_VOLUME = 2; /** - * The type of a message that can be passed to an audio {@link TrackRenderer} via + * The type of a message that can be passed to an audio {@link Renderer} via * {@link ExoPlayer#sendMessages} or {@link ExoPlayer#blockingSendMessages}. The message object * should be a {@link android.media.PlaybackParams}, which will be used to configure the * underlying {@link android.media.AudioTrack}. The message object should not be modified by the diff --git a/library/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java b/library/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java index 9cee0c8e14..d95b88325f 100644 --- a/library/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java +++ b/library/src/main/java/com/google/android/exoplayer2/DefaultLoadControl.java @@ -103,7 +103,7 @@ public final class DefaultLoadControl implements LoadControl { } @Override - public void onTrackSelections(TrackRenderer[] renderers, TrackGroupArray trackGroups, + public void onTrackSelections(Renderer[] renderers, TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { targetBufferSize = 0; for (int i = 0; i < renderers.length; i++) { diff --git a/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelectionPolicy.java b/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelectionPolicy.java index 94c04087bf..ba2efcd121 100644 --- a/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelectionPolicy.java +++ b/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelectionPolicy.java @@ -122,7 +122,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { // TrackSelectionPolicy implementation. @Override - public TrackSelection[] selectTracks(TrackRenderer[] renderers, + public TrackSelection[] selectTracks(Renderer[] renderers, TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports) throws ExoPlaybackException { // Make a track selection for each renderer. @@ -157,13 +157,13 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { // Video track selection implementation. - private static TrackSelection selectTrackForVideoRenderer(TrackRenderer renderer, + private static TrackSelection selectTrackForVideoRenderer(Renderer renderer, TrackGroupArray trackGroups, int[][] formatSupport, int maxVideoWidth, int maxVideoHeight, boolean allowNonSeamlessAdaptiveness, boolean allowMixedMimeAdaptiveness) throws ExoPlaybackException { int requiredAdaptiveSupport = allowNonSeamlessAdaptiveness - ? TrackRenderer.ADAPTIVE_NOT_SEAMLESS | TrackRenderer.ADAPTIVE_SEAMLESS - : TrackRenderer.ADAPTIVE_SEAMLESS; + ? (Renderer.ADAPTIVE_NOT_SEAMLESS | Renderer.ADAPTIVE_SEAMLESS) + : Renderer.ADAPTIVE_SEAMLESS; boolean allowMixedMimeTypes = allowMixedMimeAdaptiveness && (renderer.supportsMixedMimeTypeAdaptation() & requiredAdaptiveSupport) != 0; int largestAdaptiveGroup = -1; @@ -347,7 +347,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { } private static boolean isSupported(int formatSupport) { - return (formatSupport & TrackRenderer.FORMAT_SUPPORT_MASK) == TrackRenderer.FORMAT_HANDLED; + return (formatSupport & Renderer.FORMAT_SUPPORT_MASK) == Renderer.FORMAT_HANDLED; } private static boolean formatHasLanguage(Format format, String language) { diff --git a/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelector.java b/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelector.java index 42619a82fa..8fcc90de5e 100644 --- a/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelector.java +++ b/library/src/main/java/com/google/android/exoplayer2/DefaultTrackSelector.java @@ -232,7 +232,7 @@ public final class DefaultTrackSelector extends TrackSelector implements } @Override - protected Pair selectTracks(TrackRenderer[] renderers, + protected Pair selectTracks(Renderer[] renderers, TrackGroupArray trackGroups) throws ExoPlaybackException { // Structures into which data will be written during the selection. The extra item at the end // of each array is to store data associated with track groups that cannot be associated with @@ -319,13 +319,13 @@ public final class DefaultTrackSelector extends TrackSelector implements * Finds the renderer to which the provided {@link TrackGroup} should be associated. *

* A {@link TrackGroup} is associated to a renderer that reports - * {@link TrackRenderer#FORMAT_HANDLED} support for one or more of the tracks in the group, or - * {@link TrackRenderer#FORMAT_EXCEEDS_CAPABILITIES} if no such renderer exists, or - * {@link TrackRenderer#FORMAT_UNSUPPORTED_SUBTYPE} if again no such renderer exists. In the case + * {@link Renderer#FORMAT_HANDLED} support for one or more of the tracks in the group, or + * {@link Renderer#FORMAT_EXCEEDS_CAPABILITIES} if no such renderer exists, or + * {@link Renderer#FORMAT_UNSUPPORTED_SUBTYPE} if again no such renderer exists. In the case * that two or more renderers report the same level of support, the renderer with the lowest index * is associated. *

- * If all renderers report {@link TrackRenderer#FORMAT_UNSUPPORTED_TYPE} for all of the tracks in + * If all renderers report {@link Renderer#FORMAT_UNSUPPORTED_TYPE} for all of the tracks in * the group, then {@code renderers.length} is returned to indicate that no association was made. * * @param renderers The renderers from which to select. @@ -334,18 +334,18 @@ public final class DefaultTrackSelector extends TrackSelector implements * was made. * @throws ExoPlaybackException If an error occurs finding a renderer. */ - private static int findRenderer(TrackRenderer[] renderers, TrackGroup group) + private static int findRenderer(Renderer[] renderers, TrackGroup group) throws ExoPlaybackException { int bestRendererIndex = renderers.length; - int bestSupportLevel = TrackRenderer.FORMAT_UNSUPPORTED_TYPE; + int bestSupportLevel = Renderer.FORMAT_UNSUPPORTED_TYPE; for (int rendererIndex = 0; rendererIndex < renderers.length; rendererIndex++) { - TrackRenderer renderer = renderers[rendererIndex]; + Renderer renderer = renderers[rendererIndex]; for (int trackIndex = 0; trackIndex < group.length; trackIndex++) { int trackSupportLevel = renderer.supportsFormat(group.getFormat(trackIndex)); if (trackSupportLevel > bestSupportLevel) { bestRendererIndex = rendererIndex; bestSupportLevel = trackSupportLevel; - if (bestSupportLevel == TrackRenderer.FORMAT_HANDLED) { + if (bestSupportLevel == Renderer.FORMAT_HANDLED) { // We can't do better. return bestRendererIndex; } @@ -356,16 +356,16 @@ public final class DefaultTrackSelector extends TrackSelector implements } /** - * Calls {@link TrackRenderer#supportsFormat(Format)} for each track in the specified + * Calls {@link Renderer#supportsFormat(Format)} for each track in the specified * {@link TrackGroup}, returning the results in an array. * * @param renderer The renderer to evaluate. * @param group The {@link TrackGroup} to evaluate. - * @return An array containing the result of calling {@link TrackRenderer#supportsFormat(Format)} + * @return An array containing the result of calling {@link Renderer#supportsFormat(Format)} * on the renderer for each track in the group. * @throws ExoPlaybackException If an error occurs determining the format support. */ - private static int[] getFormatSupport(TrackRenderer renderer, TrackGroup group) + private static int[] getFormatSupport(Renderer renderer, TrackGroup group) throws ExoPlaybackException { int[] formatSupport = new int[group.length]; for (int i = 0; i < group.length; i++) { @@ -375,15 +375,15 @@ public final class DefaultTrackSelector extends TrackSelector implements } /** - * Calls {@link TrackRenderer#supportsMixedMimeTypeAdaptation()} for each renderer, returning + * Calls {@link Renderer#supportsMixedMimeTypeAdaptation()} for each renderer, returning * the results in an array. * * @param renderers The renderers to evaluate. * @return An array containing the result of calling - * {@link TrackRenderer#supportsMixedMimeTypeAdaptation()} on each renderer. + * {@link Renderer#supportsMixedMimeTypeAdaptation()} on each renderer. * @throws ExoPlaybackException If an error occurs determining the adaptation support. */ - private static int[] getMixedMimeTypeAdaptationSupport(TrackRenderer[] renderers) + private static int[] getMixedMimeTypeAdaptationSupport(Renderer[] renderers) throws ExoPlaybackException { int[] mixedMimeTypeAdaptationSupport = new int[renderers.length]; for (int i = 0; i < mixedMimeTypeAdaptationSupport.length; i++) { @@ -423,7 +423,7 @@ public final class DefaultTrackSelector extends TrackSelector implements } /** - * Provides track information for each {@link TrackRenderer}. + * Provides track information for each {@link Renderer}. */ public static final class TrackInfo { @@ -455,8 +455,8 @@ public final class DefaultTrackSelector extends TrackSelector implements * @param trackGroups The {@link TrackGroupArray}s for each renderer. * @param trackSelections The current {@link TrackSelection}s for each renderer. * @param mixedMimeTypeAdaptiveSupport The result of - * {@link TrackRenderer#supportsMixedMimeTypeAdaptation()} for each renderer. - * @param formatSupport The result of {@link TrackRenderer#supportsFormat(Format)} for each + * {@link Renderer#supportsMixedMimeTypeAdaptation()} for each renderer. + * @param formatSupport The result of {@link Renderer#supportsFormat(Format)} for each * track, indexed by renderer index, group index and track index (in that order). * @param unassociatedTrackGroups Contains {@link TrackGroup}s not associated with any renderer. */ @@ -504,8 +504,8 @@ public final class DefaultTrackSelector extends TrackSelector implements for (int i = 0; i < rendererFormatSupport.length; i++) { for (int j = 0; j < rendererFormatSupport[i].length; j++) { hasTracks = true; - if ((rendererFormatSupport[i][j] & TrackRenderer.FORMAT_SUPPORT_MASK) - == TrackRenderer.FORMAT_HANDLED) { + if ((rendererFormatSupport[i][j] & Renderer.FORMAT_SUPPORT_MASK) + == Renderer.FORMAT_HANDLED) { return RENDERER_SUPPORT_PLAYABLE_TRACKS; } } @@ -519,14 +519,14 @@ public final class DefaultTrackSelector extends TrackSelector implements * @param rendererIndex The renderer index. * @param groupIndex The index of the group to which the track belongs. * @param trackIndex The index of the track within the group. - * @return One of {@link TrackRenderer#FORMAT_HANDLED}, - * {@link TrackRenderer#FORMAT_EXCEEDS_CAPABILITIES}, - * {@link TrackRenderer#FORMAT_UNSUPPORTED_SUBTYPE} and - * {@link TrackRenderer#FORMAT_UNSUPPORTED_TYPE}. + * @return One of {@link Renderer#FORMAT_HANDLED}, + * {@link Renderer#FORMAT_EXCEEDS_CAPABILITIES}, + * {@link Renderer#FORMAT_UNSUPPORTED_SUBTYPE} and + * {@link Renderer#FORMAT_UNSUPPORTED_TYPE}. */ public int getTrackFormatSupport(int rendererIndex, int groupIndex, int trackIndex) { return formatSupport[rendererIndex][groupIndex][trackIndex] - & TrackRenderer.FORMAT_SUPPORT_MASK; + & Renderer.FORMAT_SUPPORT_MASK; } /** @@ -534,21 +534,21 @@ public final class DefaultTrackSelector extends TrackSelector implements * specified {@link TrackGroup}. *

* Tracks for which {@link #getTrackFormatSupport(int, int, int)} returns - * {@link TrackRenderer#FORMAT_HANDLED} are always considered. + * {@link Renderer#FORMAT_HANDLED} are always considered. * Tracks for which {@link #getTrackFormatSupport(int, int, int)} returns - * {@link TrackRenderer#FORMAT_UNSUPPORTED_TYPE} or - * {@link TrackRenderer#FORMAT_UNSUPPORTED_SUBTYPE} are never considered. + * {@link Renderer#FORMAT_UNSUPPORTED_TYPE} or + * {@link Renderer#FORMAT_UNSUPPORTED_SUBTYPE} are never considered. * Tracks for which {@link #getTrackFormatSupport(int, int, int)} returns - * {@link TrackRenderer#FORMAT_EXCEEDS_CAPABILITIES} are considered only if + * {@link Renderer#FORMAT_EXCEEDS_CAPABILITIES} are considered only if * {@code includeCapabilitiesExceededTracks} is set to {@code true}. * * @param rendererIndex The renderer index. * @param groupIndex The index of the group. * @param includeCapabilitiesExceededTracks True if formats that exceed the capabilities of the * renderer should be included when determining support. False otherwise. - * @return One of {@link TrackRenderer#ADAPTIVE_SEAMLESS}, - * {@link TrackRenderer#ADAPTIVE_NOT_SEAMLESS} and - * {@link TrackRenderer#ADAPTIVE_NOT_SUPPORTED}. + * @return One of {@link Renderer#ADAPTIVE_SEAMLESS}, + * {@link Renderer#ADAPTIVE_NOT_SEAMLESS} and + * {@link Renderer#ADAPTIVE_NOT_SUPPORTED}. */ public int getAdaptiveSupport(int rendererIndex, int groupIndex, boolean includeCapabilitiesExceededTracks) { @@ -558,8 +558,8 @@ public final class DefaultTrackSelector extends TrackSelector implements int trackIndexCount = 0; for (int i = 0; i < trackCount; i++) { int fixedSupport = getTrackFormatSupport(rendererIndex, groupIndex, i); - if (fixedSupport == TrackRenderer.FORMAT_HANDLED || (includeCapabilitiesExceededTracks - && fixedSupport == TrackRenderer.FORMAT_EXCEEDS_CAPABILITIES)) { + if (fixedSupport == Renderer.FORMAT_HANDLED || (includeCapabilitiesExceededTracks + && fixedSupport == Renderer.FORMAT_EXCEEDS_CAPABILITIES)) { trackIndices[trackIndexCount++] = i; } } @@ -573,17 +573,17 @@ public final class DefaultTrackSelector extends TrackSelector implements * * @param rendererIndex The renderer index. * @param groupIndex The index of the group. - * @return One of {@link TrackRenderer#ADAPTIVE_SEAMLESS}, - * {@link TrackRenderer#ADAPTIVE_NOT_SEAMLESS} and - * {@link TrackRenderer#ADAPTIVE_NOT_SUPPORTED}. + * @return One of {@link Renderer#ADAPTIVE_SEAMLESS}, + * {@link Renderer#ADAPTIVE_NOT_SEAMLESS} and + * {@link Renderer#ADAPTIVE_NOT_SUPPORTED}. */ public int getAdaptiveSupport(int rendererIndex, int groupIndex, int[] trackIndices) { TrackGroup trackGroup = trackGroups[rendererIndex].get(groupIndex); if (!trackGroup.adaptive) { - return TrackRenderer.ADAPTIVE_NOT_SUPPORTED; + return Renderer.ADAPTIVE_NOT_SUPPORTED; } int handledTrackCount = 0; - int adaptiveSupport = TrackRenderer.ADAPTIVE_SEAMLESS; + int adaptiveSupport = Renderer.ADAPTIVE_SEAMLESS; boolean multipleMimeTypes = false; String firstSampleMimeType = null; for (int i = 0; i < trackIndices.length; i++) { @@ -596,7 +596,7 @@ public final class DefaultTrackSelector extends TrackSelector implements multipleMimeTypes |= !Util.areEqual(firstSampleMimeType, sampleMimeType); } adaptiveSupport = Math.min(adaptiveSupport, - formatSupport[rendererIndex][groupIndex][i] & TrackRenderer.ADAPTIVE_SUPPORT_MASK); + formatSupport[rendererIndex][groupIndex][i] & Renderer.ADAPTIVE_SUPPORT_MASK); } return multipleMimeTypes ? Math.min(adaptiveSupport, mixedMimeTypeAdaptiveSupport[rendererIndex]) @@ -604,9 +604,9 @@ public final class DefaultTrackSelector extends TrackSelector implements } /** - * Gets the {@link TrackGroup}s not associated with any {@link TrackRenderer}. + * Gets the {@link TrackGroup}s not associated with any {@link Renderer}. * - * @return The {@link TrackGroup}s not associated with any {@link TrackRenderer}. + * @return The {@link TrackGroup}s not associated with any {@link Renderer}. */ public TrackGroupArray getUnassociatedTrackGroups() { return unassociatedTrackGroups; diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java index 050f9cc546..2ccc5b7175 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlaybackException.java @@ -31,7 +31,7 @@ public final class ExoPlaybackException extends Exception { */ public static final int TYPE_SOURCE = 0; /** - * The error occurred in a {@link TrackRenderer}. + * The error occurred in a {@link Renderer}. *

* Call {@link #getRendererException()} to retrieve the underlying cause. */ diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index 419132469d..71f2cbd7da 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -32,11 +32,11 @@ package com.google.android.exoplayer2; *

The implementation is designed to make no assumptions about (and hence impose no restrictions * on) the type of the media being played, how and where it is stored, or how it is rendered. * Rather than implementing the loading and rendering of media directly, {@link ExoPlayer} instead - * delegates this work to one or more {@link TrackRenderer}s, which are injected when the player + * delegates this work to one or more {@link Renderer}s, which are injected when the player * is created. Hence {@link ExoPlayer} is capable of loading and playing any media for which a - * {@link TrackRenderer} implementation can be provided. + * {@link Renderer} implementation can be provided. * - *

{@link MediaCodecAudioTrackRenderer} and {@link MediaCodecVideoTrackRenderer} can be used for + *

{@link MediaCodecAudioRenderer} and {@link MediaCodecVideoRenderer} can be used for * the common cases of rendering audio and video. These components in turn require an * upstream {@link MediaPeriod} to be injected through their constructors, where upstream * is defined to denote a component that is closer to the source of the media. This pattern of @@ -63,8 +63,8 @@ package com.google.android.exoplayer2; *

  • Registered {@link EventListener}s are invoked on the thread that created the * {@link ExoPlayer} instance.
  • *
  • An internal playback thread is responsible for managing playback and invoking the - * {@link TrackRenderer}s in order to load and play the media.
  • - *
  • {@link TrackRenderer} implementations (or any upstream components that they depend on) may + * {@link Renderer}s in order to load and play the media.
  • + *
  • {@link Renderer} implementations (or any upstream components that they depend on) may * use additional background threads (e.g. to load data). These are implementation specific.
  • * * @@ -83,7 +83,7 @@ package com.google.android.exoplayer2; * border="0"/>

    * *

    The possible playback state transitions are shown below. Transitions can be triggered either - * by changes in the state of the {@link TrackRenderer}s being used, or as a result of + * by changes in the state of the {@link Renderer}s being used, or as a result of * {@link #setMediaSource(MediaSource)}, {@link #stop()} or {@link #release()} being invoked.

    *

    ExoPlayer playback state transitions * Must be called from a thread that has an associated {@link Looper}. * - * @param renderers The {@link TrackRenderer}s that will be used by the instance. + * @param renderers The {@link Renderer}s that will be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. */ - public static ExoPlayer newInstance(TrackRenderer[] renderers, TrackSelector trackSelector) { + public static ExoPlayer newInstance(Renderer[] renderers, TrackSelector trackSelector) { return newInstance(renderers, trackSelector, new DefaultLoadControl()); } @@ -122,11 +122,11 @@ public final class ExoPlayerFactory { *

    * Must be called from a thread that has an associated {@link Looper}. * - * @param renderers The {@link TrackRenderer}s that will be used by the instance. + * @param renderers The {@link Renderer}s that will be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. */ - public static ExoPlayer newInstance(TrackRenderer[] renderers, TrackSelector trackSelector, + public static ExoPlayer newInstance(Renderer[] renderers, TrackSelector trackSelector, LoadControl loadControl) { return new ExoPlayerImpl(renderers, trackSelector, loadControl); } diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 02ba34d646..0621748054 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -54,12 +54,12 @@ import java.util.concurrent.CopyOnWriteArraySet; /** * Constructs an instance. Must be invoked from a thread that has an associated {@link Looper}. * - * @param renderers The {@link TrackRenderer}s that will be used by the instance. + * @param renderers The {@link Renderer}s that will be used by the instance. * @param trackSelector The {@link TrackSelector} that will be used by the instance. * @param loadControl The {@link LoadControl} that will be used by the instance. */ @SuppressLint("HandlerLeak") - public ExoPlayerImpl(TrackRenderer[] renderers, TrackSelector trackSelector, + public ExoPlayerImpl(Renderer[] renderers, TrackSelector trackSelector, LoadControl loadControl) { Log.i(TAG, "Init " + ExoPlayerLibraryInfo.VERSION); Assertions.checkNotNull(renderers); diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index abf106a28f..581171ff71 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -100,10 +100,10 @@ import java.util.ArrayList; private final Timeline timeline; private PlaybackInfo playbackInfo; - private TrackRenderer rendererMediaClockSource; + private Renderer rendererMediaClockSource; private MediaClock rendererMediaClock; private MediaSource mediaSource; - private TrackRenderer[] enabledRenderers; + private Renderer[] enabledRenderers; private boolean released; private boolean playWhenReady; private boolean rebuffering; @@ -115,7 +115,7 @@ import java.util.ArrayList; private long internalPositionUs; - public ExoPlayerImplInternal(TrackRenderer[] renderers, TrackSelector trackSelector, + public ExoPlayerImplInternal(Renderer[] renderers, TrackSelector trackSelector, LoadControl loadControl, boolean playWhenReady, Handler eventHandler) { this.trackSelector = trackSelector; this.loadControl = loadControl; @@ -128,7 +128,7 @@ import java.util.ArrayList; } standaloneMediaClock = new StandaloneMediaClock(); - enabledRenderers = new TrackRenderer[0]; + enabledRenderers = new Renderer[0]; timeline = new Timeline(renderers); playbackInfo = new PlaybackInfo(0); @@ -335,14 +335,14 @@ import java.util.ArrayList; private void startRenderers() throws ExoPlaybackException { rebuffering = false; standaloneMediaClock.start(); - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { renderer.start(); } } private void stopRenderers() throws ExoPlaybackException { standaloneMediaClock.stop(); - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { ensureStopped(renderer); } } @@ -400,7 +400,7 @@ import java.util.ArrayList; updatePlaybackPositions(); boolean allRenderersEnded = true; boolean allRenderersReadyOrEnded = true; - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { // TODO: Each renderer should return the maximum delay before which it wishes to be invoked // again. The minimum of these values should then be used as the delay before the next // invocation of this method. @@ -494,7 +494,7 @@ import java.util.ArrayList; long sourceOffsetUs = timeline.playingPeriod == null ? 0 : timeline.playingPeriod.offsetUs; internalPositionUs = sourceOffsetUs + periodPositionUs; standaloneMediaClock.setPositionUs(internalPositionUs); - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { renderer.reset(internalPositionUs); } } @@ -519,7 +519,7 @@ import java.util.ArrayList; standaloneMediaClock.stop(); rendererMediaClock = null; rendererMediaClockSource = null; - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { try { ensureStopped(renderer); renderer.disable(); @@ -528,7 +528,7 @@ import java.util.ArrayList; Log.e(TAG, "Stop failed.", e); } } - enabledRenderers = new TrackRenderer[0]; + enabledRenderers = new Renderer[0]; mediaSource = null; timeline.reset(); loadControl.reset(); @@ -552,8 +552,8 @@ import java.util.ArrayList; } } - private void ensureStopped(TrackRenderer renderer) throws ExoPlaybackException { - if (renderer.getState() == TrackRenderer.STATE_STARTED) { + private void ensureStopped(Renderer renderer) throws ExoPlaybackException { + if (renderer.getState() == Renderer.STATE_STARTED) { renderer.stop(); } } @@ -573,7 +573,7 @@ import java.util.ArrayList; */ private final class Timeline { - private final TrackRenderer[] renderers; + private final Renderer[] renderers; public boolean isReady; public boolean isEnded; @@ -585,7 +585,7 @@ import java.util.ArrayList; private int pendingPeriodIndex; private long playingPeriodEndPositionUs; - public Timeline(TrackRenderer[] renderers) { + public Timeline(Renderer[] renderers) { this.renderers = renderers; playingPeriodEndPositionUs = C.UNSET_TIME_US; } @@ -615,7 +615,7 @@ import java.util.ArrayList; public void maybeThrowPeriodPrepareError() throws IOException { if (loadingPeriod != null && !loadingPeriod.prepared && (readingPeriod == null || readingPeriod.nextPeriod == loadingPeriod)) { - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { if (!renderer.hasReadStreamToEnd()) { return; } @@ -682,7 +682,7 @@ import java.util.ArrayList; // The renderers have their final TrackStreams. return; } - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { if (!renderer.hasReadStreamToEnd()) { return; } @@ -693,7 +693,7 @@ import java.util.ArrayList; TrackSelectionArray newTrackSelections = readingPeriod.trackSelections; TrackGroupArray groups = readingPeriod.mediaPeriod.getTrackGroups(); for (int i = 0; i < renderers.length; i++) { - TrackRenderer renderer = renderers[i]; + Renderer renderer = renderers[i]; TrackSelection oldSelection = oldTrackSelections.get(i); TrackSelection newSelection = newTrackSelections.get(i); if (oldSelection != null) { @@ -717,7 +717,7 @@ import java.util.ArrayList; && readingPeriod.index == periodCount - 1) { readingPeriod = null; // This is the last period, so signal the renderers to read the end of the stream. - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { renderer.setCurrentTrackStreamIsFinal(); } } @@ -789,11 +789,11 @@ import java.util.ArrayList; resetInternalPosition(seekPositionUs); maybeContinueLoading(); } else { - for (TrackRenderer renderer : enabledRenderers) { + for (Renderer renderer : enabledRenderers) { ensureStopped(renderer); renderer.disable(); } - enabledRenderers = new TrackRenderer[0]; + enabledRenderers = new Renderer[0]; playingPeriod = null; readingPeriod = null; loadingPeriod = null; @@ -844,8 +844,8 @@ import java.util.ArrayList; int enabledRendererCount = 0; boolean[] rendererWasEnabledFlags = new boolean[renderers.length]; for (int i = 0; i < renderers.length; i++) { - TrackRenderer renderer = renderers[i]; - rendererWasEnabledFlags[i] = renderer.getState() != TrackRenderer.STATE_DISABLED; + Renderer renderer = renderers[i]; + rendererWasEnabledFlags[i] = renderer.getState() != Renderer.STATE_DISABLED; TrackSelection oldSelection = playingPeriodOldTrackSelections.get(i); TrackSelection newSelection = playingPeriod.trackSelections.get(i); if (newSelection != null) { @@ -906,8 +906,8 @@ import java.util.ArrayList; int enabledRendererCount = 0; boolean[] rendererWasEnabledFlags = new boolean[renderers.length]; for (int i = 0; i < renderers.length; i++) { - TrackRenderer renderer = renderers[i]; - rendererWasEnabledFlags[i] = renderer.getState() != TrackRenderer.STATE_DISABLED; + Renderer renderer = renderers[i]; + rendererWasEnabledFlags[i] = renderer.getState() != Renderer.STATE_DISABLED; TrackSelection newSelection = period.trackSelections.get(i); if (newSelection != null) { // The renderer should be enabled when playing the new period. @@ -942,15 +942,15 @@ import java.util.ArrayList; private void enableRenderers(boolean[] rendererWasEnabledFlags, int enabledRendererCount) throws ExoPlaybackException { - enabledRenderers = new TrackRenderer[enabledRendererCount]; + enabledRenderers = new Renderer[enabledRendererCount]; enabledRendererCount = 0; TrackGroupArray trackGroups = playingPeriod.mediaPeriod.getTrackGroups(); for (int i = 0; i < renderers.length; i++) { - TrackRenderer renderer = renderers[i]; + Renderer renderer = renderers[i]; TrackSelection newSelection = playingPeriod.trackSelections.get(i); if (newSelection != null) { enabledRenderers[enabledRendererCount++] = renderer; - if (renderer.getState() == TrackRenderer.STATE_DISABLED) { + if (renderer.getState() == Renderer.STATE_DISABLED) { // The renderer needs enabling with its new track selection. boolean playing = playWhenReady && state == ExoPlayer.STATE_READY; // Consider as joining only if the renderer was previously disabled. @@ -988,7 +988,7 @@ import java.util.ArrayList; */ private static final class Period { - private final TrackRenderer[] renderers; + private final Renderer[] renderers; private final TrackSelector trackSelector; public final MediaPeriod mediaPeriod; @@ -1005,7 +1005,7 @@ import java.util.ArrayList; private TrackSelectionArray trackSelections; private TrackSelectionArray periodTrackSelections; - public Period(TrackRenderer[] renderers, TrackSelector trackSelector, MediaPeriod mediaPeriod, + public Period(Renderer[] renderers, TrackSelector trackSelector, MediaPeriod mediaPeriod, int index) { this.renderers = renderers; this.trackSelector = trackSelector; diff --git a/library/src/main/java/com/google/android/exoplayer2/LoadControl.java b/library/src/main/java/com/google/android/exoplayer2/LoadControl.java index 0b6012a827..67654be3e1 100644 --- a/library/src/main/java/com/google/android/exoplayer2/LoadControl.java +++ b/library/src/main/java/com/google/android/exoplayer2/LoadControl.java @@ -29,7 +29,7 @@ public interface LoadControl { * @param trackGroups The available {@link TrackGroup}s. * @param trackSelections The {@link TrackSelection}s that were made. */ - void onTrackSelections(TrackRenderer[] renderers, TrackGroupArray trackGroups, + void onTrackSelections(Renderer[] renderers, TrackGroupArray trackGroups, TrackSelectionArray trackSelections); /** diff --git a/library/src/main/java/com/google/android/exoplayer2/MediaCodecAudioTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer2/MediaCodecAudioRenderer.java similarity index 94% rename from library/src/main/java/com/google/android/exoplayer2/MediaCodecAudioTrackRenderer.java rename to library/src/main/java/com/google/android/exoplayer2/MediaCodecAudioRenderer.java index e95f776f4d..aa15e445ab 100644 --- a/library/src/main/java/com/google/android/exoplayer2/MediaCodecAudioTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/MediaCodecAudioRenderer.java @@ -15,7 +15,7 @@ */ package com.google.android.exoplayer2; -import com.google.android.exoplayer2.AudioTrackRendererEventListener.EventDispatcher; +import com.google.android.exoplayer2.AudioRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioTrack; @@ -39,7 +39,7 @@ import java.nio.ByteBuffer; * Decodes and renders audio using {@link MediaCodec} and {@link android.media.AudioTrack}. */ @TargetApi(16) -public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implements MediaClock { +public class MediaCodecAudioRenderer extends MediaCodecRenderer implements MediaClock { private final EventDispatcher eventDispatcher; private final AudioTrack audioTrack; @@ -57,7 +57,7 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implem /** * @param mediaCodecSelector A decoder selector. */ - public MediaCodecAudioTrackRenderer(MediaCodecSelector mediaCodecSelector) { + public MediaCodecAudioRenderer(MediaCodecSelector mediaCodecSelector) { this(mediaCodecSelector, null, true); } @@ -71,7 +71,7 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implem * permitted to play clear regions of encrypted media files before {@code drmSessionManager} * has obtained the keys necessary to decrypt encrypted regions of the media. */ - public MediaCodecAudioTrackRenderer(MediaCodecSelector mediaCodecSelector, + public MediaCodecAudioRenderer(MediaCodecSelector mediaCodecSelector, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys) { this(mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys, null, null); } @@ -82,8 +82,8 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implem * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. */ - public MediaCodecAudioTrackRenderer(MediaCodecSelector mediaCodecSelector, Handler eventHandler, - AudioTrackRendererEventListener eventListener) { + public MediaCodecAudioRenderer(MediaCodecSelector mediaCodecSelector, Handler eventHandler, + AudioRendererEventListener eventListener) { this(mediaCodecSelector, null, true, eventHandler, eventListener); } @@ -100,9 +100,9 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implem * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. */ - public MediaCodecAudioTrackRenderer(MediaCodecSelector mediaCodecSelector, + public MediaCodecAudioRenderer(MediaCodecSelector mediaCodecSelector, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys, - Handler eventHandler, AudioTrackRendererEventListener eventListener) { + Handler eventHandler, AudioRendererEventListener eventListener) { this(mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys, eventHandler, eventListener, null, AudioManager.STREAM_MUSIC); } @@ -123,9 +123,9 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implem * default capabilities (no encoded audio passthrough support) should be assumed. * @param streamType The type of audio stream for the {@link AudioTrack}. */ - public MediaCodecAudioTrackRenderer(MediaCodecSelector mediaCodecSelector, + public MediaCodecAudioRenderer(MediaCodecSelector mediaCodecSelector, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys, - Handler eventHandler, AudioTrackRendererEventListener eventListener, + Handler eventHandler, AudioRendererEventListener eventListener, AudioCapabilities audioCapabilities, int streamType) { super(mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys); audioSessionId = AudioTrack.SESSION_ID_NOT_SET; @@ -344,14 +344,14 @@ public class MediaCodecAudioTrackRenderer extends MediaCodecTrackRenderer implem } catch (AudioTrack.InitializationException e) { throw ExoPlaybackException.createForRenderer(e, getIndex()); } - if (getState() == TrackRenderer.STATE_STARTED) { + if (getState() == Renderer.STATE_STARTED) { audioTrack.play(); } } else { // Check for AudioTrack underrun. boolean audioTrackHadData = audioTrackHasData; audioTrackHasData = audioTrack.hasPendingData(); - if (audioTrackHadData && !audioTrackHasData && getState() == TrackRenderer.STATE_STARTED) { + if (audioTrackHadData && !audioTrackHasData && getState() == Renderer.STATE_STARTED) { long elapsedSinceLastFeedMs = SystemClock.elapsedRealtime() - lastFeedElapsedRealtimeMs; long bufferSizeUs = audioTrack.getBufferSizeUs(); long bufferSizeMs = bufferSizeUs == C.UNSET_TIME_US ? -1 : bufferSizeUs / 1000; diff --git a/library/src/main/java/com/google/android/exoplayer2/MediaCodecTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer2/MediaCodecRenderer.java similarity index 99% rename from library/src/main/java/com/google/android/exoplayer2/MediaCodecTrackRenderer.java rename to library/src/main/java/com/google/android/exoplayer2/MediaCodecRenderer.java index 321acbebb2..d5016f991a 100644 --- a/library/src/main/java/com/google/android/exoplayer2/MediaCodecTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/MediaCodecRenderer.java @@ -37,10 +37,10 @@ import java.util.ArrayList; import java.util.List; /** - * An abstract {@link TrackRenderer} that uses {@link MediaCodec} to decode samples for rendering. + * An abstract {@link Renderer} that uses {@link MediaCodec} to decode samples for rendering. */ @TargetApi(16) -public abstract class MediaCodecTrackRenderer extends TrackRenderer { +public abstract class MediaCodecRenderer extends Renderer { /** * Thrown when a failure occurs instantiating a decoder. @@ -192,7 +192,7 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer { * permitted to play clear regions of encrypted media files before {@code drmSessionManager} * has obtained the keys necessary to decrypt encrypted regions of the media. */ - public MediaCodecTrackRenderer(MediaCodecSelector mediaCodecSelector, + public MediaCodecRenderer(MediaCodecSelector mediaCodecSelector, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys) { Assertions.checkState(Util.SDK_INT >= 16); this.mediaCodecSelector = Assertions.checkNotNull(mediaCodecSelector); @@ -338,7 +338,7 @@ public abstract class MediaCodecTrackRenderer extends TrackRenderer { throwDecoderInitError(new DecoderInitializationException(format, e, drmSessionRequiresSecureDecoder, codecName)); } - codecHotswapDeadlineMs = getState() == TrackRenderer.STATE_STARTED + codecHotswapDeadlineMs = getState() == Renderer.STATE_STARTED ? (SystemClock.elapsedRealtime() + MAX_CODEC_HOTSWAP_TIME_MS) : -1; inputIndex = -1; outputIndex = -1; diff --git a/library/src/main/java/com/google/android/exoplayer2/MediaCodecVideoTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer2/MediaCodecVideoRenderer.java similarity index 95% rename from library/src/main/java/com/google/android/exoplayer2/MediaCodecVideoTrackRenderer.java rename to library/src/main/java/com/google/android/exoplayer2/MediaCodecVideoRenderer.java index 3397d129b0..a733c1d0d4 100644 --- a/library/src/main/java/com/google/android/exoplayer2/MediaCodecVideoTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/MediaCodecVideoRenderer.java @@ -16,7 +16,7 @@ package com.google.android.exoplayer2; import com.google.android.exoplayer2.MediaCodecUtil.DecoderQueryException; -import com.google.android.exoplayer2.VideoTrackRendererEventListener.EventDispatcher; +import com.google.android.exoplayer2.VideoRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; @@ -39,7 +39,7 @@ import java.nio.ByteBuffer; * Decodes and renders video using {@link MediaCodec}. */ @TargetApi(16) -public class MediaCodecVideoTrackRenderer extends MediaCodecTrackRenderer { +public class MediaCodecVideoRenderer extends MediaCodecRenderer { private static final String TAG = "MediaCodecVideoRenderer"; private static final String KEY_CROP_LEFT = "crop-left"; @@ -82,7 +82,7 @@ public class MediaCodecVideoTrackRenderer extends MediaCodecTrackRenderer { * @param videoScalingMode The scaling mode to pass to * {@link MediaCodec#setVideoScalingMode(int)}. */ - public MediaCodecVideoTrackRenderer(Context context, MediaCodecSelector mediaCodecSelector, + public MediaCodecVideoRenderer(Context context, MediaCodecSelector mediaCodecSelector, int videoScalingMode) { this(context, mediaCodecSelector, videoScalingMode, 0); } @@ -95,7 +95,7 @@ public class MediaCodecVideoTrackRenderer extends MediaCodecTrackRenderer { * @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer * can attempt to seamlessly join an ongoing playback. */ - public MediaCodecVideoTrackRenderer(Context context, MediaCodecSelector mediaCodecSelector, + public MediaCodecVideoRenderer(Context context, MediaCodecSelector mediaCodecSelector, int videoScalingMode, long allowedJoiningTimeMs) { this(context, mediaCodecSelector, videoScalingMode, allowedJoiningTimeMs, null, null, -1); } @@ -111,11 +111,11 @@ public class MediaCodecVideoTrackRenderer extends MediaCodecTrackRenderer { * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. * @param maxDroppedFrameCountToNotify The maximum number of frames that can be dropped between - * invocations of {@link VideoTrackRendererEventListener#onDroppedFrames(int, long)}. + * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. */ - public MediaCodecVideoTrackRenderer(Context context, MediaCodecSelector mediaCodecSelector, + public MediaCodecVideoRenderer(Context context, MediaCodecSelector mediaCodecSelector, int videoScalingMode, long allowedJoiningTimeMs, Handler eventHandler, - VideoTrackRendererEventListener eventListener, int maxDroppedFrameCountToNotify) { + VideoRendererEventListener eventListener, int maxDroppedFrameCountToNotify) { this(context, mediaCodecSelector, videoScalingMode, allowedJoiningTimeMs, null, false, eventHandler, eventListener, maxDroppedFrameCountToNotify); } @@ -138,12 +138,12 @@ public class MediaCodecVideoTrackRenderer extends MediaCodecTrackRenderer { * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. * @param maxDroppedFrameCountToNotify The maximum number of frames that can be dropped between - * invocations of {@link VideoTrackRendererEventListener#onDroppedFrames(int, long)}. + * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. */ - public MediaCodecVideoTrackRenderer(Context context, MediaCodecSelector mediaCodecSelector, + public MediaCodecVideoRenderer(Context context, MediaCodecSelector mediaCodecSelector, int videoScalingMode, long allowedJoiningTimeMs, DrmSessionManager drmSessionManager, boolean playClearSamplesWithoutKeys, Handler eventHandler, - VideoTrackRendererEventListener eventListener, int maxDroppedFrameCountToNotify) { + VideoRendererEventListener eventListener, int maxDroppedFrameCountToNotify) { super(mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys); this.videoScalingMode = videoScalingMode; this.allowedJoiningTimeMs = allowedJoiningTimeMs; @@ -307,7 +307,7 @@ public class MediaCodecVideoTrackRenderer extends MediaCodecTrackRenderer { this.surface = surface; this.reportedDrawnToSurface = false; int state = getState(); - if (state == TrackRenderer.STATE_ENABLED || state == TrackRenderer.STATE_STARTED) { + if (state == Renderer.STATE_ENABLED || state == Renderer.STATE_STARTED) { releaseCodec(); maybeInitCodec(); } @@ -403,7 +403,7 @@ public class MediaCodecVideoTrackRenderer extends MediaCodecTrackRenderer { return true; } - if (getState() != TrackRenderer.STATE_STARTED) { + if (getState() != Renderer.STATE_STARTED) { return false; } diff --git a/library/src/main/java/com/google/android/exoplayer2/TrackRenderer.java b/library/src/main/java/com/google/android/exoplayer2/Renderer.java similarity index 91% rename from library/src/main/java/com/google/android/exoplayer2/TrackRenderer.java rename to library/src/main/java/com/google/android/exoplayer2/Renderer.java index 780c4b1454..49d8630f8c 100644 --- a/library/src/main/java/com/google/android/exoplayer2/TrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/Renderer.java @@ -23,16 +23,16 @@ import java.io.IOException; /** * Renders a single component of media. - * - *

    Internally, a renderer's lifecycle is managed by the owning {@link ExoPlayer}. The player - * will transition its renderers through various states as the overall playback state changes. The - * valid state transitions are shown below, annotated with the methods that are invoked during each + *

    + * Internally, a renderer's lifecycle is managed by the owning {@link ExoPlayer}. The player will + * transition its renderers through various states as the overall playback state changes. The valid + * state transitions are shown below, annotated with the methods that are invoked during each * transition. *

    TrackRenderer state transitions

    */ -public abstract class TrackRenderer implements ExoPlayerComponent { +public abstract class Renderer implements ExoPlayerComponent { /** * A mask to apply to the result of {@link #supportsFormat(Format)} to obtain one of @@ -41,33 +41,33 @@ public abstract class TrackRenderer implements ExoPlayerComponent { */ public static final int FORMAT_SUPPORT_MASK = 0b11; /** - * The {@link TrackRenderer} is capable of rendering the format. + * The {@link Renderer} is capable of rendering the format. */ public static final int FORMAT_HANDLED = 0b11; /** - * The {@link TrackRenderer} is capable of rendering formats with the same mimeType, but the + * The {@link Renderer} is capable of rendering formats with the same mimeType, but the * properties of the format exceed the renderer's capability. *

    - * Example: The {@link TrackRenderer} is capable of rendering H264 and the format's mimeType is + * Example: The {@link Renderer} is capable of rendering H264 and the format's mimeType is * {@link MimeTypes#VIDEO_H264}, but the format's resolution exceeds the maximum limit supported * by the underlying H264 decoder. */ public static final int FORMAT_EXCEEDS_CAPABILITIES = 0b10; /** - * The {@link TrackRenderer} is a general purpose renderer for formats of the same top-level type, + * The {@link Renderer} is a general purpose renderer for formats of the same top-level type, * but is not capable of rendering the format or any other format with the same mimeType because * the sub-type is not supported. *

    - * Example: The {@link TrackRenderer} is a general purpose audio renderer and the format's + * Example: The {@link Renderer} is a general purpose audio renderer and the format's * mimeType matches audio/[subtype], but there does not exist a suitable decoder for [subtype]. */ public static final int FORMAT_UNSUPPORTED_SUBTYPE = 0b01; /** - * The {@link TrackRenderer} is not capable of rendering the format, either because it does not + * The {@link Renderer} is not capable of rendering the format, either because it does not * support the format's top-level type, or because it's a specialized renderer for a different * mimeType. *

    - * Example: The {@link TrackRenderer} is a general purpose video renderer, but the format has an + * Example: The {@link Renderer} is a general purpose video renderer, but the format has an * audio mimeType. */ public static final int FORMAT_UNSUPPORTED_TYPE = 0b00; @@ -78,16 +78,16 @@ public abstract class TrackRenderer implements ExoPlayerComponent { */ public static final int ADAPTIVE_SUPPORT_MASK = 0b1100; /** - * The {@link TrackRenderer} can seamlessly adapt between formats. + * The {@link Renderer} can seamlessly adapt between formats. */ public static final int ADAPTIVE_SEAMLESS = 0b1000; /** - * The {@link TrackRenderer} can adapt between formats, but may suffer a brief discontinuity + * The {@link Renderer} can adapt between formats, but may suffer a brief discontinuity * (~50-100ms) when adaptation occurs. */ public static final int ADAPTIVE_NOT_SEAMLESS = 0b0100; /** - * The {@link TrackRenderer} does not support adaptation between formats. + * The {@link Renderer} does not support adaptation between formats. */ public static final int ADAPTIVE_NOT_SUPPORTED = 0b0000; @@ -112,7 +112,7 @@ public abstract class TrackRenderer implements ExoPlayerComponent { private boolean readEndOfStream; private boolean streamIsFinal; - public TrackRenderer() { + public Renderer() { readEndOfStream = true; } @@ -447,7 +447,7 @@ public abstract class TrackRenderer implements ExoPlayerComponent { /** * Whether the renderer is ready for the {@link ExoPlayer} instance to transition to * {@link ExoPlayer#STATE_ENDED}. The player will make this transition as soon as {@code true} is - * returned by all of its {@link TrackRenderer}s. + * returned by all of its {@link Renderer}s. *

    * This method may be called when the renderer is in the following states: * {@link #STATE_ENABLED}, {@link #STATE_STARTED}. diff --git a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index aca7b62e9d..ce5fc1cd06 100644 --- a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -17,13 +17,11 @@ package com.google.android.exoplayer2; import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.metadata.MetadataTrackRenderer; -import com.google.android.exoplayer2.metadata.MetadataTrackRenderer.MetadataRenderer; +import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.metadata.id3.Id3Frame; import com.google.android.exoplayer2.metadata.id3.Id3Parser; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.TextRenderer; -import com.google.android.exoplayer2.text.TextTrackRenderer; import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; @@ -41,7 +39,7 @@ import java.util.ArrayList; import java.util.List; /** - * An {@link ExoPlayer} that uses default {@link TrackRenderer} components. + * An {@link ExoPlayer} that uses default {@link Renderer} components. *

    * Instances of this class can be obtained from {@link ExoPlayerFactory}. */ @@ -94,7 +92,7 @@ public final class SimpleExoPlayer implements ExoPlayer { private final ExoPlayer player; private final BandwidthMeter bandwidthMeter; - private final TrackRenderer[] renderers; + private final Renderer[] renderers; private final ComponentListener componentListener; private final Handler mainHandler; private final int videoRendererCount; @@ -118,7 +116,7 @@ public final class SimpleExoPlayer implements ExoPlayer { componentListener = new ComponentListener(); // Build the renderers. - ArrayList renderersList = new ArrayList<>(); + ArrayList renderersList = new ArrayList<>(); if (preferExtensionDecoders) { buildExtensionRenderers(renderersList, allowedVideoJoiningTimeMs); buildRenderers(context, drmSessionManager, renderersList, allowedVideoJoiningTimeMs); @@ -126,12 +124,12 @@ public final class SimpleExoPlayer implements ExoPlayer { buildRenderers(context, drmSessionManager, renderersList, allowedVideoJoiningTimeMs); buildExtensionRenderers(renderersList, allowedVideoJoiningTimeMs); } - renderers = renderersList.toArray(new TrackRenderer[renderersList.size()]); + renderers = renderersList.toArray(new Renderer[renderersList.size()]); // Obtain counts of video and audio renderers. int videoRendererCount = 0; int audioRendererCount = 0; - for (TrackRenderer renderer : renderers) { + for (Renderer renderer : renderers) { switch (renderer.getTrackType()) { case C.TRACK_TYPE_VIDEO: videoRendererCount++; @@ -160,7 +158,7 @@ public final class SimpleExoPlayer implements ExoPlayer { /** * Returns the track type that the renderer at a given index handles. * - * @see TrackRenderer#getTrackType() + * @see Renderer#getTrackType() * @param index The index of the renderer. * @return One of the {@code TRACK_TYPE_*} constants defined in {@link C}. */ @@ -176,7 +174,7 @@ public final class SimpleExoPlayer implements ExoPlayer { public void setSurface(Surface surface) { ExoPlayerMessage[] messages = new ExoPlayerMessage[videoRendererCount]; int count = 0; - for (TrackRenderer renderer : renderers) { + for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_VIDEO) { messages[count++] = new ExoPlayerMessage(renderer, C.MSG_SET_SURFACE, surface); } @@ -197,7 +195,7 @@ public final class SimpleExoPlayer implements ExoPlayer { public void setVolume(float volume) { ExoPlayerMessage[] messages = new ExoPlayerMessage[audioRendererCount]; int count = 0; - for (TrackRenderer renderer : renderers) { + for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { messages[count++] = new ExoPlayerMessage(renderer, C.MSG_SET_VOLUME, volume); } @@ -213,7 +211,7 @@ public final class SimpleExoPlayer implements ExoPlayer { public void setPlaybackParams(PlaybackParams params) { ExoPlayerMessage[] messages = new ExoPlayerMessage[audioRendererCount]; int count = 0; - for (TrackRenderer renderer : renderers) { + for (Renderer renderer : renderers) { if (renderer.getTrackType() == C.TRACK_TYPE_AUDIO) { messages[count++] = new ExoPlayerMessage(renderer, C.MSG_SET_PLAYBACK_PARAMS, params); } @@ -396,39 +394,39 @@ public final class SimpleExoPlayer implements ExoPlayer { // Internal methods. private void buildRenderers(Context context, DrmSessionManager drmSessionManager, - ArrayList renderersList, long allowedVideoJoiningTimeMs) { - MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(context, + ArrayList renderersList, long allowedVideoJoiningTimeMs) { + MediaCodecVideoRenderer videoRenderer = new MediaCodecVideoRenderer(context, MediaCodecSelector.DEFAULT, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT, allowedVideoJoiningTimeMs, drmSessionManager, false, mainHandler, componentListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY); renderersList.add(videoRenderer); - TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(MediaCodecSelector.DEFAULT, + Renderer audioRenderer = new MediaCodecAudioRenderer(MediaCodecSelector.DEFAULT, drmSessionManager, true, mainHandler, componentListener, AudioCapabilities.getCapabilities(context), AudioManager.STREAM_MUSIC); renderersList.add(audioRenderer); - TrackRenderer textRenderer = new TextTrackRenderer(componentListener, mainHandler.getLooper()); + Renderer textRenderer = new TextRenderer(componentListener, mainHandler.getLooper()); renderersList.add(textRenderer); - MetadataTrackRenderer> id3Renderer = new MetadataTrackRenderer<>(new Id3Parser(), - componentListener, mainHandler.getLooper()); + MetadataRenderer> id3Renderer = new MetadataRenderer<>(componentListener, + mainHandler.getLooper(), new Id3Parser()); renderersList.add(id3Renderer); } - private void buildExtensionRenderers(ArrayList renderersList, + private void buildExtensionRenderers(ArrayList renderersList, long allowedVideoJoiningTimeMs) { // Load extension renderers using reflection so that demo app doesn't depend on them. // Class.forName() appears for each renderer so that automated tools like proguard // can detect the use of reflection (see http://proguard.sourceforge.net/FAQ.html#forname). try { Class clazz = - Class.forName("com.google.android.exoplayer2.ext.vp9.LibvpxVideoTrackRenderer"); + Class.forName("com.google.android.exoplayer2.ext.vp9.LibvpxVideoRenderer"); Constructor constructor = clazz.getConstructor(boolean.class, long.class, Handler.class, - VideoTrackRendererEventListener.class, int.class); - renderersList.add((TrackRenderer) constructor.newInstance(true, allowedVideoJoiningTimeMs, + VideoRendererEventListener.class, int.class); + renderersList.add((Renderer) constructor.newInstance(true, allowedVideoJoiningTimeMs, mainHandler, componentListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)); - Log.i(TAG, "Loaded LibvpxVideoTrackRenderer."); + Log.i(TAG, "Loaded LibvpxVideoRenderer."); } catch (ClassNotFoundException e) { // Expected if the app was built without the extension. } catch (Exception e) { @@ -437,11 +435,11 @@ public final class SimpleExoPlayer implements ExoPlayer { try { Class clazz = - Class.forName("com.google.android.exoplayer2.ext.opus.LibopusAudioTrackRenderer"); + Class.forName("com.google.android.exoplayer2.ext.opus.LibopusAudioRenderer"); Constructor constructor = clazz.getConstructor(Handler.class, - AudioTrackRendererEventListener.class); - renderersList.add((TrackRenderer) constructor.newInstance(mainHandler, componentListener)); - Log.i(TAG, "Loaded LibopusAudioTrackRenderer."); + AudioRendererEventListener.class); + renderersList.add((Renderer) constructor.newInstance(mainHandler, componentListener)); + Log.i(TAG, "Loaded LibopusAudioRenderer."); } catch (ClassNotFoundException e) { // Expected if the app was built without the extension. } catch (Exception e) { @@ -450,11 +448,11 @@ public final class SimpleExoPlayer implements ExoPlayer { try { Class clazz = - Class.forName("com.google.android.exoplayer2.ext.flac.LibflacAudioTrackRenderer"); + Class.forName("com.google.android.exoplayer2.ext.flac.LibflacAudioRenderer"); Constructor constructor = clazz.getConstructor(Handler.class, - AudioTrackRendererEventListener.class); - renderersList.add((TrackRenderer) constructor.newInstance(mainHandler, componentListener)); - Log.i(TAG, "Loaded LibflacAudioTrackRenderer."); + AudioRendererEventListener.class); + renderersList.add((Renderer) constructor.newInstance(mainHandler, componentListener)); + Log.i(TAG, "Loaded LibflacAudioRenderer."); } catch (ClassNotFoundException e) { // Expected if the app was built without the extension. } catch (Exception e) { @@ -463,11 +461,11 @@ public final class SimpleExoPlayer implements ExoPlayer { try { Class clazz = - Class.forName("com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioTrackRenderer"); + Class.forName("com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioRenderer"); Constructor constructor = clazz.getConstructor(Handler.class, - AudioTrackRendererEventListener.class); - renderersList.add((TrackRenderer) constructor.newInstance(mainHandler, componentListener)); - Log.i(TAG, "Loaded FfmpegAudioTrackRenderer."); + AudioRendererEventListener.class); + renderersList.add((Renderer) constructor.newInstance(mainHandler, componentListener)); + Log.i(TAG, "Loaded FfmpegAudioRenderer."); } catch (ClassNotFoundException e) { // Expected if the app was built without the extension. } catch (Exception e) { @@ -475,10 +473,10 @@ public final class SimpleExoPlayer implements ExoPlayer { } } - private final class ComponentListener implements VideoTrackRendererEventListener, - AudioTrackRendererEventListener, TextRenderer, MetadataRenderer> { + private final class ComponentListener implements VideoRendererEventListener, + AudioRendererEventListener, TextRenderer.Output, MetadataRenderer.Output> { - // VideoTrackRendererEventListener implementation + // VideoRendererEventListener implementation @Override public void onVideoEnabled(CodecCounters counters) { @@ -537,7 +535,7 @@ public final class SimpleExoPlayer implements ExoPlayer { videoCodecCounters = null; } - // AudioTrackRendererEventListener implementation + // AudioRendererEventListener implementation @Override public void onAudioEnabled(CodecCounters counters) { @@ -581,7 +579,7 @@ public final class SimpleExoPlayer implements ExoPlayer { audioCodecCounters = null; } - // TextRenderer implementation + // TextRendererOutput implementation @Override public void onCues(List cues) { diff --git a/library/src/main/java/com/google/android/exoplayer2/TrackSelectionPolicy.java b/library/src/main/java/com/google/android/exoplayer2/TrackSelectionPolicy.java index 7a085b2bcc..e5dca62d7b 100644 --- a/library/src/main/java/com/google/android/exoplayer2/TrackSelectionPolicy.java +++ b/library/src/main/java/com/google/android/exoplayer2/TrackSelectionPolicy.java @@ -16,7 +16,7 @@ package com.google.android.exoplayer2; /** - * Defines a policy for selecting the track rendered by each {@link TrackRenderer}. + * Defines a policy for selecting the track rendered by each {@link Renderer}. */ public abstract class TrackSelectionPolicy { @@ -49,17 +49,17 @@ public abstract class TrackSelectionPolicy { } /** - * Given an array of {@link TrackRenderer}s and a set of {@link TrackGroup}s assigned to each of + * Given an array of {@link Renderer}s and a set of {@link TrackGroup}s assigned to each of * them, provides a {@link TrackSelection} per renderer. * - * @param renderers The available {@link TrackRenderer}s. + * @param renderers The available {@link Renderer}s. * @param rendererTrackGroupArrays An array of {@link TrackGroupArray}s where each entry - * corresponds to the {@link TrackRenderer} of equal index in {@code renderers}. + * corresponds to the {@link Renderer} of equal index in {@code renderers}. * @param rendererFormatSupports Maps every available track to a specific level of support as - * defined by the {@link TrackRenderer} {@code FORMAT_*} constants. + * defined by the {@link Renderer} {@code FORMAT_*} constants. * @throws ExoPlaybackException If an error occurs while selecting the tracks. */ - protected abstract TrackSelection[] selectTracks(TrackRenderer[] renderers, + protected abstract TrackSelection[] selectTracks(Renderer[] renderers, TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports) throws ExoPlaybackException; diff --git a/library/src/main/java/com/google/android/exoplayer2/TrackSelector.java b/library/src/main/java/com/google/android/exoplayer2/TrackSelector.java index d7870bfadb..54d4e52dbe 100644 --- a/library/src/main/java/com/google/android/exoplayer2/TrackSelector.java +++ b/library/src/main/java/com/google/android/exoplayer2/TrackSelector.java @@ -18,7 +18,7 @@ package com.google.android.exoplayer2; import android.util.Pair; /** - * Selects tracks to be consumed by available {@link TrackRenderer}s. + * Selects tracks to be consumed by available {@link Renderer}s. */ public abstract class TrackSelector { @@ -63,12 +63,12 @@ public abstract class TrackSelector { * if the selection is activated. * @throws ExoPlaybackException If an error occurs selecting tracks. */ - protected abstract Pair selectTracks(TrackRenderer[] renderers, + protected abstract Pair selectTracks(Renderer[] renderers, TrackGroupArray trackGroups) throws ExoPlaybackException; /** * Invoked when a selection previously generated by - * {@link #selectTracks(TrackRenderer[], TrackGroupArray)} is activated. + * {@link #selectTracks(Renderer[], TrackGroupArray)} is activated. * * @param selectionInfo The opaque object associated with the selection. */ diff --git a/library/src/main/java/com/google/android/exoplayer2/VideoTrackRendererEventListener.java b/library/src/main/java/com/google/android/exoplayer2/VideoRendererEventListener.java similarity index 95% rename from library/src/main/java/com/google/android/exoplayer2/VideoTrackRendererEventListener.java rename to library/src/main/java/com/google/android/exoplayer2/VideoRendererEventListener.java index cb3ac98deb..da55b24e27 100644 --- a/library/src/main/java/com/google/android/exoplayer2/VideoTrackRendererEventListener.java +++ b/library/src/main/java/com/google/android/exoplayer2/VideoRendererEventListener.java @@ -23,9 +23,9 @@ import android.view.Surface; import android.view.TextureView; /** - * Interface definition for a callback to be notified of video {@link TrackRenderer} events. + * Interface definition for a callback to be notified of video {@link Renderer} events. */ -public interface VideoTrackRendererEventListener { +public interface VideoRendererEventListener { /** * Invoked when the renderer is enabled. @@ -101,14 +101,14 @@ public interface VideoTrackRendererEventListener { void onVideoDisabled(CodecCounters counters); /** - * Dispatches events to a {@link VideoTrackRendererEventListener}. + * Dispatches events to a {@link VideoRendererEventListener}. */ final class EventDispatcher { private final Handler handler; - private final VideoTrackRendererEventListener listener; + private final VideoRendererEventListener listener; - public EventDispatcher(Handler handler, VideoTrackRendererEventListener listener) { + public EventDispatcher(Handler handler, VideoRendererEventListener listener) { this.handler = listener != null ? Assertions.checkNotNull(handler) : null; this.listener = listener; } diff --git a/library/src/main/java/com/google/android/exoplayer2/extensions/AudioDecoderTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer2/extensions/AudioDecoderRenderer.java similarity index 94% rename from library/src/main/java/com/google/android/exoplayer2/extensions/AudioDecoderTrackRenderer.java rename to library/src/main/java/com/google/android/exoplayer2/extensions/AudioDecoderRenderer.java index 1bfc7a0286..fea01c57e7 100644 --- a/library/src/main/java/com/google/android/exoplayer2/extensions/AudioDecoderTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/extensions/AudioDecoderRenderer.java @@ -15,8 +15,8 @@ */ package com.google.android.exoplayer2.extensions; -import com.google.android.exoplayer2.AudioTrackRendererEventListener; -import com.google.android.exoplayer2.AudioTrackRendererEventListener.EventDispatcher; +import com.google.android.exoplayer2.AudioRendererEventListener; +import com.google.android.exoplayer2.AudioRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.CodecCounters; import com.google.android.exoplayer2.DecoderInputBuffer; @@ -24,7 +24,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.MediaClock; -import com.google.android.exoplayer2.TrackRenderer; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.TrackStream; import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioTrack; @@ -39,7 +39,7 @@ import android.os.SystemClock; /** * Decodes and renders audio using a {@link SimpleDecoder}. */ -public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements MediaClock { +public abstract class AudioDecoderRenderer extends Renderer implements MediaClock { private final EventDispatcher eventDispatcher; private final FormatHolder formatHolder; @@ -62,7 +62,7 @@ public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements private boolean audioTrackHasData; private long lastFeedElapsedRealtimeMs; - public AudioDecoderTrackRenderer() { + public AudioDecoderRenderer() { this(null, null); } @@ -71,8 +71,8 @@ public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements * null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required. */ - public AudioDecoderTrackRenderer(Handler eventHandler, - AudioTrackRendererEventListener eventListener) { + public AudioDecoderRenderer(Handler eventHandler, + AudioRendererEventListener eventListener) { this (eventHandler, eventListener, null, AudioManager.STREAM_MUSIC); } @@ -84,8 +84,8 @@ public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements * default capabilities (no encoded audio passthrough support) should be assumed. * @param streamType The type of audio stream for the {@link AudioTrack}. */ - public AudioDecoderTrackRenderer(Handler eventHandler, - AudioTrackRendererEventListener eventListener, AudioCapabilities audioCapabilities, + public AudioDecoderRenderer(Handler eventHandler, + AudioRendererEventListener eventListener, AudioCapabilities audioCapabilities, int streamType) { eventDispatcher = new EventDispatcher(eventHandler, eventListener); audioSessionId = AudioTrack.SESSION_ID_NOT_SET; @@ -193,14 +193,14 @@ public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements onAudioSessionId(audioSessionId); } audioTrackHasData = false; - if (getState() == TrackRenderer.STATE_STARTED) { + if (getState() == Renderer.STATE_STARTED) { audioTrack.play(); } } else { // Check for AudioTrack underrun. boolean audioTrackHadData = audioTrackHasData; audioTrackHasData = audioTrack.hasPendingData(); - if (audioTrackHadData && !audioTrackHasData && getState() == TrackRenderer.STATE_STARTED) { + if (audioTrackHadData && !audioTrackHasData && getState() == Renderer.STATE_STARTED) { long elapsedSinceLastFeedMs = SystemClock.elapsedRealtime() - lastFeedElapsedRealtimeMs; long bufferSizeUs = audioTrack.getBufferSizeUs(); long bufferSizeMs = bufferSizeUs == C.UNSET_TIME_US ? -1 : bufferSizeUs / 1000; diff --git a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java similarity index 71% rename from library/src/main/java/com/google/android/exoplayer2/metadata/MetadataTrackRenderer.java rename to library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java index 2fa48eca7c..79afa9fbea 100644 --- a/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataTrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java @@ -20,7 +20,7 @@ import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; -import com.google.android.exoplayer2.TrackRenderer; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.TrackStream; import com.google.android.exoplayer2.util.Assertions; @@ -33,18 +33,18 @@ import java.io.IOException; import java.nio.ByteBuffer; /** - * A {@link TrackRenderer} for metadata embedded in a media stream. + * A {@link Renderer} for metadata embedded in a media stream. * * @param The type of the metadata. */ -public final class MetadataTrackRenderer extends TrackRenderer implements Callback { +public final class MetadataRenderer extends Renderer implements Callback { /** - * An interface for components that process metadata. + * An output for the renderer. * * @param The type of the metadata. */ - public interface MetadataRenderer { + public interface Output { /** * Invoked each time there is a metadata associated with current playback time. @@ -58,8 +58,8 @@ public final class MetadataTrackRenderer extends TrackRenderer implements Cal private static final int MSG_INVOKE_RENDERER = 0; private final MetadataParser metadataParser; - private final MetadataRenderer metadataRenderer; - private final Handler metadataHandler; + private final Output output; + private final Handler outputHandler; private final FormatHolder formatHolder; private final DecoderInputBuffer buffer; @@ -68,20 +68,18 @@ public final class MetadataTrackRenderer extends TrackRenderer implements Cal private T pendingMetadata; /** + * @param output The output. + * @param outputLooper The looper associated with the thread on which the output should be + * invoked. If the output makes use of standard Android UI components, then this should + * normally be the looper associated with the application's main thread, which can be obtained + * using {@link android.app.Activity#getMainLooper()}. Null may be passed if the output + * should be invoked directly on the player's internal rendering thread. * @param metadataParser A parser for parsing the metadata. - * @param metadataRenderer The metadata renderer to receive the parsed metadata. - * @param metadataRendererLooper The looper associated with the thread on which metadataRenderer - * should be invoked. If the renderer makes use of standard Android UI components, then this - * should normally be the looper associated with the applications' main thread, which can be - * obtained using {@link android.app.Activity#getMainLooper()}. Null may be passed if the - * renderer should be invoked directly on the player's internal rendering thread. */ - public MetadataTrackRenderer(MetadataParser metadataParser, - MetadataRenderer metadataRenderer, Looper metadataRendererLooper) { + public MetadataRenderer(Output output, Looper outputLooper, MetadataParser metadataParser) { + this.output = Assertions.checkNotNull(output); + this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this); this.metadataParser = Assertions.checkNotNull(metadataParser); - this.metadataRenderer = Assertions.checkNotNull(metadataRenderer); - this.metadataHandler = metadataRendererLooper == null ? null - : new Handler(metadataRendererLooper, this); formatHolder = new FormatHolder(); buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); } @@ -93,8 +91,8 @@ public final class MetadataTrackRenderer extends TrackRenderer implements Cal @Override protected int supportsFormat(Format format) { - return metadataParser.canParse(format.sampleMimeType) ? TrackRenderer.FORMAT_HANDLED - : TrackRenderer.FORMAT_UNSUPPORTED_TYPE; + return metadataParser.canParse(format.sampleMimeType) ? Renderer.FORMAT_HANDLED + : Renderer.FORMAT_UNSUPPORTED_TYPE; } @Override @@ -147,8 +145,8 @@ public final class MetadataTrackRenderer extends TrackRenderer implements Cal } private void invokeRenderer(T metadata) { - if (metadataHandler != null) { - metadataHandler.obtainMessage(MSG_INVOKE_RENDERER, metadata).sendToTarget(); + if (outputHandler != null) { + outputHandler.obtainMessage(MSG_INVOKE_RENDERER, metadata).sendToTarget(); } else { invokeRendererInternal(metadata); } @@ -166,7 +164,7 @@ public final class MetadataTrackRenderer extends TrackRenderer implements Cal } private void invokeRendererInternal(T metadata) { - metadataRenderer.onMetadata(metadata); + output.onMetadata(metadata); } } diff --git a/library/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java b/library/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java index 6f04b080ec..fc83aed6b1 100644 --- a/library/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java @@ -15,18 +15,274 @@ */ package com.google.android.exoplayer2.text; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.FormatHolder; +import com.google.android.exoplayer2.ParserException; +import com.google.android.exoplayer2.Renderer; +import com.google.android.exoplayer2.TrackStream; +import com.google.android.exoplayer2.extensions.Decoder; +import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.MimeTypes; + +import android.annotation.TargetApi; +import android.os.Handler; +import android.os.Handler.Callback; +import android.os.Looper; +import android.os.Message; + +import java.io.IOException; +import java.util.Collections; import java.util.List; /** - * An interface for components that render text. + * A {@link Renderer} for subtitles. + *

    + * Text is parsed from sample data using {@link Decoder} instances obtained from a + * {@link SubtitleParserFactory}. The actual rendering of each line of text is delegated to a + * {@link Output}. */ -public interface TextRenderer { +@TargetApi(16) +public final class TextRenderer extends Renderer implements Callback { /** - * Invoked each time there is a change in the {@link Cue}s to be rendered. - * - * @param cues The {@link Cue}s to be rendered, or an empty list if no cues are to be rendered. + * An output for the renderer. */ - void onCues(List cues); + public interface Output { + + /** + * Invoked each time there is a change in the {@link Cue}s. + * + * @param cues The {@link Cue}s. + */ + void onCues(List cues); + + } + + private static final int MSG_UPDATE_OUTPUT = 0; + + private final Handler outputHandler; + private final Output output; + private final SubtitleParserFactory parserFactory; + private final FormatHolder formatHolder; + + private boolean inputStreamEnded; + private boolean outputStreamEnded; + private SubtitleParser parser; + private SubtitleInputBuffer nextInputBuffer; + private SubtitleOutputBuffer subtitle; + private SubtitleOutputBuffer nextSubtitle; + private int nextSubtitleEventIndex; + + /** + * @param output The output. + * @param outputLooper The looper associated with the thread on which the output should be + * invoked. If the output makes use of standard Android UI components, then this should + * normally be the looper associated with the application's main thread, which can be obtained + * using {@link android.app.Activity#getMainLooper()}. Null may be passed if the output + * should be invoked directly on the player's internal rendering thread. + */ + public TextRenderer(Output output, Looper outputLooper) { + this(output, outputLooper, SubtitleParserFactory.DEFAULT); + } + + /** + * @param output The output. + * @param outputLooper The looper associated with the thread on which the output should be + * invoked. If the output makes use of standard Android UI components, then this should + * normally be the looper associated with the application's main thread, which can be obtained + * using {@link android.app.Activity#getMainLooper()}. Null may be passed if the output + * should be invoked directly on the player's internal rendering thread. + * @param parserFactory A factory from which to obtain {@link Decoder} instances. + */ + public TextRenderer(Output output, Looper outputLooper, SubtitleParserFactory parserFactory) { + this.output = Assertions.checkNotNull(output); + this.outputHandler = outputLooper == null ? null : new Handler(outputLooper, this); + this.parserFactory = parserFactory; + formatHolder = new FormatHolder(); + } + + @Override + public int getTrackType() { + return C.TRACK_TYPE_TEXT; + } + + @Override + protected int supportsFormat(Format format) { + return parserFactory.supportsFormat(format) ? Renderer.FORMAT_HANDLED + : (MimeTypes.isText(format.sampleMimeType) ? FORMAT_UNSUPPORTED_SUBTYPE + : FORMAT_UNSUPPORTED_TYPE); + } + + @Override + protected void onStreamChanged(Format[] formats) throws ExoPlaybackException { + if (parser != null) { + parser.release(); + } + parser = parserFactory.createParser(formats[0]); + } + + @Override + protected void onReset(long positionUs, boolean joining) { + inputStreamEnded = false; + outputStreamEnded = false; + if (subtitle != null) { + subtitle.release(); + subtitle = null; + } + if (nextSubtitle != null) { + nextSubtitle.release(); + nextSubtitle = null; + } + nextInputBuffer = null; + clearOutput(); + parser.flush(); + } + + @Override + protected void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { + if (outputStreamEnded) { + return; + } + + if (nextSubtitle == null) { + parser.setPositionUs(positionUs); + try { + nextSubtitle = parser.dequeueOutputBuffer(); + } catch (IOException e) { + throw ExoPlaybackException.createForRenderer(e, getIndex()); + } + } + + if (getState() != Renderer.STATE_STARTED) { + return; + } + + boolean textRendererNeedsUpdate = false; + if (subtitle != null) { + // We're iterating through the events in a subtitle. Set textRendererNeedsUpdate if we + // advance to the next event. + long subtitleNextEventTimeUs = getNextEventTime(); + while (subtitleNextEventTimeUs <= positionUs) { + nextSubtitleEventIndex++; + subtitleNextEventTimeUs = getNextEventTime(); + textRendererNeedsUpdate = true; + } + } + + if (nextSubtitle != null && nextSubtitle.timestampUs <= positionUs) { + // Advance to the next subtitle. Sync the next event index and trigger an update. + if (subtitle != null) { + subtitle.release(); + } + subtitle = nextSubtitle; + nextSubtitle = null; + if (subtitle.isEndOfStream()) { + outputStreamEnded = true; + subtitle.release(); + subtitle = null; + return; + } + nextSubtitleEventIndex = subtitle.getNextEventTimeIndex(positionUs); + textRendererNeedsUpdate = true; + } + + if (textRendererNeedsUpdate) { + // textRendererNeedsUpdate is set and we're playing. Update the renderer. + updateOutput(subtitle.getCues(positionUs)); + } + + try { + while (!inputStreamEnded) { + if (nextInputBuffer == null) { + nextInputBuffer = parser.dequeueInputBuffer(); + if (nextInputBuffer == null) { + return; + } + } + // Try and read the next subtitle from the source. + int result = readSource(formatHolder, nextInputBuffer); + if (result == TrackStream.BUFFER_READ) { + // Clear BUFFER_FLAG_DECODE_ONLY (see [Internal: b/27893809]) and queue the buffer. + nextInputBuffer.clearFlag(C.BUFFER_FLAG_DECODE_ONLY); + if (nextInputBuffer.isEndOfStream()) { + inputStreamEnded = true; + } else { + nextInputBuffer.subsampleOffsetUs = formatHolder.format.subsampleOffsetUs; + nextInputBuffer.flip(); + } + parser.queueInputBuffer(nextInputBuffer); + nextInputBuffer = null; + } else if (result == TrackStream.NOTHING_READ) { + break; + } + } + } catch (ParserException e) { + throw ExoPlaybackException.createForRenderer(e, getIndex()); + } + } + + @Override + protected void onDisabled() { + if (subtitle != null) { + subtitle.release(); + subtitle = null; + } + if (nextSubtitle != null) { + nextSubtitle.release(); + nextSubtitle = null; + } + parser.release(); + parser = null; + nextInputBuffer = null; + clearOutput(); + super.onDisabled(); + } + + @Override + protected boolean isEnded() { + return outputStreamEnded; + } + + @Override + protected boolean isReady() { + // Don't block playback whilst subtitles are loading. + // Note: To change this behavior, it will be necessary to consider [Internal: b/12949941]. + return true; + } + + private long getNextEventTime() { + return ((nextSubtitleEventIndex == -1) + || (nextSubtitleEventIndex >= subtitle.getEventTimeCount())) ? Long.MAX_VALUE + : (subtitle.getEventTime(nextSubtitleEventIndex)); + } + + private void updateOutput(List cues) { + if (outputHandler != null) { + outputHandler.obtainMessage(MSG_UPDATE_OUTPUT, cues).sendToTarget(); + } else { + invokeUpdateOutputInternal(cues); + } + } + + private void clearOutput() { + updateOutput(Collections.emptyList()); + } + + @SuppressWarnings("unchecked") + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MSG_UPDATE_OUTPUT: + invokeUpdateOutputInternal((List) msg.obj); + return true; + } + return false; + } + + private void invokeUpdateOutputInternal(List cues) { + output.onCues(cues); + } } diff --git a/library/src/main/java/com/google/android/exoplayer2/text/TextTrackRenderer.java b/library/src/main/java/com/google/android/exoplayer2/text/TextTrackRenderer.java deleted file mode 100644 index e3764516ad..0000000000 --- a/library/src/main/java/com/google/android/exoplayer2/text/TextTrackRenderer.java +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2016 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.exoplayer2.text; - -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlaybackException; -import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.FormatHolder; -import com.google.android.exoplayer2.ParserException; -import com.google.android.exoplayer2.TrackRenderer; -import com.google.android.exoplayer2.TrackStream; -import com.google.android.exoplayer2.extensions.Decoder; -import com.google.android.exoplayer2.util.Assertions; -import com.google.android.exoplayer2.util.MimeTypes; - -import android.annotation.TargetApi; -import android.os.Handler; -import android.os.Handler.Callback; -import android.os.Looper; -import android.os.Message; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; - -/** - * A {@link TrackRenderer} for subtitles. - *

    - * Text is parsed from sample data using {@link Decoder} instances obtained from a - * {@link SubtitleParserFactory}. The actual rendering of each line of text is delegated to a - * {@link TextRenderer}. - */ -@TargetApi(16) -public final class TextTrackRenderer extends TrackRenderer implements Callback { - - private static final int MSG_UPDATE_OVERLAY = 0; - - private final Handler textRendererHandler; - private final TextRenderer textRenderer; - private final SubtitleParserFactory parserFactory; - private final FormatHolder formatHolder; - - private boolean inputStreamEnded; - private boolean outputStreamEnded; - private SubtitleParser parser; - private SubtitleInputBuffer nextInputBuffer; - private SubtitleOutputBuffer subtitle; - private SubtitleOutputBuffer nextSubtitle; - private int nextSubtitleEventIndex; - - /** - * @param textRenderer The text renderer. - * @param textRendererLooper The looper associated with the thread on which textRenderer should be - * invoked. If the renderer makes use of standard Android UI components, then this should - * normally be the looper associated with the application's main thread, which can be obtained - * using {@link android.app.Activity#getMainLooper()}. Null may be passed if the renderer - * should be invoked directly on the player's internal rendering thread. - */ - public TextTrackRenderer(TextRenderer textRenderer, Looper textRendererLooper) { - this(textRenderer, textRendererLooper, SubtitleParserFactory.DEFAULT); - } - - /** - * @param textRenderer The text renderer. - * @param textRendererLooper The looper associated with the thread on which textRenderer should be - * invoked. If the renderer makes use of standard Android UI components, then this should - * normally be the looper associated with the application's main thread, which can be obtained - * using {@link android.app.Activity#getMainLooper()}. Null may be passed if the renderer - * should be invoked directly on the player's internal rendering thread. - * @param parserFactory A factory from which to obtain {@link Decoder} instances. - */ - public TextTrackRenderer(TextRenderer textRenderer, Looper textRendererLooper, - SubtitleParserFactory parserFactory) { - this.textRenderer = Assertions.checkNotNull(textRenderer); - this.textRendererHandler = textRendererLooper == null ? null - : new Handler(textRendererLooper, this); - this.parserFactory = parserFactory; - formatHolder = new FormatHolder(); - } - - @Override - public int getTrackType() { - return C.TRACK_TYPE_TEXT; - } - - @Override - protected int supportsFormat(Format format) { - return parserFactory.supportsFormat(format) ? TrackRenderer.FORMAT_HANDLED - : (MimeTypes.isText(format.sampleMimeType) ? FORMAT_UNSUPPORTED_SUBTYPE - : FORMAT_UNSUPPORTED_TYPE); - } - - @Override - protected void onStreamChanged(Format[] formats) throws ExoPlaybackException { - if (parser != null) { - parser.release(); - } - parser = parserFactory.createParser(formats[0]); - } - - @Override - protected void onReset(long positionUs, boolean joining) { - inputStreamEnded = false; - outputStreamEnded = false; - if (subtitle != null) { - subtitle.release(); - subtitle = null; - } - if (nextSubtitle != null) { - nextSubtitle.release(); - nextSubtitle = null; - } - nextInputBuffer = null; - clearTextRenderer(); - parser.flush(); - } - - @Override - protected void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { - if (outputStreamEnded) { - return; - } - - if (nextSubtitle == null) { - parser.setPositionUs(positionUs); - try { - nextSubtitle = parser.dequeueOutputBuffer(); - } catch (IOException e) { - throw ExoPlaybackException.createForRenderer(e, getIndex()); - } - } - - if (getState() != TrackRenderer.STATE_STARTED) { - return; - } - - boolean textRendererNeedsUpdate = false; - if (subtitle != null) { - // We're iterating through the events in a subtitle. Set textRendererNeedsUpdate if we - // advance to the next event. - long subtitleNextEventTimeUs = getNextEventTime(); - while (subtitleNextEventTimeUs <= positionUs) { - nextSubtitleEventIndex++; - subtitleNextEventTimeUs = getNextEventTime(); - textRendererNeedsUpdate = true; - } - } - - if (nextSubtitle != null && nextSubtitle.timestampUs <= positionUs) { - // Advance to the next subtitle. Sync the next event index and trigger an update. - if (subtitle != null) { - subtitle.release(); - } - subtitle = nextSubtitle; - nextSubtitle = null; - if (subtitle.isEndOfStream()) { - outputStreamEnded = true; - subtitle.release(); - subtitle = null; - return; - } - nextSubtitleEventIndex = subtitle.getNextEventTimeIndex(positionUs); - textRendererNeedsUpdate = true; - } - - if (textRendererNeedsUpdate) { - // textRendererNeedsUpdate is set and we're playing. Update the renderer. - updateTextRenderer(subtitle.getCues(positionUs)); - } - - try { - while (!inputStreamEnded) { - if (nextInputBuffer == null) { - nextInputBuffer = parser.dequeueInputBuffer(); - if (nextInputBuffer == null) { - return; - } - } - // Try and read the next subtitle from the source. - int result = readSource(formatHolder, nextInputBuffer); - if (result == TrackStream.BUFFER_READ) { - // Clear BUFFER_FLAG_DECODE_ONLY (see [Internal: b/27893809]) and queue the buffer. - nextInputBuffer.clearFlag(C.BUFFER_FLAG_DECODE_ONLY); - if (nextInputBuffer.isEndOfStream()) { - inputStreamEnded = true; - } else { - nextInputBuffer.subsampleOffsetUs = formatHolder.format.subsampleOffsetUs; - nextInputBuffer.flip(); - } - parser.queueInputBuffer(nextInputBuffer); - nextInputBuffer = null; - } else if (result == TrackStream.NOTHING_READ) { - break; - } - } - } catch (ParserException e) { - throw ExoPlaybackException.createForRenderer(e, getIndex()); - } - } - - @Override - protected void onDisabled() { - if (subtitle != null) { - subtitle.release(); - subtitle = null; - } - if (nextSubtitle != null) { - nextSubtitle.release(); - nextSubtitle = null; - } - parser.release(); - parser = null; - nextInputBuffer = null; - clearTextRenderer(); - super.onDisabled(); - } - - @Override - protected boolean isEnded() { - return outputStreamEnded; - } - - @Override - protected boolean isReady() { - // Don't block playback whilst subtitles are loading. - // Note: To change this behavior, it will be necessary to consider [Internal: b/12949941]. - return true; - } - - private long getNextEventTime() { - return ((nextSubtitleEventIndex == -1) - || (nextSubtitleEventIndex >= subtitle.getEventTimeCount())) ? Long.MAX_VALUE - : (subtitle.getEventTime(nextSubtitleEventIndex)); - } - - private void updateTextRenderer(List cues) { - if (textRendererHandler != null) { - textRendererHandler.obtainMessage(MSG_UPDATE_OVERLAY, cues).sendToTarget(); - } else { - invokeRendererInternalCues(cues); - } - } - - private void clearTextRenderer() { - updateTextRenderer(Collections.emptyList()); - } - - @SuppressWarnings("unchecked") - @Override - public boolean handleMessage(Message msg) { - switch (msg.what) { - case MSG_UPDATE_OVERLAY: - invokeRendererInternalCues((List) msg.obj); - return true; - } - return false; - } - - private void invokeRendererInternalCues(List cues) { - textRenderer.onCues(cues); - } - -} diff --git a/library/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java b/library/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java index 078a36c71e..b7e16e8bdb 100644 --- a/library/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java +++ b/library/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java @@ -147,7 +147,7 @@ import java.util.regex.Pattern; * @param id Id of the cue, {@code null} if it is not present. * @param markup The markup text to be parsed. * @param styles List of styles defined by the CSS style blocks preceeding the cues. - * @param builder Target builder. + * @param builder Output builder. */ /* package */ static void parseCueText(String id, String markup, WebvttCue.Builder builder, List styles) { diff --git a/library/src/main/java/com/google/android/exoplayer2/util/PlayerControl.java b/library/src/main/java/com/google/android/exoplayer2/util/PlayerControl.java index d6ad28d734..d03603eba2 100644 --- a/library/src/main/java/com/google/android/exoplayer2/util/PlayerControl.java +++ b/library/src/main/java/com/google/android/exoplayer2/util/PlayerControl.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.util; import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaCodecAudioRenderer; import android.widget.MediaController.MediaPlayerControl; @@ -52,9 +53,8 @@ public class PlayerControl implements MediaPlayerControl { * This is an unsupported operation. *

    * Application of audio effects is dependent on the audio renderer used. When using - * {@link com.google.android.exoplayer2.MediaCodecAudioTrackRenderer}, the recommended approach is - * to extend the class and override - * {@link com.google.android.exoplayer2.MediaCodecAudioTrackRenderer#onAudioSessionId}. + * {@link MediaCodecAudioRenderer}, the recommended approach is to extend the class and override + * {@link MediaCodecAudioRenderer#onAudioSessionId}. * * @throws UnsupportedOperationException Always thrown. */ diff --git a/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/gts/DashTest.java b/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/gts/DashTest.java index cd6b344741..8c3876e985 100644 --- a/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/gts/DashTest.java +++ b/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/gts/DashTest.java @@ -23,9 +23,9 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaCodecUtil; import com.google.android.exoplayer2.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.MediaSource; +import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.TrackGroup; import com.google.android.exoplayer2.TrackGroupArray; -import com.google.android.exoplayer2.TrackRenderer; import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.TrackSelectionPolicy; import com.google.android.exoplayer2.dash.DashMediaSource; @@ -444,7 +444,7 @@ public final class DashTest extends ActivityInstrumentationTestCase2