diff --git a/pc/webrtc_sdp.cc b/pc/webrtc_sdp.cc index 8def097f1d..56f1f43d61 100644 --- a/pc/webrtc_sdp.cc +++ b/pc/webrtc_sdp.cc @@ -3699,6 +3699,27 @@ bool ParseFmtpParam(absl::string_view line, return true; } +bool ParseFmtpParameterSet(absl::string_view line_params, + webrtc::CodecParameterMap& codec_params, + SdpParseError* error) { + // Parse out format specific parameters. + for (absl::string_view param : + rtc::split(line_params, kSdpDelimiterSemicolonChar)) { + std::string name; + std::string value; + if (!ParseFmtpParam(absl::StripAsciiWhitespace(param), &name, &value, + error)) { + return false; + } + if (codec_params.find(name) != codec_params.end()) { + RTC_LOG(LS_INFO) << "Overwriting duplicate fmtp parameter with key \"" + << name << "\"."; + } + codec_params[name] = value; + } + return true; +} + bool ParseFmtpAttributes(absl::string_view line, const cricket::MediaType media_type, MediaContentDescription* media_desc, @@ -3736,19 +3757,8 @@ bool ParseFmtpAttributes(absl::string_view line, // Parse out format specific parameters. webrtc::CodecParameterMap codec_params; - for (absl::string_view param : - rtc::split(line_params, kSdpDelimiterSemicolonChar)) { - std::string name; - std::string value; - if (!ParseFmtpParam(absl::StripAsciiWhitespace(param), &name, &value, - error)) { - return false; - } - if (codec_params.find(name) != codec_params.end()) { - RTC_LOG(LS_INFO) << "Overwriting duplicate fmtp parameter with key \"" - << name << "\"."; - } - codec_params[name] = value; + if (!ParseFmtpParameterSet(line_params, codec_params, error)) { + return false; } if (media_type == cricket::MEDIA_TYPE_AUDIO || diff --git a/pc/webrtc_sdp.h b/pc/webrtc_sdp.h index 052ed546c8..a67a9b4a07 100644 --- a/pc/webrtc_sdp.h +++ b/pc/webrtc_sdp.h @@ -112,6 +112,11 @@ RTC_EXPORT bool ParseCandidate(absl::string_view message, bool WriteFmtpParameters(const webrtc::CodecParameterMap& parameters, rtc::StringBuilder* os); +// Parses a string into an FMTP parameter set, in key-value format. +bool ParseFmtpParameterSet(absl::string_view line_params, + webrtc::CodecParameterMap& codec_params, + SdpParseError* error); + } // namespace webrtc #endif // PC_WEBRTC_SDP_H_ diff --git a/pc/webrtc_sdp_unittest.cc b/pc/webrtc_sdp_unittest.cc index f71b303283..71f6d042cd 100644 --- a/pc/webrtc_sdp_unittest.cc +++ b/pc/webrtc_sdp_unittest.cc @@ -5123,3 +5123,24 @@ TEST_F(WebRtcSdpTest, BackfillsDefaultFmtpValues) { EXPECT_TRUE(codecs[3].GetParam("tx-mode", &value)); EXPECT_EQ(value, "SRST"); } + +TEST_F(WebRtcSdpTest, ParsesKeyValueFmtpParameterSet) { + std::string params = "key1=value1;key2=value2"; + webrtc::CodecParameterMap codec_params; + SdpParseError error; + + ASSERT_TRUE(webrtc::ParseFmtpParameterSet(params, codec_params, &error)); + EXPECT_EQ(2U, codec_params.size()); + EXPECT_EQ(codec_params["key1"], "value1"); + EXPECT_EQ(codec_params["key2"], "value2"); +} + +TEST_F(WebRtcSdpTest, ParsesNonKeyValueFmtpParameterSet) { + std::string params = "not-in-key-value-format"; + webrtc::CodecParameterMap codec_params; + SdpParseError error; + + ASSERT_TRUE(webrtc::ParseFmtpParameterSet(params, codec_params, &error)); + EXPECT_EQ(1U, codec_params.size()); + EXPECT_EQ(codec_params[""], "not-in-key-value-format"); +}