Add test and formatting fixes

This commit is contained in:
tonihei 2025-04-24 12:45:03 +01:00
parent 25feac7664
commit 6ce9fdee8c
3 changed files with 72 additions and 140 deletions

View File

@ -25,9 +25,6 @@ import androidx.media3.common.util.Assertions;
import androidx.media3.common.util.NullableType; import androidx.media3.common.util.NullableType;
import androidx.media3.exoplayer.LoadingInfo; import androidx.media3.exoplayer.LoadingInfo;
import androidx.media3.exoplayer.SeekParameters; import androidx.media3.exoplayer.SeekParameters;
import androidx.media3.exoplayer.source.chunk.Chunk;
import androidx.media3.exoplayer.source.chunk.MediaChunk;
import androidx.media3.exoplayer.source.chunk.MediaChunkIterator;
import androidx.media3.exoplayer.trackselection.ExoTrackSelection; import androidx.media3.exoplayer.trackselection.ExoTrackSelection;
import androidx.media3.exoplayer.trackselection.ForwardingTrackSelection; import androidx.media3.exoplayer.trackselection.ForwardingTrackSelection;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@ -36,7 +33,6 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.List;
/** Merges multiple {@link MediaPeriod}s. */ /** Merges multiple {@link MediaPeriod}s. */
/* package */ final class MergingMediaPeriod implements MediaPeriod, MediaPeriod.Callback { /* package */ final class MergingMediaPeriod implements MediaPeriod, MediaPeriod.Callback {
@ -141,7 +137,8 @@ import java.util.List;
TrackGroup mergedTrackGroup = mergedTrackSelection.getTrackGroup(); TrackGroup mergedTrackGroup = mergedTrackSelection.getTrackGroup();
TrackGroup childTrackGroup = TrackGroup childTrackGroup =
checkNotNull(childTrackGroupByMergedTrackGroup.get(mergedTrackGroup)); checkNotNull(childTrackGroupByMergedTrackGroup.get(mergedTrackGroup));
childSelections[j] = new MergingMediaPeriodTrackSelection(mergedTrackSelection, childTrackGroup); childSelections[j] =
new MergingMediaPeriodTrackSelection(mergedTrackSelection, childTrackGroup);
} else { } else {
childSelections[j] = null; childSelections[j] = null;
} }
@ -317,157 +314,44 @@ import java.util.List;
private static final class MergingMediaPeriodTrackSelection extends ForwardingTrackSelection { private static final class MergingMediaPeriodTrackSelection extends ForwardingTrackSelection {
private final TrackGroup trackGroup; private final TrackGroup trackGroup;
public MergingMediaPeriodTrackSelection(ExoTrackSelection trackSelection, TrackGroup trackGroup) { public MergingMediaPeriodTrackSelection(
ExoTrackSelection trackSelection, TrackGroup trackGroup) {
super(trackSelection); super(trackSelection);
this.trackGroup = trackGroup; this.trackGroup = trackGroup;
} }
@Override
public @Type int getType() {
return getWrappedInstance().getType();
}
@Override @Override
public TrackGroup getTrackGroup() { public TrackGroup getTrackGroup() {
return trackGroup; return trackGroup;
} }
@Override
public int length() {
return getWrappedInstance().length();
}
@Override @Override
public Format getFormat(int index) { public Format getFormat(int index) {
return trackGroup.getFormat(getWrappedInstance().getIndexInTrackGroup(index)); return trackGroup.getFormat(getWrappedInstance().getIndexInTrackGroup(index));
} }
@Override
public int getIndexInTrackGroup(int index) {
return getWrappedInstance().getIndexInTrackGroup(index);
}
@Override @Override
public int indexOf(Format format) { public int indexOf(Format format) {
return getWrappedInstance().indexOf(trackGroup.indexOf(format)); return getWrappedInstance().indexOf(trackGroup.indexOf(format));
} }
@Override
public int indexOf(int indexInTrackGroup) {
return getWrappedInstance().indexOf(indexInTrackGroup);
}
@Override
public void enable() {
getWrappedInstance().enable();
}
@Override
public void disable() {
getWrappedInstance().disable();
}
@Override @Override
public Format getSelectedFormat() { public Format getSelectedFormat() {
return trackGroup.getFormat(getWrappedInstance().getSelectedIndexInTrackGroup()); return trackGroup.getFormat(getWrappedInstance().getSelectedIndexInTrackGroup());
} }
@Override @Override
public int getSelectedIndexInTrackGroup() { public boolean equals(@Nullable Object other) {
return getWrappedInstance().getSelectedIndexInTrackGroup(); if (!super.equals(other) || !(other instanceof MergingMediaPeriodTrackSelection)) {
}
@Override
public int getSelectedIndex() {
return getWrappedInstance().getSelectedIndex();
}
@Override
public @C.SelectionReason int getSelectionReason() {
return getWrappedInstance().getSelectionReason();
}
@Nullable
@Override
public Object getSelectionData() {
return getWrappedInstance().getSelectionData();
}
@Override
public void onPlaybackSpeed(float playbackSpeed) {
getWrappedInstance().onPlaybackSpeed(playbackSpeed);
}
@Override
public void onDiscontinuity() {
getWrappedInstance().onDiscontinuity();
}
@Override
public void onRebuffer() {
getWrappedInstance().onRebuffer();
}
@Override
public void onPlayWhenReadyChanged(boolean playWhenReady) {
getWrappedInstance().onPlayWhenReadyChanged(playWhenReady);
}
@Override
public void updateSelectedTrack(
long playbackPositionUs,
long bufferedDurationUs,
long availableDurationUs,
List<? extends MediaChunk> queue,
MediaChunkIterator[] mediaChunkIterators) {
getWrappedInstance().updateSelectedTrack(
playbackPositionUs, bufferedDurationUs, availableDurationUs, queue, mediaChunkIterators);
}
@Override
public int evaluateQueueSize(long playbackPositionUs, List<? extends MediaChunk> queue) {
return getWrappedInstance().evaluateQueueSize(playbackPositionUs, queue);
}
@Override
public boolean shouldCancelChunkLoad(
long playbackPositionUs, Chunk loadingChunk, List<? extends MediaChunk> queue) {
return getWrappedInstance().shouldCancelChunkLoad(playbackPositionUs, loadingChunk, queue);
}
@Override
public boolean excludeTrack(int index, long exclusionDurationMs) {
return getWrappedInstance().excludeTrack(index, exclusionDurationMs);
}
@Override
public boolean isTrackExcluded(int index, long nowMs) {
return getWrappedInstance().isTrackExcluded(index, nowMs);
}
@Override
public long getLatestBitrateEstimate() {
return getWrappedInstance().getLatestBitrateEstimate();
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (!(o instanceof MergingMediaPeriodTrackSelection)) {
return false; return false;
} }
MergingMediaPeriodTrackSelection that = (MergingMediaPeriodTrackSelection) o; MergingMediaPeriodTrackSelection that = (MergingMediaPeriodTrackSelection) other;
return getWrappedInstance().equals(that.getWrappedInstance()) && trackGroup.equals(that.trackGroup); return trackGroup.equals(that.trackGroup);
} }
@Override @Override
public int hashCode() { public int hashCode() {
int result = 17; return 31 * super.hashCode() + trackGroup.hashCode();
result = 31 * result + trackGroup.hashCode();
result = 31 * result + getWrappedInstance().hashCode();
return result;
} }
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 The Android Open Source Project * Copyright 2025 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -25,14 +25,25 @@ import androidx.media3.exoplayer.source.chunk.MediaChunk;
import androidx.media3.exoplayer.source.chunk.MediaChunkIterator; import androidx.media3.exoplayer.source.chunk.MediaChunkIterator;
import java.util.List; import java.util.List;
/** An {@link ExoTrackSelection} forwarding all calls to a wrapped instance. */
@UnstableApi @UnstableApi
public class ForwardingTrackSelection implements ExoTrackSelection { public class ForwardingTrackSelection implements ExoTrackSelection {
private final ExoTrackSelection trackSelection; private final ExoTrackSelection trackSelection;
/**
* Creates the forwarding track selection.
*
* @param trackSelection The wrapped {@link ExoTrackSelection}.
*/
public ForwardingTrackSelection(ExoTrackSelection trackSelection) { public ForwardingTrackSelection(ExoTrackSelection trackSelection) {
this.trackSelection = trackSelection; this.trackSelection = trackSelection;
} }
/** Returns the wrapped {@link ExoTrackSelection}. */
public ExoTrackSelection getWrappedInstance() {
return trackSelection;
}
@Override @Override
public void enable() { public void enable() {
trackSelection.enable(); trackSelection.enable();
@ -90,11 +101,14 @@ public class ForwardingTrackSelection implements ExoTrackSelection {
} }
@Override @Override
public void updateSelectedTrack(long playbackPositionUs, long bufferedDurationUs, public void updateSelectedTrack(
long availableDurationUs, List<? extends MediaChunk> queue, long playbackPositionUs,
long bufferedDurationUs,
long availableDurationUs,
List<? extends MediaChunk> queue,
MediaChunkIterator[] mediaChunkIterators) { MediaChunkIterator[] mediaChunkIterators) {
trackSelection.updateSelectedTrack(playbackPositionUs, bufferedDurationUs, trackSelection.updateSelectedTrack(
availableDurationUs, queue, mediaChunkIterators); playbackPositionUs, bufferedDurationUs, availableDurationUs, queue, mediaChunkIterators);
} }
@Override @Override
@ -103,8 +117,8 @@ public class ForwardingTrackSelection implements ExoTrackSelection {
} }
@Override @Override
public boolean shouldCancelChunkLoad(long playbackPositionUs, Chunk loadingChunk, public boolean shouldCancelChunkLoad(
List<? extends MediaChunk> queue) { long playbackPositionUs, Chunk loadingChunk, List<? extends MediaChunk> queue) {
return trackSelection.shouldCancelChunkLoad(playbackPositionUs, loadingChunk, queue); return trackSelection.shouldCancelChunkLoad(playbackPositionUs, loadingChunk, queue);
} }
@ -158,12 +172,9 @@ public class ForwardingTrackSelection implements ExoTrackSelection {
return trackSelection.indexOf(indexInTrackGroup); return trackSelection.indexOf(indexInTrackGroup);
} }
public ExoTrackSelection getWrappedInstance() { @Override
return trackSelection;
}
public int hashCode() { public int hashCode() {
return getWrappedInstance().hashCode(); return trackSelection.hashCode();
} }
@Override @Override
@ -171,11 +182,10 @@ public class ForwardingTrackSelection implements ExoTrackSelection {
if (this == obj) { if (this == obj) {
return true; return true;
} }
if (obj == null || getClass() != obj.getClass()) { if (!(obj instanceof ForwardingTrackSelection)) {
return false; return false;
} }
ForwardingTrackSelection other = (ForwardingTrackSelection) obj; ForwardingTrackSelection other = (ForwardingTrackSelection) obj;
return trackSelection.equals(other.trackSelection);
return getWrappedInstance().equals(other.getWrappedInstance());
} }
} }

View File

@ -0,0 +1,38 @@
/*
* Copyright 2025 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 androidx.media3.exoplayer.trackselection;
import static androidx.media3.test.utils.TestUtil.assertForwardingClassForwardsAllMethods;
import static androidx.media3.test.utils.TestUtil.assertSubclassOverridesAllMethods;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
/** Unit test for {@link ForwardingTrackSelection}. */
@RunWith(AndroidJUnit4.class)
public class ForwardingTrackSelectionTest {
@Test
public void overridesAllMethods() throws NoSuchMethodException {
assertSubclassOverridesAllMethods(ExoTrackSelection.class, ForwardingTrackSelection.class);
}
@Test
public void forwardsAllMethods() throws Exception {
assertForwardingClassForwardsAllMethods(ExoTrackSelection.class, ForwardingTrackSelection::new);
}
}