Skip to content

Commit

Permalink
Add missing equals to MergingMediaPeriod.ForwardingTrackSelection
Browse files Browse the repository at this point in the history
This causes a bug where the forwarded selections are no longer
assumed equal and the child MediaPeriods will think they need
to reset streams even though the selection stayed the same.

Issue: Issue: #10248
PiperOrigin-RevId: 449454038
  • Loading branch information
tonihei authored and icbaker committed May 24, 2022
1 parent b3dc32d commit e9d5381
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 7 deletions.
Expand Up @@ -607,5 +607,25 @@ public boolean blacklist(int index, long exclusionDurationMs) {
public boolean isBlacklisted(int index, long nowMs) {
return trackSelection.isBlacklisted(index, nowMs);
}

@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ForwardingTrackSelection)) {
return false;
}
ForwardingTrackSelection that = (ForwardingTrackSelection) o;
return trackSelection.equals(that.trackSelection) && trackGroup.equals(that.trackGroup);
}

@Override
public int hashCode() {
int result = 17;
result = 31 * result + trackGroup.hashCode();
result = 31 * result + trackSelection.hashCode();
return result;
}
}
}
Expand Up @@ -34,6 +34,7 @@
import com.google.android.exoplayer2.trackselection.FixedTrackSelection;
import com.google.android.exoplayer2.upstream.DefaultAllocator;
import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import org.checkerframework.checker.nullness.compatqual.NullableType;
import org.junit.Test;
Expand Down Expand Up @@ -138,21 +139,64 @@ public void selectTracks_createsSampleStreamsFromChildPeriods() throws Exception
streams[0].readData(formatHolder, inputBuffer, FLAG_REQUIRE_FORMAT);
streams[1].readData(formatHolder, inputBuffer, FLAG_REQUIRE_FORMAT);

FakeMediaPeriodWithSelectTracksPosition childMediaPeriod1 =
(FakeMediaPeriodWithSelectTracksPosition) mergingMediaPeriod.getChildPeriod(0);
FakeMediaPeriodWithSelectionParameters childMediaPeriod1 =
(FakeMediaPeriodWithSelectionParameters) mergingMediaPeriod.getChildPeriod(0);
assertThat(childMediaPeriod1.selectTracksPositionUs).isEqualTo(0);
assertThat(streams[0].readData(formatHolder, inputBuffer, /* readFlags= */ 0))
.isEqualTo(C.RESULT_BUFFER_READ);
assertThat(inputBuffer.timeUs).isEqualTo(123_000L);

FakeMediaPeriodWithSelectTracksPosition childMediaPeriod2 =
(FakeMediaPeriodWithSelectTracksPosition) mergingMediaPeriod.getChildPeriod(1);
FakeMediaPeriodWithSelectionParameters childMediaPeriod2 =
(FakeMediaPeriodWithSelectionParameters) mergingMediaPeriod.getChildPeriod(1);
assertThat(childMediaPeriod2.selectTracksPositionUs).isEqualTo(3000L);
assertThat(streams[1].readData(formatHolder, inputBuffer, /* readFlags= */ 0))
.isEqualTo(C.RESULT_BUFFER_READ);
assertThat(inputBuffer.timeUs).isEqualTo(456_000 - 3000);
}

