Break out parsing of FMTP lines so that others can use it
Intended use is to convert between different representations of "codec".
Bug: webrtc:42226302
Change-Id: If6d985ad17c2ff6018c77c7858e602b9eefa9297
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/350562
Reviewed-by: Florent Castelli <orphis@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42319}
diff --git a/pc/webrtc_sdp.cc b/pc/webrtc_sdp.cc
index 8def097..56f1f43 100644
--- a/pc/webrtc_sdp.cc
+++ b/pc/webrtc_sdp.cc
@@ -3699,6 +3699,27 @@
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 @@
// 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 052ed54..a67a9b4 100644
--- a/pc/webrtc_sdp.h
+++ b/pc/webrtc_sdp.h
@@ -112,6 +112,11 @@
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 f71b303..71f6d04 100644
--- a/pc/webrtc_sdp_unittest.cc
+++ b/pc/webrtc_sdp_unittest.cc
@@ -5123,3 +5123,24 @@
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");
+}