diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 6f9f2e5924..f9bc9b1182 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -73,6 +73,9 @@ * DASH extension: * Smooth Streaming extension: * RTSP extension: + * Add parsing support for SessionDescriptions containing lines with + trailing whitespace characters + ([#2357](https://github.com/androidx/media/issues/2357)). * Decoder extensions (FFmpeg, VP9, AV1, etc.): * MIDI extension: * Leanback extension: diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/SessionDescriptionParser.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/SessionDescriptionParser.java index 411fef6ffa..5e1bb6e3b0 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/SessionDescriptionParser.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/SessionDescriptionParser.java @@ -83,6 +83,8 @@ import java.util.regex.Pattern; // Lines are separated by an CRLF. for (String line : RtspMessageUtil.splitRtspMessageBody(sdpString)) { + line = line.trim(); + if ("".equals(line)) { continue; } diff --git a/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/SessionDescriptionTest.java b/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/SessionDescriptionTest.java index cf97e79dbf..1cc5289d0c 100644 --- a/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/SessionDescriptionTest.java +++ b/libraries/exoplayer_rtsp/src/test/java/androidx/media3/exoplayer/rtsp/SessionDescriptionTest.java @@ -342,6 +342,25 @@ public class SessionDescriptionTest { assertThat(sessionDescription.mediaDescriptionList.get(0).mediaTitle).isNull(); } + @Test + public void parse_sdpStringWithTrailingWhitespace_succeeds() throws Exception { + String testMediaSdpInfo = + "v=0\r\n" + + "o=MNobody 2890844526 2890842807 IN IP4 192.0.2.46\r\n" + + "s=SDP Seminar\r\n" + + "i=Sun Apr 20 12:59:09 2025\n\r\n" + + "t=0 0\r\n" + + "a=control:*\r\n" + + "m=audio 3456 RTP/AVP 0\r\n" + + "i=\r\n" + + "a=rtpmap:97 AC3/44100 \r\n"; + + SessionDescription sessionDescription = SessionDescriptionParser.parse(testMediaSdpInfo); + + assertThat(sessionDescription.sessionInfo).isEqualTo("Sun Apr 20 12:59:09 2025"); + assertThat(sessionDescription.mediaDescriptionList.get(0).mediaTitle).isNull(); + } + @Test public void parse_sdpStringWithEmptySessionAttribute_throwsParserException() { String testMediaSdpInfo =