Skip to content

Commit

Permalink
Merge pull request #123 from stoyicker:wrapping_media_source
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 476376463
  • Loading branch information
marcbaechinger committed Oct 19, 2022
2 parents 5725ebb + ba9f3d8 commit 8623f1f
Show file tree
Hide file tree
Showing 6 changed files with 259 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,13 @@ public final void removeDrmEventListener(DrmSessionEventListener eventListener)
drmEventDispatcher.removeEventListener(eventListener);
}

@SuppressWarnings("deprecation") // Overriding deprecated method to make it final.
@Override
public final void prepareSource(
MediaSourceCaller caller, @Nullable TransferListener mediaTransferListener) {
prepareSource(caller, mediaTransferListener, PlayerId.UNSET);
}

@Override
public final void prepareSource(
MediaSourceCaller caller,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,8 @@
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.TransferListener;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util;
import java.io.IOException;
Expand All @@ -39,7 +37,7 @@
* {@link MediaSource} that wraps a source and clips its timeline based on specified start/end
* positions. The wrapped source must consist of a single period.
*/
public final class ClippingMediaSource extends CompositeMediaSource<Void> {
public final class ClippingMediaSource extends WrappingMediaSource {

/** Thrown when a {@link ClippingMediaSource} cannot clip its wrapped source. */
public static final class IllegalClippingException extends IOException {
Expand Down Expand Up @@ -85,7 +83,6 @@ private static String getReasonDescription(@Reason int reason) {
}
}

private final MediaSource mediaSource;
private final long startUs;
private final long endUs;
private final boolean enableInitialDiscontinuity;
Expand Down Expand Up @@ -181,8 +178,8 @@ public ClippingMediaSource(
boolean enableInitialDiscontinuity,
boolean allowDynamicClippingUpdates,
boolean relativeToDefaultPosition) {
super(Assertions.checkNotNull(mediaSource));
Assertions.checkArgument(startPositionUs >= 0);
this.mediaSource = Assertions.checkNotNull(mediaSource);
startUs = startPositionUs;
endUs = endPositionUs;
this.enableInitialDiscontinuity = enableInitialDiscontinuity;
Expand All @@ -192,17 +189,6 @@ public ClippingMediaSource(
window = new Timeline.Window();
}

@Override
public MediaItem getMediaItem() {
return mediaSource.getMediaItem();
}

@Override
protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
super.prepareSourceInternal(mediaTransferListener);
prepareChildSource(/* id= */ null, mediaSource);
}

@Override
public void maybeThrowSourceInfoRefreshError() throws IOException {
if (clippingError != null) {
Expand Down Expand Up @@ -240,7 +226,7 @@ protected void releaseSourceInternal() {
}

@Override
protected void onChildSourceInfoRefreshed(Void id, MediaSource mediaSource, Timeline timeline) {
protected void onChildSourceInfoRefreshed(Timeline timeline) {
if (clippingError != null) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,10 @@
import com.google.android.exoplayer2.AbstractConcatenatedTimeline;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.ShuffleOrder.UnshuffledShuffleOrder;
import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.TransferListener;
import com.google.android.exoplayer2.util.Assertions;
import java.util.HashMap;
import java.util.Map;
Expand All @@ -41,9 +39,8 @@
* times.
*/
@Deprecated
public final class LoopingMediaSource extends CompositeMediaSource<Void> {
public final class LoopingMediaSource extends WrappingMediaSource {

private final MaskingMediaSource maskingMediaSource;
private final int loopCount;
private final Map<MediaPeriodId, MediaPeriodId> childMediaPeriodIdToMediaPeriodId;
private final Map<MediaPeriod, MediaPeriodId> mediaPeriodToChildMediaPeriodId;
Expand All @@ -65,21 +62,17 @@ public LoopingMediaSource(MediaSource childSource) {
* @param loopCount The desired number of loops. Must be strictly positive.
*/
public LoopingMediaSource(MediaSource childSource, int loopCount) {
super(new MaskingMediaSource(childSource, /* useLazyPreparation= */ false));
Assertions.checkArgument(loopCount > 0);
this.maskingMediaSource = new MaskingMediaSource(childSource, /* useLazyPreparation= */ false);
this.loopCount = loopCount;
childMediaPeriodIdToMediaPeriodId = new HashMap<>();
mediaPeriodToChildMediaPeriodId = new HashMap<>();
}

@Override
public MediaItem getMediaItem() {
return maskingMediaSource.getMediaItem();
}

@Override
@Nullable
public Timeline getInitialTimeline() {
MaskingMediaSource maskingMediaSource = (MaskingMediaSource) mediaSource;
return loopCount != Integer.MAX_VALUE
? new LoopingTimeline(maskingMediaSource.getTimeline(), loopCount)
: new InfinitelyLoopingTimeline(maskingMediaSource.getTimeline());
Expand All @@ -90,29 +83,23 @@ public boolean isSingleWindow() {
return false;
}

@Override
protected void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
super.prepareSourceInternal(mediaTransferListener);
prepareChildSource(/* id= */ null, maskingMediaSource);
}

@Override
public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator, long startPositionUs) {
if (loopCount == Integer.MAX_VALUE) {
return maskingMediaSource.createPeriod(id, allocator, startPositionUs);
return mediaSource.createPeriod(id, allocator, startPositionUs);
}
Object childPeriodUid = LoopingTimeline.getChildPeriodUidFromConcatenatedUid(id.periodUid);
MediaPeriodId childMediaPeriodId = id.copyWithPeriodUid(childPeriodUid);
childMediaPeriodIdToMediaPeriodId.put(childMediaPeriodId, id);
MediaPeriod mediaPeriod =
maskingMediaSource.createPeriod(childMediaPeriodId, allocator, startPositionUs);
mediaSource.createPeriod(childMediaPeriodId, allocator, startPositionUs);
mediaPeriodToChildMediaPeriodId.put(mediaPeriod, childMediaPeriodId);
return mediaPeriod;
}

@Override
public void releasePeriod(MediaPeriod mediaPeriod) {
maskingMediaSource.releasePeriod(mediaPeriod);
mediaSource.releasePeriod(mediaPeriod);
@Nullable
MediaPeriodId childMediaPeriodId = mediaPeriodToChildMediaPeriodId.remove(mediaPeriod);
if (childMediaPeriodId != null) {
Expand All @@ -121,7 +108,7 @@ public void releasePeriod(MediaPeriod mediaPeriod) {
}

@Override
protected void onChildSourceInfoRefreshed(Void id, MediaSource mediaSource, Timeline timeline) {
protected void onChildSourceInfoRefreshed(Timeline timeline) {
Timeline loopingTimeline =
loopCount != Integer.MAX_VALUE
? new LoopingTimeline(timeline, loopCount)
Expand All @@ -131,8 +118,7 @@ protected void onChildSourceInfoRefreshed(Void id, MediaSource mediaSource, Time

@Override
@Nullable
protected MediaPeriodId getMediaPeriodIdForChildMediaPeriodId(
Void id, MediaPeriodId mediaPeriodId) {
protected MediaPeriodId getMediaPeriodIdForChildMediaPeriodId(MediaPeriodId mediaPeriodId) {
return loopCount != Integer.MAX_VALUE
? childMediaPeriodIdToMediaPeriodId.get(mediaPeriodId)
: mediaPeriodId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import com.google.android.exoplayer2.Timeline.Window;
import com.google.android.exoplayer2.source.ads.AdPlaybackState;
import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.upstream.TransferListener;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util;
import org.checkerframework.checker.nullness.qual.RequiresNonNull;
Expand All @@ -35,9 +34,8 @@
* A {@link MediaSource} that masks the {@link Timeline} with a placeholder until the actual media
* structure is known.
*/
public final class MaskingMediaSource extends CompositeMediaSource<Void> {
public final class MaskingMediaSource extends WrappingMediaSource {

private final MediaSource mediaSource;
private final boolean useLazyPreparation;
private final Timeline.Window window;
private final Timeline.Period period;
Expand All @@ -57,7 +55,7 @@ public final class MaskingMediaSource extends CompositeMediaSource<Void> {
* initial preparations are triggered only when the player starts buffering the media.
*/
public MaskingMediaSource(MediaSource mediaSource, boolean useLazyPreparation) {
this.mediaSource = mediaSource;
super(mediaSource);
this.useLazyPreparation = useLazyPreparation && mediaSource.isSingleWindow();
window = new Timeline.Window();
period = new Timeline.Period();
Expand All @@ -78,19 +76,13 @@ public Timeline getTimeline() {
}

@Override
public void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
super.prepareSourceInternal(mediaTransferListener);
public void prepareSourceInternal() {
if (!useLazyPreparation) {
hasStartedPreparing = true;
prepareChildSource(/* id= */ null, mediaSource);
prepareChildSource();
}
}

@Override
public MediaItem getMediaItem() {
return mediaSource.getMediaItem();
}

@Override
@SuppressWarnings("MissingSuperCall")
public void maybeThrowSourceInfoRefreshError() {
Expand All @@ -113,7 +105,7 @@ public MaskingMediaPeriod createPeriod(
unpreparedMaskingMediaPeriod = mediaPeriod;
if (!hasStartedPreparing) {
hasStartedPreparing = true;
prepareChildSource(/* id= */ null, mediaSource);
prepareChildSource();
}
}
return mediaPeriod;
Expand All @@ -135,8 +127,7 @@ public void releaseSourceInternal() {
}

@Override
protected void onChildSourceInfoRefreshed(
Void id, MediaSource mediaSource, Timeline newTimeline) {
protected void onChildSourceInfoRefreshed(Timeline newTimeline) {
@Nullable MediaPeriodId idForMaskingPeriodPreparation = null;
if (isPrepared) {
timeline = timeline.cloneWithUpdatedTimeline(newTimeline);
Expand Down Expand Up @@ -206,8 +197,7 @@ protected void onChildSourceInfoRefreshed(

@Override
@Nullable
protected MediaPeriodId getMediaPeriodIdForChildMediaPeriodId(
Void id, MediaPeriodId mediaPeriodId) {
protected MediaPeriodId getMediaPeriodIdForChildMediaPeriodId(MediaPeriodId mediaPeriodId) {
return mediaPeriodId.copyWithPeriodUid(getExternalPeriodUid(mediaPeriodId.periodUid));
}

Expand Down Expand Up @@ -302,11 +292,6 @@ public MaskingTimeline cloneWithUpdatedTimeline(Timeline timeline) {
return new MaskingTimeline(timeline, replacedInternalWindowUid, replacedInternalPeriodUid);
}

/** Returns the wrapped timeline. */
public Timeline getTimeline() {
return timeline;
}

@Override
public Window getWindow(int windowIndex, Window window, long defaultPositionProjectionUs) {
timeline.getWindow(windowIndex, window, defaultPositionProjectionUs);
Expand Down
Loading

0 comments on commit 8623f1f

Please sign in to comment.