Reuse media sources in demo apps.

Especially the cast demo app benefits from this feature as it can keep its
ConcatenatingMediaSource all the time without having to repopulate it
when switching players.

Issue:#3498

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=187866048
This commit is contained in:
tonihei 2018-03-05 07:52:22 -08:00 committed by Oliver Woodman
parent 6e5ae87cae
commit c0c11af29f
2 changed files with 58 additions and 61 deletions

View File

@ -79,8 +79,8 @@ import java.util.ArrayList;
private final CastPlayer castPlayer; private final CastPlayer castPlayer;
private final ArrayList<DemoUtil.Sample> mediaQueue; private final ArrayList<DemoUtil.Sample> mediaQueue;
private final QueuePositionListener queuePositionListener; private final QueuePositionListener queuePositionListener;
private final ConcatenatingMediaSource concatenatingMediaSource;
private ConcatenatingMediaSource concatenatingMediaSource;
private boolean castMediaQueueCreationPending; private boolean castMediaQueueCreationPending;
private int currentItemIndex; private int currentItemIndex;
private Player currentPlayer; private Player currentPlayer;
@ -116,6 +116,7 @@ import java.util.ArrayList;
this.castControlView = castControlView; this.castControlView = castControlView;
mediaQueue = new ArrayList<>(); mediaQueue = new ArrayList<>();
currentItemIndex = C.INDEX_UNSET; currentItemIndex = C.INDEX_UNSET;
concatenatingMediaSource = new ConcatenatingMediaSource();
DefaultTrackSelector trackSelector = new DefaultTrackSelector(BANDWIDTH_METER); DefaultTrackSelector trackSelector = new DefaultTrackSelector(BANDWIDTH_METER);
RenderersFactory renderersFactory = new DefaultRenderersFactory(context, null); RenderersFactory renderersFactory = new DefaultRenderersFactory(context, null);
@ -154,9 +155,8 @@ import java.util.ArrayList;
*/ */
public void addItem(Sample sample) { public void addItem(Sample sample) {
mediaQueue.add(sample); mediaQueue.add(sample);
if (currentPlayer == exoPlayer) { concatenatingMediaSource.addMediaSource(buildMediaSource(sample));
concatenatingMediaSource.addMediaSource(buildMediaSource(sample)); if (currentPlayer == castPlayer) {
} else {
castPlayer.addItems(buildMediaQueueItem(sample)); castPlayer.addItems(buildMediaQueueItem(sample));
} }
} }
@ -185,9 +185,8 @@ import java.util.ArrayList;
* @return Whether the removal was successful. * @return Whether the removal was successful.
*/ */
public boolean removeItem(int itemIndex) { public boolean removeItem(int itemIndex) {
if (currentPlayer == exoPlayer) { concatenatingMediaSource.removeMediaSource(itemIndex);
concatenatingMediaSource.removeMediaSource(itemIndex); if (currentPlayer == castPlayer) {
} else {
if (castPlayer.getPlaybackState() != Player.STATE_IDLE) { if (castPlayer.getPlaybackState() != Player.STATE_IDLE) {
Timeline castTimeline = castPlayer.getCurrentTimeline(); Timeline castTimeline = castPlayer.getCurrentTimeline();
if (castTimeline.getPeriodCount() <= itemIndex) { if (castTimeline.getPeriodCount() <= itemIndex) {
@ -214,9 +213,8 @@ import java.util.ArrayList;
*/ */
public boolean moveItem(int fromIndex, int toIndex) { public boolean moveItem(int fromIndex, int toIndex) {
// Player update. // Player update.
if (currentPlayer == exoPlayer) { concatenatingMediaSource.moveMediaSource(fromIndex, toIndex);
concatenatingMediaSource.moveMediaSource(fromIndex, toIndex); if (currentPlayer == castPlayer && castPlayer.getPlaybackState() != Player.STATE_IDLE) {
} else if (castPlayer.getPlaybackState() != Player.STATE_IDLE) {
Timeline castTimeline = castPlayer.getCurrentTimeline(); Timeline castTimeline = castPlayer.getCurrentTimeline();
int periodCount = castTimeline.getPeriodCount(); int periodCount = castTimeline.getPeriodCount();
if (periodCount <= fromIndex || periodCount <= toIndex) { if (periodCount <= fromIndex || periodCount <= toIndex) {
@ -262,6 +260,7 @@ import java.util.ArrayList;
public void release() { public void release() {
currentItemIndex = C.INDEX_UNSET; currentItemIndex = C.INDEX_UNSET;
mediaQueue.clear(); mediaQueue.clear();
concatenatingMediaSource.clear();
castPlayer.setSessionAvailabilityListener(null); castPlayer.setSessionAvailabilityListener(null);
castPlayer.release(); castPlayer.release();
localPlayerView.setPlayer(null); localPlayerView.setPlayer(null);
@ -349,10 +348,6 @@ import java.util.ArrayList;
// Media queue management. // Media queue management.
castMediaQueueCreationPending = currentPlayer == castPlayer; castMediaQueueCreationPending = currentPlayer == castPlayer;
if (currentPlayer == exoPlayer) { if (currentPlayer == exoPlayer) {
concatenatingMediaSource = new ConcatenatingMediaSource();
for (int i = 0; i < mediaQueue.size(); i++) {
concatenatingMediaSource.addMediaSource(buildMediaSource(mediaQueue.get(i)));
}
exoPlayer.prepare(concatenatingMediaSource); exoPlayer.prepare(concatenatingMediaSource);
} }

View File

@ -118,6 +118,7 @@ public class PlayerActivity extends Activity
private DataSource.Factory mediaDataSourceFactory; private DataSource.Factory mediaDataSourceFactory;
private SimpleExoPlayer player; private SimpleExoPlayer player;
private MediaSource mediaSource;
private DefaultTrackSelector trackSelector; private DefaultTrackSelector trackSelector;
private TrackSelectionHelper trackSelectionHelper; private TrackSelectionHelper trackSelectionHelper;
private DebugTextViewHelper debugViewHelper; private DebugTextViewHelper debugViewHelper;
@ -253,9 +254,8 @@ public class PlayerActivity extends Activity
// Internal methods // Internal methods
private void initializePlayer() { private void initializePlayer() {
Intent intent = getIntent(); if (player == null) {
boolean needNewPlayer = player == null; Intent intent = getIntent();
if (needNewPlayer) {
TrackSelection.Factory adaptiveTrackSelectionFactory = TrackSelection.Factory adaptiveTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(BANDWIDTH_METER); new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);
trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory);
@ -315,52 +315,53 @@ public class PlayerActivity extends Activity
playerView.setPlaybackPreparer(this); playerView.setPlaybackPreparer(this);
debugViewHelper = new DebugTextViewHelper(player, debugTextView); debugViewHelper = new DebugTextViewHelper(player, debugTextView);
debugViewHelper.start(); debugViewHelper.start();
}
String action = intent.getAction(); String action = intent.getAction();
Uri[] uris; Uri[] uris;
String[] extensions; String[] extensions;
if (ACTION_VIEW.equals(action)) { if (ACTION_VIEW.equals(action)) {
uris = new Uri[]{intent.getData()}; uris = new Uri[] {intent.getData()};
extensions = new String[]{intent.getStringExtra(EXTENSION_EXTRA)}; extensions = new String[] {intent.getStringExtra(EXTENSION_EXTRA)};
} else if (ACTION_VIEW_LIST.equals(action)) { } else if (ACTION_VIEW_LIST.equals(action)) {
String[] uriStrings = intent.getStringArrayExtra(URI_LIST_EXTRA); String[] uriStrings = intent.getStringArrayExtra(URI_LIST_EXTRA);
uris = new Uri[uriStrings.length]; uris = new Uri[uriStrings.length];
for (int i = 0; i < uriStrings.length; i++) { for (int i = 0; i < uriStrings.length; i++) {
uris[i] = Uri.parse(uriStrings[i]); uris[i] = Uri.parse(uriStrings[i]);
} }
extensions = intent.getStringArrayExtra(EXTENSION_LIST_EXTRA); extensions = intent.getStringArrayExtra(EXTENSION_LIST_EXTRA);
if (extensions == null) { if (extensions == null) {
extensions = new String[uriStrings.length]; extensions = new String[uriStrings.length];
} }
} else {
showToast(getString(R.string.unexpected_intent_action, action));
return;
}
if (Util.maybeRequestReadExternalStoragePermission(this, uris)) {
// The player will be reinitialized if the permission is granted.
return;
}
MediaSource[] mediaSources = new MediaSource[uris.length];
for (int i = 0; i < uris.length; i++) {
mediaSources[i] = buildMediaSource(uris[i], extensions[i], mainHandler, eventLogger);
}
MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0]
: new ConcatenatingMediaSource(mediaSources);
String adTagUriString = intent.getStringExtra(AD_TAG_URI_EXTRA);
if (adTagUriString != null) {
Uri adTagUri = Uri.parse(adTagUriString);
if (!adTagUri.equals(loadedAdTagUri)) {
releaseAdsLoader();
loadedAdTagUri = adTagUri;
}
MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString));
if (adsMediaSource != null) {
mediaSource = adsMediaSource;
} else { } else {
showToast(R.string.ima_not_loaded); showToast(getString(R.string.unexpected_intent_action, action));
return;
}
if (Util.maybeRequestReadExternalStoragePermission(this, uris)) {
// The player will be reinitialized if the permission is granted.
return;
}
MediaSource[] mediaSources = new MediaSource[uris.length];
for (int i = 0; i < uris.length; i++) {
mediaSources[i] = buildMediaSource(uris[i], extensions[i], mainHandler, eventLogger);
}
mediaSource =
mediaSources.length == 1 ? mediaSources[0] : new ConcatenatingMediaSource(mediaSources);
String adTagUriString = intent.getStringExtra(AD_TAG_URI_EXTRA);
if (adTagUriString != null) {
Uri adTagUri = Uri.parse(adTagUriString);
if (!adTagUri.equals(loadedAdTagUri)) {
releaseAdsLoader();
loadedAdTagUri = adTagUri;
}
MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString));
if (adsMediaSource != null) {
mediaSource = adsMediaSource;
} else {
showToast(R.string.ima_not_loaded);
}
} else {
releaseAdsLoader();
} }
} else {
releaseAdsLoader();
} }
boolean haveResumePosition = resumeWindow != C.INDEX_UNSET; boolean haveResumePosition = resumeWindow != C.INDEX_UNSET;
if (haveResumePosition) { if (haveResumePosition) {
@ -424,6 +425,7 @@ public class PlayerActivity extends Activity
updateResumePosition(); updateResumePosition();
player.release(); player.release();
player = null; player = null;
mediaSource = null;
trackSelector = null; trackSelector = null;
trackSelectionHelper = null; trackSelectionHelper = null;
eventLogger = null; eventLogger = null;