From 71186ef16ee2f3dc07a4f9d1d696c273b1c6ca87 Mon Sep 17 00:00:00 2001 From: cblay Date: Wed, 14 Dec 2016 17:37:27 -0800 Subject: [PATCH] Improving handling of atoms with size less than header in FragmentedMp4Extractor. These currently lead to cryptic ArrayIndexOutOfBoundsExceptions being thrown from System.arraycopy() so my proposal is to throw a more useful ParserException instead. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=142087132 --- RELEASENOTES.md | 16 +- build.gradle | 2 +- demo/src/main/AndroidManifest.xml | 4 +- demo/src/main/assets/media.exolist.json | 32 +--- .../android/exoplayer2/ExoPlayerTest.java | 63 +++---- .../android/exoplayer2/BaseRenderer.java | 6 - .../java/com/google/android/exoplayer2/C.java | 7 - .../android/exoplayer2/ExoPlayerImpl.java | 6 +- .../exoplayer2/ExoPlayerImplInternal.java | 17 +- .../exoplayer2/ExoPlayerLibraryInfo.java | 4 +- .../android/exoplayer2/SimpleExoPlayer.java | 7 +- .../android/exoplayer2/audio/AudioTrack.java | 163 +++--------------- .../audio/MediaCodecAudioRenderer.java | 10 +- .../audio/SimpleDecoderAudioRenderer.java | 10 +- .../source/ExtractorMediaPeriod.java | 2 +- .../exoplayer2/source/MediaPeriod.java | 28 --- .../exoplayer2/source/hls/HlsMediaSource.java | 7 +- .../google/android/exoplayer2/text/Cue.java | 45 ----- .../exoplayer2/ui/SimpleExoPlayerView.java | 64 ++----- .../exoplayer2/ui/SubtitlePainter.java | 8 +- .../video/MediaCodecVideoRenderer.java | 13 +- .../exo_controls_fastforward.png | Bin 354 -> 1114 bytes .../res/drawable-hdpi/exo_controls_next.png | Bin 323 -> 1073 bytes .../res/drawable-hdpi/exo_controls_pause.png | Bin 108 -> 599 bytes .../res/drawable-hdpi/exo_controls_play.png | Bin 286 -> 1163 bytes .../drawable-hdpi/exo_controls_previous.png | Bin 292 -> 1067 bytes .../res/drawable-hdpi/exo_controls_rewind.png | Bin 347 -> 1252 bytes .../exo_controls_fastforward.png | Bin 192 -> 886 bytes .../res/drawable-ldpi/exo_controls_next.png | Bin 167 -> 735 bytes .../res/drawable-ldpi/exo_controls_pause.png | Bin 91 -> 3249 bytes .../res/drawable-ldpi/exo_controls_play.png | Bin 182 -> 673 bytes .../drawable-ldpi/exo_controls_previous.png | Bin 187 -> 770 bytes .../res/drawable-ldpi/exo_controls_rewind.png | Bin 214 -> 906 bytes .../exo_controls_fastforward.png | Bin 255 -> 929 bytes .../res/drawable-mdpi/exo_controls_next.png | Bin 276 -> 843 bytes .../res/drawable-mdpi/exo_controls_pause.png | Bin 153 -> 540 bytes .../res/drawable-mdpi/exo_controls_play.png | Bin 228 -> 897 bytes .../drawable-mdpi/exo_controls_previous.png | Bin 227 -> 837 bytes .../res/drawable-mdpi/exo_controls_rewind.png | Bin 273 -> 997 bytes .../drawable-v21/exo_controls_fastforward.xml | 8 - .../res/drawable-v21/exo_controls_next.xml | 8 - .../res/drawable-v21/exo_controls_pause.xml | 8 - .../res/drawable-v21/exo_controls_play.xml | 8 - .../drawable-v21/exo_controls_previous.xml | 8 - .../res/drawable-v21/exo_controls_rewind.xml | 8 - .../exo_controls_fastforward.png | Bin 392 -> 1479 bytes .../res/drawable-xhdpi/exo_controls_next.png | Bin 334 -> 1364 bytes .../res/drawable-xhdpi/exo_controls_pause.png | Bin 164 -> 685 bytes .../res/drawable-xhdpi/exo_controls_play.png | Bin 343 -> 1617 bytes .../drawable-xhdpi/exo_controls_previous.png | Bin 339 -> 1372 bytes .../drawable-xhdpi/exo_controls_rewind.png | Bin 400 -> 1675 bytes .../exo_controls_fastforward.png | Bin 584 -> 1134 bytes .../res/drawable-xxhdpi/exo_controls_next.png | Bin 391 -> 1316 bytes .../drawable-xxhdpi/exo_controls_pause.png | Bin 113 -> 611 bytes .../res/drawable-xxhdpi/exo_controls_play.png | Bin 384 -> 1183 bytes .../drawable-xxhdpi/exo_controls_previous.png | Bin 464 -> 1294 bytes .../drawable-xxhdpi/exo_controls_rewind.png | Bin 571 -> 1197 bytes .../exo_controls_fastforward.png | Bin 712 -> 0 bytes .../drawable-xxxhdpi/exo_controls_next.png | Bin 532 -> 0 bytes .../drawable-xxxhdpi/exo_controls_pause.png | Bin 188 -> 0 bytes .../drawable-xxxhdpi/exo_controls_play.png | Bin 484 -> 0 bytes .../exo_controls_previous.png | Bin 522 -> 0 bytes .../drawable-xxxhdpi/exo_controls_rewind.png | Bin 690 -> 0 bytes library/src/main/res/values/attrs.xml | 1 - 64 files changed, 113 insertions(+), 450 deletions(-) delete mode 100644 library/src/main/res/drawable-v21/exo_controls_fastforward.xml delete mode 100644 library/src/main/res/drawable-v21/exo_controls_next.xml delete mode 100644 library/src/main/res/drawable-v21/exo_controls_pause.xml delete mode 100644 library/src/main/res/drawable-v21/exo_controls_play.xml delete mode 100644 library/src/main/res/drawable-v21/exo_controls_previous.xml delete mode 100644 library/src/main/res/drawable-v21/exo_controls_rewind.xml delete mode 100644 library/src/main/res/drawable-xxxhdpi/exo_controls_fastforward.png delete mode 100644 library/src/main/res/drawable-xxxhdpi/exo_controls_next.png delete mode 100644 library/src/main/res/drawable-xxxhdpi/exo_controls_pause.png delete mode 100644 library/src/main/res/drawable-xxxhdpi/exo_controls_play.png delete mode 100644 library/src/main/res/drawable-xxxhdpi/exo_controls_previous.png delete mode 100644 library/src/main/res/drawable-xxxhdpi/exo_controls_rewind.png diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8ddbe4068c..feaa240220 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,20 +1,10 @@ # Release notes # -### r2.1.1 ### - -Bugfix release only. Users of r2.1.0 and r2.0.x should proactively update to -this version. - -* Fix some subtitle types (e.g. WebVTT) being displayed out of sync - ([#2208](https://github.com/google/ExoPlayer/issues/2208)). -* Fix incorrect position reporting for on-demand HLS media that includes - EXT-X-PROGRAM-DATE-TIME tags - ([#2224](https://github.com/google/ExoPlayer/issues/2224)). -* Fix issue where playbacks could get stuck in the initial buffering state if - over 1MB of data needs to be read to initialize the playback. - ### r2.1.0 ### +This release contains important bug fixes. Users of r2.0.x should proactively +update to this version. + * HLS: Support for seeking in live streams ([#87](https://github.com/google/ExoPlayer/issues/87)). * HLS: Improved support: diff --git a/build.gradle b/build.gradle index 358b8f1404..0ea3ad66f3 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ allprojects { releaseRepoName = 'exoplayer' releaseUserOrg = 'google' releaseGroupId = 'com.google.android.exoplayer' - releaseVersion = 'r2.1.1' + releaseVersion = 'r2.1.0' releaseWebsite = 'https://github.com/google/ExoPlayer' } } diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml index 4c6d832211..d1b44abafe 100644 --- a/demo/src/main/AndroidManifest.xml +++ b/demo/src/main/AndroidManifest.xml @@ -16,8 +16,8 @@ + android:versionCode="2100" + android:versionName="2.1.0"> diff --git a/demo/src/main/assets/media.exolist.json b/demo/src/main/assets/media.exolist.json index 5a3015d506..6fa46d7451 100644 --- a/demo/src/main/assets/media.exolist.json +++ b/demo/src/main/assets/media.exolist.json @@ -183,53 +183,29 @@ "uri": "https://storage.googleapis.com/wvmedia/clear/vp9/tears/tears_uhd.mpd" }, { - "name": "WV: Secure Fullsample SD & HD (WebM,VP9)", + "name": "WV: Secure SD & HD (WebM,VP9)", "uri": "https://storage.googleapis.com/wvmedia/cenc/vp9/tears/tears.mpd", "drm_scheme": "widevine", "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" }, { - "name": "WV: Secure Fullsample SD (WebM,VP9)", + "name": "WV: Secure SD (WebM,VP9)", "uri": "https://storage.googleapis.com/wvmedia/cenc/vp9/tears/tears_sd.mpd", "drm_scheme": "widevine", "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" }, { - "name": "WV: Secure Fullsample HD (WebM,VP9)", + "name": "WV: Secure HD (WebM,VP9)", "uri": "https://storage.googleapis.com/wvmedia/cenc/vp9/tears/tears_hd.mpd", "drm_scheme": "widevine", "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" }, { - "name": "WV: Secure Fullsample UHD (WebM,VP9)", + "name": "WV: Secure UHD (WebM,VP9)", "uri": "https://storage.googleapis.com/wvmedia/cenc/vp9/tears/tears_uhd.mpd", "drm_scheme": "widevine", "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" }, - { - "name": "WV: Secure Subsample SD & HD (WebM,VP9)", - "uri": "https://storage.googleapis.com/wvmedia/cenc/vp9/subsample/24fps/tears/tears.mpd", - "drm_scheme": "widevine", - "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" - }, - { - "name": "WV: Secure Subsample SD (WebM,VP9)", - "uri": "https://storage.googleapis.com/wvmedia/cenc/vp9/subsample/24fps/tears/tears_sd.mpd", - "drm_scheme": "widevine", - "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" - }, - { - "name": "WV: Secure Subsample HD (WebM,VP9)", - "uri": "https://storage.googleapis.com/wvmedia/cenc/vp9/subsample/24fps/tears/tears_hd.mpd", - "drm_scheme": "widevine", - "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" - }, - { - "name": "WV: Secure Subsample UHD (WebM,VP9)", - "uri": "https://storage.googleapis.com/wvmedia/cenc/vp9/subsample/24fps/tears/tears_uhd.mpd", - "drm_scheme": "widevine", - "drm_license_url": "https://proxy.uat.widevine.com/proxy?provider=widevine_test" - }, { "name": "WV: Secure Subsample (WebM, VP9 with altref)", "uri": "https://storage.googleapis.com/widevine_test/vp9/sintel_1080p_vp9_altref_subsample/sintel_1080p_vp9_altref_subsample.mpd", diff --git a/library/src/androidTest/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/src/androidTest/java/com/google/android/exoplayer2/ExoPlayerTest.java index 0f6f3b07b1..be18d64195 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -31,7 +31,6 @@ import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.MimeTypes; import java.io.IOException; -import java.util.ArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -49,25 +48,12 @@ public final class ExoPlayerTest extends TestCase { */ private static final int TIMEOUT_MS = 10000; - /** - * Tests playback of a source that exposes a single period. - */ public void testPlayToEnd() throws Exception { PlayerWrapper playerWrapper = new PlayerWrapper(); Format format = Format.createVideoSampleFormat(null, MimeTypes.VIDEO_H264, null, Format.NO_VALUE, Format.NO_VALUE, 1280, 720, Format.NO_VALUE, null, null); - playerWrapper.setup(new SinglePeriodTimeline(0, false), null, format); - playerWrapper.blockUntilEnded(TIMEOUT_MS); - } - - /** - * Tests playback of a source that exposes an empty timeline. Playback is expected to end without - * error. - */ - public void testPlayEmptyTimeline() throws Exception { - PlayerWrapper playerWrapper = new PlayerWrapper(); - playerWrapper.setup(Timeline.EMPTY, null, null); - playerWrapper.blockUntilEnded(TIMEOUT_MS); + playerWrapper.setup(new SinglePeriodTimeline(0, false), new Object(), format); + playerWrapper.blockUntilEndedOrError(TIMEOUT_MS); } /** @@ -84,6 +70,7 @@ public final class ExoPlayerTest extends TestCase { private Format expectedFormat; private ExoPlayer player; private Exception exception; + private boolean seenPositionDiscontinuity; public PlayerWrapper() { endedCountDownLatch = new CountDownLatch(1); @@ -94,11 +81,12 @@ public final class ExoPlayerTest extends TestCase { // Called on the test thread. - public void blockUntilEnded(long timeoutMs) throws Exception { + public void blockUntilEndedOrError(long timeoutMs) throws Exception { if (!endedCountDownLatch.await(timeoutMs, TimeUnit.MILLISECONDS)) { exception = new TimeoutException("Test playback timed out."); } release(); + // Throw any pending exception (from playback, timing out or releasing). if (exception != null) { throw exception; @@ -120,7 +108,7 @@ public final class ExoPlayerTest extends TestCase { player.setPlayWhenReady(true); player.prepare(new FakeMediaSource(timeline, manifest, format)); } catch (Exception e) { - handleError(e); + handlePlayerException(e); } } }); @@ -135,7 +123,7 @@ public final class ExoPlayerTest extends TestCase { player.release(); } } catch (Exception e) { - handleError(e); + handlePlayerException(e); } finally { playerThread.quit(); } @@ -144,7 +132,7 @@ public final class ExoPlayerTest extends TestCase { playerThread.join(); } - private void handleError(Exception exception) { + private void handlePlayerException(Exception exception) { if (this.exception == null) { this.exception = exception; } @@ -179,13 +167,20 @@ public final class ExoPlayerTest extends TestCase { @Override public void onPlayerError(ExoPlaybackException exception) { - handleError(exception); + this.exception = exception; + endedCountDownLatch.countDown(); } @Override public void onPositionDiscontinuity() { - // Should never happen. - handleError(new IllegalStateException("Received position discontinuity")); + assertFalse(seenPositionDiscontinuity); + assertEquals(0, player.getCurrentWindowIndex()); + assertEquals(0, player.getCurrentPeriodIndex()); + assertEquals(0, player.getCurrentPosition()); + assertEquals(0, player.getBufferedPosition()); + assertEquals(expectedTimeline, player.getCurrentTimeline()); + assertEquals(expectedManifest, player.getCurrentManifest()); + seenPositionDiscontinuity = true; } } @@ -199,16 +194,17 @@ public final class ExoPlayerTest extends TestCase { private final Timeline timeline; private final Object manifest; private final Format format; - private final ArrayList activeMediaPeriods; + private FakeMediaPeriod mediaPeriod; private boolean preparedSource; + private boolean releasedPeriod; private boolean releasedSource; public FakeMediaSource(Timeline timeline, Object manifest, Format format) { + Assertions.checkArgument(timeline.getPeriodCount() == 1); this.timeline = timeline; this.manifest = manifest; this.format = format; - activeMediaPeriods = new ArrayList<>(); } @Override @@ -225,29 +221,33 @@ public final class ExoPlayerTest extends TestCase { @Override public MediaPeriod createPeriod(int index, Allocator allocator, long positionUs) { - Assertions.checkIndex(index, 0, timeline.getPeriodCount()); assertTrue(preparedSource); + assertNull(mediaPeriod); + assertFalse(releasedPeriod); assertFalse(releasedSource); assertEquals(0, index); assertEquals(0, positionUs); - FakeMediaPeriod mediaPeriod = new FakeMediaPeriod(format); - activeMediaPeriods.add(mediaPeriod); + mediaPeriod = new FakeMediaPeriod(format); return mediaPeriod; } @Override public void releasePeriod(MediaPeriod mediaPeriod) { assertTrue(preparedSource); + assertNotNull(this.mediaPeriod); + assertFalse(releasedPeriod); assertFalse(releasedSource); - assertTrue(activeMediaPeriods.remove(mediaPeriod)); - ((FakeMediaPeriod) mediaPeriod).release(); + assertEquals(this.mediaPeriod, mediaPeriod); + this.mediaPeriod.release(); + releasedPeriod = true; } @Override public void releaseSource() { assertTrue(preparedSource); + assertNotNull(this.mediaPeriod); + assertTrue(releasedPeriod); assertFalse(releasedSource); - assertTrue(activeMediaPeriods.isEmpty()); releasedSource = true; } @@ -400,6 +400,7 @@ public final class ExoPlayerTest extends TestCase { public FakeVideoRenderer(Format expectedFormat) { super(C.TRACK_TYPE_VIDEO); + Assertions.checkArgument(MimeTypes.isVideo(expectedFormat.sampleMimeType)); this.expectedFormat = expectedFormat; } diff --git a/library/src/main/java/com/google/android/exoplayer2/BaseRenderer.java b/library/src/main/java/com/google/android/exoplayer2/BaseRenderer.java index 514bbca8f4..447e39bf52 100644 --- a/library/src/main/java/com/google/android/exoplayer2/BaseRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/BaseRenderer.java @@ -267,12 +267,6 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { return streamIsFinal ? C.RESULT_BUFFER_READ : C.RESULT_NOTHING_READ; } buffer.timeUs += streamOffsetUs; - } else if (result == C.RESULT_FORMAT_READ) { - Format format = formatHolder.format; - if (format.subsampleOffsetUs != Format.OFFSET_SAMPLE_RELATIVE) { - format = format.copyWithSubsampleOffsetUs(format.subsampleOffsetUs + streamOffsetUs); - formatHolder.format = format; - } } return result; } 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 5cef177517..3e6fac4a5e 100644 --- a/library/src/main/java/com/google/android/exoplayer2/C.java +++ b/library/src/main/java/com/google/android/exoplayer2/C.java @@ -96,13 +96,6 @@ public final class C { @SuppressWarnings("InlinedApi") public static final int CRYPTO_MODE_AES_CBC = MediaCodec.CRYPTO_MODE_AES_CBC; - /** - * Represents an unset {@link android.media.AudioTrack} session identifier. Equal to - * {@link AudioManager#AUDIO_SESSION_ID_GENERATE}. - */ - @SuppressWarnings("InlinedApi") - public static final int AUDIO_SESSION_ID_UNSET = AudioManager.AUDIO_SESSION_ID_GENERATE; - /** * Represents an audio encoding, or an invalid or unset value. */ 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 ab4e59e08f..a7cbeb524c 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -332,10 +332,8 @@ import java.util.concurrent.CopyOnWriteArraySet; case ExoPlayerImplInternal.MSG_SEEK_ACK: { if (--pendingSeekAcks == 0) { playbackInfo = (ExoPlayerImplInternal.PlaybackInfo) msg.obj; - if (msg.arg1 != 0) { - for (EventListener listener : listeners) { - listener.onPositionDiscontinuity(); - } + for (EventListener listener : listeners) { + listener.onPositionDiscontinuity(); } } break; 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 afae56f1aa..66be6b7478 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -559,7 +559,7 @@ import java.io.IOException; // The seek position was valid for the timeline that it was performed into, but the // timeline has changed and a suitable seek position could not be resolved in the new one. playbackInfo = new PlaybackInfo(0, 0); - eventHandler.obtainMessage(MSG_SEEK_ACK, 1, 0, playbackInfo).sendToTarget(); + eventHandler.obtainMessage(MSG_SEEK_ACK, playbackInfo).sendToTarget(); // Set the internal position to (0,TIME_UNSET) so that a subsequent seek to (0,0) isn't // ignored. playbackInfo = new PlaybackInfo(0, C.TIME_UNSET); @@ -569,7 +569,6 @@ import java.io.IOException; return; } - boolean seekPositionAdjusted = seekPosition.windowPositionUs == C.TIME_UNSET; int periodIndex = periodPosition.first; long periodPositionUs = periodPosition.second; @@ -579,13 +578,10 @@ import java.io.IOException; // Seek position equals the current position. Do nothing. return; } - long newPeriodPositionUs = seekToPeriodPosition(periodIndex, periodPositionUs); - seekPositionAdjusted |= periodPositionUs != newPeriodPositionUs; - periodPositionUs = newPeriodPositionUs; + periodPositionUs = seekToPeriodPosition(periodIndex, periodPositionUs); } finally { playbackInfo = new PlaybackInfo(periodIndex, periodPositionUs); - eventHandler.obtainMessage(MSG_SEEK_ACK, seekPositionAdjusted ? 1 : 0, 0, playbackInfo) - .sendToTarget(); + eventHandler.obtainMessage(MSG_SEEK_ACK, playbackInfo).sendToTarget(); } } @@ -680,7 +676,6 @@ import java.io.IOException; standaloneMediaClock.stop(); rendererMediaClock = null; rendererMediaClockSource = null; - rendererPositionUs = RENDERER_TIMESTAMP_OFFSET_US; for (Renderer renderer : enabledRenderers) { try { ensureStopped(renderer); @@ -828,6 +823,9 @@ import java.io.IOException; } private boolean haveSufficientBuffer(boolean rebuffering) { + if (loadingPeriodHolder == null) { + return false; + } long loadingPeriodBufferedPositionUs = !loadingPeriodHolder.prepared ? loadingPeriodHolder.startPositionUs : loadingPeriodHolder.mediaPeriod.getBufferedPositionUs(); @@ -1289,8 +1287,7 @@ import java.io.IOException; } private void maybeContinueLoading() { - long nextLoadPositionUs = !loadingPeriodHolder.prepared ? 0 - : loadingPeriodHolder.mediaPeriod.getNextLoadPositionUs(); + long nextLoadPositionUs = loadingPeriodHolder.mediaPeriod.getNextLoadPositionUs(); if (nextLoadPositionUs == C.TIME_END_OF_SOURCE) { setIsLoading(false); } else { diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java index ea522ac4c8..45f63d713d 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java @@ -23,7 +23,7 @@ public interface ExoPlayerLibraryInfo { /** * The version of the library, expressed as a string. */ - String VERSION = "2.1.1"; + String VERSION = "2.1.0"; /** * The version of the library, expressed as an integer. @@ -32,7 +32,7 @@ public interface ExoPlayerLibraryInfo { * corresponding integer version 1002003 (001-002-003), and "123.45.6" has the corresponding * integer version 123045006 (123-045-006). */ - int VERSION_INT = 2001001; + int VERSION_INT = 2001000; /** * Whether the library was compiled with {@link com.google.android.exoplayer2.util.Assertions} 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 73df6a1e7a..36753309e2 100644 --- a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -29,6 +29,7 @@ import android.view.SurfaceView; import android.view.TextureView; import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioRendererEventListener; +import com.google.android.exoplayer2.audio.AudioTrack; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.drm.DrmSessionManager; @@ -177,7 +178,7 @@ public class SimpleExoPlayer implements ExoPlayer { // Set initial values. audioVolume = 1; - audioSessionId = C.AUDIO_SESSION_ID_UNSET; + audioSessionId = AudioTrack.SESSION_ID_NOT_SET; audioStreamType = C.STREAM_TYPE_DEFAULT; videoScalingMode = C.VIDEO_SCALING_MODE_DEFAULT; @@ -392,7 +393,7 @@ public class SimpleExoPlayer implements ExoPlayer { } /** - * Returns the audio session identifier, or {@link C#AUDIO_SESSION_ID_UNSET} if not set. + * Returns the audio session identifier, or {@code AudioTrack.SESSION_ID_NOT_SET} if not set. */ public int getAudioSessionId() { return audioSessionId; @@ -948,7 +949,7 @@ public class SimpleExoPlayer implements ExoPlayer { } audioFormat = null; audioDecoderCounters = null; - audioSessionId = C.AUDIO_SESSION_ID_UNSET; + audioSessionId = AudioTrack.SESSION_ID_NOT_SET; } // TextRenderer.Output implementation diff --git a/library/src/main/java/com/google/android/exoplayer2/audio/AudioTrack.java b/library/src/main/java/com/google/android/exoplayer2/audio/AudioTrack.java index 072180db94..8e6cf68dc8 100644 --- a/library/src/main/java/com/google/android/exoplayer2/audio/AudioTrack.java +++ b/library/src/main/java/com/google/android/exoplayer2/audio/AudioTrack.java @@ -17,7 +17,6 @@ package com.google.android.exoplayer2.audio; import android.annotation.SuppressLint; import android.annotation.TargetApi; -import android.media.AudioAttributes; import android.media.AudioFormat; import android.media.AudioTimestamp; import android.media.PlaybackParams; @@ -31,28 +30,26 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.Util; import java.lang.reflect.Method; import java.nio.ByteBuffer; -import java.nio.ByteOrder; /** * Plays audio data. The implementation delegates to an {@link android.media.AudioTrack} and handles * playback position smoothing, non-blocking writes and reconfiguration. *

