From f1d822b03b9ec7232d0e4a3d6fad5b97f702b1e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Tue, 7 Jun 2022 13:58:27 +0200 Subject: [PATCH] Delete variant of rtc::split that copies the output fields Bug: webrtc:13579 Change-Id: I065a32704d48d5eed21aee0e9757cac9ecf7aa99 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/261951 Reviewed-by: Alessio Bazzica Reviewed-by: Harald Alvestrand Reviewed-by: Ali Tofigh Commit-Queue: Niels Moller Cr-Commit-Position: refs/heads/main@{#37160} --- api/crypto_params.h | 8 +- media/base/codec.h | 5 +- .../test/conversational_speech/BUILD.gn | 1 + .../test/conversational_speech/timing.cc | 8 +- .../test/conversational_speech/timing.h | 5 +- .../linux/wayland/screencast_stream_utils.cc | 3 +- p2p/base/transport_description.cc | 8 +- p2p/base/transport_description.h | 3 +- pc/BUILD.gn | 1 + pc/media_session.cc | 17 +-- pc/session_description.cc | 8 +- pc/session_description.h | 21 +-- pc/webrtc_sdp.cc | 139 +++++++++--------- rtc_base/experiments/field_trial_list.h | 4 +- rtc_base/string_encode.cc | 11 -- rtc_base/string_encode.h | 4 - rtc_base/string_encode_unittest.cc | 42 +++--- system_wrappers/source/field_trial.cc | 6 +- 18 files changed, 137 insertions(+), 157 deletions(-) diff --git a/api/crypto_params.h b/api/crypto_params.h index 5da352cbef..95bd892f9c 100644 --- a/api/crypto_params.h +++ b/api/crypto_params.h @@ -13,6 +13,8 @@ #include +#include "absl/strings/string_view.h" + namespace cricket { // Parameters for SRTP negotiation, as described in RFC 4568. @@ -21,9 +23,9 @@ namespace cricket { struct CryptoParams { CryptoParams() : tag(0) {} CryptoParams(int t, - const std::string& cs, - const std::string& kp, - const std::string& sp) + absl::string_view cs, + absl::string_view kp, + absl::string_view sp) : tag(t), cipher_suite(cs), key_params(kp), session_params(sp) {} bool Matches(const CryptoParams& params) const { diff --git a/media/base/codec.h b/media/base/codec.h index c07cf60025..73190223ac 100644 --- a/media/base/codec.h +++ b/media/base/codec.h @@ -16,6 +16,7 @@ #include #include +#include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "api/field_trials_view.h" #include "api/rtp_parameters.h" @@ -30,9 +31,9 @@ typedef std::map CodecParameterMap; class FeedbackParam { public: FeedbackParam() = default; - FeedbackParam(const std::string& id, const std::string& param) + FeedbackParam(absl::string_view id, const std::string& param) : id_(id), param_(param) {} - explicit FeedbackParam(const std::string& id) + explicit FeedbackParam(absl::string_view id) : id_(id), param_(kParamValueEmpty) {} bool operator==(const FeedbackParam& other) const; diff --git a/modules/audio_processing/test/conversational_speech/BUILD.gn b/modules/audio_processing/test/conversational_speech/BUILD.gn index 035f23144d..4408b5bea5 100644 --- a/modules/audio_processing/test/conversational_speech/BUILD.gn +++ b/modules/audio_processing/test/conversational_speech/BUILD.gn @@ -52,6 +52,7 @@ rtc_library("lib") { "../../../../rtc_base:stringutils", "../../../../test:fileutils", ] + absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] visibility = [ ":*" ] # Only targets in this file can depend on this. } diff --git a/modules/audio_processing/test/conversational_speech/timing.cc b/modules/audio_processing/test/conversational_speech/timing.cc index 53c8142028..8ff011c89b 100644 --- a/modules/audio_processing/test/conversational_speech/timing.cc +++ b/modules/audio_processing/test/conversational_speech/timing.cc @@ -28,15 +28,15 @@ bool Turn::operator==(const Turn& b) const { std::vector LoadTiming(const std::string& timing_filepath) { // Line parser. auto parse_line = [](const std::string& line) { - std::vector fields; - rtc::split(line, ' ', &fields); + std::vector fields = rtc::split(line, ' '); RTC_CHECK_GE(fields.size(), 3); RTC_CHECK_LE(fields.size(), 4); int gain = 0; if (fields.size() == 4) { - gain = std::atof(fields[3].c_str()); + gain = rtc::StringToNumber(fields[3]).value_or(0); } - return Turn(fields[0], fields[1], std::atol(fields[2].c_str()), gain); + return Turn(fields[0], fields[1], + rtc::StringToNumber(fields[2]).value_or(0), gain); }; // Init. diff --git a/modules/audio_processing/test/conversational_speech/timing.h b/modules/audio_processing/test/conversational_speech/timing.h index 812f3d55cc..2a0d6405de 100644 --- a/modules/audio_processing/test/conversational_speech/timing.h +++ b/modules/audio_processing/test/conversational_speech/timing.h @@ -14,6 +14,7 @@ #include #include +#include "absl/strings/string_view.h" #include "api/array_view.h" namespace webrtc { @@ -21,8 +22,8 @@ namespace test { namespace conversational_speech { struct Turn { - Turn(std::string new_speaker_name, - std::string new_audiotrack_file_name, + Turn(absl::string_view new_speaker_name, + absl::string_view new_audiotrack_file_name, int new_offset, int gain) : speaker_name(new_speaker_name), diff --git a/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc b/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc index 6d0df404f9..dc0784791d 100644 --- a/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc +++ b/modules/desktop_capture/linux/wayland/screencast_stream_utils.cc @@ -37,8 +37,7 @@ PipeWireThreadLoopLock::~PipeWireThreadLoopLock() { } PipeWireVersion PipeWireVersion::Parse(const absl::string_view& version) { - std::vector parsed_version; - rtc::split(version, '.', &parsed_version); + std::vector parsed_version = rtc::split(version, '.'); if (parsed_version.size() != 3) { return {}; diff --git a/p2p/base/transport_description.cc b/p2p/base/transport_description.cc index 96fb9597e0..1281910285 100644 --- a/p2p/base/transport_description.cc +++ b/p2p/base/transport_description.cc @@ -108,18 +108,18 @@ RTCError IceParameters::Validate() const { return RTCError::OK(); } -bool StringToConnectionRole(const std::string& role_str, ConnectionRole* role) { +absl::optional StringToConnectionRole( + absl::string_view role_str) { const char* const roles[] = { CONNECTIONROLE_ACTIVE_STR, CONNECTIONROLE_PASSIVE_STR, CONNECTIONROLE_ACTPASS_STR, CONNECTIONROLE_HOLDCONN_STR}; for (size_t i = 0; i < arraysize(roles); ++i) { if (absl::EqualsIgnoreCase(roles[i], role_str)) { - *role = static_cast(CONNECTIONROLE_ACTIVE + i); - return true; + return static_cast(CONNECTIONROLE_ACTIVE + i); } } - return false; + return absl::nullopt; } bool ConnectionRoleToString(const ConnectionRole& role, std::string* role_str) { diff --git a/p2p/base/transport_description.h b/p2p/base/transport_description.h index 32fdb5c9b3..6a9d36b814 100644 --- a/p2p/base/transport_description.h +++ b/p2p/base/transport_description.h @@ -97,7 +97,8 @@ extern const char CONNECTIONROLE_HOLDCONN_STR[]; constexpr auto* ICE_OPTION_TRICKLE = "trickle"; constexpr auto* ICE_OPTION_RENOMINATION = "renomination"; -bool StringToConnectionRole(const std::string& role_str, ConnectionRole* role); +absl::optional StringToConnectionRole( + absl::string_view role_str); bool ConnectionRoleToString(const ConnectionRole& role, std::string* role_str); struct TransportDescription { diff --git a/pc/BUILD.gn b/pc/BUILD.gn index 385ecf254c..435c8bd91b 100644 --- a/pc/BUILD.gn +++ b/pc/BUILD.gn @@ -676,6 +676,7 @@ rtc_source_set("session_description") { absl_deps = [ "//third_party/abseil-cpp/absl/algorithm:container", "//third_party/abseil-cpp/absl/memory:memory", + "//third_party/abseil-cpp/absl/strings", ] } diff --git a/pc/media_session.cc b/pc/media_session.cc index 3f7dbb5b64..e703b44101 100644 --- a/pc/media_session.cc +++ b/pc/media_session.cc @@ -863,10 +863,10 @@ static bool FindMatchingCodec(const std::vector& codecs1, // Mixed reference codecs (i.e. 111/112) are not supported. // Different levels of redundancy between offer and answer are // since RED is considered to be declarative. - std::vector redundant_payloads_1; - std::vector redundant_payloads_2; - rtc::split(red_parameters_1->second, '/', &redundant_payloads_1); - rtc::split(red_parameters_2->second, '/', &redundant_payloads_2); + std::vector redundant_payloads_1 = + rtc::split(red_parameters_1->second, '/'); + std::vector redundant_payloads_2 = + rtc::split(red_parameters_2->second, '/'); if (redundant_payloads_1.size() > 0 && redundant_payloads_2.size() > 0) { bool consistent = true; @@ -951,13 +951,12 @@ static const C* GetAssociatedCodecForRed(const std::vector& codec_list, return nullptr; } - std::vector redundant_payloads; - rtc::split(fmtp, '/', &redundant_payloads); + std::vector redundant_payloads = rtc::split(fmtp, '/'); if (redundant_payloads.size() < 2) { return nullptr; } - std::string associated_pt_str = redundant_payloads[0]; + absl::string_view associated_pt_str = redundant_payloads[0]; int associated_pt; if (!rtc::FromString(associated_pt_str, &associated_pt)) { RTC_LOG(LS_WARNING) << "Couldn't convert first payload type " @@ -1107,8 +1106,8 @@ static Codecs MatchCodecPreference( const auto fmtp = codec.params.find(cricket::kCodecParamNotInNameValueFormat); if (fmtp != codec.params.end()) { - std::vector redundant_payloads; - rtc::split(fmtp->second, '/', &redundant_payloads); + std::vector redundant_payloads = + rtc::split(fmtp->second, '/'); if (redundant_payloads.size() > 0 && redundant_payloads[0] == id) { if (std::find(filtered_codecs.begin(), filtered_codecs.end(), diff --git a/pc/session_description.cc b/pc/session_description.cc index c1feedbf53..0346f8c149 100644 --- a/pc/session_description.cc +++ b/pc/session_description.cc @@ -65,17 +65,17 @@ const std::string* ContentGroup::FirstContentName() const { return (!content_names_.empty()) ? &(*content_names_.begin()) : NULL; } -bool ContentGroup::HasContentName(const std::string& content_name) const { +bool ContentGroup::HasContentName(absl::string_view content_name) const { return absl::c_linear_search(content_names_, content_name); } -void ContentGroup::AddContentName(const std::string& content_name) { +void ContentGroup::AddContentName(absl::string_view content_name) { if (!HasContentName(content_name)) { - content_names_.push_back(content_name); + content_names_.emplace_back(content_name); } } -bool ContentGroup::RemoveContentName(const std::string& content_name) { +bool ContentGroup::RemoveContentName(absl::string_view content_name) { ContentNames::iterator iter = absl::c_find(content_names_, content_name); if (iter == content_names_.end()) { return false; diff --git a/pc/session_description.h b/pc/session_description.h index a68c312f42..9aa8e3556a 100644 --- a/pc/session_description.h +++ b/pc/session_description.h @@ -22,6 +22,7 @@ #include #include "absl/memory/memory.h" +#include "absl/strings/string_view.h" #include "api/crypto_params.h" #include "api/media_types.h" #include "api/rtp_parameters.h" @@ -95,8 +96,8 @@ class MediaContentDescription { // `protocol` is the expected media transport protocol, such as RTP/AVPF, // RTP/SAVPF or SCTP/DTLS. virtual std::string protocol() const { return protocol_; } - virtual void set_protocol(const std::string& protocol) { - protocol_ = protocol; + virtual void set_protocol(absl::string_view protocol) { + protocol_ = std::string(protocol); } virtual webrtc::RtpTransceiverDirection direction() const { @@ -282,9 +283,9 @@ class MediaContentDescription { template class MediaContentDescriptionImpl : public MediaContentDescription { public: - void set_protocol(const std::string& protocol) override { + void set_protocol(absl::string_view protocol) override { RTC_DCHECK(IsRtpProtocol(protocol)); - protocol_ = protocol; + protocol_ = std::string(protocol); } typedef C CodecType; @@ -365,9 +366,9 @@ class SctpDataContentDescription : public MediaContentDescription { const SctpDataContentDescription* as_sctp() const override { return this; } bool has_codecs() const override { return false; } - void set_protocol(const std::string& protocol) override { + void set_protocol(absl::string_view protocol) override { RTC_DCHECK(IsSctpProtocol(protocol)); - protocol_ = protocol; + protocol_ = std::string(protocol); } bool use_sctpmap() const { return use_sctpmap_; } @@ -392,7 +393,7 @@ class SctpDataContentDescription : public MediaContentDescription { class UnsupportedContentDescription : public MediaContentDescription { public: - explicit UnsupportedContentDescription(const std::string& media_type) + explicit UnsupportedContentDescription(absl::string_view media_type) : media_type_(media_type) {} MediaType type() const override { return MEDIA_TYPE_UNSUPPORTED; } @@ -478,9 +479,9 @@ class ContentGroup { const ContentNames& content_names() const { return content_names_; } const std::string* FirstContentName() const; - bool HasContentName(const std::string& content_name) const; - void AddContentName(const std::string& content_name); - bool RemoveContentName(const std::string& content_name); + bool HasContentName(absl::string_view content_name) const; + void AddContentName(absl::string_view content_name); + bool RemoveContentName(absl::string_view content_name); // for debugging std::string ToString() const; diff --git a/pc/webrtc_sdp.cc b/pc/webrtc_sdp.cc index 5094db49f3..3f1c83736e 100644 --- a/pc/webrtc_sdp.cc +++ b/pc/webrtc_sdp.cc @@ -1078,8 +1078,8 @@ bool ParseCandidate(absl::string_view message, } } - std::vector fields; - rtc::split(candidate_value, kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(candidate_value, kSdpDelimiterSpaceChar); // RFC 5245 // a=candidate: @@ -1091,18 +1091,18 @@ bool ParseCandidate(absl::string_view message, (fields[6] != kAttributeCandidateTyp)) { return ParseFailedExpectMinFieldNum(first_line, expected_min_fields, error); } - const std::string& foundation = fields[0]; + const absl::string_view foundation = fields[0]; int component_id = 0; if (!GetValueFromString(first_line, fields[1], &component_id, error)) { return false; } - const std::string& transport = fields[2]; + const absl::string_view transport = fields[2]; uint32_t priority = 0; if (!GetValueFromString(first_line, fields[3], &priority, error)) { return false; } - const std::string& connection_address = fields[4]; + const absl::string_view connection_address = fields[4]; int port = 0; if (!GetValueFromString(first_line, fields[5], &port, error)) { return false; @@ -1131,7 +1131,7 @@ bool ParseCandidate(absl::string_view message, } std::string candidate_type; - const std::string& type = fields[7]; + const absl::string_view type = fields[7]; if (type == kCandidateHost) { candidate_type = cricket::LOCAL_PORT_TYPE; } else if (type == kCandidateSrflx) { @@ -1169,7 +1169,7 @@ bool ParseCandidate(absl::string_view message, // If this is a TCP candidate, it has additional extension as defined in // RFC 6544. - std::string tcptype; + absl::string_view tcptype; if (fields.size() >= (current_position + 2) && fields[current_position] == kTcpCandidateType) { tcptype = fields[++current_position]; @@ -1195,8 +1195,8 @@ bool ParseCandidate(absl::string_view message, // Though non-standard, we support the ICE ufrag and pwd being signaled on // the candidate to avoid issues with confusing which generation a candidate // belongs to when trickling multiple generations at the same time. - std::string username; - std::string password; + absl::string_view username; + absl::string_view password; uint32_t generation = 0; uint16_t network_id = 0; uint16_t network_cost = 0; @@ -1241,10 +1241,10 @@ bool ParseIceOptions(absl::string_view line, if (!GetValue(line, kAttributeIceOption, &ice_options, error)) { return false; } - std::vector fields; - rtc::split(ice_options, kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(ice_options, kSdpDelimiterSpaceChar); for (size_t i = 0; i < fields.size(); ++i) { - transport_options->push_back(fields[i]); + transport_options->emplace_back(fields[i]); } return true; } @@ -1254,12 +1254,11 @@ bool ParseSctpPort(absl::string_view line, SdpParseError* error) { // draft-ietf-mmusic-sctp-sdp-26 // a=sctp-port - std::vector fields; const size_t expected_min_fields = 2; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterColonChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterColonChar); if (fields.size() < expected_min_fields) { - fields.resize(0); - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); + fields = rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar); } if (fields.size() < expected_min_fields) { return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); @@ -1275,9 +1274,9 @@ bool ParseSctpMaxMessageSize(absl::string_view line, SdpParseError* error) { // draft-ietf-mmusic-sctp-sdp-26 // a=max-message-size:199999 - std::vector fields; const size_t expected_min_fields = 2; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterColonChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterColonChar); if (fields.size() < expected_min_fields) { return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); } @@ -1292,20 +1291,20 @@ bool ParseExtmap(absl::string_view line, SdpParseError* error) { // RFC 5285 // a=extmap:["/"] - std::vector fields; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar); const size_t expected_min_fields = 2; if (fields.size() < expected_min_fields) { return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); } - std::string uri = fields[1]; + absl::string_view uri = fields[1]; std::string value_direction; if (!GetValue(fields[0], kAttributeExtmap, &value_direction, error)) { return false; } - std::vector sub_fields; - rtc::split(value_direction, kSdpDelimiterSlashChar, &sub_fields); + std::vector sub_fields = + rtc::split(value_direction, kSdpDelimiterSlashChar); int value = 0; if (!GetValueFromString(line, sub_fields[0], &value, error)) { return false; @@ -2116,14 +2115,14 @@ bool ParseSessionDescription(absl::string_view message, return ParseFailedExpectLine(message, *pos, kLineTypeOrigin, std::string(), error); } - std::vector fields; - rtc::split(line->substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(line->substr(kLinePrefixLength), kSdpDelimiterSpaceChar); const size_t expected_fields = 6; if (fields.size() != expected_fields) { return ParseFailedExpectFieldNum(*line, expected_fields, error); } - *session_id = fields[1]; - *session_version = fields[2]; + *session_id = std::string(fields[1]); + *session_version = std::string(fields[2]); // RFC 4566 // s= (session name) @@ -2263,8 +2262,8 @@ bool ParseGroupAttribute(absl::string_view line, // RFC 5888 and draft-holmberg-mmusic-sdp-bundle-negotiation-00 // a=group:BUNDLE video voice - std::vector fields; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar); std::string semantics; if (!GetValue(fields[0], kAttributeGroup, &semantics, error)) { return false; @@ -2281,8 +2280,8 @@ static bool ParseFingerprintAttribute( absl::string_view line, std::unique_ptr* fingerprint, SdpParseError* error) { - std::vector fields; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar); const size_t expected_fields = 2; if (fields.size() != expected_fields) { return ParseFailedExpectFieldNum(line, expected_fields, error); @@ -2310,21 +2309,23 @@ static bool ParseFingerprintAttribute( } static bool ParseDtlsSetup(absl::string_view line, - cricket::ConnectionRole* role, + cricket::ConnectionRole* role_ptr, SdpParseError* error) { // setup-attr = "a=setup:" role // role = "active" / "passive" / "actpass" / "holdconn" - std::vector fields; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterColonChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterColonChar); const size_t expected_fields = 2; if (fields.size() != expected_fields) { return ParseFailedExpectFieldNum(line, expected_fields, error); } - std::string role_str = fields[1]; - if (!cricket::StringToConnectionRole(role_str, role)) { - return ParseFailed(line, "Invalid attribute value.", error); + if (absl::optional role = + cricket::StringToConnectionRole(fields[1]); + role.has_value()) { + *role_ptr = *role; + return true; } - return true; + return ParseFailed(line, "Invalid attribute value.", error); } static bool ParseMsidAttribute(absl::string_view line, @@ -2623,9 +2624,8 @@ bool ParseMediaDescription( GetLineWithType(message, pos, kLineTypeMedia)) { ++mline_index; - std::vector fields; - rtc::split(mline->substr(kLinePrefixLength), kSdpDelimiterSpaceChar, - &fields); + std::vector fields = + rtc::split(mline->substr(kLinePrefixLength), kSdpDelimiterSpaceChar); const size_t expected_min_fields = 4; if (fields.size() < expected_min_fields) { @@ -2643,7 +2643,7 @@ bool ParseMediaDescription( if (!rtc::FromString(fields[1], &port) || !IsValidPort(port)) { return ParseFailed(*mline, "The port number is invalid", error); } - const std::string& protocol = fields[2]; + absl::string_view protocol = fields[2]; // std::vector payload_types; @@ -2668,7 +2668,7 @@ bool ParseMediaDescription( std::string content_name; bool bundle_only = false; int section_msid_signaling = 0; - const std::string& media_type = fields[0]; + absl::string_view media_type = fields[0]; if ((media_type == kMediaTypeVideo || media_type == kMediaTypeAudio) && !cricket::IsRtpProtocol(protocol)) { return ParseFailed(*mline, "Unsupported protocol for media type", error); @@ -2756,7 +2756,7 @@ bool ParseMediaDescription( if (content->as_unsupported()) { content_rejected = true; } else if (cricket::IsRtpProtocol(protocol) && !content->as_sctp()) { - content->set_protocol(protocol); + content->set_protocol(std::string(protocol)); // Set the extmap. if (!session_extmaps.empty() && !content->rtp_header_extensions().empty()) { @@ -3442,15 +3442,15 @@ bool ParseSsrcAttribute(absl::string_view line, } else if (attribute == kSsrcAttributeMsid) { // draft-alvestrand-mmusic-msid-00 // msid:identifier [appdata] - std::vector fields; - rtc::split(value, kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(value, kSdpDelimiterSpaceChar); if (fields.size() < 1 || fields.size() > 2) { return ParseFailed( line, "Expected format \"msid:[ ]\".", error); } - ssrc_info.stream_id = fields[0]; + ssrc_info.stream_id = std::string(fields[0]); if (fields.size() == 2) { - ssrc_info.track_id = fields[1]; + ssrc_info.track_id = std::string(fields[1]); } *msid_signaling |= cricket::kMsidSignalingSsrcAttribute; } else { @@ -3465,8 +3465,8 @@ bool ParseSsrcGroupAttribute(absl::string_view line, RTC_DCHECK(ssrc_groups != NULL); // RFC 5576 // a=ssrc-group: ... - std::vector fields; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar); const size_t expected_min_fields = 2; if (fields.size() < expected_min_fields) { return ParseFailedExpectMinFieldNum(line, expected_min_fields, error); @@ -3490,8 +3490,8 @@ bool ParseSsrcGroupAttribute(absl::string_view line, bool ParseCryptoAttribute(absl::string_view line, MediaContentDescription* media_desc, SdpParseError* error) { - std::vector fields; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar); // RFC 4568 // a=crypto: [] const size_t expected_min_fields = 3; @@ -3506,12 +3506,13 @@ bool ParseCryptoAttribute(absl::string_view line, if (!GetValueFromString(line, tag_value, &tag, error)) { return false; } - const std::string& crypto_suite = fields[1]; - const std::string& key_params = fields[2]; - std::string session_params; + const absl::string_view crypto_suite = fields[1]; + const absl::string_view key_params = fields[2]; + absl::string_view session_params; if (fields.size() > 3) { session_params = fields[3]; } + media_desc->AddCrypto( CryptoParams(tag, crypto_suite, key_params, session_params)); return true; @@ -3557,8 +3558,8 @@ bool ParseRtpmapAttribute(absl::string_view line, MediaContentDescription* media_desc, SdpParseError* error) { static const int kFirstDynamicPayloadTypeLowerRange = 35; - std::vector fields; - rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar, &fields); + std::vector fields = + rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpaceChar); // RFC 4566 // a=rtpmap: /[/] const size_t expected_min_fields = 2; @@ -3581,9 +3582,7 @@ bool ParseRtpmapAttribute(absl::string_view line, << line; return true; } - const std::string& encoder = fields[1]; - std::vector codec_params; - rtc::split(encoder, '/', &codec_params); + std::vector codec_params = rtc::split(fields[1], '/'); // /[/] // 2 mandatory fields if (codec_params.size() < 2 || codec_params.size() > 3) { @@ -3592,7 +3591,7 @@ bool ParseRtpmapAttribute(absl::string_view line, "[/]\".", error); } - const std::string& encoding_name = codec_params[0]; + const absl::string_view encoding_name = codec_params[0]; int clock_rate = 0; if (!GetValueFromString(line, codec_params[1], &clock_rate, error)) { return false; @@ -3736,8 +3735,8 @@ bool ParsePacketizationAttribute(absl::string_view line, if (media_type != cricket::MEDIA_TYPE_VIDEO) { return true; } - std::vector packetization_fields; - rtc::split(line, kSdpDelimiterSpaceChar, &packetization_fields); + std::vector packetization_fields = + rtc::split(line, kSdpDelimiterSpaceChar); if (packetization_fields.size() < 2) { return ParseFailedGetValue(line, kAttributePacketization, error); } @@ -3751,7 +3750,7 @@ bool ParsePacketizationAttribute(absl::string_view line, error)) { return false; } - std::string packetization = packetization_fields[1]; + absl::string_view packetization = packetization_fields[1]; UpdateVideoCodecPacketization(media_desc->as_video(), payload_type, packetization); return true; @@ -3765,8 +3764,8 @@ bool ParseRtcpFbAttribute(absl::string_view line, media_type != cricket::MEDIA_TYPE_VIDEO) { return true; } - std::vector rtcp_fb_fields; - rtc::split(line, kSdpDelimiterSpaceChar, &rtcp_fb_fields); + std::vector rtcp_fb_fields = + rtc::split(line, kSdpDelimiterSpaceChar); if (rtcp_fb_fields.size() < 2) { return ParseFailedGetValue(line, kAttributeRtcpFb, error); } @@ -3782,11 +3781,11 @@ bool ParseRtcpFbAttribute(absl::string_view line, return false; } } - std::string id = rtcp_fb_fields[1]; + absl::string_view id = rtcp_fb_fields[1]; std::string param = ""; - for (std::vector::iterator iter = rtcp_fb_fields.begin() + 2; - iter != rtcp_fb_fields.end(); ++iter) { - param.append(*iter); + for (auto iter = rtcp_fb_fields.begin() + 2; iter != rtcp_fb_fields.end(); + ++iter) { + param.append(iter->data(), iter->length()); } const cricket::FeedbackParam feedback_param(id, param); diff --git a/rtc_base/experiments/field_trial_list.h b/rtc_base/experiments/field_trial_list.h index 7b9f0d9dfc..261977243a 100644 --- a/rtc_base/experiments/field_trial_list.h +++ b/rtc_base/experiments/field_trial_list.h @@ -73,11 +73,9 @@ class FieldTrialList : public FieldTrialListBase { return true; } - std::vector tokens; std::vector new_values_; - rtc::split(str_value.value(), '|', &tokens); - for (std::string token : tokens) { + for (const absl::string_view token : rtc::split(str_value.value(), '|')) { absl::optional value = ParseTypedParameter(token); if (value) { new_values_.push_back(*value); diff --git a/rtc_base/string_encode.cc b/rtc_base/string_encode.cc index 84361ae142..434d1e6139 100644 --- a/rtc_base/string_encode.cc +++ b/rtc_base/string_encode.cc @@ -187,17 +187,6 @@ std::vector split(absl::string_view source, char delimiter) { return fields; } -size_t split(absl::string_view source, - char delimiter, - std::vector* fields) { - RTC_DCHECK(fields); - fields->clear(); - for (const absl::string_view field_view : split(source, delimiter)) { - fields->emplace_back(field_view); - } - return fields->size(); -} - std::string ToString(const bool b) { return b ? "true" : "false"; } diff --git a/rtc_base/string_encode.h b/rtc_base/string_encode.h index 6bbb0088f3..82a9dfdb62 100644 --- a/rtc_base/string_encode.h +++ b/rtc_base/string_encode.h @@ -48,10 +48,6 @@ size_t hex_decode_with_delimiter(ArrayView buffer, // single, empty, field. std::vector split(absl::string_view source, char delimiter); -size_t split(absl::string_view source, - char delimiter, - std::vector* fields); - // Splits the source string into multiple fields separated by delimiter, // with duplicates of delimiter ignored. Trailing delimiter ignored. size_t tokenize(absl::string_view source, diff --git a/rtc_base/string_encode_unittest.cc b/rtc_base/string_encode_unittest.cc index 4afed3f00f..f277d3a856 100644 --- a/rtc_base/string_encode_unittest.cc +++ b/rtc_base/string_encode_unittest.cc @@ -215,53 +215,45 @@ TEST(TokenizeFirstTest, SingleToken) { // Tests counting substrings. TEST(SplitTest, CountSubstrings) { - std::vector fields; - - EXPECT_EQ(5ul, split("one,two,three,four,five", ',', &fields)); - fields.clear(); - EXPECT_EQ(1ul, split("one", ',', &fields)); + EXPECT_EQ(5ul, split("one,two,three,four,five", ',').size()); + EXPECT_EQ(1ul, split("one", ',').size()); // Empty fields between commas count. - fields.clear(); - EXPECT_EQ(5ul, split("one,,three,four,five", ',', &fields)); - fields.clear(); - EXPECT_EQ(3ul, split(",three,", ',', &fields)); - fields.clear(); - EXPECT_EQ(1ul, split("", ',', &fields)); + EXPECT_EQ(5ul, split("one,,three,four,five", ',').size()); + EXPECT_EQ(3ul, split(",three,", ',').size()); + EXPECT_EQ(1ul, split("", ',').size()); } // Tests comparing substrings. TEST(SplitTest, CompareSubstrings) { - std::vector fields; - - split("find,middle,one", ',', &fields); + std::vector fields = split("find,middle,one", ','); ASSERT_EQ(3ul, fields.size()); - ASSERT_STREQ("middle", fields.at(1).c_str()); - fields.clear(); + ASSERT_EQ("middle", fields.at(1)); // Empty fields between commas count. - split("find,,middle,one", ',', &fields); + fields = split("find,,middle,one", ','); ASSERT_EQ(4ul, fields.size()); - ASSERT_STREQ("middle", fields.at(2).c_str()); - fields.clear(); - split("", ',', &fields); + ASSERT_EQ("middle", fields.at(2)); + fields = split("", ','); ASSERT_EQ(1ul, fields.size()); - ASSERT_STREQ("", fields.at(0).c_str()); + ASSERT_EQ("", fields.at(0)); } TEST(SplitTest, EmptyTokens) { - std::vector fields; - EXPECT_EQ(3ul, split("a.b.c", '.', &fields)); + std::vector fields = split("a.b.c", '.'); + ASSERT_EQ(3ul, fields.size()); EXPECT_EQ("a", fields[0]); EXPECT_EQ("b", fields[1]); EXPECT_EQ("c", fields[2]); - EXPECT_EQ(3ul, split("..c", '.', &fields)); + fields = split("..c", '.'); + ASSERT_EQ(3ul, fields.size()); EXPECT_TRUE(fields[0].empty()); EXPECT_TRUE(fields[1].empty()); EXPECT_EQ("c", fields[2]); - EXPECT_EQ(1ul, split("", '.', &fields)); + fields = split("", '.'); + ASSERT_EQ(1ul, fields.size()); EXPECT_TRUE(fields[0].empty()); } diff --git a/system_wrappers/source/field_trial.cc b/system_wrappers/source/field_trial.cc index db49f635d0..f83876be03 100644 --- a/system_wrappers/source/field_trial.cc +++ b/system_wrappers/source/field_trial.cc @@ -77,11 +77,11 @@ void InsertOrReplaceFieldTrialStringsInMap( std::map* fieldtrial_map, const absl::string_view trials_string) { if (FieldTrialsStringIsValidInternal(trials_string)) { - std::vector tokens; - rtc::split(std::string(trials_string), '/', &tokens); + std::vector tokens = rtc::split(trials_string, '/'); // Skip last token which is empty due to trailing '/'. for (size_t idx = 0; idx < tokens.size() - 1; idx += 2) { - (*fieldtrial_map)[tokens[idx]] = tokens[idx + 1]; + (*fieldtrial_map)[std::string(tokens[idx])] = + std::string(tokens[idx + 1]); } } else { RTC_DCHECK_NOTREACHED() << "Invalid field trials string:" << trials_string;