Make remaining media source reusable.

This make sure all media sources can be reprepared after being released.

Issue:#3498

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=183990416
This commit is contained in:
tonihei 2018-01-31 07:54:22 -08:00 committed by Oliver Woodman
parent 286977998d
commit cb95f7e95b
4 changed files with 34 additions and 5 deletions

View File

@ -133,7 +133,6 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> {
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
super.prepareSource(player, isTopLevelSource, listener);
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener;
prepareChildSource(/* id= */ null, mediaSource);
}
@ -161,6 +160,13 @@ public final class ClippingMediaSource extends CompositeMediaSource<Void> {
mediaSource.releasePeriod(((ClippingMediaPeriod) mediaPeriod).mediaPeriod);
}
@Override
public void releaseSource() {
super.releaseSource();
clippingError = null;
sourceListener = null;
}
@Override
protected void onChildSourceInfoRefreshed(
Void id, MediaSource mediaSource, Timeline timeline, @Nullable Object manifest) {

View File

@ -88,7 +88,6 @@ public final class ConcatenatingMediaSource extends CompositeMediaSource<Integer
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
super.prepareSource(player, isTopLevelSource, listener);
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener;
boolean[] duplicateFlags = buildDuplicateFlags(mediaSources);
if (mediaSources.length == 0) {
@ -119,6 +118,13 @@ public final class ConcatenatingMediaSource extends CompositeMediaSource<Integer
mediaSources[sourceIndex].releasePeriod(mediaPeriod);
}
@Override
public void releaseSource() {
super.releaseSource();
listener = null;
timeline = null;
}
@Override
protected void onChildSourceInfoRefreshed(
Integer sourceFirstIndex,

View File

@ -63,7 +63,6 @@ public final class LoopingMediaSource extends CompositeMediaSource<Void> {
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, final Listener listener) {
super.prepareSource(player, isTopLevelSource, listener);
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener;
prepareChildSource(/* id= */ null, childSource);
}
@ -81,6 +80,13 @@ public final class LoopingMediaSource extends CompositeMediaSource<Void> {
childSource.releasePeriod(mediaPeriod);
}
@Override
public void releaseSource() {
super.releaseSource();
listener = null;
childPeriodCount = 0;
}
@Override
protected void onChildSourceInfoRefreshed(
Void id, MediaSource mediaSource, Timeline timeline, @Nullable Object manifest) {

View File

@ -20,12 +20,12 @@ import android.support.annotation.Nullable;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.util.Assertions;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
/**
* Merges multiple {@link MediaSource}s.
@ -100,7 +100,6 @@ public final class MergingMediaSource extends CompositeMediaSource<Integer> {
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
super.prepareSource(player, isTopLevelSource, listener);
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener;
for (int i = 0; i < mediaSources.length; i++) {
prepareChildSource(i, mediaSources[i]);
@ -132,6 +131,18 @@ public final class MergingMediaSource extends CompositeMediaSource<Integer> {
}
}
@Override
public void releaseSource() {
super.releaseSource();
listener = null;
primaryTimeline = null;
primaryManifest = null;
periodCount = PERIOD_COUNT_UNSET;
mergeError = null;
pendingTimelineSources.clear();
Collections.addAll(pendingTimelineSources, mediaSources);
}
@Override
protected void onChildSourceInfoRefreshed(
Integer id, MediaSource mediaSource, Timeline timeline, @Nullable Object manifest) {