From 6f67cb839c0d33fbc1014a34034a012aa0756316 Mon Sep 17 00:00:00 2001 From: Colin Barr Date: Mon, 2 Aug 2021 21:15:33 +0100 Subject: [PATCH 1/2] Handle trailing semicolon on RTSP fmtp attribute --- .../source/rtsp/MediaDescription.java | 3 +- .../source/rtsp/RtspMediaTrackTest.java | 42 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java index f5547e119c..86dc08cb5f 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java @@ -314,7 +314,8 @@ import java.util.HashMap; // Format of the parameter: RFC3640 Section 4.4.1: // =[; =]. - String[] parameters = Util.split(fmtpComponents[1], ";\\s?"); + // Split with implicit limit of 0 to handle an optional trailing semicolon. + String[] parameters = fmtpComponents[1].split(";\\s?"); ImmutableMap.Builder formatParametersBuilder = new ImmutableMap.Builder<>(); for (String parameter : parameters) { // The parameter values can bear equal signs, so splitAtFirst must be used. diff --git a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrackTest.java b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrackTest.java index 363533536e..0901fd5fde 100644 --- a/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrackTest.java +++ b/library/rtsp/src/test/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrackTest.java @@ -80,6 +80,48 @@ public class RtspMediaTrackTest { assertThat(format).isEqualTo(expectedFormat); } + @Test + public void generatePayloadFormat_withH264MediaDescriptionAndFmtpTrailingSemicolon_succeeds() { + MediaDescription mediaDescription = + new MediaDescription.Builder( + MEDIA_TYPE_VIDEO, /* port= */ 0, RTP_AVP_PROFILE, /* payloadType= */ 96) + .setConnection("IN IP4 0.0.0.0") + .setBitrate(500_000) + .addAttribute(ATTR_RTPMAP, "96 H264/90000") + .addAttribute( + ATTR_FMTP, + "96 packetization-mode=1;profile-level-id=64001F;sprop-parameter-sets=Z2QAH6zZQPARabIAAAMACAAAAwGcHjBjLA==,aOvjyyLA;") + .addAttribute(ATTR_CONTROL, "track1") + .build(); + + RtpPayloadFormat format = RtspMediaTrack.generatePayloadFormat(mediaDescription); + RtpPayloadFormat expectedFormat = + new RtpPayloadFormat( + new Format.Builder() + .setSampleMimeType(MimeTypes.VIDEO_H264) + .setAverageBitrate(500_000) + .setPixelWidthHeightRatio(1.0f) + .setHeight(544) + .setWidth(960) + .setCodecs("avc1.64001F") + .setInitializationData( + ImmutableList.of( + new byte[] { + 0, 0, 0, 1, 103, 100, 0, 31, -84, -39, 64, -16, 17, 105, -78, 0, 0, 3, 0, + 8, 0, 0, 3, 1, -100, 30, 48, 99, 44 + }, + new byte[] {0, 0, 0, 1, 104, -21, -29, -53, 34, -64})) + .build(), + /* rtpPayloadType= */ 96, + /* clockRate= */ 90_000, + /* fmtpParameters= */ ImmutableMap.of( + "packetization-mode", "1", + "profile-level-id", "64001F", + "sprop-parameter-sets", "Z2QAH6zZQPARabIAAAMACAAAAwGcHjBjLA==,aOvjyyLA")); + + assertThat(format).isEqualTo(expectedFormat); + } + @Test public void generatePayloadFormat_withAacMediaDescription_succeeds() { MediaDescription mediaDescription = From 0921efab3e7d9e5657898b147033fa55113c0f91 Mon Sep 17 00:00:00 2001 From: Colin Barr Date: Tue, 3 Aug 2021 10:33:49 +0100 Subject: [PATCH 2/2] Switch to an explicit limit of 0 for splitting on RTSP fmtp parameters --- .../android/exoplayer2/source/rtsp/MediaDescription.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java index 86dc08cb5f..8b523b4fcc 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/MediaDescription.java @@ -314,8 +314,8 @@ import java.util.HashMap; // Format of the parameter: RFC3640 Section 4.4.1: // =[; =]. - // Split with implicit limit of 0 to handle an optional trailing semicolon. - String[] parameters = fmtpComponents[1].split(";\\s?"); + // Split with an explicit limit of 0 to handle an optional trailing semicolon. + String[] parameters = fmtpComponents[1].split(";\\s?", /* limit= */ 0); ImmutableMap.Builder formatParametersBuilder = new ImmutableMap.Builder<>(); for (String parameter : parameters) { // The parameter values can bear equal signs, so splitAtFirst must be used.