Commit a62cf312 by claincly Committed by Marc Baechinger

Handle initial RTSP seek

PiperOrigin-RevId: 469143613
parent ee04bb88
......@@ -187,6 +187,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Override
public void seek(long nextRtpTimestamp, long playbackStartTimeUs) {
synchronized (lock) {
if (!isSeekPending) {
// Sets the isSeekPending flag, in the case preSeek() is not called, when seeking does not
// require RTSP message exchange. For example, playing back with non-zero start position.
isSeekPending = true;
}
this.nextRtpTimestamp = nextRtpTimestamp;
this.playbackStartTimeUs = playbackStartTimeUs;
}
......
......@@ -229,6 +229,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
}
trackSelected = true;
if (positionUs != 0) {
// Track selection is performed only once in RTSP streams.
requestedSeekPositionUs = positionUs;
pendingSeekPositionUs = positionUs;
pendingSeekPositionUsForTcpRetry = positionUs;
}
maybeSetupTracks();
return positionUs;
}
......@@ -273,7 +279,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
// 2b.2. If RTSP PLAY (for the first seek) has not been sent, the new seek position will be
// used in the following PLAY request.
// TODO(internal: b/198620566) Handle initial seek.
// TODO(internal: b/213153670) Handle dropped seek position.
if (getBufferedPositionUs() == 0 && !isUsingRtpTcp) {
// Stores the seek position for later, if no RTP packet is received when using UDP.
......@@ -571,7 +576,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Override
public void onRtspSetupCompleted() {
rtspClient.startPlayback(/* offsetMs= */ 0);
long offsetMs = 0;
if (pendingSeekPositionUs != C.TIME_UNSET) {
offsetMs = Util.usToMs(pendingSeekPositionUs);
} else if (pendingSeekPositionUsForTcpRetry != C.TIME_UNSET) {
offsetMs = Util.usToMs(pendingSeekPositionUsForTcpRetry);
}
rtspClient.startPlayback(offsetMs);
}
@Override
......@@ -610,6 +621,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
if (isSeekPending() && pendingSeekPositionUs == requestedSeekPositionUs) {
// Seek loadable only when all pending seeks are processed, or SampleQueues will report
// inconsistent bufferedPosition.
// Seeks to the start position when the initial seek position is set.
dataLoadable.seekToUs(startPositionUs, trackTiming.rtpTimestamp);
}
}
......@@ -624,7 +636,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
pendingSeekPositionUs = C.TIME_UNSET;
seekToUs(requestedSeekPositionUs);
}
} else if (pendingSeekPositionUsForTcpRetry != C.TIME_UNSET) {
} else if (pendingSeekPositionUsForTcpRetry != C.TIME_UNSET && isUsingRtpTcp) {
seekToUs(pendingSeekPositionUsForTcpRetry);
pendingSeekPositionUsForTcpRetry = C.TIME_UNSET;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment