From a89bf3a4776b618e5debf1089fe51377a335e54e Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 11 Jul 2016 04:17:59 -0700 Subject: [PATCH] Allow merging of both periods and sources. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=127073129 --- .../exoplayer2/ConcatenatingMediaSource.java | 2 +- ...diaPeriod.java => MergingMediaPeriod.java} | 5 +- .../exoplayer2/MergingMediaSource.java | 60 +++++++++++++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) rename library/src/main/java/com/google/android/exoplayer2/{MultiMediaPeriod.java => MergingMediaPeriod.java} (98%) create mode 100644 library/src/main/java/com/google/android/exoplayer2/MergingMediaSource.java diff --git a/library/src/main/java/com/google/android/exoplayer2/ConcatenatingMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/ConcatenatingMediaSource.java index 19fd186acb..263f735c24 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ConcatenatingMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/ConcatenatingMediaSource.java @@ -16,7 +16,7 @@ package com.google.android.exoplayer2; /** - * A {@link MediaSource} that concatenates multiple {@link MediaSource}s. + * Concatenates multiple {@link MediaSource}s. */ public final class ConcatenatingMediaSource implements MediaSource { diff --git a/library/src/main/java/com/google/android/exoplayer2/MultiMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/MergingMediaPeriod.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer2/MultiMediaPeriod.java rename to library/src/main/java/com/google/android/exoplayer2/MergingMediaPeriod.java index 1fe0f6c274..45c92a537a 100644 --- a/library/src/main/java/com/google/android/exoplayer2/MultiMediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/MergingMediaPeriod.java @@ -24,11 +24,10 @@ import java.util.ArrayList; import java.util.IdentityHashMap; import java.util.List; -// TODO: Make this a MediaSource /** * Merges multiple {@link MediaPeriod} instances. */ -public final class MultiMediaPeriod implements MediaPeriod, MediaPeriod.Callback { +public final class MergingMediaPeriod implements MediaPeriod, MediaPeriod.Callback { private final MediaPeriod[] periods; private final IdentityHashMap trackStreamPeriods; @@ -43,7 +42,7 @@ public final class MultiMediaPeriod implements MediaPeriod, MediaPeriod.Callback private MediaPeriod[] enabledPeriods; private SequenceableLoader sequenceableLoader; - public MultiMediaPeriod(MediaPeriod... periods) { + public MergingMediaPeriod(MediaPeriod... periods) { this.periods = periods; pendingChildPrepareCount = periods.length; trackStreamPeriods = new IdentityHashMap<>(); diff --git a/library/src/main/java/com/google/android/exoplayer2/MergingMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/MergingMediaSource.java new file mode 100644 index 0000000000..fceefccb74 --- /dev/null +++ b/library/src/main/java/com/google/android/exoplayer2/MergingMediaSource.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2; + +import com.google.android.exoplayer2.util.Assertions; + +/** + * Merges multiple {@link MediaPeriod} instances. + *

+ * The {@link MediaSource}s being merged must have known and equal period counts, and may not return + * {@code null} from {@link #createPeriod(int)}. + */ +public final class MergingMediaSource implements MediaSource { + + private final MediaSource[] mediaSources; + private final int periodCount; + + /** + * @param mediaSources The {@link MediaSource}s to merge. + */ + public MergingMediaSource(MediaSource... mediaSources) { + this.mediaSources = mediaSources; + periodCount = mediaSources[0].getPeriodCount(); + Assertions.checkState(periodCount != MediaSource.UNKNOWN_PERIOD_COUNT, + "Child sources must have known period counts"); + for (int i = 1; i < mediaSources.length; i++) { + Assertions.checkState(mediaSources[i].getPeriodCount() == periodCount, + "Child sources must have equal period counts"); + } + } + + @Override + public int getPeriodCount() { + return periodCount; + } + + @Override + public MediaPeriod createPeriod(int index) { + MediaPeriod[] periods = new MediaPeriod[mediaSources.length]; + for (int i = 0; i < periods.length; i++) { + periods[i] = mediaSources[i].createPeriod(index); + Assertions.checkState(periods[i] != null, "Child source must not return null period"); + } + return new MergingMediaPeriod(periods); + } + +}