parent
353db0bc6c
commit
e0ba872b66
|
@ -102,7 +102,7 @@ ext {
|
||||||
androidxWorkVersion = '2.7.1'
|
androidxWorkVersion = '2.7.1'
|
||||||
|
|
||||||
icepickVersion = '3.2.0'
|
icepickVersion = '3.2.0'
|
||||||
exoPlayerVersion = '2.18.2'
|
exoPlayerVersion = '2.18.1'
|
||||||
googleAutoServiceVersion = '1.0.1'
|
googleAutoServiceVersion = '1.0.1'
|
||||||
groupieVersion = '2.10.1'
|
groupieVersion = '2.10.1'
|
||||||
markwonVersion = '4.6.2'
|
markwonVersion = '4.6.2'
|
||||||
|
|
|
@ -1,21 +1,27 @@
|
||||||
package org.schabi.newpipe.player.mediasource;
|
package org.schabi.newpipe.player.mediasource;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import com.google.android.exoplayer2.MediaItem;
|
import com.google.android.exoplayer2.MediaItem;
|
||||||
|
import com.google.android.exoplayer2.Timeline;
|
||||||
|
import com.google.android.exoplayer2.source.CompositeMediaSource;
|
||||||
|
import com.google.android.exoplayer2.source.MediaPeriod;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
import com.google.android.exoplayer2.source.MediaSource;
|
||||||
import com.google.android.exoplayer2.source.WrappingMediaSource;
|
import com.google.android.exoplayer2.upstream.Allocator;
|
||||||
|
import com.google.android.exoplayer2.upstream.TransferListener;
|
||||||
|
|
||||||
import org.schabi.newpipe.player.mediaitem.MediaItemTag;
|
import org.schabi.newpipe.player.mediaitem.MediaItemTag;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
||||||
|
|
||||||
public class LoadedMediaSource extends WrappingMediaSource implements ManagedMediaSource {
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
public class LoadedMediaSource extends CompositeMediaSource<Integer> implements ManagedMediaSource {
|
||||||
|
private final MediaSource source;
|
||||||
private final PlayQueueItem stream;
|
private final PlayQueueItem stream;
|
||||||
private final MediaItem mediaItem;
|
private final MediaItem mediaItem;
|
||||||
private final long expireTimestamp;
|
private final long expireTimestamp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses a {@link WrappingMediaSource} to wrap one child {@link MediaSource}
|
* Uses a {@link CompositeMediaSource} to wrap one or more child {@link MediaSource}s
|
||||||
* containing actual media. This wrapper {@link LoadedMediaSource} holds the expiration
|
* containing actual media. This wrapper {@link LoadedMediaSource} holds the expiration
|
||||||
* timestamp as a {@link ManagedMediaSource} to allow explicit playlist management under
|
* timestamp as a {@link ManagedMediaSource} to allow explicit playlist management under
|
||||||
* {@link ManagedMediaSourcePlaylist}.
|
* {@link ManagedMediaSourcePlaylist}.
|
||||||
|
@ -30,7 +36,7 @@ public class LoadedMediaSource extends WrappingMediaSource implements ManagedMed
|
||||||
@NonNull final MediaItemTag tag,
|
@NonNull final MediaItemTag tag,
|
||||||
@NonNull final PlayQueueItem stream,
|
@NonNull final PlayQueueItem stream,
|
||||||
final long expireTimestamp) {
|
final long expireTimestamp) {
|
||||||
super(source);
|
this.source = source;
|
||||||
this.stream = stream;
|
this.stream = stream;
|
||||||
this.expireTimestamp = expireTimestamp;
|
this.expireTimestamp = expireTimestamp;
|
||||||
|
|
||||||
|
@ -45,6 +51,51 @@ public class LoadedMediaSource extends WrappingMediaSource implements ManagedMed
|
||||||
return System.currentTimeMillis() >= expireTimestamp;
|
return System.currentTimeMillis() >= expireTimestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegates the preparation of child {@link MediaSource}s to the
|
||||||
|
* {@link CompositeMediaSource} wrapper. Since all {@link LoadedMediaSource}s use only
|
||||||
|
* a single child media, the child id of 0 is always used (sonar doesn't like null as id here).
|
||||||
|
*
|
||||||
|
* @param mediaTransferListener A data transfer listener that will be registered by the
|
||||||
|
* {@link CompositeMediaSource} for child source preparation.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void prepareSourceInternal(@Nullable final TransferListener mediaTransferListener) {
|
||||||
|
super.prepareSourceInternal(mediaTransferListener);
|
||||||
|
prepareChildSource(0, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When any child {@link MediaSource} is prepared, the refreshed {@link Timeline} can
|
||||||
|
* be listened to here. But since {@link LoadedMediaSource} has only a single child source,
|
||||||
|
* this method is called only once until {@link #releaseSourceInternal()} is called.
|
||||||
|
* <br><br>
|
||||||
|
* On refresh, the {@link CompositeMediaSource} delegate will be notified with the
|
||||||
|
* new {@link Timeline}, otherwise {@link #createPeriod(MediaPeriodId, Allocator, long)}
|
||||||
|
* will not be called and playback may be stalled.
|
||||||
|
*
|
||||||
|
* @param id The unique id used to prepare the child source.
|
||||||
|
* @param mediaSource The child source whose source info has been refreshed.
|
||||||
|
* @param timeline The new timeline of the child source.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void onChildSourceInfoRefreshed(final Integer id,
|
||||||
|
final MediaSource mediaSource,
|
||||||
|
final Timeline timeline) {
|
||||||
|
refreshSourceInfo(timeline);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MediaPeriod createPeriod(final MediaPeriodId id, final Allocator allocator,
|
||||||
|
final long startPositionUs) {
|
||||||
|
return source.createPeriod(id, allocator, startPositionUs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void releasePeriod(final MediaPeriod mediaPeriod) {
|
||||||
|
source.releasePeriod(mediaPeriod);
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public MediaItem getMediaItem() {
|
public MediaItem getMediaItem() {
|
||||||
|
|
Loading…
Reference in New Issue