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}
This commit is contained in:
Harald Alvestrand 2024-05-16 09:04:33 +00:00 committed by WebRTC LUCI CQ
parent b4dcac3e1a
commit c6c6971d97
3 changed files with 49 additions and 13 deletions

View File

@ -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,20 +3757,9 @@ 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)) {
if (!ParseFmtpParameterSet(line_params, codec_params, 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 (media_type == cricket::MEDIA_TYPE_AUDIO ||
media_type == cricket::MEDIA_TYPE_VIDEO) {

View File

@ -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_

View File

@ -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");
}