From d0dc72fb6ac30bab2e07dbe55ef82f9879e35412 Mon Sep 17 00:00:00 2001 From: claincly Date: Mon, 7 Jun 2021 17:09:34 +0100 Subject: [PATCH] Fix TCP retry bug when some RTSP tracks are not selected. The size of rtspLoaderWrappers must match the number of tracks exposed by the RTSP session (a track is exposed if its media description entry appears in DESCRIBE's SDP response). When retrying with TCP, the old code will start loading all exposed RTSP tracks, regardless of whether they are selected. The fixed code will only start loading selected tracks. #minor-release PiperOrigin-RevId: 377931030 --- .../source/rtsp/RtspMediaPeriod.java | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java index aa5038848a..ccdd8f4742 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java @@ -306,9 +306,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Nullable private RtpDataLoadable getLoadableByTrackUri(Uri trackUri) { for (int i = 0; i < rtspLoaderWrappers.size(); i++) { - RtpLoadInfo loadInfo = rtspLoaderWrappers.get(i).loadInfo; - if (loadInfo.getTrackUri().equals(trackUri)) { - return loadInfo.loadable; + if (!rtspLoaderWrappers.get(i).canceled) { + RtpLoadInfo loadInfo = rtspLoaderWrappers.get(i).loadInfo; + if (loadInfo.getTrackUri().equals(trackUri)) { + return loadInfo.loadable; + } } } return null; @@ -543,17 +545,21 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ArrayList newLoaderWrappers = new ArrayList<>(rtspLoaderWrappers.size()); ArrayList newSelectedLoadInfos = new ArrayList<>(selectedLoadInfos.size()); + // newLoaderWrappers' elements and orders must match those of rtspLoaderWrappers'. for (int i = 0; i < rtspLoaderWrappers.size(); i++) { RtspLoaderWrapper loaderWrapper = rtspLoaderWrappers.get(i); - RtspLoaderWrapper newLoaderWrapper = - new RtspLoaderWrapper( - loaderWrapper.loadInfo.mediaTrack, /* trackId= */ i, rtpDataChannelFactory); - newLoaderWrappers.add(newLoaderWrapper); - newLoaderWrapper.startLoading(); - - if (selectedLoadInfos.contains(loaderWrapper.loadInfo)) { - newSelectedLoadInfos.add(newLoaderWrapper.loadInfo); + if (!loaderWrapper.canceled) { + RtspLoaderWrapper newLoaderWrapper = + new RtspLoaderWrapper( + loaderWrapper.loadInfo.mediaTrack, /* trackId= */ i, rtpDataChannelFactory); + newLoaderWrappers.add(newLoaderWrapper); + newLoaderWrapper.startLoading(); + if (selectedLoadInfos.contains(loaderWrapper.loadInfo)) { + newSelectedLoadInfos.add(newLoaderWrapper.loadInfo); + } + } else { + newLoaderWrappers.add(loaderWrapper); } } @@ -644,21 +650,22 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** Cancels loading. */ public void cancelLoad() { - if (canceled) { - return; - } - loadInfo.loadable.cancelLoad(); - canceled = true; + if (!canceled) { + loadInfo.loadable.cancelLoad(); + canceled = true; - // Update loadingFinished every time loading is canceled. - updateLoadingFinished(); + // Update loadingFinished every time loading is canceled. + updateLoadingFinished(); + } } /** Resets the {@link Loadable} and {@link SampleQueue} to prepare for an RTSP seek. */ public void seekTo(long positionUs) { - loadInfo.loadable.resetForSeek(); - sampleQueue.reset(); - sampleQueue.setStartTimeUs(positionUs); + if (!canceled) { + loadInfo.loadable.resetForSeek(); + sampleQueue.reset(); + sampleQueue.setStartTimeUs(positionUs); + } } /** Releases the instance. */