From 962b5940c2f6c8d30abd2bfc0cb629b9e229c04a Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 31 Aug 2016 10:17:41 -0700 Subject: [PATCH] Update ExoPlayer documentation + tweak method naming ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=131843222 --- .../android/exoplayer2/demo/EventLogger.java | 2 +- .../exoplayer2/demo/PlayerActivity.java | 4 +- .../exoplayer2/ext/flac/FlacPlaybackTest.java | 4 +- .../exoplayer2/ext/opus/OpusPlaybackTest.java | 4 +- .../exoplayer2/ext/vp9/VpxPlaybackTest.java | 4 +- .../google/android/exoplayer2/ExoPlayer.java | 196 +++++++++--------- .../android/exoplayer2/ExoPlayerImpl.java | 13 +- .../android/exoplayer2/SimpleExoPlayer.java | 12 +- .../exoplayer2/ui/DebugTextViewHelper.java | 2 +- .../doc-files/exoplayer-playbackstate.png | Bin 15647 -> 0 bytes .../exoplayer2/doc-files/exoplayer-state.png | Bin 17195 -> 0 bytes .../doc-files/exoplayer-threading-model.png | Bin 24534 -> 0 bytes .../doc-files/exoplayer-threading-model.svg | 3 + .../doc-files/timeline-advanced.svg | 2 +- .../doc-files/timeline-live-indefinite.svg | 2 +- .../doc-files/timeline-live-limited.svg | 2 +- .../doc-files/timeline-live-multi-period.svg | 2 +- .../exoplayer2/doc-files/timeline-period.svg | 2 +- .../doc-files/timeline-playlist.svg | 2 +- .../doc-files/timeline-single-file.svg | 2 +- .../exoplayer2/doc-files/timeline-window.svg | 2 +- .../playbacktests/util/ExoHostedTest.java | 4 +- 22 files changed, 138 insertions(+), 126 deletions(-) delete mode 100644 library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-playbackstate.png delete mode 100644 library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-state.png delete mode 100644 library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-threading-model.png create mode 100644 library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-threading-model.svg 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 0538eb5230..d52fc30cba 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 @@ -95,7 +95,7 @@ import java.util.Locale; } @Override - public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { + public void onTimelineChanged(Timeline timeline, Object manifest) { int periodCount = timeline.getPeriodCount(); int windowCount = timeline.getWindowCount(); Log.d(TAG, "sourceInfo [periodCount=" + periodCount + ", windowCount=" + windowCount); 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 930e091ecf..a6da5499d4 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 @@ -330,7 +330,7 @@ public class PlayerActivity extends Activity implements OnKeyListener, OnTouchLi } MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0] : new ConcatenatingMediaSource(mediaSources); - player.setMediaSource(mediaSource, !shouldRestorePosition); + player.prepare(mediaSource, !shouldRestorePosition); playerNeedsSource = false; updateButtonVisibilities(); } @@ -431,7 +431,7 @@ public class PlayerActivity extends Activity implements OnKeyListener, OnTouchLi } @Override - public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { + public void onTimelineChanged(Timeline timeline, Object manifest) { // Do nothing. } 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 5b01d77a07..ca3d1a0a65 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 @@ -80,7 +80,7 @@ public class FlacPlaybackTest extends InstrumentationTestCase { MatroskaExtractor.FACTORY, null, null); - player.setMediaSource(mediaSource); + player.prepare(mediaSource); player.setPlayWhenReady(true); Looper.loop(); } @@ -96,7 +96,7 @@ public class FlacPlaybackTest extends InstrumentationTestCase { } @Override - public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { + public void onTimelineChanged(Timeline timeline, Object manifest) { // Do nothing. } 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 dd3097b612..b094ed1f93 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 @@ -80,7 +80,7 @@ public class OpusPlaybackTest extends InstrumentationTestCase { MatroskaExtractor.FACTORY, null, null); - player.setMediaSource(mediaSource); + player.prepare(mediaSource); player.setPlayWhenReady(true); Looper.loop(); } @@ -96,7 +96,7 @@ public class OpusPlaybackTest extends InstrumentationTestCase { } @Override - public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { + public void onTimelineChanged(Timeline timeline, Object manifest) { // Do nothing. } 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 339d73815f..7fd1294b01 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 @@ -99,7 +99,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { player.sendMessages(new ExoPlayer.ExoPlayerMessage(videoRenderer, LibvpxVideoRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER, new VpxVideoSurfaceView(context))); - player.setMediaSource(mediaSource); + player.prepare(mediaSource); player.setPlayWhenReady(true); Looper.loop(); } @@ -115,7 +115,7 @@ public class VpxPlaybackTest extends InstrumentationTestCase { } @Override - public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { + public void onTimelineChanged(Timeline timeline, Object manifest) { // Do nothing. } 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 762df4056f..b3408ff722 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -15,83 +15,93 @@ */ package com.google.android.exoplayer2; -import com.google.android.exoplayer2.source.MediaPeriod; +import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; +import com.google.android.exoplayer2.metadata.MetadataRenderer; +import com.google.android.exoplayer2.source.ConcatenatingMediaSource; +import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.MediaSource; +import com.google.android.exoplayer2.source.MergingMediaSource; +import com.google.android.exoplayer2.source.SingleSampleMediaSource; +import com.google.android.exoplayer2.source.dash.DashMediaSource; +import com.google.android.exoplayer2.source.hls.HlsMediaSource; +import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; +import com.google.android.exoplayer2.text.TextRenderer; +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; +import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; /** * An extensible media player exposing traditional high-level media player functionality, such as - * the ability to buffer media, play, pause and seek. + * the ability to buffer media, play, pause and seek. Instances can be obtained from + * {@link ExoPlayerFactory}. * - *

Topics covered here are: - *

    - *
  1. Assumptions and player composition - *
  2. Threading model - *
  3. Player state - *
+ *

Player composition

+ *

ExoPlayer is designed to make few assumptions about (and hence impose few restrictions on) the + * type of the media being played, how and where it is stored, and how it is rendered. Rather than + * implementing the loading and rendering of media directly, ExoPlayer implementations delegate this + * work to components that are injected when a player is created or when it's prepared for playback. + * Components common to all ExoPlayer implementations are: + *

+ *

An ExoPlayer can be built using the default components provided by the library, but may also + * be built using custom implementations if non-standard behaviors are required. For example a + * custom LoadControl could be injected to change the player's buffering strategy, or a custom + * Renderer could be injected to use a video codec not supported natively by Android. * - * - *

Assumptions and player construction

+ *

The concept of injecting components that implement pieces of player functionality is present + * throughout the library. The default component implementations listed above delegate work to + * further injected components. This allows many sub-components to be individually replaced with + * custom implementations. For example the default MediaSource implementations require one or more + * {@link DataSource} factories to be injected via their constructors. By providing a custom factory + * it's possible to load data from a non-standard source or through a different network stack. * - *

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 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 Renderer} implementation can be provided. - * - *

{@link com.google.android.exoplayer2.audio.MediaCodecAudioRenderer} and - * {@link com.google.android.exoplayer2.video.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 upstream dependency - * injection is actively encouraged, since it means that the functionality of the player is built up - * through the composition of components that can easily be exchanged for alternate implementations. - * For example a {@link MediaPeriod} implementation may require a further upstream data loading - * component to be injected through its constructor, with different implementations enabling the - * loading of data from various sources. - * - * *

Threading model

- * - *

The figure below shows the {@link ExoPlayer} threading model.

- *

MediaPlayer state diagram

+ *

The figure below shows ExoPlayer's threading model.

+ *

+ * ExoPlayer's threading model + *

* * - * - * - *

Player state

- * - *

The components of an {@link ExoPlayer}'s state can be divided into two distinct groups. The - * state accessed by calling {@link #getPlayWhenReady()} is only ever changed by invoking - * {@link #setPlayWhenReady(boolean)}, and is never changed as a result of operations that have been - * performed asynchronously by the playback thread. In contrast, the playback state accessed by - * calling {@link #getPlaybackState()} is only ever changed as a result of operations completing on - * the playback thread, as illustrated below.

- * - *

ExoPlayer state

- * - *

The possible playback state transitions are shown below. Transitions can be triggered either - * 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 called.

- *

ExoPlayer playback state transitions

*/ public interface ExoPlayer { @@ -117,23 +127,13 @@ public interface ExoPlayer { */ void onPlayerStateChanged(boolean playWhenReady, int playbackState); - // TODO: Should be windowIndex and position in the window. /** - * Called when the player's position changes due to a discontinuity (i.e. due to seeking, - * playback transitioning to the next window, or a source induced discontinuity). + * Called when timeline and/or manifest has been refreshed. * - * @param periodIndex The index of the period being played. - * @param positionMs The playback position in that period, in milliseconds. + * @param timeline The latest timeline. + * @param manifest The latest manifest. */ - void onPositionDiscontinuity(int periodIndex, long positionMs); - - /** - * Called when manifest and/or timeline has been refreshed. - * - * @param timeline The source's timeline. - * @param manifest The loaded manifest. - */ - void onSourceInfoRefreshed(Timeline timeline, Object manifest); + void onTimelineChanged(Timeline timeline, Object manifest); /** * Called when an error occurs. The playback state will transition to {@link #STATE_IDLE} @@ -144,6 +144,16 @@ public interface ExoPlayer { */ void onPlayerError(ExoPlaybackException error); + // TODO: Should be windowIndex and position in the window. + /** + * Called when the player's position changes due to a discontinuity (i.e. due to seeking, + * playback transitioning to the next window, or a source induced discontinuity). + * + * @param periodIndex The index of the period being played. + * @param positionMs The playback position in that period, in milliseconds. + */ + void onPositionDiscontinuity(int periodIndex, long positionMs); + } /** @@ -239,19 +249,21 @@ public interface ExoPlayer { int getPlaybackState(); /** - * Sets the {@link MediaSource} to play. Equivalent to {@code setMediaSource(mediaSource, true)}. + * Prepares the player to play the provided {@link MediaSource}. Equivalent to + * {@code prepare(mediaSource, true)}. */ - void setMediaSource(MediaSource mediaSource); + void prepare(MediaSource mediaSource); /** - * Sets the {@link MediaSource} to play. + * Prepares the player to play the provided {@link MediaSource}, optionally resetting the playback + * position the default position in the first {@link Timeline.Window}. * * @param mediaSource The {@link MediaSource} to play. - * @param resetPosition Whether the playback position should be reset to the source's default - * position. If false, playback will start from the position defined by - * {@link #getCurrentWindowIndex()} and {@link #getCurrentPosition()}. + * @param resetPosition Whether the playback position should be reset to the default position in + * the first {@link Timeline.Window}. If false, playback will start from the position defined + * by {@link #getCurrentWindowIndex()} and {@link #getCurrentPosition()}. */ - void setMediaSource(MediaSource mediaSource, boolean resetPosition); + void prepare(MediaSource mediaSource, boolean resetPosition); /** * Sets whether playback should proceed when {@link #getPlaybackState()} == {@link #STATE_READY}. @@ -279,17 +291,15 @@ public interface ExoPlayer { /** * Seeks to the default position associated with the current window. The position can depend on - * the type of source passed to {@link #setMediaSource(MediaSource)}. For live streams it will - * typically be the live edge of the window. For other streams it will typically be the start of - * the window. + * the type of source passed to {@link #prepare(MediaSource)}. For live streams it will typically + * be the live edge of the window. For other streams it will typically be the start of the window. */ void seekToDefaultPosition(); /** * Seeks to the default position associated with the specified window. The position can depend on - * the type of source passed to {@link #setMediaSource(MediaSource)}. For live streams it will - * typically be the live edge of the window. For other streams it will typically be the start of - * the window. + * the type of source passed to {@link #prepare(MediaSource)}. For live streams it will typically + * be the live edge of the window. For other streams it will typically be the start of the window. * * @param windowIndex The index of the window whose associated default position should be seeked * to. @@ -353,7 +363,7 @@ public interface ExoPlayer { /** * Returns the current manifest. The type depends on the {@link MediaSource} passed to - * {@link #setMediaSource(MediaSource)} or {@link #setMediaSource(MediaSource, boolean)}. + * {@link #prepare}. */ Object getCurrentManifest(); 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 b62e196691..91cf5ec123 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -28,7 +28,7 @@ import com.google.android.exoplayer2.util.Assertions; import java.util.concurrent.CopyOnWriteArraySet; /** - * Concrete implementation of {@link ExoPlayer}. + * An {@link ExoPlayer} implementation. Instances can be obtained from {@link ExoPlayerFactory}. */ /* package */ final class ExoPlayerImpl implements ExoPlayer { @@ -62,8 +62,7 @@ import java.util.concurrent.CopyOnWriteArraySet; * @param loadControl The {@link LoadControl} that will be used by the instance. */ @SuppressLint("HandlerLeak") - public ExoPlayerImpl(Renderer[] renderers, TrackSelector trackSelector, - LoadControl loadControl) { + public ExoPlayerImpl(Renderer[] renderers, TrackSelector trackSelector, LoadControl loadControl) { Log.i(TAG, "Init " + ExoPlayerLibraryInfo.VERSION); Assertions.checkNotNull(renderers); Assertions.checkState(renderers.length > 0); @@ -99,12 +98,12 @@ import java.util.concurrent.CopyOnWriteArraySet; } @Override - public void setMediaSource(MediaSource mediaSource) { - setMediaSource(mediaSource, true); + public void prepare(MediaSource mediaSource) { + prepare(mediaSource, true); } @Override - public void setMediaSource(MediaSource mediaSource, boolean resetPosition) { + public void prepare(MediaSource mediaSource, boolean resetPosition) { timeline = null; internalPlayer.setMediaSource(mediaSource, resetPosition); } @@ -342,7 +341,7 @@ import java.util.concurrent.CopyOnWriteArraySet; timeline = timelineAndManifest.first; manifest = timelineAndManifest.second; for (EventListener listener : listeners) { - listener.onSourceInfoRefreshed(timeline, manifest); + listener.onTimelineChanged(timeline, manifest); } break; } 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 71630e3a2d..18f8fc3942 100644 --- a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -45,8 +45,8 @@ import java.util.ArrayList; import java.util.List; /** - * An {@link ExoPlayer} that uses default {@link Renderer} components. Instances can be obtained - * from {@link ExoPlayerFactory}. + * An {@link ExoPlayer} implementation that uses default {@link Renderer} components. Instances can + * be obtained from {@link ExoPlayerFactory}. */ @TargetApi(16) public final class SimpleExoPlayer implements ExoPlayer { @@ -367,13 +367,13 @@ public final class SimpleExoPlayer implements ExoPlayer { } @Override - public void setMediaSource(MediaSource mediaSource) { - player.setMediaSource(mediaSource); + public void prepare(MediaSource mediaSource) { + player.prepare(mediaSource); } @Override - public void setMediaSource(MediaSource mediaSource, boolean resetPosition) { - player.setMediaSource(mediaSource, resetPosition); + public void prepare(MediaSource mediaSource, boolean resetPosition) { + player.prepare(mediaSource, resetPosition); } @Override diff --git a/library/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java b/library/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java index b72bc18ef9..53e1dcee69 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java +++ b/library/src/main/java/com/google/android/exoplayer2/ui/DebugTextViewHelper.java @@ -89,7 +89,7 @@ public final class DebugTextViewHelper implements Runnable, ExoPlayer.EventListe } @Override - public void onSourceInfoRefreshed(Timeline timeline, Object manifest) { + public void onTimelineChanged(Timeline timeline, Object manifest) { // Do nothing. } diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-playbackstate.png b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-playbackstate.png deleted file mode 100644 index fb0ba72a609a68e5166246ce6d1f3b3e82d1022b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15647 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

^Ma@wKz3 zt<(4Km!X$BGuHI<^vbdPm&0Nl_wFw3-pCU0$=`UhFsCxO>?3Qsi`S~r)pK^%3JVKy zz~B@LO3J(xV?tHsV4Y@drsSo)$*f1@o*sW#F&J1_F{r1fCx!8B0Y2SqP*cE=KoCDj z^Ko))jIYh%_b+~CR#>Hf`nm<9j4raWvJcv49beLW*wlJ1j`8WN5}yL#;MIHV&DH+3!!hr4+ zoZP$<3qcDn-}ijBx)*PM1cm{N^1>}9KRFH!?hqQWpE_G!MP)XzM^s3ty9#LC3S=?^J*4wy#cLHYcGA48J9NK=lL<6Bl5-5&Q2lYsiPr9m&r$EvnaWC#m0g} z-{(G7YA#lu$NTbjY5+`-KlI&}6YbACP4_4rJWxAi=c7z#d>jx9b^VI^(c0XJpc=qEP zz&3Lu#g8m7==3O%wX4wpg~!I)TePfcMz)Ua){h;M5fUT^Zy}j4YFL?J>o(%Z-_!}r4R8*?)y`J>8L=je3;=7Ys z?YLSD05Nd(wvXQaz1tg4YpB){0Ei^7z=wZFYncjrL)9bh3t%uZGV)0%#yeulT|Brm zDNNr@4K1zZ&QS8+ts*NBsAAy|YBx-KVk}#KE$!vkvdNlG zbEkh0Xlh>e-e3M`sovri1L4`bP!H`x;VAecP^WDVCtH#G2tWx0T6SM7hL+zbi1?5J zl*`cZK_a1mu~oFMkIfjTxFkmk>TfeNqK}0I6XvKtTK5G57Oa?EsBXP&kRtacscknu z*ywa8L)KKoqpTEug;{8w@1k`m$Uwdk2{s0SjGJwkhYjFof!@KcEE#ogDo>K|Y zj37tW6RzC}k2I=K3@jfrRcuLqv4(viR@2J{fTatAtab0@`6H9^xcTklFMR|`gA9pA zmaH|f0X9i8CPNO`6wS69J!>*Gzsa$Nnf1@Wh2QA(&rVqgCj0O1?;%>i5Vwu4qyfgi zccCu3M9Gts$H^}?g^9Y^OjqH_CyJ}MvuC1ZLuRSHo&7nuj`Xw8_;^e5x3MbM_`6~6 z^3V0Bs4opSn;p$t-gaI86eI_Q(0XczJRL1=H#+L>sC4?9zYOktgDM>N4P4K(@etyV zGd&2EfwUp}4LDk;0Ne;bX1*~l!S*lYL_@I`$6;%t3*$cif(b52cl^A>$CK=n+LYt{E9-Vc(WasqnDmm@E#vRK z{CzkhP~h?cKAg-SKb%D6tn7YKfwh|~HOp$?;cx|D0S;%FKTTwJ1PuzH82u2U=f}?; zM0)MckSPG(li+0&XJ>bJdiMb%NRLeC_$NBC0XIEo

^u&Dg{QJ^oe|Ij+;o75r5~ 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 G@V@|B6*eOP diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-state.png b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-state.png deleted file mode 100644 index d37a51e23aca176325774c0bc40a3fc8a851b8ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17195 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 diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-threading-model.png b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/exoplayer-threading-model.png deleted file mode 100644 index 9f0306c11109afb71dc6bfce07f9c0336466c110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24534 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

IlFzeOQ78tUT^1?6I)LPtYH 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

cn~$rHvt6JF7vlK9+0)=4-PMMG%3SM$xuy zv0@3HwdX`Gf|lvgSJ{2MtZ(}USooN0yu(2yIa_~(s-L}?0ws-KVT)|tTN>Vw?C2_i z_luf5z`s?|Dg#bS%rLqAFTYa1xEJl8pav1V6>llJ^$R>*DZu^X2D-`9EKUry>hRh2 zNQZBVn}7Tq*uh%wuZn1d!1Q*9v?Nfk~&dcob}5=Vx4UNyqr#JV@&a%X-ZM8*59i45Pq$ep;Fx;y+O~p9Q1z3fe5#Y7(2E^%fzary{JRpcD+_ zdXrnu8+gD7rVZ3Tv76@R!3!CtSG-{f9{ut{D!46-y9~C9amFP6-Wa5A#V_~ zB1T;2IO+fm@f4bl3N6Uk^`J+jPFAGAAEZ8g9jJ~NZ%m9VKy#-S|G0fs@cx|a6D8vP z{ps$~8-FP*Z?JLs%FMI^mYC|&d+S@v@uyDPi!WG=NE6Gg)tOLZFF$`*_&Fmt!jZb$ zMf<^+>FvEjKI%s(6*Awtk@RO^h%<5VnDCd&@*+8Nnr1CIwGQ6s@hn(t(Wv9+^L?A* zvEooZfR={6?xEfrayJv8=wxz7e4(dK+d-0#Fc zl`PL1)5zsk^}Ccr-|`)vHMGXG1cKfr^jdt@nB}+GOct)uQU%e1=hOt1%(Ukh_PNk+ zKMbOMe5YT_Oo;DE{)kDORKH;_dPtpoL5;SIbKO1tB9W^!c$9F(QzA-kGBDx{UkRU-(?vRnPn7da!oW9w+SJGnY!*jp;(`oh z_Wp5;BP%9|7IaJ(vKGO5h|9CI{mY#oG!(-3L3GYN_HW z(9Kv2yBaZyydX@M*;DZKbB*Xt{E$ypWyZ~1?!-FztfP?m1Nwmmv=+`(YhTij;7mHD zKMM4iBKeqC8Y+fKNh&sr3LD3qtSCiu7p+)QBlxsx!KpiX8s3C7nUE@jrSz9nb%}Qh zOapg`USuAU=TbWcJ6^2SQqd%LK)r2&Ad{q1*Ah-?dO?aIwj;F41Ii$r=$n^~wFU!W z6|bDenRsFDq$F@OwURm${()X4uo$6eyjG|w{1^~g3gw;evfK+*j4Q4^iu#Min_wen zN>&S7nx0H@gog1eS4Vvvyy&{q2ADhAga?A+TnqKZm-F_pcZ42J?&-6e+0nstHn;IA zoE&U5k*mD}Jk)bS3CxFZ)xVbl6s!{wP|_hja}%HOXOneiEj_{xL9XGER^z)vBS7pyWs^7eK%Qr zU8Lpu)T-8&*`4`-bob}3V~JGfPWRRu`@}eH2}(*Ck68R02t-HaL!s1M1}AsFJu-Vx zsepm^E?SkR*GY84z|SM9$ea00iRIb1QA-!aQIz85yUZEL(sk5=xoo%E!uZ9e3X(x@ zTeu6%^7URdo+lOCj{PmVcL&jVSrdhbVL7?dHp!!9QL#05kkNz}M^@R_{MIA2KI77>InrGi&wynMB3WpeeNjhuc$dUN8H8Qy);c7n|O;`24fkTwMa zrQ372aGqy|5bsK4#`$3?*lti!)R$JD4>N7c3(wnx0aQBgNOItnF@8bFk^(l$C_M>T z%Uqt-ry;|nk2`CcBuJ&E*(J3lBCNYjG2k9f3qg|t9a~E zn{7R-cYS>I3ja6x2nZIJTURrqME@+F5AX4VB*$UscObL~+PnWruPE|*w_Qe7nFhch z)i4v6H8Wz)r@=Gmc5-tXU8v8??+5&8MRkcf@ zE~b~tKSh~D6+;9twT*a{ooQsXtk#-OFkr zM!g(mp6J4ZVsmVZw`pU}CA4II{9ox*w|3j4mjY`&1^=5vW(GN1fhR#63h9nwUrCN( zUQ>a-Oi~f!$OO4=S@tvtC{upRTslJJdsTe25^RE{f_XVYy@VPrBC-79xp&o8(7*Ie z1k!y%*L`6pdhSDBeSFfheMUz4WTV=L*{6H##L)^xkkC?LVI-4=*nFF+6w=G*>w&af z`%f}O$&q*tt>S)%4+DXxn>=J?wI+9nSh;Z~E!?QE{ zUojD|p;h3U2|f2aO3 + + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1ExoPlayerApplication codeLoadControlTrackSelectorMediaSourceRenderersApplication visible stateMessage queueMessage queueapplication threadinternal playback threadbackground thread(s)playback loopget*()prepare()seekTo()etc…Listener calls diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-advanced.svg b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-advanced.svg index e376534cf6..e7a9960acc 100644 --- a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-advanced.svg +++ b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-advanced.svg @@ -1,3 +1,3 @@ - Produced by OmniGraffle 6.6.1 2016-08-29 18:21:43 +0000Canvas 1Layer 1period2period3window2timeperiod1window1 + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1period2period3window2timeperiod1window1 diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-indefinite.svg b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-indefinite.svg index 9c309a4a11..d15b27b552 100644 --- a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-indefinite.svg +++ b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-indefinite.svg @@ -1,3 +1,3 @@ - Produced by OmniGraffle 6.6.1 2016-08-29 18:21:43 +0000Canvas 1Layer 1period1window1time + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1period1window1time diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-limited.svg b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-limited.svg index 768144bee4..24c457424d 100644 --- a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-limited.svg +++ b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-limited.svg @@ -1,3 +1,3 @@ - Produced by OmniGraffle 6.6.1 2016-08-29 18:21:43 +0000Canvas 1Layer 1period1window1time + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1period1window1time diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-multi-period.svg b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-multi-period.svg index cc8c3930c1..e9528193f6 100644 --- a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-multi-period.svg +++ b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-live-multi-period.svg @@ -1,3 +1,3 @@ - Produced by OmniGraffle 6.6.1 2016-08-29 18:21:43 +0000Canvas 1Layer 1period1period2window1time + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1period1period2window1time diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-period.svg b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-period.svg index 2271ffd694..05a5b259ee 100644 --- a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-period.svg +++ b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-period.svg @@ -1,3 +1,3 @@ - Produced by OmniGraffle 6.6.1 2016-08-29 18:21:43 +0000Canvas 1Layer 1period1period2window1period1.positionInWindowperiod2.positionInWindowperiod1.windowIndexperiod2.windowIndexperiod1.durationperiod2.duration (unset) + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1period1period2window1period1.positionInWindowperiod2.positionInWindowperiod1.windowIndexperiod2.windowIndexperiod1.durationperiod2.duration (unset) diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-playlist.svg b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-playlist.svg index ba283064b5..5b775de6a5 100644 --- a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-playlist.svg +++ b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-playlist.svg @@ -1,3 +1,3 @@ - Produced by OmniGraffle 6.6.1 2016-08-29 18:21:43 +0000Canvas 1Layer 1period1window1period2period3window2window3time + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1period1window1period2period3window2window3time diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-single-file.svg b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-single-file.svg index fd644f8482..b9435ed95f 100644 --- a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-single-file.svg +++ b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-single-file.svg @@ -1,3 +1,3 @@ - Produced by OmniGraffle 6.6.1 2016-08-29 18:21:43 +0000Canvas 1Layer 1period1window1time + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1period1window1time diff --git a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-window.svg b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-window.svg index b834f02f9d..aaa4b7738b 100644 --- a/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-window.svg +++ b/library/src/main/javadoc/com/google/android/exoplayer2/doc-files/timeline-window.svg @@ -1,3 +1,3 @@ - Produced by OmniGraffle 6.6.1 2016-08-29 18:21:43 +0000Canvas 1Layer 1period1period2window1window1.positionInFirstPeriodwindow1.durationwindow1.defaultStartPositionwindow1.firstPeriodIndexwindow1.lastPeriodIndex + Produced by OmniGraffle 6.6.1 2016-08-30 16:05:23 +0000Canvas 1Layer 1period1period2window1window1.positionInFirstPeriodwindow1.durationwindow1.defaultStartPositionwindow1.firstPeriodIndexwindow1.lastPeriodIndex diff --git a/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/util/ExoHostedTest.java b/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/util/ExoHostedTest.java index 052de93f8a..1b87dde852 100644 --- a/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/util/ExoHostedTest.java +++ b/playbacktests/src/main/java/com/google/android/exoplayer2/playbacktests/util/ExoHostedTest.java @@ -132,7 +132,7 @@ public abstract class ExoHostedTest implements HostedTest, ExoPlayer.EventListen String userAgent = "ExoPlayerPlaybackTests"; DrmSessionManager drmSessionManager = buildDrmSessionManager(userAgent); player = buildExoPlayer(host, surface, trackSelector, drmSessionManager); - player.setMediaSource(buildSource(host, Util.getUserAgent(host, userAgent), bandwidthMeter)); + player.prepare(buildSource(host, Util.getUserAgent(host, userAgent), bandwidthMeter)); player.addListener(this); player.setAudioDebugListener(this); player.setVideoDebugListener(this); @@ -215,7 +215,7 @@ public abstract class ExoHostedTest implements HostedTest, ExoPlayer.EventListen } @Override - public final void onSourceInfoRefreshed(Timeline timeline, Object manifest) { + public final void onTimelineChanged(Timeline timeline, Object manifest) { // Do nothing. }