@Test
public void selectTracks_withSameArguments_forwardsEqualSelectionsToChildSources()
throws Exception {
MergingMediaPeriod mergingMediaPeriod =
prepareMergingPeriod(
new MergingPeriodDefinition(
/* timeOffsetUs= */ 0, /* singleSampleTimeUs= */ 0, childFormat11),
new MergingPeriodDefinition(
/* timeOffsetUs= */ 0, /* singleSampleTimeUs= */ 0, childFormat22));
FakeMediaPeriodWithSelectionParameters childMediaPeriod1 =
(FakeMediaPeriodWithSelectionParameters) mergingMediaPeriod.getChildPeriod(0);
FakeMediaPeriodWithSelectionParameters childMediaPeriod2 =
(FakeMediaPeriodWithSelectionParameters) mergingMediaPeriod.getChildPeriod(1);

TrackGroupArray mergedTrackGroups = mergingMediaPeriod.getTrackGroups();
ExoTrackSelection[] selectionArray =
new ExoTrackSelection[] {
new FixedTrackSelection(mergedTrackGroups.get(0), /* track= */ 0),
new FixedTrackSelection(mergedTrackGroups.get(1), /* track= */ 0)
};

mergingMediaPeriod.selectTracks(
selectionArray,
/* mayRetainStreamFlags= */ new boolean[2],
/* streams= */ new SampleStream[2],
/* streamResetFlags= */ new boolean[2],
/* positionUs= */ 0);
ExoTrackSelection firstSelectionChild1 = childMediaPeriod1.selectTracksSelections[0];
ExoTrackSelection firstSelectionChild2 = childMediaPeriod2.selectTracksSelections[1];

mergingMediaPeriod.selectTracks(
selectionArray,
/* mayRetainStreamFlags= */ new boolean[2],
/* streams= */ new SampleStream[2],
/* streamResetFlags= */ new boolean[2],
/* positionUs= */ 0);
ExoTrackSelection secondSelectionChild1 = childMediaPeriod1.selectTracksSelections[0];
ExoTrackSelection secondSelectionChild2 = childMediaPeriod2.selectTracksSelections[1];

assertThat(firstSelectionChild1).isEqualTo(secondSelectionChild1);
assertThat(firstSelectionChild2).isEqualTo(secondSelectionChild2);
}

private MergingMediaPeriod prepareMergingPeriod(MergingPeriodDefinition... definitions)
throws Exception {
MediaPeriod[] mediaPeriods = new MediaPeriod[definitions.length];
Expand All @@ -165,7 +209,7 @@ private MergingMediaPeriod prepareMergingPeriod(MergingPeriodDefinition... defin
trackGroups[j] = new TrackGroup(definition.formats[j]);
}
mediaPeriods[i] =
new FakeMediaPeriodWithSelectTracksPosition(
new FakeMediaPeriodWithSelectionParameters(
new TrackGroupArray(trackGroups),
new EventDispatcher()
.withParameters(
Expand Down Expand Up @@ -200,11 +244,12 @@ public void onContinueLoadingRequested(MediaPeriod source) {
return mergingMediaPeriod;
}

private static final class FakeMediaPeriodWithSelectTracksPosition extends FakeMediaPeriod {
private static final class FakeMediaPeriodWithSelectionParameters extends FakeMediaPeriod {

public @NullableType ExoTrackSelection[] selectTracksSelections;
public long selectTracksPositionUs;

public FakeMediaPeriodWithSelectTracksPosition(
public FakeMediaPeriodWithSelectionParameters(
TrackGroupArray trackGroupArray,
EventDispatcher mediaSourceEventDispatcher,
TrackDataFactory trackDataFactory) {
Expand All @@ -216,6 +261,7 @@ public FakeMediaPeriodWithSelectTracksPosition(
DrmSessionManager.DRM_UNSUPPORTED,
new DrmSessionEventListener.EventDispatcher(),
/* deferOnPrepared= */ false);
selectTracksSelections = new ExoTrackSelection[trackGroupArray.length];
selectTracksPositionUs = C.TIME_UNSET;
}

Expand All @@ -226,6 +272,7 @@ public long selectTracks(
@NullableType SampleStream[] streams,
boolean[] streamResetFlags,
long positionUs) {
selectTracksSelections = Arrays.copyOf(selections, selections.length);
selectTracksPositionUs = positionUs;
return super.selectTracks(
selections, mayRetainStreamFlags, streams, streamResetFlags, positionUs);
Expand Down

0 comments on commit e9d5381

Please sign in to comment.