Skip to content

Commit c8a403e

Browse files
copybara-githubmicrokatz
authored andcommitted
Merge pull request #753 from stevemayhew:p-fix-issue-9347
PiperOrigin-RevId: 590862514 (cherry picked from commit ab296ef)
1 parent 33a5190 commit c8a403e

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

RELEASENOTES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
* Fix issue that OPUS and VORBIS channel layouts are wrong for 3, 5, 6, 7
1111
and 8 channels
1212
([#8396](https://github.com/google/ExoPlayer/issues/8396)).
13+
* Fix issue where track selections after seek to zero in a live stream
14+
incorrectly let the stream start at its default position
15+
([#9347](https://github.com/google/ExoPlayer/issues/9347)).
1316
* Transformer:
1417
* Work around an issue where the encoder would throw at configuration time
1518
due to setting a high operating rate.

libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MaskingMediaPeriod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ public long selectTracks(
183183
long positionUs) {
184184
if (preparePositionOverrideUs != C.TIME_UNSET && positionUs == preparePositionUs) {
185185
positionUs = preparePositionOverrideUs;
186-
preparePositionOverrideUs = C.TIME_UNSET;
187186
}
187+
preparePositionOverrideUs = C.TIME_UNSET;
188188
return castNonNull(mediaPeriod)
189189
.selectTracks(selections, mayRetainStreamFlags, streams, streamResetFlags, positionUs);
190190
}

libraries/exoplayer/src/test/java/androidx/media3/exoplayer/ExoPlayerTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
import androidx.media3.common.Timeline;
123123
import androidx.media3.common.Timeline.Window;
124124
import androidx.media3.common.TrackGroup;
125+
import androidx.media3.common.TrackSelectionParameters;
125126
import androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences;
126127
import androidx.media3.common.Tracks;
127128
import androidx.media3.common.VideoSize;
@@ -14101,6 +14102,53 @@ protected void onStreamChanged(
1410114102
.isSameInstanceAs(mediaItem2);
1410214103
}
1410314104

14105+
@Test
14106+
public void seekToZeroAndTrackSelection_withNonZeroDefaultPosition_startsPlaybackAtZero()
14107+
throws Exception {
14108+
// Create a timeline with a non-zero default position. It's important to use a
14109+
// windowOffsetInFirstPeriodUs of zero to ensure that our later manual seek to zero could be
14110+
// mistaken for the initial placeholder start position of zero
14111+
// (see https://github.com/google/ExoPlayer/issues/9347).
14112+
Timeline timeline =
14113+
new FakeTimeline(
14114+
new TimelineWindowDefinition(
14115+
/* periodCount= */ 1,
14116+
/* id= */ new Object(),
14117+
/* isSeekable= */ true,
14118+
/* isDynamic= */ true,
14119+
/* isLive= */ true,
14120+
/* isPlaceholder= */ false,
14121+
/* durationUs= */ 10_000_000,
14122+
/* defaultPositionUs= */ 9_000_000,
14123+
/* windowOffsetInFirstPeriodUs= */ 0,
14124+
/* adPlaybackState= */ AdPlaybackState.NONE));
14125+
FakeMediaSource mediaSource =
14126+
new FakeMediaSource(
14127+
timeline, ExoPlayerTestRunner.VIDEO_FORMAT, ExoPlayerTestRunner.AUDIO_FORMAT);
14128+
// Make sure the player has to use its placeholder values initially.
14129+
mediaSource.setAllowPreparation(false);
14130+
ExoPlayer player = new TestExoPlayerBuilder(context).build();
14131+
player.setMediaSource(mediaSource);
14132+
player.prepare();
14133+
runUntilPendingCommandsAreFullyHandled(player);
14134+
mediaSource.setAllowPreparation(true);
14135+
runUntilPlaybackState(player, Player.STATE_READY);
14136+
long positionAfterPrepare = player.getCurrentPosition();
14137+
14138+
// Manually seek back to zero and force to reselect tracks.
14139+
player.seekTo(0);
14140+
player.setTrackSelectionParameters(
14141+
new TrackSelectionParameters.Builder(context)
14142+
.setTrackTypeDisabled(C.TRACK_TYPE_AUDIO, /* disabled= */ true)
14143+
.build());
14144+
runUntilPendingCommandsAreFullyHandled(player);
14145+
long positionAfterSeek = player.getContentPosition();
14146+
player.release();
14147+
14148+
assertThat(positionAfterPrepare).isEqualTo(9000);
14149+
assertThat(positionAfterSeek).isEqualTo(0);
14150+
}
14151+
1410414152
// Internal methods.
1410514153

1410614154
private void addWatchAsSystemFeature() {

0 commit comments

Comments
 (0)