From 133f5f16b81a8fcad6c33776ec8ddd322f0fec9f Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 26 Jul 2018 08:11:10 -0700 Subject: [PATCH] Pass MediaPeriodId to DeferredMediaPeriod when actual period is created. This helps to distinguish between the MediaPeriodId the deferred media period is being created with and the MediaPeriodId which is used to create the actual underlying period. This serves two purposes: 1. The error reporting of ad prepare errors uses the correct media period id (the externally visible ad media period id). 2. The transition to using media period uid instead of indices is simplified. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=206160463 --- .../source/ConcatenatingMediaSource.java | 14 ++++---- .../source/DeferredMediaPeriod.java | 8 +++-- .../exoplayer2/source/ads/AdsMediaSource.java | 32 +++++++++++-------- 3 files changed, 32 insertions(+), 22 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 aaf2b6fef1..20df2a8ab5 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 @@ -392,17 +392,16 @@ public class ConcatenatingMediaSource extends CompositeMediaSource { } + // Used to identify the content "child" source for CompositeMediaSource. + private static final MediaPeriodId DUMMY_CONTENT_MEDIA_PERIOD_ID = + new MediaPeriodId(/* periodIndex= */ 0); + private final MediaSource contentMediaSource; private final MediaSourceFactory adMediaSourceFactory; private final AdsLoader adsLoader; @@ -314,7 +318,7 @@ public final class AdsMediaSource extends CompositeMediaSource { Assertions.checkArgument(isTopLevelSource); final ComponentListener componentListener = new ComponentListener(); this.componentListener = componentListener; - prepareChildSource(new MediaPeriodId(/* periodIndex= */ 0), contentMediaSource); + prepareChildSource(DUMMY_CONTENT_MEDIA_PERIOD_ID, contentMediaSource); mainHandler.post(new Runnable() { @Override public void run() { @@ -344,16 +348,14 @@ public final class AdsMediaSource extends CompositeMediaSource { prepareChildSource(id, adMediaSource); } MediaSource mediaSource = adGroupMediaSources[adGroupIndex][adIndexInAdGroup]; - DeferredMediaPeriod deferredMediaPeriod = - new DeferredMediaPeriod( - mediaSource, - new MediaPeriodId(/* periodIndex= */ 0, id.windowSequenceNumber), - allocator); + DeferredMediaPeriod deferredMediaPeriod = new DeferredMediaPeriod(mediaSource, id, allocator); deferredMediaPeriod.setPrepareErrorListener( new AdPrepareErrorListener(adUri, adGroupIndex, adIndexInAdGroup)); List mediaPeriods = deferredMediaPeriodByAdMediaSource.get(mediaSource); if (mediaPeriods == null) { - deferredMediaPeriod.createPeriod(); + MediaPeriodId adSourceMediaPeriodId = + new MediaPeriodId(/* periodIndex= */ 0, id.windowSequenceNumber); + deferredMediaPeriod.createPeriod(adSourceMediaPeriodId); } else { // Keep track of the deferred media period so it can be populated with the real media period // when the source's info becomes available. @@ -362,7 +364,7 @@ public final class AdsMediaSource extends CompositeMediaSource { return deferredMediaPeriod; } else { DeferredMediaPeriod mediaPeriod = new DeferredMediaPeriod(contentMediaSource, id, allocator); - mediaPeriod.createPeriod(); + mediaPeriod.createPeriod(id); return mediaPeriod; } } @@ -415,8 +417,8 @@ public final class AdsMediaSource extends CompositeMediaSource { @Override protected @Nullable MediaPeriodId getMediaPeriodIdForChildMediaPeriodId( MediaPeriodId childId, MediaPeriodId mediaPeriodId) { - // The child id for the content period is just a dummy without window sequence number. That's - // why we need to forward the reported mediaPeriodId in this case. + // The child id for the content period is just DUMMY_CONTENT_MEDIA_PERIOD_ID. That's why we need + // to forward the reported mediaPeriodId in this case. return childId.isAd() ? childId : mediaPeriodId; } @@ -443,12 +445,14 @@ public final class AdsMediaSource extends CompositeMediaSource { int adIndexInAdGroup, Timeline timeline) { Assertions.checkArgument(timeline.getPeriodCount() == 1); adDurationsUs[adGroupIndex][adIndexInAdGroup] = timeline.getPeriod(0, period).getDurationUs(); - if (deferredMediaPeriodByAdMediaSource.containsKey(mediaSource)) { - List mediaPeriods = deferredMediaPeriodByAdMediaSource.get(mediaSource); + List mediaPeriods = deferredMediaPeriodByAdMediaSource.remove(mediaSource); + if (mediaPeriods != null) { for (int i = 0; i < mediaPeriods.size(); i++) { - mediaPeriods.get(i).createPeriod(); + DeferredMediaPeriod mediaPeriod = mediaPeriods.get(i); + MediaPeriodId adSourceMediaPeriodId = + new MediaPeriodId(/* periodIndex= */ 0, mediaPeriod.id.windowSequenceNumber); + mediaPeriod.createPeriod(adSourceMediaPeriodId); } - deferredMediaPeriodByAdMediaSource.remove(mediaSource); } maybeUpdateSourceInfo(); }