diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java index ebca28479c..b9dbbb982f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java @@ -55,7 +55,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource mediaSourcesPublic; + private final List mediaSourcesPublic; // Accessed on the playback thread. private final List mediaSourceHolders; @@ -129,12 +129,13 @@ public class ConcatenatingMediaSource extends CompositeMediaSource 0 ? shuffleOrder.cloneAndClear() : shuffleOrder; this.mediaSourceByMediaPeriod = new IdentityHashMap<>(); - this.mediaSourcesPublic = new ArrayList<>(Arrays.asList(mediaSources)); + this.mediaSourcesPublic = new ArrayList<>(); this.mediaSourceHolders = new ArrayList<>(); this.deferredMediaPeriods = new ArrayList<>(1); this.pendingOnCompletionActions = new ArrayList<>(); - this.query = new MediaSourceHolder(null, null, -1, -1, -1); + this.query = new MediaSourceHolder(/* mediaSource= */ null); this.isAtomic = isAtomic; + addMediaSources(Arrays.asList(mediaSources)); } /** @@ -181,12 +182,13 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(index, mediaSource, actionOnCompletion)) + .setPayload(new MessageData<>(index, mediaSourceHolder, actionOnCompletion)) .send(); } else if (actionOnCompletion != null) { actionOnCompletion.run(); @@ -244,12 +246,16 @@ public class ConcatenatingMediaSource extends CompositeMediaSource mediaSourceHolders = new ArrayList<>(mediaSources.size()); + for (MediaSource mediaSource : mediaSources) { + mediaSourceHolders.add(new MediaSourceHolder(mediaSource)); + } + mediaSourcesPublic.addAll(index, mediaSourceHolders); if (player != null && !mediaSources.isEmpty()) { player .createMessage(this) .setType(MSG_ADD_MULTIPLE) - .setPayload(new MessageData<>(index, mediaSources, actionOnCompletion)) + .setPayload(new MessageData<>(index, mediaSourceHolders, actionOnCompletion)) .send(); } else if (actionOnCompletion != null) { actionOnCompletion.run(); @@ -370,7 +376,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource addMessage = (MessageData) message; + MessageData addMessage = (MessageData) message; shuffleOrder = shuffleOrder.cloneAndInsert(addMessage.index, 1); addMediaSourceInternal(addMessage.index, addMessage.customData); scheduleListenerNotification(addMessage.actionOnCompletion); break; case MSG_ADD_MULTIPLE: - MessageData> addMultipleMessage = - (MessageData>) message; + MessageData> addMultipleMessage = + (MessageData>) message; shuffleOrder = shuffleOrder.cloneAndInsert( addMultipleMessage.index, addMultipleMessage.customData.size()); @@ -514,33 +520,30 @@ public class ConcatenatingMediaSource extends CompositeMediaSource 0) { MediaSourceHolder previousHolder = mediaSourceHolders.get(newIndex - 1); - newMediaSourceHolder = - new MediaSourceHolder( - newMediaSource, - newTimeline, - newIndex, - previousHolder.firstWindowIndexInChild + previousHolder.timeline.getWindowCount(), - previousHolder.firstPeriodIndexInChild + previousHolder.timeline.getPeriodCount()); + newMediaSourceHolder.reset( + newIndex, + previousHolder.firstWindowIndexInChild + previousHolder.timeline.getWindowCount(), + previousHolder.firstPeriodIndexInChild + previousHolder.timeline.getPeriodCount()); } else { - newMediaSourceHolder = new MediaSourceHolder(newMediaSource, newTimeline, 0, 0, 0); + newMediaSourceHolder.reset( + newIndex, /* firstWindowIndexInChild= */ 0, /* firstPeriodIndexInChild= */ 0); } correctOffsets( newIndex, /* childIndexUpdate= */ 1, - newTimeline.getWindowCount(), - newTimeline.getPeriodCount()); + newMediaSourceHolder.timeline.getWindowCount(), + newMediaSourceHolder.timeline.getPeriodCount()); mediaSourceHolders.add(newIndex, newMediaSourceHolder); prepareChildSource(newMediaSourceHolder, newMediaSourceHolder.mediaSource); } - private void addMediaSourcesInternal(int index, Collection mediaSources) { - for (MediaSource mediaSource : mediaSources) { - addMediaSourceInternal(index++, mediaSource); + private void addMediaSourcesInternal( + int index, Collection mediaSourceHolders) { + for (MediaSourceHolder mediaSourceHolder : mediaSourceHolders) { + addMediaSourceInternal(index++, mediaSourceHolder); } } @@ -647,18 +650,19 @@ public class ConcatenatingMediaSource extends CompositeMediaSource