diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4f5f5e066a..80fe7f8e3b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -11,6 +11,8 @@ * Update `SampleQueue` to store `sourceId` as a `long` rather than an `int`. This changes the signatures of public methods `SampleQueue.sourceId` and `SampleQueue.peekSourceId`. + * Reset target live stream override when seeking to default position + ([#11051](https://github.com/google/ExoPlayer/pull/11051)). * Audio: * Fix bug where some playbacks fail when tunneling is enabled and `AudioProcessors` are active, e.g. for gapless trimming diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java index 62dffd768a..c42044fef1 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java @@ -1256,7 +1256,8 @@ import java.util.concurrent.atomic.AtomicBoolean; /* newPeriodId= */ periodId, /* oldTimeline= */ playbackInfo.timeline, /* oldPeriodId= */ playbackInfo.periodId, - /* positionForTargetOffsetOverrideUs= */ requestedContentPositionUs); + /* positionForTargetOffsetOverrideUs= */ requestedContentPositionUs, + /* forceSetTargetOffsetOverride= */ true); } } finally { playbackInfo = @@ -1906,7 +1907,8 @@ import java.util.concurrent.atomic.AtomicBoolean; /* oldPeriodId= */ playbackInfo.periodId, /* positionForTargetOffsetOverrideUs */ positionUpdate.setTargetLiveOffset ? newPositionUs - : C.TIME_UNSET); + : C.TIME_UNSET, + /* forceSetTargetOffsetOverride= */ false); if (periodPositionChanged || newRequestedContentPositionUs != playbackInfo.requestedContentPositionUs) { Object oldPeriodUid = playbackInfo.periodId.periodUid; @@ -1944,7 +1946,8 @@ import java.util.concurrent.atomic.AtomicBoolean; MediaPeriodId newPeriodId, Timeline oldTimeline, MediaPeriodId oldPeriodId, - long positionForTargetOffsetOverrideUs) + long positionForTargetOffsetOverrideUs, + boolean forceSetTargetOffsetOverride) throws ExoPlaybackException { if (!shouldUseLivePlaybackSpeedControl(newTimeline, newPeriodId)) { // Live playback speed control is unused for the current period, reset speed to user-defined @@ -1974,8 +1977,9 @@ import java.util.concurrent.atomic.AtomicBoolean; int oldWindowIndex = oldTimeline.getPeriodByUid(oldPeriodId.periodUid, period).windowIndex; oldWindowUid = oldTimeline.getWindow(oldWindowIndex, window).uid; } - if (!Util.areEqual(oldWindowUid, windowUid)) { - // Reset overridden target live offset to media values if window changes. + if (!Util.areEqual(oldWindowUid, windowUid) || forceSetTargetOffsetOverride) { + // Reset overridden target live offset to media values if window changes or if seekTo + // default live position. livePlaybackSpeedControl.setTargetLiveOffsetOverrideUs(C.TIME_UNSET); } } @@ -2098,7 +2102,8 @@ import java.util.concurrent.atomic.AtomicBoolean; /* newPeriodId= */ readingPeriodHolder.info.id, /* oldTimeline= */ playbackInfo.timeline, /* oldPeriodId= */ oldReadingPeriodHolder.info.id, - /* positionForTargetOffsetOverrideUs= */ C.TIME_UNSET); + /* positionForTargetOffsetOverrideUs= */ C.TIME_UNSET, + /* forceSetTargetOffsetOverride= */ false); if (readingPeriodHolder.prepared && readingPeriodHolder.mediaPeriod.readDiscontinuity() != C.TIME_UNSET) {