From 2c671711f47dac2d5b375b0cde1829774216d132 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 6 Mar 2018 06:34:05 -0800 Subject: [PATCH] Ensure child source ids are kept in ConcatenatingMediaSource. Previously, child source ids were reassigned when the media source is reused. Now the creation of the ids moved to outer level to stay in sync with the list of child media sources. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=188014739 --- .../source/ConcatenatingMediaSource.java | 78 ++++++++++--------- .../source/ConcatenatingMediaSourceTest.java | 23 ++++++ 2 files changed, 64 insertions(+), 37 deletions(-) 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