From f2cf82cd15047b0c4c2406c6b58a18edd3080f3c Mon Sep 17 00:00:00 2001 From: Steve Mayhew Date: Thu, 9 Mar 2023 15:50:47 -0800 Subject: [PATCH] Removes liveOffsetTarget override on seek to live edge Any calls that issue a `seekTo()` where the position is `TIME_UNSET` will now restore the live offset target to the MediaItem set default. The change simply passes a flag to `updatePlaybackSpeedSettingsForNewPeriod()` that indicates the call is from a seek operation. If this flag is set, a `positionForTargetOffsetOverrideUs` of `TIME_UNSET` unconditionally removes the `setTargetLiveOffsetOverrideUs()` This fixes issue #11050 --- .../exoplayer2/ExoPlayerImplInternal.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index a9ca6cf18d4..c4166ef2a66 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -1248,7 +1248,9 @@ private void seekToInternal(SeekPosition seekPosition) throws ExoPlaybackExcepti /* newPeriodId= */ periodId, /* oldTimeline= */ playbackInfo.timeline, /* oldPeriodId= */ playbackInfo.periodId, - /* positionForTargetOffsetOverrideUs= */ requestedContentPositionUs); + /* positionForTargetOffsetOverrideUs= */ requestedContentPositionUs, + /* positionRequestedBySeek */true); + } } finally { playbackInfo = @@ -1897,7 +1899,8 @@ timeline, rendererPositionUs, getMaxRendererReadPositionUs())) { /* oldPeriodId= */ playbackInfo.periodId, /* positionForTargetOffsetOverrideUs */ positionUpdate.setTargetLiveOffset ? newPositionUs - : C.TIME_UNSET); + : C.TIME_UNSET, + /* positionRequestedBySeek */false); if (periodPositionChanged || newRequestedContentPositionUs != playbackInfo.requestedContentPositionUs) { Object oldPeriodUid = playbackInfo.periodId.periodUid; @@ -1935,7 +1938,8 @@ private void updatePlaybackSpeedSettingsForNewPeriod( MediaPeriodId newPeriodId, Timeline oldTimeline, MediaPeriodId oldPeriodId, - long positionForTargetOffsetOverrideUs) + long positionForTargetOffsetOverrideUs, + boolean positionRequestedBySeek) throws ExoPlaybackException { if (!shouldUseLivePlaybackSpeedControl(newTimeline, newPeriodId)) { // Live playback speed control is unused for the current period, reset speed to user-defined @@ -1965,8 +1969,9 @@ private void updatePlaybackSpeedSettingsForNewPeriod( 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) || positionRequestedBySeek) { + // Reset overridden target live offset to media values if window changes or if seekTo + // default live position. livePlaybackSpeedControl.setTargetLiveOffsetOverrideUs(C.TIME_UNSET); } } @@ -2089,7 +2094,8 @@ private void maybeUpdateReadingPeriod() throws ExoPlaybackException { /* newPeriodId= */ readingPeriodHolder.info.id, /* oldTimeline= */ playbackInfo.timeline, /* oldPeriodId= */ oldReadingPeriodHolder.info.id, - /* positionForTargetOffsetOverrideUs= */ C.TIME_UNSET); + /* positionForTargetOffsetOverrideUs= */ C.TIME_UNSET, + /* positionRequestedBySeek */false); if (readingPeriodHolder.prepared && readingPeriodHolder.mediaPeriod.readDiscontinuity() != C.TIME_UNSET) {