Remove simple stringstream usages.

This CL replaces std::o?stringstream with rtc::StringBuilder where that's possible to do without changing any of the surrounding code. It also updates includes and build files as appropriate.

The CL was generated by running 'git grep -l -P std::o?stringstream | xargs perl -pi -e "s/std::o?stringstream/rtc::StringBuilder/g"'. Then I've manually updated the #includes and BUILD files, run 'git cl format' and unstaged any file that would need more complex fixes.

Bug: webrtc:8982
Change-Id: Ibc32153f4a3fd177e260b6ad05ce393972549357
Reviewed-on: https://webrtc-review.googlesource.com/98460
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Jonas Olsson <jonasolsson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24605}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index f8b6ca3..b6ad1d6 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -387,6 +387,7 @@
     deps = [
       "..:webrtc_common",
       "../modules/video_coding:video_codec_interface",
+      "../rtc_base:stringutils",
       "video_codecs:video_codecs_api",
     ]
   }
diff --git a/api/candidate.cc b/api/candidate.cc
index d51fb84..128c470 100644
--- a/api/candidate.cc
+++ b/api/candidate.cc
@@ -10,6 +10,8 @@
 
 #include "api/candidate.h"
 
+#include "rtc_base/strings/string_builder.h"
+
 namespace cricket {
 
 Candidate::Candidate()
@@ -68,7 +70,7 @@
 }
 
 std::string Candidate::ToStringInternal(bool sensitive) const {
-  std::ostringstream ost;
+  rtc::StringBuilder ost;
   std::string address =
       sensitive ? address_.ToSensitiveString() : address_.ToString();
   ost << "Cand[" << transport_name_ << ":" << foundation_ << ":" << component_
diff --git a/api/test/videocodec_test_stats.cc b/api/test/videocodec_test_stats.cc
index 7252278..78c39d0 100644
--- a/api/test/videocodec_test_stats.cc
+++ b/api/test/videocodec_test_stats.cc
@@ -10,11 +10,13 @@
 
 #include "api/test/videocodec_test_stats.h"
 
+#include "rtc_base/strings/string_builder.h"
+
 namespace webrtc {
 namespace test {
 
 std::string VideoCodecTestStats::FrameStatistics::ToString() const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "frame_number " << frame_number;
   ss << " decoded_width " << decoded_width;
   ss << " decoded_height " << decoded_height;
@@ -43,7 +45,7 @@
 
 std::string VideoCodecTestStats::VideoStatistics::ToString(
     std::string prefix) const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << prefix << "target_bitrate_kbps: " << target_bitrate_kbps;
   ss << "\n" << prefix << "input_framerate_fps: " << input_framerate_fps;
   ss << "\n" << prefix << "spatial_idx: " << spatial_idx;
diff --git a/common_audio/resampler/resampler_unittest.cc b/common_audio/resampler/resampler_unittest.cc
index fd636e2..61be040 100644
--- a/common_audio/resampler/resampler_unittest.cc
+++ b/common_audio/resampler/resampler_unittest.cc
@@ -11,6 +11,7 @@
 #include <array>
 
 #include "common_audio/resampler/include/resampler.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 // TODO(andrew): this is a work-in-progress. Many more tests are needed.
@@ -64,7 +65,7 @@
 void ResamplerTest::ResetIfNeededAndPush(int in_rate,
                                          int out_rate,
                                          int num_channels) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Input rate: " << in_rate << ", output rate: " << out_rate
      << ", channel count: " << num_channels;
   SCOPED_TRACE(ss.str());
@@ -90,7 +91,7 @@
   for (size_t i = 0; i < kRatesSize; ++i) {
     for (size_t j = 0; j < kRatesSize; ++j) {
       for (size_t k = 0; k < kNumChannelsSize; ++k) {
-        std::ostringstream ss;
+        rtc::StringBuilder ss;
         ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j]
            << ", channels: " << kNumChannels[k];
         SCOPED_TRACE(ss.str());
@@ -109,7 +110,7 @@
   const int kChannels = 1;
   for (size_t i = 0; i < kRatesSize; ++i) {
     for (size_t j = 0; j < kRatesSize; ++j) {
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j];
       SCOPED_TRACE(ss.str());
 
@@ -131,7 +132,7 @@
   const int kChannels = 2;
   for (size_t i = 0; i < kRatesSize; ++i) {
     for (size_t j = 0; j < kRatesSize; ++j) {
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j];
       SCOPED_TRACE(ss.str());
 
diff --git a/common_audio/signal_processing/signal_processing_unittest.cc b/common_audio/signal_processing/signal_processing_unittest.cc
index 8e65ebd..aeaf97b 100644
--- a/common_audio/signal_processing/signal_processing_unittest.cc
+++ b/common_audio/signal_processing/signal_processing_unittest.cc
@@ -9,9 +9,9 @@
  */
 
 #include <algorithm>
-#include <sstream>
 
 #include "common_audio/signal_processing/include/signal_processing_library.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 static const size_t kVector16Size = 9;
@@ -134,7 +134,7 @@
           INT32_MIN, std::min<int64_t>(INT32_MAX, static_cast<int64_t>(a) + b));
       const int64_t diff = std::max<int64_t>(
           INT32_MIN, std::min<int64_t>(INT32_MAX, static_cast<int64_t>(a) - b));
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << a << " +/- " << b << ": sum " << sum << ", diff " << diff;
       SCOPED_TRACE(ss.str());
       EXPECT_EQ(sum, WebRtcSpl_AddSatW32(a, b));
diff --git a/examples/stunprober/main.cc b/examples/stunprober/main.cc
index 973db39..42ee0a1 100644
--- a/examples/stunprober/main.cc
+++ b/examples/stunprober/main.cc
@@ -12,7 +12,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <iostream>
 #include <map>
 #include <memory>
 
@@ -25,6 +24,7 @@
 #include "rtc_base/nethelpers.h"
 #include "rtc_base/network.h"
 #include "rtc_base/ssladapter.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/stringutils.h"
 #include "rtc_base/thread.h"
 #include "rtc_base/timeutils.h"
diff --git a/media/base/mediachannel.h b/media/base/mediachannel.h
index f0e1658..a4a75ed 100644
--- a/media/base/mediachannel.h
+++ b/media/base/mediachannel.h
@@ -41,6 +41,7 @@
 #include "rtc_base/networkroute.h"
 #include "rtc_base/socket.h"
 #include "rtc_base/stringencode.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/third_party/sigslot/sigslot.h"
 
 namespace rtc {
@@ -76,7 +77,7 @@
 
 template <class T>
 static std::string VectorToString(const std::vector<T>& vals) {
-  std::ostringstream ost;  // no-presubmit-check TODO(webrtc:8982)
+  rtc::StringBuilder ost;  // no-presubmit-check TODO(webrtc:8982)
   ost << "[";
   for (size_t i = 0; i < vals.size(); ++i) {
     if (i > 0) {
@@ -110,7 +111,7 @@
   bool operator!=(const VideoOptions& o) const { return !(*this == o); }
 
   std::string ToString() const {
-    std::ostringstream ost;
+    rtc::StringBuilder ost;
     ost << "VideoOptions {";
     ost << ToStringIfSet("noise reduction", video_noise_reduction);
     ost << ToStringIfSet("screencast min bitrate kbps",
@@ -149,7 +150,7 @@
   RtpHeaderExtension(const std::string& uri, int id) : uri(uri), id(id) {}
 
   std::string ToString() const {
-    std::ostringstream ost;
+    rtc::StringBuilder ost;
     ost << "{";
     ost << "uri: " << uri;
     ost << ", id: " << id;
@@ -602,7 +603,7 @@
   RtcpParameters rtcp;
 
   std::string ToString() const {
-    std::ostringstream ost;
+    rtc::StringBuilder ost;
     ost << "{";
     const char* separator = "";
     for (const auto& entry : ToStringMap()) {
diff --git a/media/engine/webrtcvoiceengine.cc b/media/engine/webrtcvoiceengine.cc
index b981a20..d6c2967 100644
--- a/media/engine/webrtcvoiceengine.cc
+++ b/media/engine/webrtcvoiceengine.cc
@@ -40,6 +40,7 @@
 #include "rtc_base/race_checker.h"
 #include "rtc_base/stringencode.h"
 #include "rtc_base/strings/audio_format_to_string.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/stringutils.h"
 #include "rtc_base/third_party/base64/base64.h"
 #include "rtc_base/trace_event.h"
@@ -95,7 +96,7 @@
 
 // Dumps an AudioCodec in RFC 2327-ish format.
 std::string ToString(const AudioCodec& codec) {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << codec.name << "/" << codec.clockrate << "/" << codec.channels;
   if (!codec.params.empty()) {
     ss << " {";
diff --git a/modules/audio_coding/codecs/isac/unittest.cc b/modules/audio_coding/codecs/isac/unittest.cc
index 4e76e0d..5855d56 100644
--- a/modules/audio_coding/codecs/isac/unittest.cc
+++ b/modules/audio_coding/codecs/isac/unittest.cc
@@ -10,7 +10,6 @@
 
 #include <algorithm>
 #include <numeric>
-#include <sstream>
 #include <vector>
 
 #include "modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"
@@ -18,6 +17,7 @@
 #include "modules/audio_coding/neteq/tools/input_audio_file.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/numerics/safe_conversions.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
 
@@ -142,7 +142,7 @@
 
   int elapsed_time_ms = 0;
   for (int i = 0; elapsed_time_ms < 10000; ++i) {
-    std::ostringstream ss;
+    rtc::StringBuilder ss;
     ss << " i = " << i;
     SCOPED_TRACE(ss.str());
 
diff --git a/modules/audio_coding/neteq/buffer_level_filter_unittest.cc b/modules/audio_coding/neteq/buffer_level_filter_unittest.cc
index b6dcd2a..1f12e73 100644
--- a/modules/audio_coding/neteq/buffer_level_filter_unittest.cc
+++ b/modules/audio_coding/neteq/buffer_level_filter_unittest.cc
@@ -14,6 +14,7 @@
 
 #include <math.h>  // Access to pow function.
 
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -30,7 +31,7 @@
     for (int value = 100; value <= 200; value += 10) {
       filter.Reset();
       filter.SetTargetBufferLevel(1);  // Makes filter coefficient 251/256.
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << "times = " << times << ", value = " << value;
       SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
       for (int i = 0; i < times; ++i) {
diff --git a/modules/audio_coding/neteq/dtmf_tone_generator_unittest.cc b/modules/audio_coding/neteq/dtmf_tone_generator_unittest.cc
index 11a0ac6..e843706 100644
--- a/modules/audio_coding/neteq/dtmf_tone_generator_unittest.cc
+++ b/modules/audio_coding/neteq/dtmf_tone_generator_unittest.cc
@@ -16,6 +16,7 @@
 
 #include "common_audio/include/audio_util.h"
 #include "modules/audio_coding/neteq/audio_multi_vector.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -33,7 +34,7 @@
     AudioMultiVector signal(channels);
 
     for (int event = 0; event <= 15; ++event) {
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << "Checking event " << event << " at sample rate " << fs_hz;
       SCOPED_TRACE(ss.str());
       const int kAttenuation = 0;
@@ -72,7 +73,7 @@
       EXPECT_EQ(kNumSamples, tone_gen_.Generate(kNumSamples, &ref_signal));
       // Test every 5 steps (to save time).
       for (int attenuation = 1; attenuation <= 63; attenuation += 5) {
-        std::ostringstream ss;
+        rtc::StringBuilder ss;
         ss << "Checking event " << event << " at sample rate " << fs_hz;
         ss << "; attenuation " << attenuation;
         SCOPED_TRACE(ss.str());
diff --git a/modules/audio_coding/neteq/neteq_external_decoder_unittest.cc b/modules/audio_coding/neteq/neteq_external_decoder_unittest.cc
index 5c350bb..872829c 100644
--- a/modules/audio_coding/neteq/neteq_external_decoder_unittest.cc
+++ b/modules/audio_coding/neteq/neteq_external_decoder_unittest.cc
@@ -19,6 +19,7 @@
 #include "modules/audio_coding/neteq/tools/input_audio_file.h"
 #include "modules/audio_coding/neteq/tools/neteq_external_decoder_test.h"
 #include "modules/audio_coding/neteq/tools/rtp_generator.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gmock.h"
 #include "test/testsupport/fileutils.h"
 
@@ -122,7 +123,7 @@
         } while (Lost());  // If lost, immediately read the next packet.
       }
 
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << "Lap number " << k << ".";
       SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
       // Compare mono and multi-channel.
diff --git a/modules/audio_coding/neteq/neteq_stereo_unittest.cc b/modules/audio_coding/neteq/neteq_stereo_unittest.cc
index ef4c235..3f86944 100644
--- a/modules/audio_coding/neteq/neteq_stereo_unittest.cc
+++ b/modules/audio_coding/neteq/neteq_stereo_unittest.cc
@@ -22,6 +22,7 @@
 #include "modules/audio_coding/neteq/include/neteq.h"
 #include "modules/audio_coding/neteq/tools/input_audio_file.h"
 #include "modules/audio_coding/neteq/tools/rtp_generator.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
 
@@ -228,7 +229,7 @@
       EXPECT_EQ(num_channels_, output_multi_channel_.num_channels_);
       EXPECT_EQ(output_size_samples_,
                 output_multi_channel_.samples_per_channel_);
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << "Lap number " << k << ".";
       SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
       // Compare mono and multi-channel.
diff --git a/modules/audio_coding/neteq/neteq_unittest.cc b/modules/audio_coding/neteq/neteq_unittest.cc
index 96a392b..3ee0b5b 100644
--- a/modules/audio_coding/neteq/neteq_unittest.cc
+++ b/modules/audio_coding/neteq/neteq_unittest.cc
@@ -33,6 +33,7 @@
 #include "rtc_base/numerics/safe_conversions.h"
 #include "rtc_base/protobuf_utils.h"
 #include "rtc_base/stringencode.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/system/arch.h"
 #include "test/field_trial.h"
 #include "test/gtest.h"
@@ -386,7 +387,7 @@
   uint64_t last_concealed_samples = 0;
   uint64_t last_total_samples_received = 0;
   while (packet_) {
-    std::ostringstream ss;
+    rtc::StringBuilder ss;
     ss << "Lap number " << i++ << " in DecodeAndCompare while loop";
     SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
     ASSERT_NO_FATAL_FAILURE(Process());
@@ -900,7 +901,7 @@
   static const int kExpectedOutputLength = 160;  // 10 ms at 16 kHz sample rate.
   const int16_t* const_out_frame_data = out_frame_.data();
   for (int i = 0; i < kExpectedOutputLength; ++i) {
-    std::ostringstream ss;
+    rtc::StringBuilder ss;
     ss << "i = " << i;
     SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
     EXPECT_EQ(0, const_out_frame_data[i]);
@@ -922,7 +923,7 @@
       kInitSampleRateHz / 100;  // 10 ms at initial sample rate.
   const int16_t* const_out_frame_data = out_frame_.data();
   for (int i = 0; i < kExpectedOutputLength; ++i) {
-    std::ostringstream ss;
+    rtc::StringBuilder ss;
     ss << "i = " << i;
     SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
     EXPECT_EQ(0, const_out_frame_data[i]);
@@ -1532,7 +1533,7 @@
   AudioFrame out_frame1, out_frame2;
   bool muted;
   for (int i = 0; i < 1000; ++i) {
-    std::ostringstream ss;
+    rtc::StringBuilder ss;
     ss << "i = " << i;
     SCOPED_TRACE(ss.str());  // Print out the loop iterator on failure.
     EXPECT_EQ(0, neteq_->GetAudio(&out_frame1, &muted));
@@ -1555,7 +1556,7 @@
   int counter = 0;
   while (out_frame1.speech_type_ != AudioFrame::kNormalSpeech) {
     ASSERT_LT(counter++, 1000) << "Test timed out";
-    std::ostringstream ss;
+    rtc::StringBuilder ss;
     ss << "counter = " << counter;
     SCOPED_TRACE(ss.str());  // Print out the loop iterator on failure.
     EXPECT_EQ(0, neteq_->GetAudio(&out_frame1, &muted));
diff --git a/modules/audio_coding/neteq/tools/neteq_input.cc b/modules/audio_coding/neteq/tools/neteq_input.cc
index bb2a01e..ecbd9e0 100644
--- a/modules/audio_coding/neteq/tools/neteq_input.cc
+++ b/modules/audio_coding/neteq/tools/neteq_input.cc
@@ -10,7 +10,7 @@
 
 #include "modules/audio_coding/neteq/tools/neteq_input.h"
 
-#include <sstream>
+#include "rtc_base/strings/string_builder.h"
 
 namespace webrtc {
 namespace test {
@@ -19,7 +19,7 @@
 NetEqInput::PacketData::~PacketData() = default;
 
 std::string NetEqInput::PacketData::ToString() const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "{"
      << "time_ms: " << static_cast<int64_t>(time_ms) << ", "
      << "header: {"
diff --git a/modules/audio_coding/test/EncodeDecodeTest.cc b/modules/audio_coding/test/EncodeDecodeTest.cc
index a8c4053..c6f3f8c 100644
--- a/modules/audio_coding/test/EncodeDecodeTest.cc
+++ b/modules/audio_coding/test/EncodeDecodeTest.cc
@@ -13,7 +13,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <memory>
-#include <sstream>  // no-presubmit-check TODO(webrtc:8982)
 
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
@@ -21,6 +20,7 @@
 #include "modules/audio_coding/codecs/audio_format_conversion.h"
 #include "modules/audio_coding/include/audio_coding_module.h"
 #include "modules/audio_coding/test/utility.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
 
@@ -133,7 +133,7 @@
 
   int playSampFreq;
   std::string file_name;
-  std::stringstream file_stream;
+  rtc::StringBuilder file_stream;
   file_stream << webrtc::test::OutputPath() << out_file_name
       << static_cast<int>(codeId) << ".pcm";
   file_name = file_stream.str();
diff --git a/modules/audio_coding/test/PacketLossTest.cc b/modules/audio_coding/test/PacketLossTest.cc
index da6ea1c..a1629fd 100644
--- a/modules/audio_coding/test/PacketLossTest.cc
+++ b/modules/audio_coding/test/PacketLossTest.cc
@@ -13,6 +13,7 @@
 #include <memory>
 
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
 
@@ -34,7 +35,7 @@
   loss_rate_ = loss_rate;
   burst_length_ = burst_length;
   burst_lost_counter_ = burst_length_;  // To prevent first packet gets lost.
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << out_file_name << "_" << loss_rate_ << "_" << burst_length_ << "_";
   Receiver::Setup(acm, rtpStream, ss.str(), channels);
 }
diff --git a/modules/audio_coding/test/TestAllCodecs.cc b/modules/audio_coding/test/TestAllCodecs.cc
index 781337c..0099b2a 100644
--- a/modules/audio_coding/test/TestAllCodecs.cc
+++ b/modules/audio_coding/test/TestAllCodecs.cc
@@ -23,6 +23,7 @@
 #include "modules/audio_coding/test/utility.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/stringencode.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
 
@@ -476,7 +477,7 @@
 
 void TestAllCodecs::OpenOutFile(int test_number) {
   std::string filename = webrtc::test::OutputPath();
-  std::ostringstream test_number_str;
+  rtc::StringBuilder test_number_str;
   test_number_str << test_number;
   filename += "testallcodecs_out_";
   filename += test_number_str.str();
diff --git a/modules/audio_coding/test/TestRedFec.cc b/modules/audio_coding/test/TestRedFec.cc
index 71d3486..679bd4d 100644
--- a/modules/audio_coding/test/TestRedFec.cc
+++ b/modules/audio_coding/test/TestRedFec.cc
@@ -17,6 +17,7 @@
 #include "modules/audio_coding/codecs/audio_format_conversion.h"
 #include "modules/audio_coding/include/audio_coding_module_typedefs.h"
 #include "modules/audio_coding/test/utility.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/testsupport/fileutils.h"
 
 namespace webrtc {
@@ -327,7 +328,7 @@
 
 void TestRedFec::OpenOutFile(int16_t test_number) {
   std::string file_name;
-  std::stringstream file_stream;
+  rtc::StringBuilder file_stream;
   file_stream << webrtc::test::OutputPath();
   file_stream << "TestRedFec_outFile_";
   file_stream << test_number << ".pcm";
diff --git a/modules/audio_coding/test/TestStereo.cc b/modules/audio_coding/test/TestStereo.cc
index f8c983c..797178b 100644
--- a/modules/audio_coding/test/TestStereo.cc
+++ b/modules/audio_coding/test/TestStereo.cc
@@ -19,6 +19,7 @@
 #include "modules/audio_coding/codecs/audio_format_conversion.h"
 #include "modules/audio_coding/include/audio_coding_module_typedefs.h"
 #include "modules/audio_coding/test/utility.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
 
@@ -832,7 +833,7 @@
 
 void TestStereo::OpenOutFile(int16_t test_number) {
   std::string file_name;
-  std::stringstream file_stream;
+  rtc::StringBuilder file_stream;
   file_stream << webrtc::test::OutputPath() << "teststereo_out_" << test_number
               << ".pcm";
   file_name = file_stream.str();
diff --git a/modules/audio_coding/test/TestVADDTX.cc b/modules/audio_coding/test/TestVADDTX.cc
index 79b2d31..eefce0d 100644
--- a/modules/audio_coding/test/TestVADDTX.cc
+++ b/modules/audio_coding/test/TestVADDTX.cc
@@ -16,6 +16,7 @@
 #include "modules/audio_coding/codecs/audio_format_conversion.h"
 #include "modules/audio_coding/test/PCMFile.h"
 #include "modules/audio_coding/test/utility.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/testsupport/fileutils.h"
 
 namespace webrtc {
@@ -204,7 +205,7 @@
   if (new_outfile) {
     output_file_num_++;
   }
-  std::stringstream out_filename;
+  rtc::StringBuilder out_filename;
   out_filename << webrtc::test::OutputPath() << "testWebRtcVadDtx_outFile_"
                << output_file_num_ << ".pcm";
   Run(webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"), 32000, 1,
diff --git a/modules/audio_coding/test/delay_test.cc b/modules/audio_coding/test/delay_test.cc
index d49cd3c..6402e05 100644
--- a/modules/audio_coding/test/delay_test.cc
+++ b/modules/audio_coding/test/delay_test.cc
@@ -24,6 +24,7 @@
 #include "modules/audio_coding/test/PCMFile.h"
 #include "modules/audio_coding/test/utility.h"
 #include "rtc_base/flags.h"
+#include "rtc_base/strings/string_builder.h"
 #include "system_wrappers/include/event_wrapper.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
@@ -171,7 +172,7 @@
   }
 
   void OpenOutFile(const char* output_id) {
-    std::stringstream file_stream;
+    rtc::StringBuilder file_stream;
     file_stream << "delay_test_" << FLAG_codec << "_" << FLAG_sample_rate_hz
                 << "Hz"
                 << "_" << FLAG_delay << "ms.pcm";
diff --git a/modules/audio_coding/test/iSACTest.cc b/modules/audio_coding/test/iSACTest.cc
index e9fd867..009b76c 100644
--- a/modules/audio_coding/test/iSACTest.cc
+++ b/modules/audio_coding/test/iSACTest.cc
@@ -26,6 +26,7 @@
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "modules/audio_coding/codecs/audio_format_conversion.h"
 #include "modules/audio_coding/test/utility.h"
+#include "rtc_base/strings/string_builder.h"
 #include "system_wrappers/include/event_wrapper.h"
 #include "test/testsupport/fileutils.h"
 
@@ -221,8 +222,8 @@
   _inFileB.Open(file_name_swb_, 32000, "rb", true);
 
   std::string file_name_out;
-  std::stringstream file_stream_a;
-  std::stringstream file_stream_b;
+  rtc::StringBuilder file_stream_a;
+  rtc::StringBuilder file_stream_b;
   file_stream_a << webrtc::test::OutputPath();
   file_stream_b << webrtc::test::OutputPath();
   file_stream_a << "out_iSACTest_A_" << testNr << ".pcm";
@@ -288,8 +289,8 @@
   _inFileB.Open(file_name_swb_, 32000, "rb");
 
   std::string file_name_out;
-  std::stringstream file_stream_a;
-  std::stringstream file_stream_b;
+  rtc::StringBuilder file_stream_a;
+  rtc::StringBuilder file_stream_b;
   file_stream_a << webrtc::test::OutputPath();
   file_stream_b << webrtc::test::OutputPath();
   file_stream_a << "out_iSACTest_A_" << testNr << ".pcm";
diff --git a/modules/audio_mixer/audio_mixer_impl_unittest.cc b/modules/audio_mixer/audio_mixer_impl_unittest.cc
index 57e4526..86a4b66 100644
--- a/modules/audio_mixer/audio_mixer_impl_unittest.cc
+++ b/modules/audio_mixer/audio_mixer_impl_unittest.cc
@@ -12,7 +12,6 @@
 
 #include <limits>
 #include <memory>
-#include <sstream>
 #include <string>
 #include <utility>
 
@@ -21,6 +20,7 @@
 #include "modules/audio_mixer/default_output_rate_calculator.h"
 #include "rtc_base/bind.h"
 #include "rtc_base/checks.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/task_queue_for_test.h"
 #include "test/gmock.h"
 
@@ -50,7 +50,7 @@
 std::string ProduceDebugText(int sample_rate_hz,
                              int number_of_channels,
                              int number_of_sources) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz << " ";
   ss << "Number of channels: " << number_of_channels << " ";
   ss << "Number of sources: " << number_of_sources;
diff --git a/modules/audio_mixer/audio_mixer_test.cc b/modules/audio_mixer/audio_mixer_test.cc
index a2b41ab..21b92da 100644
--- a/modules/audio_mixer/audio_mixer_test.cc
+++ b/modules/audio_mixer/audio_mixer_test.cc
@@ -17,6 +17,7 @@
 #include "modules/audio_mixer/audio_mixer_impl.h"
 #include "modules/audio_mixer/default_output_rate_calculator.h"
 #include "rtc_base/flags.h"
+#include "rtc_base/strings/string_builder.h"
 
 DEFINE_bool(help, false, "Prints this message");
 DEFINE_int(sampling_rate,
@@ -74,7 +75,7 @@
   bool FileHasEnded() const { return file_has_ended_; }
 
   std::string ToString() const {
-    std::stringstream ss;
+    rtc::StringBuilder ss;
     ss << "{rate: " << sample_rate_hz_ << ", channels: " << number_of_channels_
        << ", samples_tot: " << wav_reader_->num_samples() << "}";
     return ss.str();
diff --git a/modules/audio_mixer/frame_combiner_unittest.cc b/modules/audio_mixer/frame_combiner_unittest.cc
index c7bf9c3..bf13629 100644
--- a/modules/audio_mixer/frame_combiner_unittest.cc
+++ b/modules/audio_mixer/frame_combiner_unittest.cc
@@ -11,13 +11,13 @@
 #include "modules/audio_mixer/frame_combiner.h"
 
 #include <numeric>
-#include <sstream>
 #include <string>
 
 #include "audio/utility/audio_frame_operations.h"
 #include "modules/audio_mixer/gain_change_calculator.h"
 #include "modules/audio_mixer/sine_wave_generator.h"
 #include "rtc_base/checks.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -34,7 +34,7 @@
 std::string ProduceDebugText(int sample_rate_hz,
                              int number_of_channels,
                              int number_of_sources) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz << " ,";
   ss << "number of channels: " << number_of_channels << " ,";
   ss << "number of sources: " << number_of_sources;
@@ -42,7 +42,7 @@
 }
 
 std::string ProduceDebugText(const FrameCombinerConfig& config) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << config.sample_rate_hz << " ,";
   ss << "number of channels: " << config.number_of_channels << " ,";
   ss << "limiter active: " << (config.use_limiter ? "on" : "off") << " ,";
diff --git a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc
index 077586e..7169965 100644
--- a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc
+++ b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc
@@ -20,6 +20,7 @@
 #if defined(WEBRTC_ARCH_X86_FAMILY)
 #include <emmintrin.h>
 #endif
+
 #include "modules/audio_processing/aec3/aec3_fft.h"
 #include "modules/audio_processing/aec3/aec_state.h"
 #include "modules/audio_processing/aec3/cascaded_biquad_filter.h"
@@ -31,6 +32,7 @@
 #include "rtc_base/arraysize.h"
 #include "rtc_base/numerics/safe_minmax.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "system_wrappers/include/cpu_features_wrapper.h"
 #include "test/gtest.h"
 
@@ -39,7 +41,7 @@
 namespace {
 
 std::string ProduceDebugText(size_t delay) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << ", Delay: " << delay;
   return ss.str();
 }
diff --git a/modules/audio_processing/aec3/block_framer_unittest.cc b/modules/audio_processing/aec3/block_framer_unittest.cc
index 16d3944..3f4122f 100644
--- a/modules/audio_processing/aec3/block_framer_unittest.cc
+++ b/modules/audio_processing/aec3/block_framer_unittest.cc
@@ -10,11 +10,11 @@
 
 #include "modules/audio_processing/aec3/block_framer.h"
 
-#include <sstream>
 #include <string>
 #include <vector>
 
 #include "modules/audio_processing/aec3/aec3_common.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -159,7 +159,7 @@
 #endif
 
 std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz;
   return ss.str();
 }
@@ -229,7 +229,7 @@
 TEST(BlockFramer, WrongNumberOfPreceedingApiCallsForInsertBlock) {
   for (auto rate : {8000, 16000, 32000, 48000}) {
     for (size_t num_calls = 0; num_calls < 4; ++num_calls) {
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << "Sample rate: " << rate;
       ss << ", Num preceeding InsertBlockAndExtractSubFrame calls: "
          << num_calls;
diff --git a/modules/audio_processing/aec3/block_processor_unittest.cc b/modules/audio_processing/aec3/block_processor_unittest.cc
index 5906018..fbe1973 100644
--- a/modules/audio_processing/aec3/block_processor_unittest.cc
+++ b/modules/audio_processing/aec3/block_processor_unittest.cc
@@ -11,7 +11,6 @@
 #include "modules/audio_processing/aec3/block_processor.h"
 
 #include <memory>
-#include <sstream>
 #include <string>
 #include <vector>
 
@@ -22,6 +21,7 @@
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -93,7 +93,7 @@
 #endif
 
 std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz;
   return ss.str();
 }
diff --git a/modules/audio_processing/aec3/decimator_unittest.cc b/modules/audio_processing/aec3/decimator_unittest.cc
index e9ab21b..0c230d0 100644
--- a/modules/audio_processing/aec3/decimator_unittest.cc
+++ b/modules/audio_processing/aec3/decimator_unittest.cc
@@ -14,11 +14,11 @@
 #include <algorithm>
 #include <array>
 #include <numeric>
-#include <sstream>
 #include <string>
 #include <vector>
 
 #include "modules/audio_processing/aec3/aec3_common.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -26,7 +26,7 @@
 namespace {
 
 std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz;
   return ss.str();
 }
diff --git a/modules/audio_processing/aec3/echo_canceller3_unittest.cc b/modules/audio_processing/aec3/echo_canceller3_unittest.cc
index f652642..8cc6d5b 100644
--- a/modules/audio_processing/aec3/echo_canceller3_unittest.cc
+++ b/modules/audio_processing/aec3/echo_canceller3_unittest.cc
@@ -12,7 +12,6 @@
 
 #include <deque>
 #include <memory>
-#include <sstream>
 #include <string>
 #include <utility>
 #include <vector>
@@ -22,6 +21,7 @@
 #include "modules/audio_processing/aec3/frame_blocker.h"
 #include "modules/audio_processing/aec3/mock/mock_block_processor.h"
 #include "modules/audio_processing/audio_buffer.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -604,13 +604,13 @@
 };
 
 std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz;
   return ss.str();
 }
 
 std::string ProduceDebugText(int sample_rate_hz, int variant) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz << ", variant: " << variant;
   return ss.str();
 }
diff --git a/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc b/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc
index 0e237a5..5764d1c 100644
--- a/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc
+++ b/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc
@@ -11,7 +11,6 @@
 #include "modules/audio_processing/aec3/echo_path_delay_estimator.h"
 
 #include <algorithm>
-#include <sstream>
 #include <string>
 
 #include "api/audio/echo_canceller3_config.h"
@@ -20,13 +19,14 @@
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
 
 std::string ProduceDebugText(size_t delay, size_t down_sampling_factor) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Delay: " << delay;
   ss << ", Down sampling factor: " << down_sampling_factor;
   return ss.str();
diff --git a/modules/audio_processing/aec3/echo_remover_unittest.cc b/modules/audio_processing/aec3/echo_remover_unittest.cc
index 04a2727..9a246ed 100644
--- a/modules/audio_processing/aec3/echo_remover_unittest.cc
+++ b/modules/audio_processing/aec3/echo_remover_unittest.cc
@@ -13,7 +13,6 @@
 #include <algorithm>
 #include <memory>
 #include <numeric>
-#include <sstream>
 #include <string>
 
 #include "modules/audio_processing/aec3/aec3_common.h"
@@ -22,19 +21,20 @@
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
 
 std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz;
   return ss.str();
 }
 
 std::string ProduceDebugText(int sample_rate_hz, int delay) {
-  std::ostringstream ss(ProduceDebugText(sample_rate_hz));
+  rtc::StringBuilder ss(ProduceDebugText(sample_rate_hz));
   ss << ", Delay: " << delay;
   return ss.str();
 }
diff --git a/modules/audio_processing/aec3/frame_blocker_unittest.cc b/modules/audio_processing/aec3/frame_blocker_unittest.cc
index 6e73d4b..1fb7601 100644
--- a/modules/audio_processing/aec3/frame_blocker_unittest.cc
+++ b/modules/audio_processing/aec3/frame_blocker_unittest.cc
@@ -10,12 +10,12 @@
 
 #include "modules/audio_processing/aec3/frame_blocker.h"
 
-#include <sstream>
 #include <string>
 #include <vector>
 
 #include "modules/audio_processing/aec3/aec3_common.h"
 #include "modules/audio_processing/aec3/block_framer.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -228,7 +228,7 @@
 #endif
 
 std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz;
   return ss.str();
 }
@@ -300,7 +300,7 @@
 TEST(FrameBlocker, WrongNumberOfPreceedingApiCallsForExtractBlock) {
   for (auto rate : {8000, 16000, 32000, 48000}) {
     for (size_t num_calls = 0; num_calls < 4; ++num_calls) {
-      std::ostringstream ss;
+      rtc::StringBuilder ss;
       ss << "Sample rate: " << rate;
       ss << ", Num preceeding InsertSubFrameAndExtractBlock calls: "
          << num_calls;
diff --git a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc b/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc
index bed148a..6dbf69f 100644
--- a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc
+++ b/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc
@@ -24,6 +24,7 @@
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
 #include "rtc_base/numerics/safe_minmax.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -174,13 +175,13 @@
 }
 
 std::string ProduceDebugText(int filter_length_blocks) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Length: " << filter_length_blocks;
   return ss.str();
 }
 
 std::string ProduceDebugText(size_t delay, int filter_length_blocks) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Delay: " << delay << ", ";
   ss << ProduceDebugText(filter_length_blocks);
   return ss.str();
diff --git a/modules/audio_processing/aec3/matched_filter_unittest.cc b/modules/audio_processing/aec3/matched_filter_unittest.cc
index c7dc211..c13241f 100644
--- a/modules/audio_processing/aec3/matched_filter_unittest.cc
+++ b/modules/audio_processing/aec3/matched_filter_unittest.cc
@@ -17,7 +17,6 @@
 #include <emmintrin.h>
 #endif
 #include <algorithm>
-#include <sstream>
 #include <string>
 
 #include "modules/audio_processing/aec3/aec3_common.h"
@@ -26,6 +25,7 @@
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "system_wrappers/include/cpu_features_wrapper.h"
 #include "test/gtest.h"
 
@@ -34,7 +34,7 @@
 namespace {
 
 std::string ProduceDebugText(size_t delay, size_t down_sampling_factor) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Delay: " << delay;
   ss << ", Down sampling factor: " << down_sampling_factor;
   return ss.str();
diff --git a/modules/audio_processing/aec3/render_delay_buffer_unittest.cc b/modules/audio_processing/aec3/render_delay_buffer_unittest.cc
index 78f0b5a..29df28c 100644
--- a/modules/audio_processing/aec3/render_delay_buffer_unittest.cc
+++ b/modules/audio_processing/aec3/render_delay_buffer_unittest.cc
@@ -11,7 +11,6 @@
 #include "modules/audio_processing/aec3/render_delay_buffer.h"
 
 #include <memory>
-#include <sstream>
 #include <string>
 #include <vector>
 
@@ -19,13 +18,14 @@
 #include "modules/audio_processing/aec3/aec3_common.h"
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
 
 std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz;
   return ss.str();
 }
diff --git a/modules/audio_processing/aec3/render_delay_controller_unittest.cc b/modules/audio_processing/aec3/render_delay_controller_unittest.cc
index 98d5b25..4486d1b 100644
--- a/modules/audio_processing/aec3/render_delay_controller_unittest.cc
+++ b/modules/audio_processing/aec3/render_delay_controller_unittest.cc
@@ -12,7 +12,6 @@
 
 #include <algorithm>
 #include <memory>
-#include <sstream>
 #include <string>
 #include <vector>
 
@@ -23,19 +22,20 @@
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
 
 std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Sample rate: " << sample_rate_hz;
   return ss.str();
 }
 
 std::string ProduceDebugText(int sample_rate_hz, size_t delay) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << ProduceDebugText(sample_rate_hz) << ", Delay: " << delay;
   return ss.str();
 }
diff --git a/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc b/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc
index d77da33..d363689 100644
--- a/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc
+++ b/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc
@@ -22,6 +22,7 @@
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
 #include "rtc_base/numerics/safe_minmax.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -115,13 +116,13 @@
 }
 
 std::string ProduceDebugText(int filter_length_blocks) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Length: " << filter_length_blocks;
   return ss.str();
 }
 
 std::string ProduceDebugText(size_t delay, int filter_length_blocks) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Delay: " << delay << ", ";
   ss << ProduceDebugText(filter_length_blocks);
   return ss.str();
diff --git a/modules/audio_processing/aec3/subtractor_unittest.cc b/modules/audio_processing/aec3/subtractor_unittest.cc
index 7791805..b308d38 100644
--- a/modules/audio_processing/aec3/subtractor_unittest.cc
+++ b/modules/audio_processing/aec3/subtractor_unittest.cc
@@ -18,6 +18,7 @@
 #include "modules/audio_processing/aec3/render_delay_buffer.h"
 #include "modules/audio_processing/test/echo_canceller_test_tools.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -102,7 +103,7 @@
 }
 
 std::string ProduceDebugText(size_t delay, int filter_length_blocks) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "Delay: " << delay << ", ";
   ss << "Length: " << filter_length_blocks;
   return ss.str();
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc
index b04f89a..b96c3ec 100644
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -35,6 +35,7 @@
 #include "rtc_base/numerics/safe_minmax.h"
 #include "rtc_base/protobuf_utils.h"
 #include "rtc_base/refcountedobject.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/swap_queue.h"
 #include "rtc_base/system/arch.h"
 #include "rtc_base/task_queue.h"
@@ -259,7 +260,7 @@
 }
 
 std::string ResourceFilePath(const std::string& name, int sample_rate_hz) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   // Resource files are all stereo.
   ss << name << sample_rate_hz / 1000 << "_stereo";
   return test::ResourcePath(ss.str(), "pcm");
@@ -280,7 +281,7 @@
                            size_t num_reverse_input_channels,
                            size_t num_reverse_output_channels,
                            StreamDirection file_direction) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << name << "_i" << num_input_channels << "_" << input_rate / 1000 << "_ir"
      << num_reverse_input_channels << "_" << reverse_input_rate / 1000 << "_";
   if (num_output_channels == 1) {
diff --git a/modules/audio_processing/gain_controller2.cc b/modules/audio_processing/gain_controller2.cc
index fd4b411..6368e92 100644
--- a/modules/audio_processing/gain_controller2.cc
+++ b/modules/audio_processing/gain_controller2.cc
@@ -15,6 +15,7 @@
 #include "modules/audio_processing/logging/apm_data_dumper.h"
 #include "rtc_base/atomicops.h"
 #include "rtc_base/checks.h"
+#include "rtc_base/strings/string_builder.h"
 
 namespace webrtc {
 
@@ -69,7 +70,7 @@
 
 std::string GainController2::ToString(
     const AudioProcessing::Config::GainController2& config) {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "{enabled: " << (config.enabled ? "true" : "false") << ", "
      << "fixed_gain_dB: " << config.fixed_gain_db << "}";
   return ss.str();
diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc
index 40479d0..e8b8804 100644
--- a/modules/audio_processing/test/audio_processing_simulator.cc
+++ b/modules/audio_processing/test/audio_processing_simulator.cc
@@ -13,7 +13,6 @@
 #include <algorithm>
 #include <fstream>
 #include <iostream>
-#include <sstream>
 #include <string>
 #include <utility>
 #include <vector>
@@ -27,6 +26,7 @@
 #include "rtc_base/checks.h"
 #include "rtc_base/json.h"
 #include "rtc_base/logging.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/stringutils.h"
 
 namespace webrtc {
@@ -409,7 +409,7 @@
 
 std::string GetIndexedOutputWavFilename(const std::string& wav_name,
                                         int counter) {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << wav_name.substr(0, wav_name.size() - 4) << "_" << counter
      << wav_name.substr(wav_name.size() - 4);
   return ss.str();
diff --git a/modules/audio_processing/test/fake_recording_device_unittest.cc b/modules/audio_processing/test/fake_recording_device_unittest.cc
index 65940f2..484972c 100644
--- a/modules/audio_processing/test/fake_recording_device_unittest.cc
+++ b/modules/audio_processing/test/fake_recording_device_unittest.cc
@@ -10,13 +10,13 @@
 
 #include <cmath>
 #include <memory>
-#include <sstream>
 #include <string>
 #include <vector>
 
 #include "absl/memory/memory.h"
 #include "api/array_view.h"
 #include "modules/audio_processing/test/fake_recording_device.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -98,13 +98,13 @@
 }
 
 std::string FakeRecordingDeviceKindToString(int fake_rec_device_kind) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "fake recording device: " << fake_rec_device_kind;
   return ss.str();
 }
 
 std::string AnalogLevelToString(int level) {
-  std::ostringstream ss;
+  rtc::StringBuilder ss;
   ss << "analog level: " << level;
   return ss.str();
 }
diff --git a/modules/audio_processing/transient/transient_detector_unittest.cc b/modules/audio_processing/transient/transient_detector_unittest.cc
index d1eb7af..091a573 100644
--- a/modules/audio_processing/transient/transient_detector_unittest.cc
+++ b/modules/audio_processing/transient/transient_detector_unittest.cc
@@ -11,11 +11,11 @@
 #include "modules/audio_processing/transient/transient_detector.h"
 
 #include <memory>
-#include <sstream>
 #include <string>
 
 #include "modules/audio_processing/transient/common.h"
 #include "modules/audio_processing/transient/file_utils.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/system/file_wrapper.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
@@ -43,7 +43,7 @@
     int sample_rate_hz = kSampleRatesHz[i];
 
     // Prepare detect file.
-    std::stringstream detect_file_name;
+    rtc::StringBuilder detect_file_name;
     detect_file_name << "audio_processing/transient/detect"
                      << (sample_rate_hz / 1000) << "kHz";
 
@@ -58,7 +58,7 @@
                              << detect_file_name.str().c_str();
 
     // Prepare audio file.
-    std::stringstream audio_file_name;
+    rtc::StringBuilder audio_file_name;
     audio_file_name << "audio_processing/transient/audio"
                     << (sample_rate_hz / 1000) << "kHz";
 
diff --git a/modules/audio_processing/transient/wpd_tree_unittest.cc b/modules/audio_processing/transient/wpd_tree_unittest.cc
index 88f0739..830a5df 100644
--- a/modules/audio_processing/transient/wpd_tree_unittest.cc
+++ b/modules/audio_processing/transient/wpd_tree_unittest.cc
@@ -11,11 +11,11 @@
 #include "modules/audio_processing/transient/wpd_tree.h"
 
 #include <memory>
-#include <sstream>
 #include <string>
 
 #include "modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h"
 #include "modules/audio_processing/transient/file_utils.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/system/file_wrapper.h"
 #include "test/gtest.h"
 #include "test/testsupport/fileutils.h"
@@ -87,7 +87,7 @@
     // Matlab files.
     matlab_files_data[i].reset(FileWrapper::Create());
 
-    std::ostringstream matlab_stream;
+    rtc::StringBuilder matlab_stream;
     matlab_stream << "audio_processing/transient/wpd" << i;
     std::string matlab_string = test::ResourcePath(matlab_stream.str(), "dat");
     matlab_files_data[i]->OpenFile(matlab_string.c_str(), true);  // Read only.
@@ -98,7 +98,7 @@
     // Out files.
     out_files_data[i].reset(FileWrapper::Create());
 
-    std::ostringstream out_stream;
+    rtc::StringBuilder out_stream;
     out_stream << test::OutputPath() << "wpd_" << i << ".out";
     std::string out_string = out_stream.str();
 
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_framework.h b/modules/remote_bitrate_estimator/test/bwe_test_framework.h
index b67a218..6c4a1ec 100644
--- a/modules/remote_bitrate_estimator/test/bwe_test_framework.h
+++ b/modules/remote_bitrate_estimator/test/bwe_test_framework.h
@@ -19,7 +19,6 @@
 #include <memory>
 #include <numeric>
 #include <set>
-#include <sstream>
 #include <string>
 #include <utility>
 #include <vector>
@@ -33,6 +32,7 @@
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "rtc_base/constructormagic.h"
 #include "rtc_base/random.h"
+#include "rtc_base/strings/string_builder.h"
 #include "system_wrappers/include/clock.h"
 
 namespace webrtc {
@@ -128,7 +128,7 @@
   }
 
   std::string AsString() {
-    std::stringstream ss;
+    rtc::StringBuilder ss;
     ss << (GetMean() >= 0 ? GetMean() : -1) << ", "
        << (GetStdDev() >= 0 ? GetStdDev() : -1);
     return ss.str();
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_logging.cc b/modules/remote_bitrate_estimator/test/bwe_test_logging.cc
index 571ed50..1b4cae2 100644
--- a/modules/remote_bitrate_estimator/test/bwe_test_logging.cc
+++ b/modules/remote_bitrate_estimator/test/bwe_test_logging.cc
@@ -16,11 +16,11 @@
 #include <stdio.h>
 
 #include <algorithm>
-#include <sstream>
 
 #include "rtc_base/checks.h"
 #include "rtc_base/format_macros.h"
 #include "rtc_base/platform_thread.h"
+#include "rtc_base/strings/string_builder.h"
 
 namespace webrtc {
 namespace testing {
@@ -29,7 +29,7 @@
 Logging Logging::g_Logging;
 
 static std::string ToString(uint32_t v) {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << v;
   return ss.str();
 }
diff --git a/modules/remote_bitrate_estimator/test/estimators/remb.cc b/modules/remote_bitrate_estimator/test/estimators/remb.cc
index 94416fe..3244220 100644
--- a/modules/remote_bitrate_estimator/test/estimators/remb.cc
+++ b/modules/remote_bitrate_estimator/test/estimators/remb.cc
@@ -16,6 +16,7 @@
 #include "modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
 #include "modules/remote_bitrate_estimator/test/bwe_test_logging.h"
 #include "modules/rtp_rtcp/include/receive_statistics.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/system/unused.h"
 #include "test/gtest.h"
 
@@ -71,7 +72,7 @@
       latest_estimate_bps_(-1),
       last_feedback_ms_(-1),
       estimator_(new RemoteBitrateEstimatorAbsSendTime(this, &clock_)) {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "Estimate_" << flow_id_ << "#1";
   estimate_log_prefix_ = ss.str();
   // Default RTT in RemoteRateControl is 200 ms ; 50 ms is more realistic.
diff --git a/modules/remote_bitrate_estimator/test/metric_recorder.cc b/modules/remote_bitrate_estimator/test/metric_recorder.cc
index fc2296e..2346ece 100644
--- a/modules/remote_bitrate_estimator/test/metric_recorder.cc
+++ b/modules/remote_bitrate_estimator/test/metric_recorder.cc
@@ -15,6 +15,7 @@
 #include <algorithm>
 
 #include "modules/remote_bitrate_estimator/test/packet_sender.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/system/unused.h"
 
 namespace webrtc {
@@ -359,7 +360,7 @@
 void MetricRecorder::PlotZero() {
   for (int i = kThroughput; i <= kLoss; ++i) {
     if (plot_information_[i].plot) {
-      std::stringstream prefix;
+      rtc::StringBuilder prefix;
       // TODO(terelius): Since this does not use the BWE_TEST_LOGGING macros,
       // it hasn't been kept up to date with the plot format. Remove or fix?
       prefix << "Receiver_" << flow_id_ << "_" + plot_information_[i].prefix;
diff --git a/modules/remote_bitrate_estimator/tools/rtp_to_text.cc b/modules/remote_bitrate_estimator/tools/rtp_to_text.cc
index 35f1aec..57ad137 100644
--- a/modules/remote_bitrate_estimator/tools/rtp_to_text.cc
+++ b/modules/remote_bitrate_estimator/tools/rtp_to_text.cc
@@ -11,11 +11,11 @@
 #include <stdio.h>
 
 #include <memory>
-#include <sstream>
 
 #include "modules/remote_bitrate_estimator/tools/bwe_rtp.h"
 #include "modules/rtp_rtcp/include/rtp_header_parser.h"
 #include "rtc_base/format_macros.h"
+#include "rtc_base/strings/string_builder.h"
 #include "test/rtp_file_reader.h"
 
 int main(int argc, char* argv[]) {
@@ -43,7 +43,7 @@
     if (header.extension.transmissionTimeOffset != 0)
       ++non_zero_ts_offsets;
     if (arrival_time_only) {
-      std::stringstream ss;
+      rtc::StringBuilder ss;
       ss << static_cast<int64_t>(packet.time_ms) * 1000000;
       fprintf(stdout, "%s\n", ss.str().c_str());
     } else {
diff --git a/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc
index b903a4e..15a39ef 100644
--- a/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc
+++ b/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "modules/rtp_rtcp/source/rtcp_packet/sdes.h"
 
+#include "rtc_base/strings/string_builder.h"
 #include "test/gtest.h"
 #include "test/rtcp_packet_parser.h"
 
@@ -74,7 +75,7 @@
   Sdes sdes;
   for (size_t i = 0; i < kMaxChunks; ++i) {
     uint32_t ssrc = kSenderSsrc + i;
-    std::ostringstream oss;
+    rtc::StringBuilder oss;
     oss << "cname" << i;
     EXPECT_TRUE(sdes.AddCName(ssrc, oss.str()));
   }
diff --git a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
index 6be4ce3..c94b2f4 100644
--- a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
+++ b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
@@ -239,7 +239,7 @@
 
 std::string VideoCodecTestFixtureImpl::Config::ToString() const {
   std::string codec_type = CodecTypeToPayloadString(codec_settings.codecType);
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "filename: " << filename;
   ss << "\nnum_frames: " << num_frames;
   ss << "\nmax_payload_size_bytes: " << max_payload_size_bytes;
diff --git a/ortc/ortcfactory.cc b/ortc/ortcfactory.cc
index 66ae77d..cb63d26 100644
--- a/ortc/ortcfactory.cc
+++ b/ortc/ortcfactory.cc
@@ -10,7 +10,6 @@
 
 #include "ortc/ortcfactory.h"
 
-#include <sstream>
 #include <utility>  // For std::move.
 #include <vector>
 
@@ -41,6 +40,7 @@
 #include "rtc_base/checks.h"
 #include "rtc_base/helpers.h"
 #include "rtc_base/logging.h"
+#include "rtc_base/strings/string_builder.h"
 
 namespace {
 
@@ -461,7 +461,7 @@
   RTC_LOG(LS_INFO) << "Created UDP socket with address "
                    << socket->GetLocalAddress().ToSensitiveString() << ".";
   // Make a unique debug name (for logging/diagnostics only).
-  std::ostringstream oss;
+  rtc::StringBuilder oss;
   static int udp_id = 0;
   oss << "udp" << udp_id++;
   return UdpTransportProxyWithInternal<cricket::UdpTransport>::Create(
diff --git a/p2p/base/stunport.cc b/p2p/base/stunport.cc
index 9df3eba..c03653b 100644
--- a/p2p/base/stunport.cc
+++ b/p2p/base/stunport.cc
@@ -21,6 +21,7 @@
 #include "rtc_base/ipaddress.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/nethelpers.h"
+#include "rtc_base/strings/string_builder.h"
 
 namespace cricket {
 
@@ -485,7 +486,7 @@
           rtc::EmptySocketAddressWithFamily(related_address.family());
     }
 
-    std::ostringstream url;
+    rtc::StringBuilder url;
     url << "stun:" << stun_server_addr.ipaddr().ToString() << ":"
         << stun_server_addr.port();
     AddAddress(stun_reflected_addr, socket_->GetLocalAddress(), related_address,
diff --git a/p2p/base/turnport.cc b/p2p/base/turnport.cc
index 13c9a46..0883534 100644
--- a/p2p/base/turnport.cc
+++ b/p2p/base/turnport.cc
@@ -25,6 +25,7 @@
 #include "rtc_base/nethelpers.h"
 #include "rtc_base/socketaddress.h"
 #include "rtc_base/stringencode.h"
+#include "rtc_base/strings/string_builder.h"
 
 namespace cricket {
 
@@ -1236,7 +1237,7 @@
     case PROTO_TCP:
       break;
   }
-  std::ostringstream url;
+  rtc::StringBuilder url;
   url << scheme << ":" << server_address_.address.ipaddr().ToString() << ":"
       << server_address_.address.port() << "?transport=" << transport;
   return url.str();
diff --git a/p2p/base/turnserver.cc b/p2p/base/turnserver.cc
index a7a8c57..160e259 100644
--- a/p2p/base/turnserver.cc
+++ b/p2p/base/turnserver.cc
@@ -25,6 +25,7 @@
 #include "rtc_base/messagedigest.h"
 #include "rtc_base/socketadapters.h"
 #include "rtc_base/stringencode.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/thread.h"
 
 namespace cricket {
@@ -597,7 +598,7 @@
   const char* const kProtos[] = {
       "unknown", "udp", "tcp", "ssltcp"
   };
-  std::ostringstream ost;
+  rtc::StringBuilder ost;
   ost << src_.ToString() << "-" << dst_.ToString() << ":"<< kProtos[proto_];
   return ost.str();
 }
@@ -630,7 +631,7 @@
 }
 
 std::string TurnServerAllocation::ToString() const {
-  std::ostringstream ost;
+  rtc::StringBuilder ost;
   ost << "Alloc[" << conn_.ToString() << "]";
   return ost.str();
 }
diff --git a/pc/channel.cc b/pc/channel.cc
index 281a499..b63cea7 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -26,6 +26,7 @@
 #include "rtc_base/dscp.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/networkroute.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/trace_event.h"
 // Adding 'nogncheck' to disable the gn include headers check to support modular
 // WebRTC build targets.
@@ -593,7 +594,7 @@
        it != local_streams_.end(); ++it) {
     if (it->has_ssrcs() && !GetStreamBySsrc(streams, it->first_ssrc())) {
       if (!media_channel()->RemoveSendStream(it->first_ssrc())) {
-        std::ostringstream desc;
+        rtc::StringBuilder desc;
         desc << "Failed to remove send stream with ssrc " << it->first_ssrc()
              << ".";
         SafeSetError(desc.str(), error_desc);
@@ -608,7 +609,7 @@
       if (media_channel()->AddSendStream(*it)) {
         RTC_LOG(LS_INFO) << "Add send stream ssrc: " << it->ssrcs[0];
       } else {
-        std::ostringstream desc;
+        rtc::StringBuilder desc;
         desc << "Failed to add send stream ssrc: " << it->first_ssrc();
         SafeSetError(desc.str(), error_desc);
         ret = false;
@@ -634,7 +635,7 @@
       if (RemoveRecvStream_w(it->first_ssrc())) {
         RTC_LOG(LS_INFO) << "Remove remote ssrc: " << it->first_ssrc();
       } else {
-        std::ostringstream desc;
+        rtc::StringBuilder desc;
         desc << "Failed to remove remote stream with ssrc " << it->first_ssrc()
              << ".";
         SafeSetError(desc.str(), error_desc);
@@ -654,7 +655,7 @@
       if (AddRecvStream_w(*it)) {
         RTC_LOG(LS_INFO) << "Add remote ssrc: " << it->first_ssrc();
       } else {
-        std::ostringstream desc;
+        rtc::StringBuilder desc;
         desc << "Failed to add remote stream ssrc: " << it->first_ssrc();
         SafeSetError(desc.str(), error_desc);
         ret = false;
diff --git a/pc/mediasession_unittest.cc b/pc/mediasession_unittest.cc
index 269ad78..dbcb9b4 100644
--- a/pc/mediasession_unittest.cc
+++ b/pc/mediasession_unittest.cc
@@ -25,6 +25,7 @@
 #include "rtc_base/gunit.h"
 #include "rtc_base/messagedigest.h"
 #include "rtc_base/ssladapter.h"
+#include "rtc_base/strings/string_builder.h"
 
 #define ASSERT_CRYPTO(cd, s, cs)      \
   ASSERT_EQ(s, cd->cryptos().size()); \
@@ -3703,7 +3704,7 @@
     }
 
     auto format_codecs = [](const std::vector<AudioCodec>& codecs) {
-      std::stringstream os;
+      rtc::StringBuilder os;
       bool first = true;
       os << "{";
       for (const auto& c : codecs) {
diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc
index 6c543f9..684cf63 100644
--- a/pc/peerconnection.cc
+++ b/pc/peerconnection.cc
@@ -47,6 +47,7 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/numerics/safe_conversions.h"
 #include "rtc_base/stringencode.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/stringutils.h"
 #include "rtc_base/trace_event.h"
 #include "system_wrappers/include/clock.h"
@@ -594,7 +595,7 @@
 std::string GetSetDescriptionErrorMessage(cricket::ContentSource source,
                                           SdpType type,
                                           const RTCError& error) {
-  std::ostringstream oss;
+  rtc::StringBuilder oss;
   oss << "Failed to set " << (source == cricket::CS_LOCAL ? "local" : "remote")
       << " " << SdpTypeToString(type) << " sdp: " << error.message();
   return oss.str();
@@ -5834,7 +5835,7 @@
 }
 
 std::string PeerConnection::GetSessionErrorMsg() {
-  std::ostringstream desc;
+  rtc::StringBuilder desc;
   desc << kSessionError << SessionErrorToString(session_error()) << ". ";
   desc << kSessionErrorDesc << session_error_desc() << ".";
   return desc.str();
diff --git a/pc/peerconnection_ice_unittest.cc b/pc/peerconnection_ice_unittest.cc
index 23a49e9..a96adfe 100644
--- a/pc/peerconnection_ice_unittest.cc
+++ b/pc/peerconnection_ice_unittest.cc
@@ -27,6 +27,7 @@
 #include "pc/test/fakeaudiocapturemodule.h"
 #include "rtc_base/fakenetwork.h"
 #include "rtc_base/gunit.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/virtualsocketserver.h"
 #include "system_wrappers/include/metrics_default.h"
 
@@ -258,7 +259,7 @@
                                                  const char* b_expr,
                                                  const cricket::Candidate& a,
                                                  const cricket::Candidate& b) {
-  std::stringstream failure_info;
+  rtc::StringBuilder failure_info;
   if (a.component() != b.component()) {
     failure_info << "\ncomponent: " << a.component() << " != " << b.component();
   }
@@ -593,7 +594,7 @@
     const char* candidates_expr,
     const SocketAddress& address,
     const std::vector<IceCandidateInterface*> candidates) {
-  std::stringstream candidate_hosts;
+  rtc::StringBuilder candidate_hosts;
   for (const auto* candidate : candidates) {
     const auto& candidate_ip = candidate->candidate().address().ipaddr();
     if (candidate_ip == address.ipaddr()) {
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 11550c7..c780fec 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -313,6 +313,7 @@
   deps = [
     ":checks",
     ":safe_conversions",
+    ":stringutils",
   ]
 }
 
diff --git a/rtc_base/httpcommon.cc b/rtc_base/httpcommon.cc
index 4ecb393..86bfe97 100644
--- a/rtc_base/httpcommon.cc
+++ b/rtc_base/httpcommon.cc
@@ -27,6 +27,7 @@
 #include "rtc_base/httpcommon.h"
 #include "rtc_base/messagedigest.h"
 #include "rtc_base/socketaddress.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/third_party/base64/base64.h"
 #include "rtc_base/zero_memory.h"
 
@@ -798,7 +799,7 @@
     std::string HA2 = MD5(A2);
     std::string dig_response = MD5(HA1 + ":" + middle + ":" + HA2);
 
-    std::stringstream ss;
+    rtc::StringBuilder ss;
     ss << auth_method;
     ss << " username=" << quote(username);
     ss << ", realm=" << quote(realm);
diff --git a/rtc_base/network.cc b/rtc_base/network.cc
index 34da828..01b84a6 100644
--- a/rtc_base/network.cc
+++ b/rtc_base/network.cc
@@ -40,6 +40,7 @@
 #include "rtc_base/socket.h"  // includes something that makes windows happy
 #include "rtc_base/stream.h"
 #include "rtc_base/stringencode.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/stringutils.h"
 #include "rtc_base/thread.h"
 
@@ -181,7 +182,7 @@
 std::string MakeNetworkKey(const std::string& name,
                            const IPAddress& prefix,
                            int prefix_length) {
-  std::ostringstream ost;
+  rtc::StringBuilder ost;
   ost << name << "%" << prefix.ToString() << "/" << prefix_length;
   return ost.str();
 }
@@ -1057,7 +1058,7 @@
 }
 
 std::string Network::ToString() const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   // Print out the first space-terminated token of the network desc, plus
   // the IP address.
   ss << "Net[" << description_.substr(0, description_.find(' ')) << ":"
diff --git a/rtc_base/socketadapters.cc b/rtc_base/socketadapters.cc
index 8095894..acd9b63 100644
--- a/rtc_base/socketadapters.cc
+++ b/rtc_base/socketadapters.cc
@@ -31,6 +31,7 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/socketadapters.h"
 #include "rtc_base/stringencode.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/stringutils.h"
 #include "rtc_base/zero_memory.h"
 
@@ -369,7 +370,7 @@
 }
 
 void AsyncHttpsProxySocket::SendRequest() {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "CONNECT " << dest_.ToString() << " HTTP/1.0\r\n";
   ss << "User-Agent: " << agent_ << "\r\n";
   ss << "Host: " << dest_.HostAsURIString() << "\r\n";
diff --git a/rtc_base/sslidentity.cc b/rtc_base/sslidentity.cc
index f286884..b9ada00 100644
--- a/rtc_base/sslidentity.cc
+++ b/rtc_base/sslidentity.cc
@@ -20,6 +20,7 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/opensslidentity.h"
 #include "rtc_base/sslfingerprint.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/third_party/base64/base64.h"
 
 namespace rtc {
@@ -116,7 +117,7 @@
 std::string SSLIdentity::DerToPem(const std::string& pem_type,
                                   const unsigned char* data,
                                   size_t length) {
-  std::stringstream result;
+  rtc::StringBuilder result;
 
   result << "-----BEGIN " << pem_type << "-----\n";
 
diff --git a/rtc_base/timeutils.h b/rtc_base/timeutils.h
index 20b1dac..c6ea012 100644
--- a/rtc_base/timeutils.h
+++ b/rtc_base/timeutils.h
@@ -18,6 +18,7 @@
 #include <string>
 
 #include "rtc_base/checks.h"
+#include "rtc_base/strings/string_builder.h"
 
 namespace rtc {
 
@@ -142,7 +143,7 @@
   int max() const { return max_; }
 
   std::string ToString() const {
-    std::stringstream ss;
+    rtc::StringBuilder ss;
     ss << "[" << min_ << "," << max_ << "]";
     return ss.str();
   }
diff --git a/rtc_tools/event_log_visualizer/analyzer.cc b/rtc_tools/event_log_visualizer/analyzer.cc
index 56ea1c7..c51aae3 100644
--- a/rtc_tools/event_log_visualizer/analyzer.cc
+++ b/rtc_tools/event_log_visualizer/analyzer.cc
@@ -55,6 +55,7 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/numerics/sequence_number_util.h"
 #include "rtc_base/rate_statistics.h"
+#include "rtc_base/strings/string_builder.h"
 
 #ifndef BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
 #define BWE_TEST_LOGGING_COMPILE_TIME_ENABLE 0
@@ -75,7 +76,7 @@
 }
 
 std::string SsrcToString(uint32_t ssrc) {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "SSRC " << ssrc;
   return ss.str();
 }
@@ -408,7 +409,7 @@
   // represents a pair of a local server-reflexive candidate on a WiFi network
   // and a remote relay candidate using TCP as the relay protocol on a cell
   // network, when the candidate pair communicates over UDP using IPv4.
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   std::string local_candidate_type =
       GetIceCandidateTypeAsString(config.local_candidate_type);
   std::string remote_candidate_type =
diff --git a/rtc_tools/unpack_aecdump/unpack.cc b/rtc_tools/unpack_aecdump/unpack.cc
index 0367cc4..4c75608 100644
--- a/rtc_tools/unpack_aecdump/unpack.cc
+++ b/rtc_tools/unpack_aecdump/unpack.cc
@@ -22,6 +22,7 @@
 #include "rtc_base/flags.h"
 #include "rtc_base/format_macros.h"
 #include "rtc_base/ignore_wundef.h"
+#include "rtc_base/strings/string_builder.h"
 
 RTC_PUSH_IGNORING_WUNDEF()
 #include "modules/audio_processing/debug.pb.h"
@@ -122,7 +123,7 @@
   std::unique_ptr<RawFile> input_raw_file;
   std::unique_ptr<RawFile> output_raw_file;
 
-  std::stringstream callorder_raw_name;
+  rtc::StringBuilder callorder_raw_name;
   callorder_raw_name << FLAG_callorder_file << ".char";
   FILE* callorder_char_file = OpenFile(callorder_raw_name.str(), "wb");
   FILE* settings_file = OpenFile(FLAG_settings_file, "wb");
@@ -345,20 +346,20 @@
       if (!FLAG_raw) {
         // The WAV files need to be reset every time, because they cant change
         // their sample rate or number of channels.
-        std::stringstream reverse_name;
+        rtc::StringBuilder reverse_name;
         reverse_name << FLAG_reverse_file << frame_count << ".wav";
         reverse_wav_file.reset(new WavWriter(
             reverse_name.str(), reverse_sample_rate, num_reverse_channels));
-        std::stringstream input_name;
+        rtc::StringBuilder input_name;
         input_name << FLAG_input_file << frame_count << ".wav";
         input_wav_file.reset(new WavWriter(input_name.str(), input_sample_rate,
                                            num_input_channels));
-        std::stringstream output_name;
+        rtc::StringBuilder output_name;
         output_name << FLAG_output_file << frame_count << ".wav";
         output_wav_file.reset(new WavWriter(
             output_name.str(), output_sample_rate, num_output_channels));
 
-        std::stringstream callorder_name;
+        rtc::StringBuilder callorder_name;
         callorder_name << FLAG_callorder_file << frame_count << ".char";
         callorder_char_file = OpenFile(callorder_name.str(), "wb");
       }
diff --git a/sdk/android/src/jni/androidnetworkmonitor.cc b/sdk/android/src/jni/androidnetworkmonitor.cc
index cfd51e8..3dd280b 100644
--- a/sdk/android/src/jni/androidnetworkmonitor.cc
+++ b/sdk/android/src/jni/androidnetworkmonitor.cc
@@ -19,6 +19,7 @@
 #include "rtc_base/bind.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/ipaddress.h"
+#include "rtc_base/strings/string_builder.h"
 #include "sdk/android/generated_base_jni/jni/NetworkMonitorAutoDetect_jni.h"
 #include "sdk/android/generated_base_jni/jni/NetworkMonitor_jni.h"
 #include "sdk/android/native_api/jni/java_types.h"
@@ -152,7 +153,7 @@
     default;
 
 std::string NetworkInformation::ToString() const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "NetInfo[name " << interface_name << "; handle " << handle << "; type "
      << type;
   if (type == NETWORK_VPN) {
diff --git a/video/end_to_end_tests/stats_tests.cc b/video/end_to_end_tests/stats_tests.cc
index e057376..7899eb7 100644
--- a/video/end_to_end_tests/stats_tests.cc
+++ b/video/end_to_end_tests/stats_tests.cc
@@ -13,6 +13,7 @@
 #include "call/simulated_network.h"
 #include "modules/rtp_rtcp/source/rtp_utility.h"
 #include "modules/video_coding/include/video_coding_defines.h"
+#include "rtc_base/strings/string_builder.h"
 #include "system_wrappers/include/metrics.h"
 #include "system_wrappers/include/metrics_default.h"
 #include "system_wrappers/include/sleep.h"
@@ -215,7 +216,7 @@
     }
 
     std::string CompoundKey(const char* name, uint32_t ssrc) {
-      std::ostringstream oss;
+      rtc::StringBuilder oss;
       oss << name << "_" << ssrc;
       return oss.str();
     }
diff --git a/video/rtp_video_stream_receiver.cc b/video/rtp_video_stream_receiver.cc
index e2139b8..870183a 100644
--- a/video/rtp_video_stream_receiver.cc
+++ b/video/rtp_video_stream_receiver.cc
@@ -37,6 +37,7 @@
 #include "rtc_base/checks.h"
 #include "rtc_base/location.h"
 #include "rtc_base/logging.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/system/fallthrough.h"
 #include "system_wrappers/include/field_trial.h"
 #include "system_wrappers/include/metrics.h"
@@ -291,7 +292,7 @@
     }
     // Periodically log the RTP header of incoming packets.
     if (now_ms - last_packet_log_ms_ > kPacketLogIntervalMs) {
-      std::stringstream ss;
+      rtc::StringBuilder ss;
       ss << "Packet received on SSRC: " << packet.Ssrc()
          << " with payload type: " << static_cast<int>(packet.PayloadType())
          << ", timestamp: " << packet.Timestamp()
diff --git a/video/stats_counter.cc b/video/stats_counter.cc
index bcbf912..8f282b0 100644
--- a/video/stats_counter.cc
+++ b/video/stats_counter.cc
@@ -15,6 +15,7 @@
 #include <map>
 
 #include "rtc_base/checks.h"
+#include "rtc_base/strings/string_builder.h"
 #include "system_wrappers/include/clock.h"
 
 namespace webrtc {
@@ -30,7 +31,7 @@
 }
 
 std::string AggregatedStats::ToStringWithMultiplier(int multiplier) const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "periodic_samples:" << num_samples << ", {";
   ss << "min:" << (min * multiplier) << ", ";
   ss << "avg:" << (average * multiplier) << ", ";
diff --git a/video/video_quality_test.cc b/video/video_quality_test.cc
index 1912f2b..294fd1a 100644
--- a/video/video_quality_test.cc
+++ b/video/video_quality_test.cc
@@ -13,7 +13,6 @@
 #include <algorithm>
 #include <deque>
 #include <map>
-#include <sstream>
 #include <string>
 #include <vector>
 
@@ -240,7 +239,7 @@
 void VideoQualityTest::TestBody() {}
 
 std::string VideoQualityTest::GenerateGraphTitle() const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << params_.video[0].codec;
   ss << " (" << params_.video[0].target_bitrate_bps / 1000 << "kbps";
   ss << ", " << params_.video[0].fps << " FPS";
@@ -1244,7 +1243,7 @@
         const size_t num_streams = params_.ss[video_idx].streams.size();
         if (selected_stream_id == num_streams) {
           for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) {
-            std::ostringstream oss;
+            rtc::StringBuilder oss;
             oss << "Loopback Video #" << video_idx << " - Stream #"
                 << static_cast<int>(stream_id);
             loopback_renderers.emplace_back(test::VideoRenderer::Create(
@@ -1258,7 +1257,7 @@
                   .sync_group = kSyncGroup;
           }
         } else {
-          std::ostringstream oss;
+          rtc::StringBuilder oss;
           oss << "Loopback Video #" << video_idx;
           loopback_renderers.emplace_back(test::VideoRenderer::Create(
               oss.str().c_str(),
@@ -1307,7 +1306,7 @@
 
 void VideoQualityTest::StartEncodedFrameLogs(VideoReceiveStream* stream) {
   if (!params_.logging.encoded_frame_base_path.empty()) {
-    std::ostringstream str;
+    rtc::StringBuilder str;
     str << receive_logs_++;
     std::string path =
         params_.logging.encoded_frame_base_path + "." + str.str() + ".recv.ivf";
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
index e7bc7e1..acf9b2d 100644
--- a/video/video_stream_encoder.cc
+++ b/video/video_stream_encoder.cc
@@ -24,6 +24,7 @@
 #include "rtc_base/experiments/quality_scaling_experiment.h"
 #include "rtc_base/location.h"
 #include "rtc_base/logging.h"
+#include "rtc_base/strings/string_builder.h"
 #include "rtc_base/system/fallthrough.h"
 #include "rtc_base/timeutils.h"
 #include "rtc_base/trace_event.h"
@@ -1237,7 +1238,7 @@
 VideoStreamEncoder::AdaptCounter::~AdaptCounter() {}
 
 std::string VideoStreamEncoder::AdaptCounter::ToString() const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   ss << "Downgrade counts: fps: {" << ToString(fps_counters_);
   ss << "}, resolution: {" << ToString(resolution_counters_) << "}";
   return ss.str();
@@ -1330,7 +1331,7 @@
 
 std::string VideoStreamEncoder::AdaptCounter::ToString(
     const std::vector<int>& counters) const {
-  std::stringstream ss;
+  rtc::StringBuilder ss;
   for (size_t reason = 0; reason < kScaleReasonSize; ++reason) {
     ss << (reason ? " cpu" : "quality") << ":" << counters[reason];
   }