Skip to content

Instantly share code, notes, and snippets.

@Khang-NT
Last active March 11, 2018 04:58
Show Gist options
  • Save Khang-NT/985e12e1d73454a79a989165c9bd13fa to your computer and use it in GitHub Desktop.
Save Khang-NT/985e12e1d73454a79a989165c9bd13fa to your computer and use it in GitHub Desktop.
package com.google.android.exoplayer2.demo;
import android.support.annotation.Nullable;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.DeferredMediaPeriod;
import com.google.android.exoplayer2.source.DynamicConcatenatingMediaSource.DeferredTimeline;
import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.upstream.Allocator;
import java.io.IOException;
public class DeferredMediaSource implements MediaSource {
private DeferredTimeline deferredTimeline = new DeferredTimeline();
private ExoPlayer player;
private boolean isTopLevelSource;
private Listener listener;
private MediaSource lazyPrepareMediaSource;
private boolean prepared = false;
private boolean createdMediaPeriod = false;
public DeferredMediaSource(MediaSource lazyPrepareMediaSource) {
this.lazyPrepareMediaSource = lazyPrepareMediaSource;
}
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
this.player = player;
this.isTopLevelSource = isTopLevelSource;
this.listener = listener;
listener.onSourceInfoRefreshed(this, deferredTimeline, null);
}
@Override
public void maybeThrowSourceInfoRefreshError() throws IOException {
if (prepared) {
lazyPrepareMediaSource.maybeThrowSourceInfoRefreshError();
}
}
@Override
public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator) {
if (prepared) {
return lazyPrepareMediaSource.createPeriod(id, allocator);
} else {
final DeferredMediaPeriod deferredMediaPeriod = new DeferredMediaPeriod(
this, id, allocator);
lazyPrepareMediaSource.prepareSource(player, isTopLevelSource, new Listener() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline, @Nullable Object manifest) {
deferredTimeline = deferredTimeline.cloneWithNewTimeline(timeline);
listener.onSourceInfoRefreshed(DeferredMediaSource.this,
deferredTimeline, manifest);
if (!createdMediaPeriod) {
deferredMediaPeriod.createPeriod();
createdMediaPeriod = true;
}
}
});
prepared = true;
return deferredMediaPeriod;
}
}
@Override
public void releasePeriod(MediaPeriod mediaPeriod) {
if (mediaPeriod instanceof DeferredMediaPeriod
&& ((DeferredMediaPeriod) mediaPeriod).mediaSource == this) {
((DeferredMediaPeriod) mediaPeriod).releasePeriod();
} else {
lazyPrepareMediaSource.releasePeriod(mediaPeriod);
}
}
@Override
public void releaseSource() {
lazyPrepareMediaSource.releaseSource();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment