From 542a1ef03f361b29ec731a7334b2922cb54ef4c9 Mon Sep 17 00:00:00 2001 From: michaelkatz Date: Fri, 27 Jan 2023 11:25:33 +0000 Subject: [PATCH] Match MergingMediaPeriod track selection by period index in id MergingMediaPeriod creates its track groups with ids concatenating position in its periods array and the underlying child track group id. The ids can be used in selectTracks for matching to periods list. Issue: google/ExoPlayer#10930 PiperOrigin-RevId: 505074653 --- .../exoplayer/source/MergingMediaPeriod.java | 14 +++----- .../source/MergingMediaPeriodTest.java | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java index c71b5cffd05..1cf6a3734f8 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MergingMediaPeriod.java @@ -118,17 +118,13 @@ public long selectTracks( for (int i = 0; i < selections.length; i++) { Integer streamChildIndex = streams[i] == null ? null : streamPeriodIndices.get(streams[i]); streamChildIndices[i] = streamChildIndex == null ? C.INDEX_UNSET : streamChildIndex; - selectionChildIndices[i] = C.INDEX_UNSET; if (selections[i] != null) { TrackGroup mergedTrackGroup = selections[i].getTrackGroup(); - TrackGroup childTrackGroup = - checkNotNull(childTrackGroupByMergedTrackGroup.get(mergedTrackGroup)); - for (int j = 0; j < periods.length; j++) { - if (periods[j].getTrackGroups().indexOf(childTrackGroup) != C.INDEX_UNSET) { - selectionChildIndices[i] = j; - break; - } - } + // mergedTrackGroup.id is 'periods array index' + ":" + childTrackGroup.id + selectionChildIndices[i] = + Integer.parseInt(mergedTrackGroup.id.substring(0, mergedTrackGroup.id.indexOf(":"))); + } else { + selectionChildIndices[i] = C.INDEX_UNSET; } } streamPeriodIndices.clear(); diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/MergingMediaPeriodTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/MergingMediaPeriodTest.java index 740e468c239..2ef9252c648 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/MergingMediaPeriodTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/MergingMediaPeriodTest.java @@ -198,6 +198,39 @@ public void selectTracks_withSameArguments_forwardsEqualSelectionsToChildSources assertThat(firstSelectionChild2).isEqualTo(secondSelectionChild2); } + // https://github.com/google/ExoPlayer/issues/10930 + @Test + public void selectTracks_withIdenticalFormats_selectsMatchingPeriod() throws Exception { + MergingMediaPeriod mergingMediaPeriod = + prepareMergingPeriod( + new MergingPeriodDefinition( + /* timeOffsetUs= */ 0, /* singleSampleTimeUs= */ 123_000, childFormat11), + new MergingPeriodDefinition( + /* timeOffsetUs= */ -3000, /* singleSampleTimeUs= */ 456_000, childFormat11)); + + ExoTrackSelection[] selectionArray = { + new FixedTrackSelection(mergingMediaPeriod.getTrackGroups().get(1), /* track= */ 0) + }; + + SampleStream[] streams = new SampleStream[1]; + mergingMediaPeriod.selectTracks( + selectionArray, + /* mayRetainStreamFlags= */ new boolean[2], + streams, + /* streamResetFlags= */ new boolean[2], + /* positionUs= */ 0); + mergingMediaPeriod.continueLoading(/* positionUs= */ 0); + + FormatHolder formatHolder = new FormatHolder(); + DecoderInputBuffer inputBuffer = + new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_NORMAL); + streams[0].readData(formatHolder, inputBuffer, FLAG_REQUIRE_FORMAT); + + assertThat(streams[0].readData(formatHolder, inputBuffer, /* readFlags= */ 0)) + .isEqualTo(C.RESULT_BUFFER_READ); + assertThat(inputBuffer.timeUs).isEqualTo(456_000 - 3000); + } + private MergingMediaPeriod prepareMergingPeriod(MergingPeriodDefinition... definitions) throws Exception { MediaPeriod[] mediaPeriods = new MediaPeriod[definitions.length];