* Before starting playback, specify the input format by calling - * {@link #configure(String, int, int, int, int)}. Next call {@link #initialize(int)} or - * {@link #initializeV21(int, boolean)}, optionally specifying an audio session and whether the - * track is to be used with tunneling video playback. + * {@link #configure(String, int, int, int, int)}. Next call {@link #initialize(int)}, optionally + * specifying an audio session. *

* Call {@link #handleBuffer(ByteBuffer, long)} to write data, and {@link #handleDiscontinuity()} * when the data being fed is discontinuous. Call {@link #play()} to start playing the written data. *

* Call {@link #configure(String, int, int, int, int)} whenever the input format changes. If * {@link #isInitialized()} returns {@code false} after the call, it is necessary to call - * {@link #initialize(int)} or {@link #initializeV21(int, boolean)} before writing more data. + * {@link #initialize(int)} before writing more data. *

* The underlying {@link android.media.AudioTrack} is created by {@link #initialize(int)} and * released by {@link #reset()} (and {@link #configure(String, int, int, int, int)} unless the input - * format is unchanged). It is safe to call {@link #initialize(int)} or - * {@link #initializeV21(int, boolean)} after calling {@link #reset()} without reconfiguration. + * format is unchanged). It is safe to call {@link #initialize(int)} after calling {@link #reset()} + * without reconfiguration. *

* Call {@link #release()} when the instance is no longer required. */ @@ -146,6 +143,11 @@ public final class AudioTrack { */ public static final int RESULT_BUFFER_CONSUMED = 2; + /** + * Represents an unset {@link android.media.AudioTrack} session identifier. + */ + public static final int SESSION_ID_NOT_SET = 0; + /** * Returned by {@link #getCurrentPositionUs} when the position is not set. */ @@ -271,10 +273,6 @@ public final class AudioTrack { private int bufferSize; private long bufferSizeUs; - private boolean useHwAvSync; - private ByteBuffer avSyncHeader; - private int bytesUntilNextAvSync; - private int nextPlayheadOffsetIndex; private int playheadOffsetCount; private long smoothedPlayheadOffsetUs; @@ -343,8 +341,8 @@ public final class AudioTrack { } /** - * Returns whether the audio track has been successfully initialized via {@link #initialize} or - * {@link #initializeV21(int, boolean)}, and has not yet been {@link #reset}. + * Returns whether the audio track has been successfully initialized via {@link #initialize} and + * not yet {@link #reset}. */ public boolean isInitialized() { return audioTrack != null; @@ -444,21 +442,6 @@ public final class AudioTrack { throw new IllegalArgumentException("Unsupported channel count: " + channelCount); } - // Workaround for overly strict channel configuration checks on nVidia Shield. - if (Util.SDK_INT <= 23 && "foster".equals(Util.DEVICE) && "NVIDIA".equals(Util.MANUFACTURER)) { - switch(channelCount) { - case 7: - channelConfig = C.CHANNEL_OUT_7POINT1_SURROUND; - break; - case 3: - case 5: - channelConfig = AudioFormat.CHANNEL_OUT_5POINT1; - break; - default: - break; - } - } - boolean passthrough = !MimeTypes.AUDIO_RAW.equals(mimeType); @C.Encoding int sourceEncoding; if (passthrough) { @@ -515,28 +498,11 @@ public final class AudioTrack { /** * Initializes the audio track for writing new buffers using {@link #handleBuffer}. * - * @param sessionId Audio track session identifier, or {@link C#AUDIO_SESSION_ID_UNSET} to create - * one. - * @return The audio track session identifier. + * @param sessionId Audio track session identifier to re-use, or {@link #SESSION_ID_NOT_SET} to + * create a new one. + * @return The new (or re-used) session identifier. */ public int initialize(int sessionId) throws InitializationException { - return initializeInternal(sessionId, false); - } - - /** - * Initializes the audio track for writing new buffers using {@link #handleBuffer}. - * - * @param sessionId Audio track session identifier, or {@link C#AUDIO_SESSION_ID_UNSET} to create - * one. - * @param tunneling Whether the audio track is to be used with tunneling video playback. - * @return The audio track session identifier. - */ - public int initializeV21(int sessionId, boolean tunneling) throws InitializationException { - Assertions.checkState(Util.SDK_INT >= 21); - return initializeInternal(sessionId, tunneling); - } - - private int initializeInternal(int sessionId, boolean tunneling) throws InitializationException { // If we're asynchronously releasing a previous audio track then we block until it has been // released. This guarantees that we cannot end up in a state where we have multiple audio // track instances. Without this guarantee it would be possible, in extreme cases, to exhaust @@ -544,11 +510,7 @@ public final class AudioTrack { // initialization of the audio track to fail. releasingConditionVariable.block(); - useHwAvSync = tunneling; - if (useHwAvSync) { - audioTrack = createHwAvSyncAudioTrackV21(sampleRate, channelConfig, targetEncoding, - bufferSize, sessionId); - } else if (sessionId == C.AUDIO_SESSION_ID_UNSET) { + if (sessionId == SESSION_ID_NOT_SET) { audioTrack = new android.media.AudioTrack(streamType, sampleRate, channelConfig, targetEncoding, bufferSize, MODE_STREAM); } else { @@ -730,9 +692,7 @@ public final class AudioTrack { buffer.position(buffer.position() + bytesWritten); } } else { - bytesWritten = useHwAvSync - ? writeNonBlockingWithAvSyncV21(audioTrack, buffer, bytesRemaining, presentationTimeUs) - : writeNonBlockingV21(audioTrack, buffer, bytesRemaining); + bytesWritten = writeNonBlockingV21(audioTrack, buffer, bytesRemaining); } if (bytesWritten < 0) { @@ -758,7 +718,6 @@ public final class AudioTrack { public void handleEndOfStream() { if (isInitialized()) { audioTrackUtil.handleEndOfStream(getSubmittedFrames()); - bytesUntilNextAvSync = 0; } } @@ -784,27 +743,19 @@ public final class AudioTrack { } /** - * Sets the stream type for audio track. If the stream type has changed and if the audio track - * is not configured for use with video tunneling, then the audio track is reset and the caller - * must re-initialize the audio track before writing more data. The caller must not reuse the - * audio session identifier when re-initializing with a new stream type. - *

- * If the audio track is configured for use with video tunneling then the stream type is ignored - * and the audio track is not reset. The passed stream type will be used if the audio track is - * later re-configured into non-tunneled mode. + * Sets the stream type for audio track. If the stream type has changed, {@link #isInitialized()} + * will return {@code false} and the caller must re-{@link #initialize(int)} the audio track + * before writing more data. The caller must not reuse the audio session identifier when + * re-initializing with a new stream type. * * @param streamType The {@link C.StreamType} to use for audio output. - * @return Whether the audio track was reset as a result of this call. + * @return Whether the stream type changed. */ public boolean setStreamType(@C.StreamType int streamType) { if (this.streamType == streamType) { return false; } this.streamType = streamType; - if (useHwAvSync) { - // The stream type is ignored in tunneling mode, so no need to reset. - return false; - } reset(); return true; } @@ -844,9 +795,9 @@ public final class AudioTrack { /** * Releases the underlying audio track asynchronously. *

- * Calling {@link #initialize(int)} or {@link #initializeV21(int, boolean)} will block until the - * audio track has been released, so it is safe to initialize immediately after a reset. The audio - * session may remain active until {@link #release()} is called. + * Calling {@link #initialize(int)} will block until the audio track has been released, so it is + * safe to initialize immediately after a reset. The audio session may remain active until + * {@link #release()} is called. */ public void reset() { if (isInitialized()) { @@ -854,7 +805,6 @@ public final class AudioTrack { submittedEncodedFrames = 0; framesPerEncodedSample = 0; currentSourceBuffer = null; - avSyncHeader = null; startMediaTimeState = START_NOT_SET; latencyUs = 0; resetSyncParams(); @@ -1070,26 +1020,6 @@ public final class AudioTrack { && audioTrack.getPlaybackHeadPosition() == 0; } - /** - * Instantiates an {@link android.media.AudioTrack} to be used with tunneling video playback. - */ - @TargetApi(21) - private static android.media.AudioTrack createHwAvSyncAudioTrackV21(int sampleRate, - int channelConfig, int encoding, int bufferSize, int sessionId) { - AudioAttributes attributesBuilder = new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MOVIE) - .setFlags(AudioAttributes.FLAG_HW_AV_SYNC) - .build(); - AudioFormat format = new AudioFormat.Builder() - .setChannelMask(channelConfig) - .setEncoding(encoding) - .setSampleRate(sampleRate) - .build(); - return new android.media.AudioTrack(attributesBuilder, format, bufferSize, MODE_STREAM, - sessionId); - } - /** * Converts the provided buffer into 16-bit PCM. * @@ -1195,50 +1125,11 @@ public final class AudioTrack { } @TargetApi(21) - private static int writeNonBlockingV21(android.media.AudioTrack audioTrack, ByteBuffer buffer, - int size) { + private static int writeNonBlockingV21( + android.media.AudioTrack audioTrack, ByteBuffer buffer, int size) { return audioTrack.write(buffer, size, WRITE_NON_BLOCKING); } - @TargetApi(21) - private int writeNonBlockingWithAvSyncV21(android.media.AudioTrack audioTrack, - ByteBuffer buffer, int size, long presentationTimeUs) { - // TODO: Uncomment this when [Internal ref b/33627517] is clarified or fixed. - // if (Util.SDK_INT >= 23) { - // // The underlying platform AudioTrack writes AV sync headers directly. - // return audioTrack.write(buffer, size, WRITE_NON_BLOCKING, presentationTimeUs * 1000); - // } - if (avSyncHeader == null) { - avSyncHeader = ByteBuffer.allocate(16); - avSyncHeader.order(ByteOrder.BIG_ENDIAN); - avSyncHeader.putInt(0x55550001); - } - if (bytesUntilNextAvSync == 0) { - avSyncHeader.putInt(4, size); - avSyncHeader.putLong(8, presentationTimeUs * 1000); - avSyncHeader.position(0); - bytesUntilNextAvSync = size; - } - int avSyncHeaderBytesRemaining = avSyncHeader.remaining(); - if (avSyncHeaderBytesRemaining > 0) { - int result = audioTrack.write(avSyncHeader, avSyncHeaderBytesRemaining, WRITE_NON_BLOCKING); - if (result < 0) { - bytesUntilNextAvSync = 0; - return result; - } - if (result < avSyncHeaderBytesRemaining) { - return 0; - } - } - int result = writeNonBlockingV21(audioTrack, buffer, size); - if (result < 0) { - bytesUntilNextAvSync = 0; - return result; - } - bytesUntilNextAvSync -= result; - return result; - } - @TargetApi(21) private static void setAudioTrackVolumeV21(android.media.AudioTrack audioTrack, float volume) { audioTrack.setVolume(volume); diff --git a/library/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index d3cde10afb..648bfd5762 100644 --- a/library/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -129,7 +129,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media boolean playClearSamplesWithoutKeys, Handler eventHandler, AudioRendererEventListener eventListener, AudioCapabilities audioCapabilities) { super(C.TRACK_TYPE_AUDIO, mediaCodecSelector, drmSessionManager, playClearSamplesWithoutKeys); - audioSessionId = C.AUDIO_SESSION_ID_UNSET; + audioSessionId = AudioTrack.SESSION_ID_NOT_SET; audioTrack = new AudioTrack(audioCapabilities, this); eventDispatcher = new EventDispatcher(eventHandler, eventListener); } @@ -274,7 +274,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media @Override protected void onDisabled() { - audioSessionId = C.AUDIO_SESSION_ID_UNSET; + audioSessionId = AudioTrack.SESSION_ID_NOT_SET; try { audioTrack.release(); } finally { @@ -328,8 +328,8 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media if (!audioTrack.isInitialized()) { // Initialize the AudioTrack now. try { - if (audioSessionId == C.AUDIO_SESSION_ID_UNSET) { - audioSessionId = audioTrack.initialize(C.AUDIO_SESSION_ID_UNSET); + if (audioSessionId == AudioTrack.SESSION_ID_NOT_SET) { + audioSessionId = audioTrack.initialize(AudioTrack.SESSION_ID_NOT_SET); eventDispatcher.audioSessionId(audioSessionId); onAudioSessionId(audioSessionId); } else { @@ -387,7 +387,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media case C.MSG_SET_STREAM_TYPE: @C.StreamType int streamType = (Integer) message; if (audioTrack.setStreamType(streamType)) { - audioSessionId = C.AUDIO_SESSION_ID_UNSET; + audioSessionId = AudioTrack.SESSION_ID_NOT_SET; } break; default: diff --git a/library/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java b/library/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java index 5c9acc7739..572f7b54c1 100644 --- a/library/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/audio/SimpleDecoderAudioRenderer.java @@ -145,7 +145,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements this.drmSessionManager = drmSessionManager; formatHolder = new FormatHolder(); this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys; - audioSessionId = C.AUDIO_SESSION_ID_UNSET; + audioSessionId = AudioTrack.SESSION_ID_NOT_SET; decoderReinitializationState = REINITIALIZATION_STATE_NONE; audioTrackNeedsConfigure = true; } @@ -245,8 +245,8 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements } if (!audioTrack.isInitialized()) { - if (audioSessionId == C.AUDIO_SESSION_ID_UNSET) { - audioSessionId = audioTrack.initialize(C.AUDIO_SESSION_ID_UNSET); + if (audioSessionId == AudioTrack.SESSION_ID_NOT_SET) { + audioSessionId = audioTrack.initialize(AudioTrack.SESSION_ID_NOT_SET); eventDispatcher.audioSessionId(audioSessionId); onAudioSessionId(audioSessionId); } else { @@ -425,7 +425,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements @Override protected void onDisabled() { inputFormat = null; - audioSessionId = C.AUDIO_SESSION_ID_UNSET; + audioSessionId = AudioTrack.SESSION_ID_NOT_SET; audioTrackNeedsConfigure = true; waitingForKeys = false; try { @@ -554,7 +554,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements case C.MSG_SET_STREAM_TYPE: @C.StreamType int streamType = (Integer) message; if (audioTrack.setStreamType(streamType)) { - audioSessionId = C.AUDIO_SESSION_ID_UNSET; + audioSessionId = AudioTrack.SESSION_ID_NOT_SET; } break; default: diff --git a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java index 8ab4d45c47..0b7190d382 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java @@ -244,7 +244,7 @@ import java.io.IOException; @Override public long getNextLoadPositionUs() { - return enabledTrackCount == 0 ? C.TIME_END_OF_SOURCE : getBufferedPositionUs(); + return getBufferedPositionUs(); } @Override diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java index f4a9665b10..a3c1c88df4 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java @@ -133,32 +133,4 @@ public interface MediaPeriod extends SequenceableLoader { */ long seekToUs(long positionUs); - // SequenceableLoader interface. Overridden to provide more specific documentation. - - /** - * Returns the next load time, or {@link C#TIME_END_OF_SOURCE} if loading has finished. - *

- * This method should only be called after the period has been prepared. It may be called when no - * tracks are selected. - */ - @Override - long getNextLoadPositionUs(); - - /** - * Attempts to continue loading. - *

- * This method may be called both during and after the period has been prepared. - *

- * A period may call {@link Callback#onContinueLoadingRequested(SequenceableLoader)} on the - * {@link Callback} passed to {@link #prepare(Callback)} to request that this method be called - * when the period is permitted to continue loading data. A period may do this both during and - * after preparation. - * - * @param positionUs The current playback position. - * @return True if progress was made, meaning that {@link #getNextLoadPositionUs()} will return - * a different value than prior to the call. False otherwise. - */ - @Override - boolean continueLoading(long positionUs); - } diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 869efa6cdc..2f46fc694c 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -104,14 +104,15 @@ public final class HlsMediaSource implements MediaSource, SinglePeriodTimeline timeline; if (playlistTracker.isLive()) { // TODO: fix windowPositionInPeriodUs when playlist is empty. + long windowPositionInPeriodUs = playlist.startTimeUs; List segments = playlist.segments; long windowDefaultStartPositionUs = segments.isEmpty() ? 0 : segments.get(Math.max(0, segments.size() - 3)).relativeStartTimeUs; timeline = new SinglePeriodTimeline(C.TIME_UNSET, playlist.durationUs, - playlist.startTimeUs, windowDefaultStartPositionUs, true, !playlist.hasEndTag); + windowPositionInPeriodUs, windowDefaultStartPositionUs, true, !playlist.hasEndTag); } else /* not live */ { - timeline = new SinglePeriodTimeline(playlist.startTimeUs + playlist.durationUs, - playlist.durationUs, playlist.startTimeUs, 0, true, false); + timeline = new SinglePeriodTimeline(playlist.durationUs, playlist.durationUs, 0, 0, true, + false); } sourceListener.onSourceInfoRefreshed(timeline, playlist); } diff --git a/library/src/main/java/com/google/android/exoplayer2/text/Cue.java b/library/src/main/java/com/google/android/exoplayer2/text/Cue.java index c4c5a7e4ca..1c29f10c84 100644 --- a/library/src/main/java/com/google/android/exoplayer2/text/Cue.java +++ b/library/src/main/java/com/google/android/exoplayer2/text/Cue.java @@ -15,7 +15,6 @@ */ package com.google.android.exoplayer2.text; -import android.graphics.Color; import android.support.annotation.IntDef; import android.text.Layout.Alignment; import java.lang.annotation.Retention; @@ -37,23 +36,19 @@ public class Cue { @Retention(RetentionPolicy.SOURCE) @IntDef({TYPE_UNSET, ANCHOR_TYPE_START, ANCHOR_TYPE_MIDDLE, ANCHOR_TYPE_END}) public @interface AnchorType {} - /** * An unset anchor or line type value. */ public static final int TYPE_UNSET = Integer.MIN_VALUE; - /** * Anchors the left (for horizontal positions) or top (for vertical positions) edge of the cue * box. */ public static final int ANCHOR_TYPE_START = 0; - /** * Anchors the middle of the cue box. */ public static final int ANCHOR_TYPE_MIDDLE = 1; - /** * Anchors the right (for horizontal positions) or bottom (for vertical positions) edge of the cue * box. @@ -66,12 +61,10 @@ public class Cue { @Retention(RetentionPolicy.SOURCE) @IntDef({TYPE_UNSET, LINE_TYPE_FRACTION, LINE_TYPE_NUMBER}) public @interface LineType {} - /** * Value for {@link #lineType} when {@link #line} is a fractional position. */ public static final int LINE_TYPE_FRACTION = 0; - /** * Value for {@link #lineType} when {@link #line} is a line number. */ @@ -81,12 +74,10 @@ public class Cue { * The cue text. Note the {@link CharSequence} may be decorated with styling spans. */ public final CharSequence text; - /** * The alignment of the cue text within the cue box, or null if the alignment is undefined. */ public final Alignment textAlignment; - /** * The position of the {@link #lineAnchor} of the cue box within the viewport in the direction * orthogonal to the writing direction, or {@link #DIMEN_UNSET}. When set, the interpretation of @@ -95,7 +86,6 @@ public class Cue { * For horizontal text and {@link #lineType} equal to {@link #LINE_TYPE_FRACTION}, this is the * fractional vertical position relative to the top of the viewport. */ - public final float line; /** * The type of the {@link #line} value. @@ -122,7 +112,6 @@ public class Cue { * {@code (line == -2 && lineAnchor == ANCHOR_TYPE_START)} position a cue so that only its first * line is visible at the bottom of the viewport. */ - @LineType public final int lineType; /** @@ -133,7 +122,6 @@ public class Cue { * and {@link #ANCHOR_TYPE_END} correspond to the top, middle and bottom of the cue box * respectively. */ - @AnchorType public final int lineAnchor; /** @@ -145,7 +133,6 @@ public class Cue { * text. */ public final float position; - /** * The cue box anchor positioned by {@link #position}. One of {@link #ANCHOR_TYPE_START}, * {@link #ANCHOR_TYPE_MIDDLE}, {@link #ANCHOR_TYPE_END} and {@link #TYPE_UNSET}. @@ -156,23 +143,12 @@ public class Cue { */ @AnchorType public final int positionAnchor; - /** * The size of the cue box in the writing direction specified as a fraction of the viewport size * in that direction, or {@link #DIMEN_UNSET}. */ public final float size; - /** - * Specifies whether or not the {@link #windowColor} property is set. - */ - public final boolean windowColorSet; - - /** - * The fill color of the window. - */ - public final int windowColor; - /** * Constructs a cue whose {@link #textAlignment} is null, whose type parameters are set to * {@link #TYPE_UNSET} and whose dimension parameters are set to {@link #DIMEN_UNSET}. @@ -195,25 +171,6 @@ public class Cue { */ public Cue(CharSequence text, Alignment textAlignment, float line, @LineType int lineType, @AnchorType int lineAnchor, float position, @AnchorType int positionAnchor, float size) { - this(text, textAlignment, line, lineType, lineAnchor, position, positionAnchor, size, false, - Color.BLACK); - } - - /** - * @param text See {@link #text}. - * @param textAlignment See {@link #textAlignment}. - * @param line See {@link #line}. - * @param lineType See {@link #lineType}. - * @param lineAnchor See {@link #lineAnchor}. - * @param position See {@link #position}. - * @param positionAnchor See {@link #positionAnchor}. - * @param size See {@link #size}. - * @param windowColorSet See {@link #windowColorSet}. - * @param windowColor See {@link #windowColor}. - */ - public Cue(CharSequence text, Alignment textAlignment, float line, @LineType int lineType, - @AnchorType int lineAnchor, float position, @AnchorType int positionAnchor, float size, - boolean windowColorSet, int windowColor) { this.text = text; this.textAlignment = textAlignment; this.line = line; @@ -222,8 +179,6 @@ public class Cue { this.position = position; this.positionAnchor = positionAnchor; this.size = size; - this.windowColorSet = windowColorSet; - this.windowColor = windowColor; } } diff --git a/library/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java b/library/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java index 8ac0c64082..d094266fcc 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java +++ b/library/src/main/java/com/google/android/exoplayer2/ui/SimpleExoPlayerView.java @@ -65,13 +65,6 @@ import java.util.List; *

  • Default: {@code true}
  • * * - *
  • {@code default_artwork} - Default artwork to use if no artwork available in audio - * streams. - *
      - *
    • Corresponding method: {@link #setDefaultArtwork(Bitmap)}
    • - *
    • Default: {@code null}
    • - *
    - *
  • *
  • {@code use_controller} - Whether playback controls are displayed. *
      *
    • Corresponding method: {@link #setUseController(boolean)}
    • @@ -186,7 +179,6 @@ public final class SimpleExoPlayerView extends FrameLayout { private SimpleExoPlayer player; private boolean useController; private boolean useArtwork; - private Bitmap defaultArtwork; private int controllerShowTimeoutMs; public SimpleExoPlayerView(Context context) { @@ -202,7 +194,6 @@ public final class SimpleExoPlayerView extends FrameLayout { int playerLayoutId = R.layout.exo_simple_player_view; boolean useArtwork = true; - int defaultArtwork = 0; boolean useController = true; int surfaceType = SURFACE_TYPE_SURFACE_VIEW; int resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT; @@ -214,8 +205,6 @@ public final class SimpleExoPlayerView extends FrameLayout { playerLayoutId = a.getResourceId(R.styleable.SimpleExoPlayerView_player_layout_id, playerLayoutId); useArtwork = a.getBoolean(R.styleable.SimpleExoPlayerView_use_artwork, useArtwork); - defaultArtwork = a.getResourceId(R.styleable.SimpleExoPlayerView_default_artwork, - defaultArtwork); useController = a.getBoolean(R.styleable.SimpleExoPlayerView_use_controller, useController); surfaceType = a.getInt(R.styleable.SimpleExoPlayerView_surface_type, surfaceType); resizeMode = a.getInt(R.styleable.SimpleExoPlayerView_resize_mode, resizeMode); @@ -257,9 +246,6 @@ public final class SimpleExoPlayerView extends FrameLayout { // Artwork view. artworkView = (ImageView) findViewById(R.id.exo_artwork); this.useArtwork = useArtwork && artworkView != null; - if (defaultArtwork != 0) { - this.defaultArtwork = BitmapFactory.decodeResource(context.getResources(), defaultArtwork); - } // Subtitle view. subtitleView = (SubtitleView) findViewById(R.id.exo_subtitles); @@ -365,26 +351,6 @@ public final class SimpleExoPlayerView extends FrameLayout { } } - /** - * Returns the default artwork to display. - */ - public Bitmap getDefaultArtwork() { - return defaultArtwork; - } - - /** - * Sets the default artwork to display if {@code useArtwork} is {@code true} and no artwork is - * present in the media. - * - * @param defaultArtwork the default artwork to display. - */ - public void setDefaultArtwork(Bitmap defaultArtwork) { - if (this.defaultArtwork != defaultArtwork) { - this.defaultArtwork = defaultArtwork; - updateForCurrentTrackSelections(); - } - } - /** * Returns whether the playback controls are enabled. */ @@ -603,9 +569,6 @@ public final class SimpleExoPlayerView extends FrameLayout { } } } - if (setArtworkFromBitmap(defaultArtwork)) { - return; - } } // Artwork disabled or unavailable. hideArtwork(); @@ -617,23 +580,18 @@ public final class SimpleExoPlayerView extends FrameLayout { if (metadataEntry instanceof ApicFrame) { byte[] bitmapData = ((ApicFrame) metadataEntry).pictureData; Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length); - return setArtworkFromBitmap(bitmap); - } - } - return false; - } - - private boolean setArtworkFromBitmap(Bitmap bitmap) { - if (bitmap != null) { - int bitmapWidth = bitmap.getWidth(); - int bitmapHeight = bitmap.getHeight(); - if (bitmapWidth > 0 && bitmapHeight > 0) { - if (contentFrame != null) { - contentFrame.setAspectRatio((float) bitmapWidth / bitmapHeight); + if (bitmap != null) { + int bitmapWidth = bitmap.getWidth(); + int bitmapHeight = bitmap.getHeight(); + if (bitmapWidth > 0 && bitmapHeight > 0) { + if (contentFrame != null) { + contentFrame.setAspectRatio((float) bitmapWidth / bitmapHeight); + } + artworkView.setImageBitmap(bitmap); + artworkView.setVisibility(VISIBLE); + return true; + } } - artworkView.setImageBitmap(bitmap); - artworkView.setVisibility(VISIBLE); - return true; } } return false; diff --git a/library/src/main/java/com/google/android/exoplayer2/ui/SubtitlePainter.java b/library/src/main/java/com/google/android/exoplayer2/ui/SubtitlePainter.java index 04f3b986bd..de461ecf0d 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ui/SubtitlePainter.java +++ b/library/src/main/java/com/google/android/exoplayer2/ui/SubtitlePainter.java @@ -146,13 +146,9 @@ import com.google.android.exoplayer2.util.Util; // Nothing to draw. return; } - - int windowColor = cue.windowColorSet ? cue.windowColor : style.windowColor; - if (!applyEmbeddedStyles) { // Strip out any embedded styling. cueText = cueText.toString(); - windowColor = style.windowColor; } if (areCharSequencesEqual(this.cueText, cueText) && Util.areEqual(this.cueTextAlignment, cue.textAlignment) @@ -165,7 +161,7 @@ import com.google.android.exoplayer2.util.Util; && this.applyEmbeddedStyles == applyEmbeddedStyles && this.foregroundColor == style.foregroundColor && this.backgroundColor == style.backgroundColor - && this.windowColor == windowColor + && this.windowColor == style.windowColor && this.edgeType == style.edgeType && this.edgeColor == style.edgeColor && Util.areEqual(this.textPaint.getTypeface(), style.typeface) @@ -191,7 +187,7 @@ import com.google.android.exoplayer2.util.Util; this.applyEmbeddedStyles = applyEmbeddedStyles; this.foregroundColor = style.foregroundColor; this.backgroundColor = style.backgroundColor; - this.windowColor = windowColor; + this.windowColor = style.windowColor; this.edgeType = style.edgeType; this.edgeColor = style.edgeColor; this.textPaint.setTypeface(style.typeface); diff --git a/library/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index f68b72fb65..2a13953106 100644 --- a/library/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -403,7 +403,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { bufferPresentationTimeUs, unadjustedFrameReleaseTimeNs); earlyUs = (adjustedReleaseTimeNs - systemTimeNs) / 1000; - if (shouldDropOutputBuffer(earlyUs, elapsedRealtimeUs)) { + if (earlyUs < -30000) { // We're more than 30ms late rendering the frame. dropOutputBuffer(codec, bufferIndex); return true; @@ -437,17 +437,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { return false; } - /** - * Returns true if the current frame should be dropped. - * - * @param earlyUs Time indicating how early the frame is. Negative values indicate late frame. - * @param elapsedRealtimeUs Wall clock time. - */ - protected boolean shouldDropOutputBuffer(long earlyUs, long elapsedRealtimeUs) { - // Drop the frame if we're more than 30ms late rendering the frame. - return earlyUs < -30000; - } - private void skipOutputBuffer(MediaCodec codec, int bufferIndex) { TraceUtil.beginSection("skipVideoBuffer"); codec.releaseOutputBuffer(bufferIndex, false); diff --git a/library/src/main/res/drawable-hdpi/exo_controls_fastforward.png b/library/src/main/res/drawable-hdpi/exo_controls_fastforward.png index 843df84091bb7e43f85088e2985cb17712eb4b12..c65956ab7fc4dcac4a6132640084c8d4668f9dbf 100644 GIT binary patch delta 1104 zcmaFFbcMx+U^_gj^1@8YC}WVVkI$qE~N<)EOXSZ-|||i(HNxp=G@0cv0k_D=6YUPy)S&S z&CSZRXFh5C0sgjM|9qZcx+9C1g`wdfgF%q+-B}AfEbJv#dSwfVsC`s&^4-%Rxu&V% zk=NbKwbmaV2$c(om_0A-U*5sRKB=F(behJsgouX1Ip&;@Hgtk&S36ZFR{P^wjdR0@;-9A>E;ViSd9yRCm8%I41BpY8Nnx^3NDnJo*8 zqcSg=Ys#=PIItLeaadx$C-+;l)#K38+=L6$rish0aAj!dnBjP^w)XC?Qz45SEo-AR zwwXwK7oEGURsTDal`~*1Q^fIynQvaaySZ~lpG>$3yOfuz{nA=FnPb&Djh~t(t(-Gi z|Mk4&=hmYA!o05QT9Pkjf8WYrWszswzR1jR?Zl$bpLe#(Zct%7vRq9rZpWHe-%JE| z7phOo`drL6f5S(YYYGW$9x38#$B)Oo{WLMjU%t2BzuINRO#{RFwu+DSfxZWLlrr~K z8&%nFz4YX3)|qc5d6qApvprTmX5lD(Ib3jqiqfyIU*D}gzWMfE-P?7~RjdR2y)Sq? zG>lW&URfp1XguRc)wicdUR*9+y!B*^aowT(+9)?>wVvlYdQ&HqS}31m+H}gT^X2UF z_~lVGyUs@(C>1I32#et5u(0ZIS#eDYL1*Aq(|tgEp=fnDFBH=d3i}e`d^e zob$A%@FwgCw)if3RMvyR@RhlhXpX*_+O=1AR(jw5G+%ms(5LXI>rY)F=P| delta 338 zcmV-Y0j>Vp2;u^e8Gi-<00374`G)`i0VzpDK~#9!?UyZ%0znXk5r`ECBw_^;fkYrl zkO&Td-~b3Df+KJM1P4GM5gcFz5{W<}5eNhVF;s~O|C6TsbB*p*Y@i|!8NNONYJ&yv)Su)7m6LN6MQc?kUR)0PoL;>X>>3}@lJPM>t zB_&G_x`48kGytBRizh|_;lS3(gS#o?>rU-QWlajz%#%1 zSQb$Bk`~fqT|hslKGI`Z;NeFM@T`M=XpaN+DjYvwg(y$#0v{hE4^Pwj8qFLBzVOVT zV}-+kP6HXrgG(;pJQ6#2el3T&ua}Yx&(M0D_F4;3p3nl`i}@SRkL60~|CGOa+SW_` kB50Tbdk7(f5JJd}D`jHlVpJacasU7T07*qoM6N<$g8kTr0ssI2 diff --git a/library/src/main/res/drawable-hdpi/exo_controls_next.png b/library/src/main/res/drawable-hdpi/exo_controls_next.png index c37541472ebb20e052a5c4e68f82852d4a489ec0..6e27b8161e4a1d34f578a5673c040b4fad09c84e 100644 GIT binary patch delta 1063 zcmV+?1laq-0lvK(VzIz(ya%7O@O#$zri+l*Z_4=%%$8 zc_gi%o@JKZ;%SL{R1jFLqhU3@Sd3lZ9+lSluhpV7@2f8uwX;m=Z4so=tjLNVT19XS z5BZXnBrP()pnv*qIb2*UIR!Z)N62C82^nAzUzWTeA9{f-;WOASmfNm(rnegAv&Ro# z`r+cwUM90I7~mSWsA3Q>y*2A)Moy=CYR}G|DcMwSyFs)cvWf(@u>H{R$ibe>(>bTl zyu&HBX%tBn#K{=P$skIzbqN3fqE=+*8>c@W+VkhLN`J}S&WEy}R3inn`DA?n6#=yy z3vZtI z5w)oeuOImIgVzRTOQCi0*iN}8004*q)%=d5!ygT0-TAU(Oe}yK$EjHes>a>D|J7ZW zC&%w@aDU?vk^mYEo9lo3y0BJ&*h5~g z)&)>i690Pwwa)GdXP^pV%Cnaz$M0^bvK1Yy4yu7vY!;=ce$l)Hgn zZlC+^{vU;n*`8pIF|&msVw|B)0Eu#6p1U$RaVKl~y`ZKOT&Kb|w0YtD3xJAI{psr0 z7k*nRY|>2di1YfZIL-2;`CJD;R9!RoB)arpDFnYqmwx?dihzbyZ+~&0!^_|=^@O9 zg#Z8m6?8>dbVG7wVRUJ4ZXi@?ZDjyAFMl#NFEKIge-W<$001R)MObuXVRU6WV{&C- zbY%cCFflPLF)=MLH&ih(IyE&qF)%GKI65#eDvj*@0000bbVXQnWMOn=I&E)cX=Zr< zGB7bQEio}IFgH{&F*-9fIyE>gFgQ9eFa*Hfp8x;=9CSrkbW?9;ba!ELWdK2BZy;i2 hAVz6&Wp{6KYjYq&Q#En5<2C>Q002ovPDHLkV1ldaA&uI>ds|7if^nwEqEt&k}R z@(X5g;PIDueVZlw_jHBT=RXUWJnsHpeOP02w9fW;RW^Pzpt^cb7srr_xVM)qg$@}A zuwG>3G3w^Ik@o)g{K>04IW(I1PF(rP?e^C6Z?e~t}8mc^KVEOXY<)RyS%oA nDVdY8h==XT9hM(YvbWwlo}!Q;Ydn(!=oAJ|S3j3^P6E)*( diff --git a/library/src/main/res/drawable-hdpi/exo_controls_pause.png b/library/src/main/res/drawable-hdpi/exo_controls_pause.png index 0a23452746c0f33622ff4d909e2213b98ce990b9..1d465a41e4b087624ae5a4cb096aab184e9ca385 100644 GIT binary patch literal 599 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;M!Q z+(IDCccpZxz@0!tqFuMgM}_ z3T@4f=>}I?mz~|CC#BkH?AbCcY(~A|*n{@108Jgrt52XwcnW~7`1kbX8xPocPfn&*aV9GC*8iq>C(n~{y_8fTE*<$ zO3kTWO79;xcFgk=47@8_;>6^mQo4&XIL>gn-_NQ9H~BJ~ikervUqiH>74MJ9$^FkJ zb!Vcj_1UW_p%XOveogi5Ua?@oqr#P6m+lbSzQtr(c$3KvzMl-o?}a}1zT?**AHcxk z072Fc*`HPO6yrBdz7!Fcx%jrA0@JMYq*Dh~&IbgtxY(`}e#CIY#Ax^7qC&Z~ix%E( zyxyC8i*Lh$E^FUy&mS73on?!tzQe1%VA|e)Du2YXI^N$Bxxf0{`u`0qtg(&z7$n=* ztWtXNWH~UvMN3>GN}P*Q6H7Al^Atidb5j}2^^MH*4GrJc3$6z$Pz5PSNi0dVN(QM) zWiT=@G}Hwm1M?6=Ln~8LD?NykygvBPzzSH0^+ zZ#vV9_MdS4gS;w3X&E6fBHB?RI&EbTun1=Pk`RrMWZyl#*nbdZ3G9blwVtcpcXrNi zpXZsga~Akq|M?>G!L0+2+&)ggt-VtQ00^*gF;faR zm9W0ek1>rh2&gG?p~S3!z|@KF_2y#5A61gv2f`XOknt+cb(jGHOeuLjtbNrtuf8h< zqtwq`P`OAjAb(EHYM?;$$lf4-_haU)+?rKU_P28y9VnpaCXq%Kb<5s>e)W2DTVFbv zc(b;+?i0S#oB|{Nv03&YhXStM5FViQL@Lu0Sjwwgevfj2lK|G8L5>6vn1v_N^W~*B zeJ)=t1)`MXBz9QcOT;?%qZJSl!0Zj2x{x{NeK(u0?tccNNFsp(7s*y478U^@A~3@r zKKsSxlkYd@))c*|i&JRF63QSeh&7-FVFp5pi8D_>q5j% zrBj`r`PUnTU_|M+9z@#!0|H{*<2%utNro%4uix(kTK5fN1B4?$4FX0}b5DP|TNX@% zNB~TLhJQ^g%19mYGv9V!dHUPf(|oJnmzMn)#2@t!eZ7PWz+NIubUO9J&p&6b0>C;E zQEB~Ac6g>LVzuCG2Hx%+4-=uO0Bx#qg%a%K%+W+I~PmC4cU z-+$nEgjvhsUd?r5IXhxs^4MrDcDHlc-*bhXXb4`picy{+9PYXU0JAYj!}niq#R9Ro zT*dwUky`J1hXWV@UOh1esXZ>s@-cqJ+oL0O03h+^pYf527seoIHY2qKV4a}rV|T{> z+O5Vy?9~?PgJc=0HGlzLP_(yV=vk!M-+v-iJjAp!*R24=%XCNFjD~ep?yc{RT(`1_ z33!5M(gO|Bjq8>f03gVEbH}cmTbb&(e*!<(|DgT_Ag#cjlin?U0000LbVXQnLvm$d zbZKvHAXI5>WdJuXGBz(UG3|d5uK)l5C3HntbYx+4WjbSWWnpw>05UK!F)cAMEqX9F zR539+H8nahFfA}RIxsLQjqLpZ001R)MObuXVRU6WZEs|0W_bWIFflPLF)=MLH&ih( zIx{soH8?FWI65#e1i;>(0000SbVXQnQ*UN;cVTj606}DLVr3vkX>w(EZ*psMAVX6% Takb+%00000NkvXXu0mjfjY|K5 delta 270 zcmV+p0rCEe37!Iw8Gi-<00374`G)`i0Od(UK~#9!?Utbt!ax*6BM=A#5Cb0FnX_6o5b?5D3I)zeoW|j=R4z`)1bX&0OAHRS6-45P}#pJ75E5 z0q21&m<4K1*oaxcd0}g2ftm|8VHR*c*cR)t3e?=N8MA=%4S$(jYfh}>T6vM0300000Ne4wvM6N<$f-+rf&;S4c diff --git a/library/src/main/res/drawable-hdpi/exo_controls_previous.png b/library/src/main/res/drawable-hdpi/exo_controls_previous.png index 3eae5c883bf2c1d8b950e35307ca7e0bf0fc664b..85b3766904187d57668e88fb7a762f8d97e1b80b 100644 GIT binary patch delta 1057 zcmV++1m63k0;>p+8Gi%-008|9F$@3z00Lr5M??VshmXv^00009a7bBm000XT000XT z0n*)m`~Uz0BuPX;R9M69mfvfWcNE5-=e%!{woBWr)hIYn(754*Fz1D6{V~g^Ei&;= zPHYAcl(A8Su}$3+z1Tpu|LCMpllr{4%!s8?5-(Sznji6tBQo4OfpR z47RQtRDyJ1m-Ip*n#VMj%fE26=4a@@E~YG3vqni#93LYSsDW?r?FlI2!SGj_psmHkEMQ6@o40B!Ko#@K_Oi!`KY#8zrw8^7#=6V^3R*r0VFBv&6^rw^ zeOr%>^lgKgQbKu#0|*^iC~WBZbmZ;*PRxu58$J|(@chN);dc)XCDUeRWNV*D0Mm5$ zso`z!1AnF@B83kHkl2||;>l`Jqbdx*jVGff<~8s2x&5aA^@|14%v%2UuNP4I_QKP9 zBx%}uz^ns6nOi!4_2xH)If^0bJwgBs3HQy8ThrrTPTy9av=De3RGynz(792^Zew+R5!mmG;UQxmpJ%22qlXvZ+zmV)nxEFt!{Csw*QuLM& zb}K-2;1~omn9!e$>D27v`R{(d^m3j8nEji9!^Mjk$=2nd#86}>i*-CM|K{d zG%tDM8<2nno(6#jVP5mFMV?|?ipX!$1Rf@h{%St$19cC1jWU=1bR$FcTQ-1?7v`$iPs0Mlf000$q zMObu0a%Ew3X>V>IRB3Hx05>l(HZL(T?SFp}uK)l5C3HntbYx+4WjbSWWnpw>05UK! zF)cAMEigA!F)=zdH99dcEigDbFfb~O?EL@$03~!qSaf7zbY(hiZ)9m^c>ppnF)=MM zF)c7RR539+Gc`IjI4v+ZIxsKds|0xFHS4_484HPR0 z@(X4#xE%a&;{M-UA61GMy32^HPd(Xe_1wSeC_hj|g{O;SNJZS+OB=}UWAyQc>(V?C+-zHvv;vr9<^9_ b@df)-Q^{poR@z^IZeZ|q^>bP0l+XkKj~kZ6 diff --git a/library/src/main/res/drawable-hdpi/exo_controls_rewind.png b/library/src/main/res/drawable-hdpi/exo_controls_rewind.png index 36537d3b7320d0e2b352527ae374bc8c6f3a1d64..a4ac181777ffed9dd03ed29c8564ce811a143b8a 100644 GIT binary patch delta 1243 zcmcc3^n`PQWIYQ51H)f#LmnW-l;rL1!tlSn|IB_MkF&rdvY3H^TL^?1FWs&C0}?DN za7+i%24H;dT~9az1M>+_7srr@!*8c~=Szi)9RL6PUSh(T!-i%z8WwxxUGnl=DZMi5 z>4~6A(?wT@O!Zv(l zHb{H-lF5h7hS?-&*P|S_7v=B&&MiKl`i^1m3s?QP>HzcRy!kzAd&9QQFOCgdd-^CN zQ}ci6w~Lx?>$@A;?C?mh5RaUaExB#EEbFwF3Cjv=bPlT-YP7!(bY#Dk*sZgaxkth` zC?=pj@%V+3z`YLn%AAZ>8<`kf+Lsx{?C8pW@-(Y*cfr#?+cz`%UlsW)o2k5|Y^QNB zk8x6u*UuW04^O|$7EW8b%47A`&9tn>(1Qm%g)z3Oq!Vx>o8%-AIBr*uXoAjsw)`m?U(eG6Vv*-?c>Tf9bU(GyPMye zyJ6{D7M5cgX&v+H-yTsmU+1pJRCal4WnRIzG@U$uYmN+_caINU5B|71D7`KB<*eV` z>rMKFw{l;+yCJ+^n2~wUId{G9fA0Q#KQFDb|Kv#C&IcJ5Ut(tjDu zjY6M&3i`NX|N4?W6Yj?MxAq!e`+UW1!U}DNfEx~drIMd_%G>_W-MU{!YU;YlZv&p4 zN{S40tf;wnJo@y0cCUwlD>rWnsIGUM+_d3*=AHnF(6+ z(;m2%o|BlcXG--ag-8575i2G$ctohEeBjA`vovx4_n+^a_P%UbwN7WM=elAcPrYQF z2Y2;!mSli@S^7#RV^y=`iUPKsQJ2Hb<(IX`9+X)9H2#&hf&H>MQr8x@dHkK~*?Oe@ zL1aO*6=&3|43oRh?RD;*4l!$Qdih3iOXH!U zyglyMirClHwX@Ww@R!fhtF>R28M9zRzDI0GZ3(+)hvn0NgDWT&Aum za(^rbljykzto;>iC!K_+@!UR={r7{_)=1s=^~-klZP9iNmRKVoD zbX>e$ zsSHL2hK9NZ7P^L}A%-Sa#)ei#X1WIERt5$)9>qUK(U6;;k{Oa#iLS%I%GeU3qh|ge zF`y0^kQKrCX(i=}MX3yqDfvmM3T~N2spa`a*~JRZ!KQ^ds|EUU+r44zwK8TlpZ=V`AX~Kb@xBLUpBqutG}z@yPb#Hr0Npiu4KG(s4v}T&!I9w zksXaJ*N)%W2b^$lV+00^T7r*g}8FYn}2J|fI5tI_Y)qkwje@(&0_aOxv z<9#Jszxs2`G_3UgsrOxvSk=Qd V9_(4)c?IZH22WQ%mvv4FO#p)T!5#nr diff --git a/library/src/main/res/drawable-ldpi/exo_controls_fastforward.png b/library/src/main/res/drawable-ldpi/exo_controls_fastforward.png index 19b9e6015c7cfe517037032e34ef1fd2de721475..1b4d9dbef99a8dd9a2299d0611005f66eb10545c 100644 GIT binary patch literal 886 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOs0kze6x;TbdoZdS*x}!Hx_DNiE(Uw#CM-mKH9!l4qHrK{H{bIxSpWG}ToTsm_DNVY3?Ge}8 z;*0u0FJ9R6J1Q=7-O|6epyKekD@%%(ZnbL?NjtPBT-*HG{0O7!57X~upS2KTsNi5x zQxV%*Eid+N#hikY&y|xViW{@_-fA;DA|Ix2yJ!7J$L#%EHtAKbofg-!EZ~>b`u}_1 zuI|4(Poj>SL(@QY-Hd6ocKy25yVyM=vH8u>q;0L`%eIHMoZG&SMJl7{!s40hy%#0c zJ?K`S$Ksd#ep$>~ue!N^drq9Tn{zPf0|&>4!la|eA0=9cH{S@E)iZ&aC(LzjhsfQz z+tLrTHyhioS;cj(W$od9eS4v5Y4_a>2Q3WG{h042H>bX<1+yES!>k=CHHkq>ex8j~@r? zf8HCY#;_9N%m9ox^Ew~CYpg)_N}^A`uSQ6@6@PD zovurlo~pV24XLzRmh*J02IszuPRsl^`LIfPc$x3l`W!fg+r=`xE}i$Z2OC7#SEE z=o%X88W@Eb8d@2cSQ(q@8kk!d7)%sjbsI%PZhlH;S|x4`54?mx311RqLvVgtNqJ&X lDuZK6ep0G}XKrG8YEWuoN@d~6R2!fo22WQ%mvv4FO#o3Kga`lt delta 175 zcmeyyc7Sn$WIY=L1H*%I+aExx-P6S}q~ca`f&}a0hF1^%|Nnp2;f&KtshU}i4{QWp z3oLYNj^TEAU@ee7d3BovcS3@-fcJz|Z6ZK1Q-NyXg~#T{00pfCJ_{^v11fY>bncM~ z(q(W>vlGnPbdpo4N5#8GDoK|iRfA9I%7zKEeB_xoY8VS<$(%TuvAQv$A;@%bf=B>A a1HJ?iNVv=&t;ucLK6TjK|r(s diff --git a/library/src/main/res/drawable-ldpi/exo_controls_next.png b/library/src/main/res/drawable-ldpi/exo_controls_next.png index d4872037aa1f00d567fbc75e0e15d99029f856e2..99927fd27b90945daa1131b31394f17f9a37e212 100644 GIT binary patch literal 735 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 aXJF|1y)S@MtRokwn!(f6&t;ucLK6T%{TBxS diff --git a/library/src/main/res/drawable-ldpi/exo_controls_play.png b/library/src/main/res/drawable-ldpi/exo_controls_play.png index 5d1c70289216982c2e209d9b6fa625697c6708cc..e7c19724bbcbb8df1b8d27cdd4a0e937216cc7ac 100644 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%Q$^mK6yu{gbVvVBHypv2Mo`?c?{ns_E>Z)xI) zwOU$MP!QOz;iq)NH9(-N3V&BdYP-6fAnvAupq#5;oTUSJ2B1zGE?+gmqi4g z-t2qtWkT+m?6{JZ&-uO|DnIwM=Dw}?H>q#g!9j`QF>}Hgvl?#2d}43e!8t`IyE02- z+byn^P4@k!eLBk>YBsxk%4b~mZ+CF=`O+BnI98_|p|?Uir)`ctU%SK1%C`FHr2}4N zN9I0kca@zbw&bRNZARgzvX{XdYYLP~@9w)1+0!dK>Hezsn|M|pYujIy_$Vat*R}5H zqK7s;Ww|9+lC#F{_lX^Hr`_-Fox0I_vvK&zCtFg^mKPSb+r=(fd;IIfeyLV-|6|Y1 zeqS%Sf92k!!-o$)d@L*=@F-e@MaJ*d!Ga14&$JySr4^r&e!le*JUNL~uV~%7KkJ## zyU9JbyVvdKZ8EzrdeUK=#}^)*y!65P(C4y9*99A$b3{EHmPJ(*yxV&98E52;d0p4l zq}X27ntc7RlI>~2oK#`&dd~O_btZ5Ao#S1lmaw+?#}Q7JGlBn~SA4!_SKe3pSzT-8 zhx;2@@9=GW$U3hg0~mv?)FK#IZ0z|cU~&`{UFD8$gv%D}|R*i_fR z+{(aUqWG%YC>nC}Q!>*kacg+sB?L+%k{}y`^V3So6N^$A98>a>QWZRN6Vp?JQWH}u U3s0un02MKKy85}Sb4q9e0B!FXlmGw# delta 165 zcmZ3;x{YyyWIY=L1H*%I+aExx*3-o?q~ca`f&}a02mk;7pWHa3eVSOqfn?_u&B$cr*u(xPB`S)6`FCSPGf28zVI5nNSX3kf^Yq3WP1D5ouste>iZqb#V9gM8 z+1_}gQEcKL>5kitGn&Otez6dczM!pnZ3QI&12 zldeUH$jTjBK{8h!1aNK55|z=hu;`jRySYTH+iK^Q9UT@O7AqVDw7N1rHYe#yy=^z! z`2OkMYMEJT`i7EL74HjnKA(60=dR}r(lJ}gJggJb9d6lqM5pGh->1jRkaKKx$N3Bo zF2j}&QUQ{-CocJM`EZqIp9=ZD;LyGEw~vC57zdcMpk<2A1(H#zKH)6yV5X<7ft*qJx) zhPS7&HL9Gw&U~@AL$Yv!!M21$mQyb7{Mh*D=Bqx764j{Z91a^g8J^z`TO#*nw$=6; zg|-xpQw3k*l^7N{JgTt&9%F4N8kCa{5 z`B~c7CZ5)dxsf2yz;Nfu!k5Pmg+07C)#<$K@yj`qsXN+A89XFbmwkJBW9i}aN#}W* zZv=23TDxV{rB@y+^ItvkxSyJ>7s6sT*O^I}amMr`^P}badinXE<#)?#bbVRA?t9#U zW8X}?OBo`kXv$rBZ+`UR%;Ws?d;WcDyAb;N`w1JCpZa%&p4?xr!^j!2;zFtCh1Lkw zrD1G_*1>u`)K*H88g_ zFqkO5>Nbjo-29Zxv`X9>9(W0X5}_o>hT#0PlJdl&R0hYC{G?O`&)mfH)S%SFl*+=B RsWw1G44$rjF6*2UngC7ZL0kX; delta 170 zcmV;b09F5j2D<@}8Gi-<007{3J@^0s0D?(GK~#9!V_+Bsqkv}MKNJw5jt7Y6)5HRx zv<(p7C&nQpSpXDf0peyL{!Oe;iM9YJqyogJ|Dyq_SODZE1M%noSO7&904Wh5UjH8t zpwt4a!9vv_f<|mRa>P|h8npuFPCLD<0(<96Rs5%)S-alHnjsn^N Y0EVDddfXl|#sB~S07*qoM6N<$f~(^}k^lez diff --git a/library/src/main/res/drawable-ldpi/exo_controls_rewind.png b/library/src/main/res/drawable-ldpi/exo_controls_rewind.png index 83d71782f65462fbc78127f99fa99dd10cbee9ef..28843f9fb06da4c4f7cbc10f262531de41ef9cc6 100644 GIT binary patch literal 906 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOs0kuu?ba4!^IK6dpY{uC_iR1R?-+#BZzHM1-mY%$N zX3*lu7~Q9;-kPd2mu=$_jGXy>deK8R^CMe4ymThEOq{(lP)$i+`RUpz5x!k(CQg66 z=g;}~g^B0P%ws;>vGu?I{`<}!b^AZ;cXwO&%e_gG?;j_B!$lj(Wugq*Zy0?#tpB#f zWoy(i?+4vGcpB6_)zy7E{evx*tkuXAd0G{5dh%rBrT0A+e&JSNK3aF^duLWD$C@vv zv$oCtt{PRE8tMK0uVm^Q5!cFy1)@>AwJWRQAYB^ar19i z)0GS5k4be;lG$>Gaix#in?oX#`VT8Ax1dNiO`p>{{mSPw|PeVXBh9cdg(4@x!TSpZw;ZjdC;* z-zU`iJ!+!WW%K>Xp`U*Ut36%&kUM=-vHkM*c{i-mbDwxNh`Xt2HZt`)Sv|Wq>D#;G zTVGqMX>GWk5t4n&>YMzPg&UrEY?{gZ=(BL@$`j#}G#I-+U1B{Ne{2QM>(l;+^rmdr zI5jtMqmQ?Btjt-{XXcm8r?_7_9XgLM?pDCP6TX38&WldnzvAuwx$`YHO2z<_ zs%nXAL`h0wNvc(HQ7VvPFfuSS&^0vFH82V>G_*1>u`)K*H88g_FqkO5>Nbjo-29Zx zv`X9>9(W0XGJ_<@hT#0PlJdl&R0hYC{G?O`&)mfH)S%SFl*+=BsWw1G44$rjF6*2U FngH>6icA0i delta 197 zcmV;$06PDQ2i5_Q8Gi-<007{3J@^0s0G&xhK~#9!V_+Bsqkt~p|Ns9yKs=vPHMlfd z0P%ew{*OnE4IwqyG_e42GZ6p&4+Z3?!DYA#5Fh`K2C%3(jZY0O!;^vd^M5P=NliK- zHP{Rm0pj)l@dJWt2nEY&0u~TdLvqBTYlf<6$ESvvcz`E6JU)?3Pz^DeYcW2}Kp_D_ zYKXBY7>M5!$Y|k&)DW^n28j1ls%8|70`dR=IQi?8?*L%n00000NkvXXu0mjf*ziyR diff --git a/library/src/main/res/drawable-mdpi/exo_controls_fastforward.png b/library/src/main/res/drawable-mdpi/exo_controls_fastforward.png index ee3efe1d694bb6cfa69dfd7451e4d1a2904c77a7..170dd2daaa75784b2d9c78db0dbb62b73bddad32 100644 GIT binary patch delta 918 zcmey*xR8BH`e?0?A`>4Sfkm+ zpHExvx1M~4r$F$(3=>1r)OYEEuCH3IY3#M4WXFSqiwpT9X6LTyoOG?{ zC=U}a!=fqAo%UDlcz^lOB>qQ7q#S1$Fa)|7=AU_BzG<)Sy5Ef3mgQ}?yR=)@t3#Q2 z^OX1X$9W_>Orop4o~!0>`?K77b)@9AIju)B!@ikry5q0gZCp8pRdU702Qr1vw8d1y9@ai=VHmdv>RX%j%8W5>Cwiy{Gol^@pA7D+G_)EXgeAxreSD97AS**mvb>snzy30r zc=79u8Z)LI@DgyTPfAVt7JR8ZGJtt@r0?#?b8GfZjhV%h`DgcnGY1b{`Lb)SO;l!& zR!)}h_R8zsmyO;Eb2;!Nn>MZpIU}7vZ{NM(cgeS()Y;#6+Ss==^U2^kx=?LB>N>85Xu#&4#c`76|O>+`Aud;%9QU3pUE_F1K(ew*gJ%Nzo| zKAkpK?bpp_)%HI1rRL7n&+B&HeQt3|`0%-)>=ajt^59C}9S1C4ZrIIj|H43DP>i_@% diff --git a/library/src/main/res/drawable-mdpi/exo_controls_next.png b/library/src/main/res/drawable-mdpi/exo_controls_next.png index 9d4d7469eda4a9513202ddd9ea97a882458fb673..fcd73d90e7623b0136e50ce7a652683a2ab3d5f1 100644 GIT binary patch delta 831 zcmbQjbee5~WIYQ51H;YYP4z&EDaqU2h2ejD|C#+j9%q3^WHAE+w-5+3Ub z=d9W4qgk-~EQiVrp>G>x`NS)orl@!_G)fi3ws)RBGN4-{NBHd z<6vduiTsyo@Uni|p@am5+w}$h2e&M>UEdil*RVo#6&VP2&_@)IegRly8oM~o)G<~=a-aD6F755;7IRJ-{=IUjs}lc zf37ZmUmV=J<&CkK&L8M0@7#D#-YD zvSQ;Ut@Wx5JW7mde&6D6ntz`*Go!d6O4(&i&x47V8)CjHbL0fhWjNE-68qQWZN!p~ z%NSTTFinh@Q(I8~#Z>UmtLXcU(J`^7?B)M6z2V({Dtoirv)1yRE1SC3uZb=@^1nu& z!SDc&j`*_UasN8lgye(tpPj2;#NU-2Z_OaWsqy>slgH+v6Jw6u_?W-ABP+m#A>{M= zI}9%vEvJ2Z@$h(2&*RDaKgVXd^;_-QtClv8G5b(K)h(tQEKkFOo)&C6Aso{+LFI(P zgzdrp`_v@$idGBnUNu&^>P(CU5j7ezyEeoAIqC7K3fQ!7&ohz1Lm1NY_wb;y9M2+mI{ sDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBE!_Ip45*I5)78&qol`;+0OmJi5&!@I literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyegQrquI>ds|EUK$mVS={nk-oo zMzKY@y3JY5_^D&pQ=bmwa@5MXu) z@^pItmdKI;Vst0BZD- A)c^nh diff --git a/library/src/main/res/drawable-mdpi/exo_controls_pause.png b/library/src/main/res/drawable-mdpi/exo_controls_pause.png index f54c942201a83c6b866d651cb6dda51ab06d5cc9..3e6b2a17b5626507ff2141f1bd5f893141be53c8 100644 GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8wRq zxP?HN@zUM8KMV|vqMj~}As)xyPI2^Oaui@#U46h~$AZ_zA2^Sx|6sbm;Un*!h9CU; zMPD@aJ~AiWzAC%;W~Xd|&6J$d#w+$Is-hZo zX^;C)DKqV8sat$L;kxAPle_2jaY?XKs;7i_<3m6-KG0(Q8eV{r(~v8qG>QTwKBDUXka;TZ$40i49JGy v{Irtt#G+IN$CUh}R0X%pqSW&IqU>S?=U~&qt&h!s>KHs-{an^LB{Ts5uHw)V delta 137 zcmbQkGLvzFL_G^L0|P^2NcwRgB^uxp;_6=D^B)6jKgDEamTas2L8Uw`315w-{4=giE^p55fMRbrn{&$3hP4zJx8T~t$h*JFQRZ*{m%WBdbs zL&J#^I21ix4zQSZ1ZuLlI4xX|;GH?ssJOpdaP7-_2k%F2=hNP)nESumY5AG&!+G(y z`c-q-nHi>hzEm!9!10$%hXY^GJPj+xM%!zpeAU9wOm26vO!(BXZGXq+j$JG7YKNqs z`+a*$i~{Qo9)`jrhEa?TnF}LUd^{Md{MjyldnWIu(5Y-|j64J<2>U;YDE?FS#H;#6 zbQ5)tEpe6l*qxS(ABV~LXU0My0VSx5_$deKG#J?a#k;TvwgZLx5|^cKA{Iu zJ-mTST4yE8CK_+tc=JjAMed)aVLkkE-Zp~qvdzXe9W!8VHn+$3E@X#s2n&zd`28XR)H-#FD9O#LHcV8y$CX42%9 z-#>`e@k)blEnbE$cELJLwbECJ^GwE5cR!|dK`uo_m5bhLX!6X%r_^G?7H$S#i!k)wSmJyCo3~6;mhN1g}=Xq)WzIZd$pEBKrrdS z>pLGV{K#@x9X-J@()@(l#QJ&h_g7du2nZ@Y%E?N~FmOC}a?7>%u_h-|IF?kb)_zbD zdt#q-!*Bt!r@OFIaaXM?_2uv z;^SEBDGvqT`!Hs&il>K?)7#s6!Sz4|svrd^i6yC4$skp!3`Pcq zhPpsxU>;&)L7P?>!EC=q*2WpT3 xSrMF{R#Ki=l*-_klAn~S;FejGTAp8&U98|7Y+AVWu^CVugQu&X%Q~loCIBdUb_)Oi delta 211 zcmZoI;xs?djqeQgJIeL4tL0f`|a;zyJTw8(-k-V1IPhLC1Ik zA4B7LhdI1QbeNwqNLcV4v0{G7An=3t$XSOoh5>vHjjtWv7)$`tHyw0+rnT^;Xb%nm!3%+^|}A<1XKe?*O0koA6}&yE?dR8=SP-QYdK#XONWzWE9J zDupPXBTCGHBKO&ozBjJuSuuUp|rWu5BVv1 zuic_{f7n>Clv~r}mERGiYYE%MVs2LL zh5L-BGymcLROeF>x^A!EyBANczEYg6RQcTUVW{ncWwH#H12$~2V~*I!6Rxm7HZ;Mp zy|+uYME6ckVk3+4ySO;>h8auGCi)64a7-3mez7P>|8?=6Wf_+)yDnzk6k*KVuBXU5o0|PsqhB|CbRr&F9>UCtDSzbf+Yop5WEL^tjWhi`*X8jrU%B{i8X3 zo$P+Ayd8ZyZ>4U|QxtMGU>118ck0c{R}P7HoGtc>fUAx$ae{!I*&{5%gpp9!L%@yS>nGKKP)aXD0-Rms9xhh7t4wD>ns~) zte<0Hw4^;kaH7Lsp}&$12iEb(OFMQStF2Fdev##X!r6`Y_HS9O647YQ#*nZ`eZBmd zy8jMLN4P%7FIwOF_u$RSh%Dtwh;FHOGoQEa%$=WK_&&%#o5x~!fQR+& zIoTPV`l5GlpMUmVd_UuvtvS*R^}-^8f+CsTeLrn}7zDcw=jqC>N~A+$6~Xi zPHZobYd{yWG+k~ybpW_>5sBRWIrTQu@?uxydTlnOv zn=<@%f)zrqs`w1x#Y1C9d@m zCC){ui6xo&c?uz!xv321`bK8@hK6tJ1=j;rsFt`!l%ynIQ+eo=O@f^)EG;nv4yK$96fUHx3vIVCg!0O3Dk@Bjb+ delta 210 zcmV;@04@K;2IB#c8Gi-<0047(dh`GQ0IEquK~#9!V_+BsqhJ(_0s`Pa0?a2-9}lT| zsOA8mS{op~57IYbX7C=)60L4Ur zc>RAofMyN=^4)>>`F{d{>J9+X96&tzKaqeI4gdxF<^gj6F-r-Lo{3NcTh^m%HpEu= z(7hZ$FMbEa0Z0|l;sJ92lAd57em`Iifa;S0;{Bryno%$cMgbuJ0I6wOXEtcRK>z>% M07*qoM6N<$f+nI+K>z>% diff --git a/library/src/main/res/drawable-mdpi/exo_controls_rewind.png b/library/src/main/res/drawable-mdpi/exo_controls_rewind.png index e75efae1893e7c53fce2d4c8809bbbe12e577923..5489180eb16e29955893e34f1ee7cd7e7be4ddda 100644 GIT binary patch delta 986 zcmbQp^pt&qWIYQ51H;YYP4z&EDaqU2h2ejD|C#+j9%q3^WHAE+w-5+3UbsQ8I6TCh$ zaycH=JJPG5!IAezK1 zrFVbXzw?9jnfhn*ER7G;|J|HnurGg}kOU9I!N!~g2mkh2ey{l*A<(cZGLKbjbM(v$ z#mEYIZC5Ay9kDno15 zwZlIjS8YDrap9`i)~gTsH++7wWzUAL#ouPW-sjn%8o0VX_Vn4whm9HUPc(ad(T$Z& zcHhMLAzy9>AJ<=DHcde&p&@l~~<<&?n5@7avEwuNBrbe&-Ve7D% zhn2ZEpI?7-#^q9l_{CS*XFoJex@mhasg_M~4*LO})}?QJ0?t(_1V;4y4C$ZmaZRby z>CWd%o6G}$N_^Fnv*(QLKeGB|)$s#c7|cDzBQnqJ-ufxyM{#B5`59O3>ZRBIIkA7^ zp7Q8bj~|A7JpE(ESwrc!D;K0D&f0L{RaDnLOZ90fIp;!s#8=%lAK zb6(qbJ$--bm_e!U;!MSp0$Xb|w{1@Rk-R@4WBr=QWm=)vK7ZaVWg~ZfR0bmh zLqlBy3tdCg5JM9yV?!$=GhG97D+7ZYkK!MrXvob^$xI8bMAuDSr1-Hzi)bjkI>|zDyVAH~_kIjJU7(8A5T-G@yGywp32fM%k delta 256 zcmV+b0ssEx2ay7h8Gi-<0047(dh`GQ0N6=HK~#9!?Uf-8!axv3D-Z~dfaCy31RjCp zC_Ms#18{&5JqDr@fkYrV0uoU%{3e?a8oDzdieg^!-RsO`vpX${AP9mFP}Mn7{>rzC zmB<|t!f(8OuFw=Y=o4}Hwb!?rZ;+e5B18GP#*_9#eUJ3`m3h~p--)cTXj_N~_fAadC0jy)}4nX - - - diff --git a/library/src/main/res/drawable-v21/exo_controls_next.xml b/library/src/main/res/drawable-v21/exo_controls_next.xml deleted file mode 100644 index c96f1e4afe..0000000000 --- a/library/src/main/res/drawable-v21/exo_controls_next.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/library/src/main/res/drawable-v21/exo_controls_pause.xml b/library/src/main/res/drawable-v21/exo_controls_pause.xml deleted file mode 100644 index 69a17cb9a1..0000000000 --- a/library/src/main/res/drawable-v21/exo_controls_pause.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/library/src/main/res/drawable-v21/exo_controls_play.xml b/library/src/main/res/drawable-v21/exo_controls_play.xml deleted file mode 100644 index c21978f7f2..0000000000 --- a/library/src/main/res/drawable-v21/exo_controls_play.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/library/src/main/res/drawable-v21/exo_controls_previous.xml b/library/src/main/res/drawable-v21/exo_controls_previous.xml deleted file mode 100644 index c5789d5fe4..0000000000 --- a/library/src/main/res/drawable-v21/exo_controls_previous.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/library/src/main/res/drawable-v21/exo_controls_rewind.xml b/library/src/main/res/drawable-v21/exo_controls_rewind.xml deleted file mode 100644 index 6ecb8f8a27..0000000000 --- a/library/src/main/res/drawable-v21/exo_controls_rewind.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/library/src/main/res/drawable-xhdpi/exo_controls_fastforward.png b/library/src/main/res/drawable-xhdpi/exo_controls_fastforward.png index ead712cfe9409637a89e4c09ae61fc22c4a3bd72..60f7e921810634fe7542915551fff71a5cab8680 100644 GIT binary patch delta 1472 zcmV;x1wZz96jvCBfA5*uo!#Zz z1vJoVC05W1h)t8CVm2*TZ4+%`jMg?b#?~0)ZEp$xN$+~oG=EKLZ7hOrYalIJOalql zRs^9gAB%h~3$t_1+lyH!ySO_u^n#oH-Oc35d!F;LXU`d+kU|P6q>w^(IF$L=vHsS6 z&tUsSC$`6V6xb-s83bpScFS!~fWW9lGfH6MFAPJ0fXp7c<=jNyBE)FHY4|l=N*u!k zq8QoITlbt}w13SH5dxzOXAx2>iIpHAu?t5aFay&btq3BBy5_tK2rynlt4aoq!!>`; z>B7fg96%#{n1r$yT?BB+xslj90@d`UOcn<&Upr7bIx(9xG$GkQ1F8|nVtUoM=!Vx8%JRx1_eO4LS~GmD$4U5$ z>W&<)ipRzm3|&)9s7D7u&@v3aSmmh z)_Q(Ut+&zPbp(!|5E>D{O7qve-n3u7cr>F6AG3uTG~op#9dqQ~KoT)#DA-}h<1e56}Baio@e$Kz4iX}Pu|`i zPg+V7F1S^Tv=m9agU?W%t>8%@U7VT2b!RSJ`=HcVSarwEn*b$IjSDEwoH)+{NdNLR z-@y|%uC_NqIdj*qzSp#5ra-IMjh4(-w-%tVCcsr%8kGx^3K%}w`p|2S0S^9xpp{eJ;w5Xscz{%@kIR@;Y8 z+@Jkjzf2`60xUUzDGUOe*NtZZRwM|sPkOq48#A(J^_fE5W6%Ts+lw}%B)1}v6>B*>9dGK3j)V`%fSz0<1zGYKUh-Rrvde7Pb3 zW$9Q$47Er(a2f>eqZf0?d2w+RU`2u`KHBqB-_sIb*sy>g=FtTUSFq;5#nFr3(|?WU zxHsh$U?w7ACLZ4TeqhxK2UuAK=5ZGfF^@woxIrwy;nJq(X`P9Hi9fo!AI+8 zdffl*&(n!A14?QzF@%0huJ_3$2Y;vLUp4}YEg?+n>n{h!L-r09Kn&mEX?oz<3+H@G z&JlqyX73R;~%LCDWs4>3MpjA^DlpX4~l*UrGE$j000$q zMObu0a%Ew3X>V>IRB3Hx05>l(HZL(T?SB!k0000bbVXQnWMOn=I%9HWVRU5xGB7bQ zEigDOF*Q^%G&(aeIx;pbFgH3dFxcW>;{X5vC3HntbYx+4WjbwdWNBu305UK!F)c7S zEipAzF*G_eFgi0iEigAaFgY-MpZpd80010xMObuGZ)S9NVRB^vL1b@YWgtdra%FdK aa%*!SLsKB)~q1X z@^Hn92fydexcT4i@{=WsXErogKMntLwbk8b_SrOP_g7WAYW}h80aLG(GCX`b<2Azu zT_CF(DAcfg`8sBc@K;t0GVj*6uYb+(ta}%q!WE!whSe*ph9r+4Gb9<*{B6`5R{2z> zF+42WIN4qJ{oCMqq8e>mp0mvA+rif|YbW0s@nTsEnL=5M@Ml&Zz8on{crSeKS*^xx zrx^A_Z#!N)gc@CMJbC<|b*-!h+cT>RB}cygnzduj*|g2I4C0r(-V6Fk^8x+D;OXk; Jvd$@?2>^VR(}n;5 diff --git a/library/src/main/res/drawable-xhdpi/exo_controls_next.png b/library/src/main/res/drawable-xhdpi/exo_controls_next.png index bc1ebf83c58c0f6b983817f62a24213cf25c2c27..4def965cec244cc3cca5544d730bebc85d8ad6bc 100644 GIT binary patch delta 1356 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 JPDHLkV1nh8*U10? delta 327 zcmV-N0l5Cr4A%mX8Gi-<0063Kaozv`0Uk+2K~#9!?U<_(!ax*7BajFL5`m-u1RWqL zA(8?pfC7+|fTRQjf&!381QLNnAd*keRkZ0_3JG zvjF*N%P2rc+CVZ0(3Q4?0(7P=kpR7E8z?}3+6D-)k+vQJY^ANEfZANz2qA_XYD z+wSZNUhHqOncX?R+4H>b`ItEe8fvJah8lXnlFG%yzzD-7S4Rrhm%H!v{+q8#00hvI zdvy694;M?dvabq&CDBAMg>M%BZiLI6LG=z&-nU#1D=W%gI!P6N&2x^^EXu=l zvyB*Y%Y9)01b=0SUNVjeGU~-SL<{3VtV<#nEK!EoLtOGk{Mb@oSO7uU$ZqD;UdyV2 z$ohoLv74W`eot#F%69tLj2p@2btcyuE8`0V&_=VJOD0}^);M6jW1lW&%^KRcjtuLa z%2V{vi;=7`Gr5OShxdPbW_H0T_`(AO6h?7O$F9N+<9~`6Edqk#u#axq#Etli>be6v z9vy6H|9X>*Z9J+^Z-ZJjauyjH}$tZAiWJ^i$8bwEMZ@0INI* zS2qd@c@P6q1Qx)JPJeH;0tl8ghuDW_@*=m~waI7p?dprfR0XM`^6&sz9w*6Sgq&T-_iuk}u(bo! z%BmAz8vrOV&}5@2R=?|;^TC(@fhRcZ-69DwlR!7aPP4Y;}h znCQ0dAohAx4l6zjmP?g7Rv!YO-l`fv1kshBvi}u;&0n1KT@h941W_e`GWyx^v6(CN z%R|*okWQYybmZ+{zH;Y9(ApuY2Jmf5+_z)jzc+gAJR+j@J_CSnMb;;O|LfHcPJXy> zQ-2K9l811^P(7NQgfsr@(W93p(OU8l4nT0NqneK2$Q(I7K6dM>7zhUu20%&h9g`&e zXw0M&6Bk~4>+CnaD<;g~4D&*w7-pE{3f*=Serqi2jh*bA3inbPb}Ehn=NRP+)Q?73 zo0z(BV>IRB3Hx05>l(HZL(T?SB!k0000bbVXQnWMOn=I%9HWVRU5xGB7bQEio}I zFgH{&F*-FhIx#RUFgQ9eFe;7g{Qv*}C3HntbYx+4WjbwdWNBu305UK!F-?qY_z{C1* z%d}ffN-Gw;|0n*{`1iWB*_H?Pd(P|aTBLDl|7zYWcIF^a#%HNQjC$ss4B6t0r}P99 zes?jvRTO;iQ;aEYGDpBBmxgL_##@Sl3ZaY#;^i6s{o?QtWxD3a_Jdb3LDl%ce+kBY zDl9*yaX!eE=ZLt;`CzRq#uN5$XW0pK OCWEJ|pUXO@geCy!sjGbe diff --git a/library/src/main/res/drawable-xhdpi/exo_controls_rewind.png b/library/src/main/res/drawable-xhdpi/exo_controls_rewind.png index 3340ef9bd227be28c3641fc1a111522d9d0af362..167d10e58b3c8267b75e1bbdcdcb9d146841d713 100644 GIT binary patch delta 1669 zcmV;02739B1B(ri8Gi%-0001Bxm5rF00Lr5M??VshmXv^00009a7bBm000XT000XT z0n*)m`~Uy|33hNnX8-^IKmY&$Kmh9V_+S741#d}2K~!ko?U>tdT-6oEe`}v}=I%JQ zYmXBLQV6}MQIbMM5+IO)Tp*DmUO+0Xka+E1Vdc4RNT_N-Reve8MX0I(aeIIWBb*Bs zO5()9NfSE>A;j2DZI3TAXXfnHhw)`5wmD}4C@=Fp&BJeh`&;X*eRO6+Lk%_5P(uyf zVM+Z@mDS8o)Rt2;nV6~AOR z8*m*bD6^fnIe)p#IwBV_KvhGP3_IA35#N-jib=;L*~1W%2pW~EE5M>DC@zn%oweed zz}K15_Km}%a|P2%CzD9GM&qgjn6S-jYU<**93W$SnDEym{&47-7h@qQ9^ATfZ~7;;T(%+rhv{CZJ&cPMV1E%aSYRtVxSPN!1#+{nIeTDF z*A`G!yKs)Xg&+zSu>;*pn_HTBl3!y@No3N`#D4$iww#v&RgtRqh(_eX15}-33*65h z)>3f9x6`FZH|6%VZUnVrq}nv#R~(`#lnW0~RlBl*9c)9KlA4KPSJU%P{%of>YQ;$P zFc}IwPJajS5H38x;?M~ekEeKmI0e__%Wz=J&b^uTN=>(T2mxILZaIVt3s5ujzaYm( ze5V-5cwtND{>L|Lop0!JTSXij5Xwb*1cH*{VIITCoa0QEnqt4(wJjG*gX+qrB956X zhI3H@2ucUfk(Htee3>Zh+LU{u?cT~HuRKhSDSz9%AI?P!pk#QC4w=JD_??;O_ix(n zc&ftcrjvy=@fV&7=b{8KSnek)b0rG?!L1MNOSR3P;?-sMZu!mbbbBZlu>;U4#<%O5 zpM5&}a|o}=i9PmA6mE6ZF)lxjZVhllZOq)r|M71hzcD*5f~bDi@}Ts|o6{rVT(kfd zIDg5ACOn#A@Atp-=L@|-Nko;^&E?3zi+>sXG?a_j0b!bd@vSCdZEULer+43ab$sZ% z>uXL-`!9d^@4t>!IQ#tqD8jeA%n@}0&(*fX@!^+V>wC|i5rLIM1lBbziM}f@zIyzf zVqOed-@~|d1{7hIkN5{)X|l{3&+0!vdw>0vYyBXr)TbKQ=D3kJj{W_Wt0xhus}Ii7 z&mM9M55h1;KMB@poN~syp8tG6Mmjp<8Bkk&;M5-L^{o->pc!vu`ouXM$#%q>R^-Yi z!Kt3Hob>350ib6ggklJ|z$Faptx4cHXRrTvpv|;)iBoMoZ|w3lDI1Gv%sq2`@PBNp zw%ui%>Q__509AdceBVy-B@?XIw3buuOzG(0?3HX=s%5D@wa0q>lF9HN&ht}k(jeo^ zmXBV@4|Oi*q6Mhx0~nMW4A8^|HLj+-i(@CxWMnd+`464!~iw(AixOy%(6*62~ytZ%!#w^SVw0ph4#)@c6c=B0Qq??E;jAnoa^nE zk!&`eS>hrGs5uvv57cX1q=_yKJaNtGYnKMvz2@xa#|yrb;8bo5K^HlfHh=Xz8}|mj zId`UATGsWQm|Nr`2dJ3`L73tkMcOqjLE4@4PYg~CkLCj_4yPEO|I4+&UF9xatL2n4 z7aTu7IXphS#MKdCSqRG&`YCabbzK`bLt_S$;D3Bd5e`>}o!|^*?ornXlJ4bktVu3# zJ=7IoSqPtDzM+K{jVIIUP=DeBE+c49?FsT3n&)E4G;TGwr26j%DnmKQ1vYbEu)@W| z{J%dN#x2xSr+(-wnmc|;)lfqXHPlc;cU=DmUrQr<&a+-M0000LbVXQnLvm$dbZKvH zAXI5>WdJuXGBz(UG3|d5uK)l5C3HntbYx+4WjbSWWnpw>05UK!F@7yDI4vP)Ix{dj zGdV3VH##sde4qRl0000SbVXQnQ*UN;cVTj606}DLVr3vkX>w(EZ*psMAVX6%akb+% P00000NkvXXu0mjft;q%9 literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!LIQk3T-^(N{!<$?d%wI4G+(+T z$S;_|kmEGV1`&r(zgw*zPI6BVmD#t5ulUMy6^-P8+MT9AWfweM978JN-cGUPYjzM| zsZHRQ;Mw=V@&Et%eCjWBGvzmkPSbM8s46!#k?K9RN&olRnu(u18}~K+T%2U#?{!{g zT~OPTnSY}t7o}fwl$@0Qj$hOH)0ws5K*8(5o(tTMd5SG6-*sAn`=a&z#VLwa=`TZh z%s-bra+}b8S-4nJ za0`Jjl>Nr8ydc?7hKQ4zjR=e7?1W@N4`mL=jTe+2 zh)yqq>R>;=IhU4HzzQ62$-Ul#9a4|SDCTKA5ur@4Y zFc4vAV>&=sP;(|v*CG!WmnlJym5j8Ngq1$kefYSxBc|g-;UtxCv46+X7Zhz?wE3#K z(M@p?*NGZSvy?7*{CwrVvBoK2rEe_xx2+ zI^De0W=c$Y#BcMGl9Dfn|NQwABy&9e__1SdMm!rg0S(Db{A;%$Xr<4(HEY&fef{;k zf(Hb2>hq6>ws4N7Py~@#BRtC6SAYN;Td@3V8oY<*JuBKIxzI;`YLw&g`j? zYs1vPfB#;7{``6U;5L&fLGq0|&*eQ>(7%}Xl+e`IYnJS-kY5lvZAFaw=}F>DEp3ccwL8XKG^!y2LBY>Bu3#xonB_ zuBS3R4T_9Ywp_~&*7vsPJ)YWm>aV+}{|g!89g-hr06pOPl+XKDYyZ}Jk?gt;bOoLW znJl^fx>R8E0wB3<`}Xo(ci(;GmcRc>M*D>1h4?>ugGoY(EZ-Me?c9z1yP+{>4l#~@7n*}c9 zZRg*c>bYRPyDM33~6uiuO53w#d#W!`f zTOw0HYP;S|6E499Eo*r%Gv4Juf#<;|mpyc0SoNkx=cdUT?u3)C5`7uGuki#kZvXV; z>E~m|j(zV*{_Im7vd-9tHKyZV?8@HN{8L{8<&Q5aSIUX4T@jQ1;dz!!z=`*)ogdg| s#~t3ukkqg6oprA&iJ1eIjs7rQT4$EU(JSx>nCBThUHx3vIVCg!0M}jX+5i9m literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$81AIbU-3xsF4-n8x+3yN;hDJ${ zUoeBf<8B^>^DMt#f7jXWpDl6QVfyONCe??d>Y3Y7#J8s zJY5_^D&pQwKb?2TK*U9MQUaF=r?1atr}!^V|NlRvw`Yd$(w$QI?<3`3>g4pk`C#Ao z*aC?Bq<#DR?#c0-D|c0R&pvrEdy!q=ou880Oh4b5k76Y3*kztw*42IAQQ~^>bP0 Hl+XkKRE;tn diff --git a/library/src/main/res/drawable-xxhdpi/exo_controls_next.png b/library/src/main/res/drawable-xxhdpi/exo_controls_next.png index 232f09e910954a5a56b32d2cb807f2e68f8de781..ce0a14325a717d6dd853b75c241d837f98c1e766 100644 GIT binary patch literal 1316 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Nr8ydc?7hDgttk%=TF{EP7+c}ONkE2A|{O^}6?0ys= zaUwe8$V;c?(({!pngldX0o!_>ir0mI zdRDEvyp{RH=5_JKGasrd+&ngCKf{Cfx5N%@UMCL}5ju21h%a<=dow{SQ)SnyE zTA2RYDNOX>d0Mn{>B*BP726)x<#;M<}VNcEQW_V@3PkBRv+!9yj^$mgT>l8b^) z4bC=l?@y;~_TIdCv(e!X0c+Ue6yJ1)XsLex{++*&BeSF>it($3;@%A#KIolM)Lp~S zo?>JJo_Ofru?R>Z4K4zy|6@_|G0 zP`_ZW+wP#1Q|{cpZJi+DHc@d&t6G5ef_V`-YLy(BiJTBamuYkzlDKq8u!50+fBKr2 zB~@{OQ!0;55NiwID43vtJnheyW?h`~Jl5mpopCJJ?QA;VfVI zYYj^W2U3!;(Pmthc_~$cZCdJGF|OAB*RNmC-%y>Y^2I!9Y0%3h0U8qJ<>jGo;${g( zF;4Y5dgt!lySsMnGTK;O*>iz&L+@(8`@`5UVf zRYjO|PVcg{v(uB4mE|m-`q=FOYlqyXJeDwrr9p;=KSX&wV7aj^cJID@b~kU_FxXK2 zvDtxh$IhKU_wC%d^Qgq8=K>AeA2SuI=iDy)`ryHX%eQXbazEBQ|9WZd?#I198$M_s zNIvoFpYwY^?ps-l4L^81j5>II%avr&S!GN5M49xa*Og+MD>Q=U} RZ332544$rjF6*2UngBukKXxeggHuq6JTyzJt( zZP#l5hksRi<0~@f_BqQBjvTX3KM(TKTsq~FSzWo``#QEQZwwYx9ccJcbD$xLo%vF3 z8{`>6vf8#!6LBX zI49c`KOpO1!znK2w<(QvP3unRPh~m9U>m%imAT@*z=3XGrmqdpZtYj&`f;C~p`V$d z;vUC=%gqe)FVdQ&MBb@0Q^V4E&u=k diff --git a/library/src/main/res/drawable-xxhdpi/exo_controls_pause.png b/library/src/main/res/drawable-xxhdpi/exo_controls_pause.png index 50a545db4d67f51ccc127aa98582a2d5236e127f..9a36b17cb8580d3644cc594d6be0b6937e0bc0f5 100644 GIT binary patch literal 611 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Nr8ydc?7hKQ4z_`cL#WAE}&f7bNUd(|aZV&&j%=Idt z;1xb0Pb~3$P+FS(P4}<`p=Ak@8+v;gC-V4Ii2FbMxhmv48{bJ5rtNdjKkq1Z-{1KE z9D@P#0UicphBNpW8`@7LuHC9~(xR{5v&?gwr1ba ztzK6C_E!wIA5~_T2UhQ%YS&Wy^q{$D?eW-|npVFqIYTZ1G6jTu+J zH~IZ6^R#aU|NsB_Qx-V`MHowh{DK)Ap4~_TawI)n w978NlCnrd-Dt!2F&(dGyW_h^N_!1)n(}DYnzc>681uA0jboFyt=akR{0QUnRx&QzG diff --git a/library/src/main/res/drawable-xxhdpi/exo_controls_play.png b/library/src/main/res/drawable-xxhdpi/exo_controls_play.png index 08508c501570293a53a9d4b246b858aab13373cb..41f76bbf999de0813a0701fb8a560841e7c7d407 100644 GIT binary patch literal 1183 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Nr8ydc?7hKQ4!2HA0#WAE}&f7T~y_FqB+Uu*A7_@3I zo@V{X(wZxjb1r1%8zs$2aX0)rmU!=+ed*o52_o$ZEg2KtL>!fz0uDNP2wQM;x#}>* zP2S6WZ`PYM^-AN-@3np7(oUw|JDp#?>Dck(>=IV{0_7dpNdV5rj|A?Cot zt+cG@Pm!*S%iHXu%V>XbOiY%NynsX98BWbX0N(*tVFbuQ|LISp^SUyHj$~VPa8tCw$3~MoImHb-i&2Cr4}5?_KvDo5|caPbJ^$iwph)nUOT5w zow}4kHR^o(&g~1}R3s@c09wLsBl~vagv%FiaZB*9=_~4;VBr3DaKSdFw!;s9KYsi;^oCvh z>Z>i^e|lzUCU{Nw)SNTBD~ySWZDrw!@9de13MmtqR4N|ZP7yP3p1{QM>yOG5Q6Ov5 zv;B24Pgz_zgFf4=iwtyYSmUUrb%}d|t%s{?6yqwEl`A|n9hNGHimqf?A+cnUQY*vM z=8zB%))xXx7CEUoOji({+RA-F*TXe6k*S0?C~)R(hPyxoF5DG|m+zf?{P=Nu=PTK! z3C#*o2ZT-b6~49+(0w5Ekmbm?-tP})m$y6os&@bU_Vr=q5C&nne~oN}@)kVH{b8It XeVsvS@NsuwA;IA3>gTe~DWM4f&P4G* literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$=1AIbU-3xsFQvkerXGs8!5-ADt z3ub6OdQ(m zpN&S#A|!*?^k{}16VXoYnre9T)QqH5!op(Rt?bj}tv}c;oS*SOslKRi@&Y&Ci%$dR zhP?2L$lEM(JEzsGdg0l)jLqV=-e6}st}o!u{dPy~NUjrvcs8ro@R-D7ev`ELYA)%6 Rr9gi&c)I$ztaD0e0ssTizK8$- diff --git a/library/src/main/res/drawable-xxhdpi/exo_controls_previous.png b/library/src/main/res/drawable-xxhdpi/exo_controls_previous.png index f71acc4875e1ee7375b4023d800abd6b1292e717..d4688741b9ce86e0f68ba226198346298ff90065 100644 GIT binary patch literal 1294 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Nr8ydc?7hDgtEZx(^F{EP7+c^ilrK3gK>nlqG#TRk3 z?m61f-SCSgle5F0DLK^|$9+p5Ap-u({6W?ma2l)(!49R@`+Zjz5_89X# zo-F^@;>*Xq>(;&Accr$+Lm=MOMM*GYmKl43d%=s1i4vvje^nTKTz}`)t6lFR@819D zbN#Ert33=KcJ&w5uUz%(RG8J= zb9_#Pvcw#ogUq{m*+JnUyRZ zZEubpYm@3eD)#sNn))Sz3PpE-0W|aJ)2C|6$&!l8J4j)e`&*^r{S#m`~&)m=;8DS9}mA22z4xM=5| z`s(Ux-@D!dEq)9P5!0@k_+HL2k$S(f`s3^XE{2BLvuEqGv$N;-_w}7A+kJP@yW{#! z+6zt}J?g4G`Q(h}&!6YNfA?-*!1u?d3&k%i4bj@GFT(X~L+ch3CWZss-ezAm;n$ve z>fwf#Eg?+1u4HXJoyeJ~$;x2wv@1sM{b`v?m$+UeMTQvzjrv-(S1Z}$w9*6n?d)Ag zlePwE%m@z;Kg;mzBabGFL|Y(J!JBV$a&KP;y7u=}ucrai?kco0FueGa@H_s?2I;J= zw^H?{pFSmU=@JJ6!(juv(z52&9qo#;&%(o2vXoRR9QqouNoVy;zvY{O7QL!Zf8?RL zp!>we5FN4AKWpryw@sK9#h|cFdY58tS=l!=9Yx)}4SGtuA3k~V#2IMrt!;k~{y$fD z{sITX5ofFU=l3tnf1Yc6q*N`J`o;{|`THubq}^s(bp^&v_mD zUVU>8uwLM381^LM)24MCj+_EA3i_dlnLJYPI{zq`if>)y>g?E=9n>o14*?|%G!e#s*KRX`0dJY5_^ zD&pQ=wJc%^6mh=D?)&*RbHay~vpgC9qg57qNxBvp-{qa-v+DTLDM4PEs&`i}kBX0c z@HAA#;E&nF17%th5B#3(k+5yDM}nz1r;nYAki`2|rdVOlFW#LjX37%}R4FPpEN^GD zvE_O2(viWRpShySBcW7`)2B~}siG=i!R`*0Uz3k8%##y&A;oj$$84sWeuIFo#_f%> zY7-l#^Rc}u=3+MeW6Jd*{*c38eT4(EZUzB=h1jxQNU>GSQ8@6pg;7qO>w`sN!|_fg z8$XE$g^L*ag;^`+7#w))!YH@AD#A+>=<;2Rb!XSeIO>$-0R7D1>FVdQ&MBb@0G@yI AVgLXD diff --git a/library/src/main/res/drawable-xxhdpi/exo_controls_rewind.png b/library/src/main/res/drawable-xxhdpi/exo_controls_rewind.png index db0555f9e5c5f89cf29edafc7c5f277556f3cb74..8ebb2ccf30055364a50323990592d3dba2417e1c 100644 GIT binary patch literal 1197 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ za0`Jjl>Nr8ydc?7hDgtjLp-TuOa zDJfXN(lW`_oPDa_!G(M`t;#3l^-VXoig02o@^&y+- zOR`v-IQcxjTRVOF_xkjG_bV)a%73qZ|8HmYM4qNpFSoD2v>=5h7XzNh3njP&@;_LF*ZSa{1EwQT?`6n$wg!HFoFErN%b-9FnNrt0NF-s<-nRr^Evm8)M<+ zF{}5nmM;5i&Q&O6H1o`tW5tA3FG3pO^!Ui44dA_96za4 zw0J>mgKFyY*}0oinlES_c(%#;`Mx$W#zGD2kURlq?hfahir!`&Czx_}FW#a#-C2b( z(cN~{n;fm13OASz&8yM8S+IenM9+Gkdc4;(_Hs6zAGI2)r`xp`yx%0f>CLt4*Z1Fw z+2mNj`e*x_Z9veWv)f{Rjne6BE$)Kr8p7VUc`Ys4wSWKndw1{NePO90w<0FCfHmg( z?TXUUt2$!c*5cyg_VV)bx25{DO^zlNK7aG(&4rS6dOMiT{k2;YwtBzU(x8PmbN)#_ zm~lf!UOs-B*HWj&7k8M)pMJ7cZVWeE9HR2lwL#KJO{p z8DnQM*IMI^(7QiBu7)!S2Cfa;T^M_P?e*8o1Nn5cwnn{8D=yxgU}df~5g21CIl>q7 z_y4sypS{>?SJ28i(@sBadaEk?GkZnQt1!*br2?B7LofBZJ-+vClH3nFg*Q10lP0}u zpC)a1E@#4|y3T9Xi6F+m_HXWjv6~qqFEuhBm^Ml7)@Fqi&-Sxh7cOc4XTTSFX--Uv zr*x%MmsaMxrvibO+~nOCd(ARt@R`2l3x-n|?9U3aQU41-{O$gXv}%ZrLOeHZh(wJTgS<460;X+f{tkL0|2 z%^COP+2_i#b)v=#q|dFWY29~vnc`;W_-Q3iqtqWro=aWHem^z%cG241EMJ}D!awiX zyk`UF??Y;i_Seb|tWaP&(7|A!#L&aRpiCO`59`0Bd=sXYUFQWB84RATelF{r5}E)? CrUy{~ literal 571 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$81AIbU-3xsF4-n8x+3yN;hDJ${ zUob=Q{m(M*4Sut5h%`U9nS7cjcz?S4VwLrmH8x-Op5K3bce23a@8K5hd){5)sP1bJzu zex8u|$?iP!?4_9w#fJS7cQ&kE{)6%CEt3bSG8KD_c_U(uuXp5qeV?iS_c@ce-x7|; z-<~o_C=+&n+17iHx!=9`a>eB599HvUX0hcgXFPu4!kQ!Tx8C?3zTAA=J0l@1WYxo$ zfmXI!hPGbI-Bp*lFO`}nxAgL2q05U)szm(z7xo@{SqNnL^e?}>_|KPy%d?c{#ufx6 zpLzFlhV=5-hlb|&7B(m69eBjox6yI8p^Wq4yz2#Lc=wxC+^KPNzF%O`)|UIN<_{O| z4Zoj14x9L->#~^|_!Zo7m|RnLreUU x-~XHn5bxna#>s3aK743!bbf5IM-v<<_wCJor+pLc2m?j~gQu&X%Q~loCIETRKIZ@c diff --git a/library/src/main/res/drawable-xxxhdpi/exo_controls_fastforward.png b/library/src/main/res/drawable-xxxhdpi/exo_controls_fastforward.png deleted file mode 100644 index af0435a8b7c85ab6703fdd2251971a5fc3a9d389..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&H3s;ExVjhk{2x%j<@0C>&@oyi zL4Lsuj}>&fe+%qqIq&d&b@b=zY>C&~d2aig9G*V=xP``Mj(nNr@15hDuX~qYzMbR5 zz`%IM)5S5QBJS@|+ zdk*yle>Gy`9qV8Jj*JuUInO>t`~v^F{b@I4zewMoe|eiyjopI!hPvm~3oM>CoWHkn zUSlBN50?WaY=4h__bI=_Txay_Wy9SwKWYwCF#kRHHDd3+rhnJI$Hc>p@;3t;<-Qtj z)bE1IQ-b!Ae{&pUp0@ZG*fjt9@4g=%BS-XCojS$x#rB*cFf}lEy85}Sb4q9e0Nizq AFaQ7m diff --git a/library/src/main/res/drawable-xxxhdpi/exo_controls_next.png b/library/src/main/res/drawable-xxxhdpi/exo_controls_next.png deleted file mode 100644 index 50916cf0e79d2b8b88c767c63e0060fd3f43b710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&cf zkY6wZ&-C-z60i5O{O)EGp7uM$AmVy4i}iNbf<>R|?*0Gop7utOv*pdno1fLRGmHEun{D^fTskEPOi1mr zmaAHy&Ck4Q?&*eK6_Xi5_bW>VJg%1v`1(tU`PKViwvhcVWf=a}oNl;vUWMVUn$dz~ z@kR@NEi7iZaxRwPu>zw6JLdrl4~AooOa^>X4TT#RdYV}iWK0+yCjg~*4_HJn96N}R zVoQ+GVR*a%tSdTz@$uB(T+{#;51s%3 diff --git a/library/src/main/res/drawable-xxxhdpi/exo_controls_pause.png b/library/src/main/res/drawable-xxxhdpi/exo_controls_pause.png deleted file mode 100644 index 6a5c59335e108d3fc995791d886b4b158e1c809d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI(Ey(iSN8&+{}^EVDaKns1#Bfj ze!&d!4iW+?+N{j~fFc2&E{-7;ac|EomX@QS3j3^P6+KyyBiBNS_J`6e zjsh%>8yGG!nQ(7l;1?S_TA2;rE@GTf_K?A6cLu|BdQuIU;=Bj8aI+`eas^5s0!m*5N*4g7 zO`y_z2ex#xVd@4+%V5_HGhF7t%1m~6umTwyez7NfUsmwXlfeNb?CI*~vd$@?2>>4k Bw*vqG diff --git a/library/src/main/res/drawable-xxxhdpi/exo_controls_previous.png b/library/src/main/res/drawable-xxxhdpi/exo_controls_previous.png deleted file mode 100644 index 00f7b97d1b374194e102bfd2220ef3c996092851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&r3LtexVjhk{HHz0oA&Ai&_>0Q zAirRS&*>sIr|-}I&GLLP$7Gr2_dNSm+zpC@*I(YOaoxLJApFZeC0zyvMk7xb$B>G+ zx7YUuH77{0CW;u!I~uAqdH$(=|6lFx9V272+jHK|tmJyO=fYjBrBi~uG(p75f4BZV zewq55NlxxGOOO6qp97gIj2OR{r!xI2p2}HqcRFW9)jA`_*GoeVTsy^b=D3#dhcXS} z4L+e<4KK?XeD*UZ{1Roj{GMS(9qWNF)(p$y84dpOL8O=xe#tUiUJsOFN0thQ=n8eH zzsj(u(P%-nybMEc{8^?Ahxr=zsdGBmv$H#VzQ}lChbgvpz;8L|wu?@SqvA7mqLL_J3xpcus<& zMV&tiXN4!%>DIV?eUx`ZzLo!Gehf?F`Il$rvg{7~F=6@E#Sau}Ja(>)1qsUE_1rMO zmH(%O1y@`PzvaBUt^z;iyu2J(5Y=)%V(;$B4_>L%cx)^dOtG6^=YDXR7?2WL7gocIgq34(Vn^sT$ z^74yz&#!`Cfg4sf`Y(@XUoH3};TNl0t-)WF8(R+?zr4Pg`NPF8**(81ewA*RKXJX} zHI);!XScFCzPW$&a~sRf^();3QvU5VG38*IAEPAnWM5h-lj8&CWv=Wi`|l?+9kzQ? zB;feQ_{oK+GyU_`xPKpfoNy!k#PhbJe||8ZJyiF>BH{+W96MM%(Y`{4=eJ@WH@DxR z=Q8^vKUAdI+4HsiHHbIn{&wj3lzdaJY0(cJKTcq@Kd?3RVBe1i&l#GkA1nq5c-*|A zv!cfDGe!u=$M4ad^u1@~ -