Adopt absl::string_view in rtc_base/ (straightforward cases)

Bug: webrtc:13579
Change-Id: I240db6285abb22652242bc0b2ebe9844ec4a45f0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/258723
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Ali Tofigh <alito@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36561}
diff --git a/modules/audio_device/dummy/file_audio_device.cc b/modules/audio_device/dummy/file_audio_device.cc
index e345a16..0e3caa9 100644
--- a/modules/audio_device/dummy/file_audio_device.cc
+++ b/modules/audio_device/dummy/file_audio_device.cc
@@ -206,7 +206,7 @@
 
   // PLAYOUT
   if (!_outputFilename.empty()) {
-    _outputFile = FileWrapper::OpenWriteOnly(_outputFilename.c_str());
+    _outputFile = FileWrapper::OpenWriteOnly(_outputFilename);
     if (!_outputFile.is_open()) {
       RTC_LOG(LS_ERROR) << "Failed to open playout file: " << _outputFilename;
       _playing = false;
@@ -266,7 +266,7 @@
   }
 
   if (!_inputFilename.empty()) {
-    _inputFile = FileWrapper::OpenReadOnly(_inputFilename.c_str());
+    _inputFile = FileWrapper::OpenReadOnly(_inputFilename);
     if (!_inputFile.is_open()) {
       RTC_LOG(LS_ERROR) << "Failed to open audio input file: "
                         << _inputFilename;
diff --git a/modules/audio_processing/aec_dump/aec_dump_impl.cc b/modules/audio_processing/aec_dump/aec_dump_impl.cc
index 160583e..1b87465 100644
--- a/modules/audio_processing/aec_dump/aec_dump_impl.cc
+++ b/modules/audio_processing/aec_dump/aec_dump_impl.cc
@@ -255,8 +255,8 @@
 std::unique_ptr<AecDump> AecDumpFactory::Create(std::string file_name,
                                                 int64_t max_log_size_bytes,
                                                 rtc::TaskQueue* worker_queue) {
-  return Create(FileWrapper::OpenWriteOnly(file_name.c_str()),
-                max_log_size_bytes, worker_queue);
+  return Create(FileWrapper::OpenWriteOnly(file_name), max_log_size_bytes,
+                worker_queue);
 }
 
 std::unique_ptr<AecDump> AecDumpFactory::Create(FILE* handle,
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc
index b21a022..e26548a 100644
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -1600,7 +1600,7 @@
 
   const std::string filename =
       test::TempFilename(test::OutputPath(), "debug_aec");
-  FileWrapper f = FileWrapper::OpenWriteOnly(filename.c_str());
+  FileWrapper f = FileWrapper::OpenWriteOnly(filename);
   ASSERT_TRUE(f.is_open());
 
 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
diff --git a/modules/audio_processing/test/wav_based_simulator.cc b/modules/audio_processing/test/wav_based_simulator.cc
index 52a05a3..d8f6b59 100644
--- a/modules/audio_processing/test/wav_based_simulator.cc
+++ b/modules/audio_processing/test/wav_based_simulator.cc
@@ -25,7 +25,7 @@
 std::vector<WavBasedSimulator::SimulationEventType>
 WavBasedSimulator::GetCustomEventChain(const std::string& filename) {
   std::vector<WavBasedSimulator::SimulationEventType> call_chain;
-  FileWrapper file_wrapper = FileWrapper::OpenReadOnly(filename.c_str());
+  FileWrapper file_wrapper = FileWrapper::OpenReadOnly(filename);
 
   RTC_CHECK(file_wrapper.is_open())
       << "Could not open the custom call order file, reverting "
diff --git a/modules/audio_processing/transient/file_utils_unittest.cc b/modules/audio_processing/transient/file_utils_unittest.cc
index 1bcf6f9..c32df6c 100644
--- a/modules/audio_processing/transient/file_utils_unittest.cc
+++ b/modules/audio_processing/transient/file_utils_unittest.cc
@@ -159,7 +159,7 @@
 TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16BufferFromFile) {
   std::string test_filename = kTestFileName;
 
-  FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str());
+  FileWrapper file = FileWrapper::OpenReadOnly(test_filename);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();
 
@@ -197,7 +197,7 @@
 TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16FromFileToFloatBuffer) {
   std::string test_filename = kTestFileName;
 
-  FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str());
+  FileWrapper file = FileWrapper::OpenReadOnly(test_filename);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();
 
@@ -237,7 +237,7 @@
 TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16FromFileToDoubleBuffer) {
   std::string test_filename = kTestFileName;
 
-  FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str());
+  FileWrapper file = FileWrapper::OpenReadOnly(test_filename);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();
 
@@ -275,7 +275,7 @@
 TEST_F(TransientFileUtilsTest, MAYBE_ReadFloatBufferFromFile) {
   std::string test_filename = kTestFileNamef;
 
-  FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str());
+  FileWrapper file = FileWrapper::OpenReadOnly(test_filename);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kTestFileNamef.c_str();
 
@@ -311,7 +311,7 @@
 TEST_F(TransientFileUtilsTest, MAYBE_ReadDoubleBufferFromFile) {
   std::string test_filename = kTestFileName;
 
-  FileWrapper file = FileWrapper::OpenReadOnly(test_filename.c_str());
+  FileWrapper file = FileWrapper::OpenReadOnly(test_filename);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();
 
@@ -348,7 +348,7 @@
   std::string kOutFileName =
       CreateTempFilename(test::OutputPath(), "utils_test");
 
-  FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName.c_str());
+  FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();
 
@@ -365,7 +365,7 @@
 
   file.Close();
 
-  file = FileWrapper::OpenReadOnly(kOutFileName.c_str());
+  file = FileWrapper::OpenReadOnly(kOutFileName);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();
 
@@ -384,7 +384,7 @@
   std::string kOutFileName =
       CreateTempFilename(test::OutputPath(), "utils_test");
 
-  FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName.c_str());
+  FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();
 
@@ -401,7 +401,7 @@
 
   file.Close();
 
-  file = FileWrapper::OpenReadOnly(kOutFileName.c_str());
+  file = FileWrapper::OpenReadOnly(kOutFileName);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();
 
@@ -420,7 +420,7 @@
   std::string kOutFileName =
       CreateTempFilename(test::OutputPath(), "utils_test");
 
-  FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName.c_str());
+  FileWrapper file = FileWrapper::OpenWriteOnly(kOutFileName);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();
 
@@ -437,7 +437,7 @@
 
   file.Close();
 
-  file = FileWrapper::OpenReadOnly(kOutFileName.c_str());
+  file = FileWrapper::OpenReadOnly(kOutFileName);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kOutFileName.c_str();
 
@@ -472,7 +472,7 @@
   EXPECT_EQ(0u, WriteInt16BufferToFile(&file, 1, int16_buffer.get()));
   EXPECT_EQ(0u, WriteDoubleBufferToFile(&file, 1, double_buffer.get()));
 
-  file = FileWrapper::OpenReadOnly(test_filename.c_str());
+  file = FileWrapper::OpenReadOnly(test_filename);
   ASSERT_TRUE(file.is_open()) << "File could not be opened:\n"
                               << kTestFileName.c_str();
 
diff --git a/modules/audio_processing/transient/transient_detector_unittest.cc b/modules/audio_processing/transient/transient_detector_unittest.cc
index 0425133..a736462 100644
--- a/modules/audio_processing/transient/transient_detector_unittest.cc
+++ b/modules/audio_processing/transient/transient_detector_unittest.cc
@@ -48,7 +48,7 @@
                      << (sample_rate_hz / 1000) << "kHz";
 
     FileWrapper detect_file = FileWrapper::OpenReadOnly(
-        test::ResourcePath(detect_file_name.str(), "dat").c_str());
+        test::ResourcePath(detect_file_name.str(), "dat"));
 
     bool file_opened = detect_file.is_open();
     ASSERT_TRUE(file_opened) << "File could not be opened.\n"
@@ -60,7 +60,7 @@
                     << (sample_rate_hz / 1000) << "kHz";
 
     FileWrapper audio_file = FileWrapper::OpenReadOnly(
-        test::ResourcePath(audio_file_name.str(), "pcm").c_str());
+        test::ResourcePath(audio_file_name.str(), "pcm"));
 
     // Create detector.
     TransientDetector detector(sample_rate_hz);
diff --git a/modules/audio_processing/transient/wpd_tree_unittest.cc b/modules/audio_processing/transient/wpd_tree_unittest.cc
index 97d69ae..bf3ff98 100644
--- a/modules/audio_processing/transient/wpd_tree_unittest.cc
+++ b/modules/audio_processing/transient/wpd_tree_unittest.cc
@@ -88,7 +88,7 @@
     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] = FileWrapper::OpenReadOnly(matlab_string.c_str());
+    matlab_files_data[i] = FileWrapper::OpenReadOnly(matlab_string);
 
     bool file_opened = matlab_files_data[i].is_open();
     ASSERT_TRUE(file_opened) << "File could not be opened.\n" << matlab_string;
@@ -98,7 +98,7 @@
     out_stream << test::OutputPath() << "wpd_" << i << ".out";
     std::string out_string = out_stream.str();
 
-    out_files_data[i] = FileWrapper::OpenWriteOnly(out_string.c_str());
+    out_files_data[i] = FileWrapper::OpenWriteOnly(out_string);
 
     file_opened = out_files_data[i].is_open();
     ASSERT_TRUE(file_opened) << "File could not be opened.\n" << out_string;
@@ -108,7 +108,7 @@
   std::string test_file_name = test::ResourcePath(
       "audio_processing/transient/ajm-macbook-1-spke16m", "pcm");
 
-  FileWrapper test_file = FileWrapper::OpenReadOnly(test_file_name.c_str());
+  FileWrapper test_file = FileWrapper::OpenReadOnly(test_file_name);
 
   bool file_opened = test_file.is_open();
   ASSERT_TRUE(file_opened) << "File could not be opened.\n" << test_file_name;
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index bf39ebe..c30340a 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -703,6 +703,7 @@
       ":win32",
     ]
   }
+  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
 }
 
 rtc_library("async_resolver_interface") {
diff --git a/rtc_base/async_resolver.cc b/rtc_base/async_resolver.cc
index ad1598f..07d77b4 100644
--- a/rtc_base/async_resolver.cc
+++ b/rtc_base/async_resolver.cc
@@ -14,6 +14,7 @@
 #include <string>
 #include <utility>
 
+#include "absl/strings/string_view.h"
 #include "api/ref_counted_base.h"
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/thread_annotations.h"
@@ -66,7 +67,7 @@
 }  // namespace
 #endif
 
-int ResolveHostname(const std::string& hostname,
+int ResolveHostname(absl::string_view hostname,
                     int family,
                     std::vector<IPAddress>* addresses) {
 #ifdef __native_client__
@@ -99,7 +100,8 @@
   // https://android.googlesource.com/platform/bionic/+/
   // 7e0bfb511e85834d7c6cb9631206b62f82701d60/libc/netbsd/net/getaddrinfo.c#1657
   hints.ai_flags = AI_ADDRCONFIG;
-  int ret = getaddrinfo(hostname.c_str(), nullptr, &hints, &result);
+  int ret =
+      getaddrinfo(std::string(hostname).c_str(), nullptr, &hints, &result);
   if (ret != 0) {
     return ret;
   }
@@ -151,8 +153,7 @@
       [this, addr, caller_task_queue = webrtc::TaskQueueBase::Current(),
        state = state_] {
         std::vector<IPAddress> addresses;
-        int error =
-            ResolveHostname(addr.hostname().c_str(), addr.family(), &addresses);
+        int error = ResolveHostname(addr.hostname(), addr.family(), &addresses);
         webrtc::MutexLock lock(&state->mutex);
         if (state->status == State::Status::kLive) {
           caller_task_queue->PostTask(webrtc::ToQueuedTask(
diff --git a/rtc_base/event_tracer.cc b/rtc_base/event_tracer.cc
index 1a2b41e..e14079e 100644
--- a/rtc_base/event_tracer.cc
+++ b/rtc_base/event_tracer.cc
@@ -17,6 +17,7 @@
 #include <string>
 #include <vector>
 
+#include "absl/strings/string_view.h"
 #include "api/sequence_checker.h"
 #include "rtc_base/atomic_ops.h"
 #include "rtc_base/checks.h"
@@ -367,11 +368,11 @@
   }
 }
 
-bool StartInternalCapture(const char* filename) {
+bool StartInternalCapture(absl::string_view filename) {
   if (!g_event_logger)
     return false;
 
-  FILE* file = fopen(filename, "w");
+  FILE* file = fopen(std::string(filename).c_str(), "w");
   if (!file) {
     RTC_LOG(LS_ERROR) << "Failed to open trace file '" << filename
                       << "' for writing.";
diff --git a/rtc_base/event_tracer.h b/rtc_base/event_tracer.h
index 68aaf0d..77c2b35 100644
--- a/rtc_base/event_tracer.h
+++ b/rtc_base/event_tracer.h
@@ -28,6 +28,7 @@
 
 #include <stdio.h>
 
+#include "absl/strings/string_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -73,7 +74,7 @@
 namespace tracing {
 // Set up internal event tracer.
 RTC_EXPORT void SetupInternalTracer();
-RTC_EXPORT bool StartInternalCapture(const char* filename);
+RTC_EXPORT bool StartInternalCapture(absl::string_view filename);
 RTC_EXPORT void StartInternalCaptureToFile(FILE* file);
 RTC_EXPORT void StopInternalCapture();
 // Make sure we run this, this will tear down the internal tracing.
diff --git a/rtc_base/experiments/BUILD.gn b/rtc_base/experiments/BUILD.gn
index 3f720d5..fffd5a0 100644
--- a/rtc_base/experiments/BUILD.gn
+++ b/rtc_base/experiments/BUILD.gn
@@ -19,7 +19,10 @@
     "../../api:field_trials_view",
     "../../api/transport:field_trial_based_config",
   ]
-  absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
+  absl_deps = [
+    "//third_party/abseil-cpp/absl/strings:strings",
+    "//third_party/abseil-cpp/absl/types:optional",
+  ]
 }
 
 rtc_library("field_trial_parser") {
diff --git a/rtc_base/experiments/alr_experiment.cc b/rtc_base/experiments/alr_experiment.cc
index 36bf67d..f5d36f6 100644
--- a/rtc_base/experiments/alr_experiment.cc
+++ b/rtc_base/experiments/alr_experiment.cc
@@ -15,6 +15,7 @@
 
 #include <string>
 
+#include "absl/strings/string_view.h"
 #include "api/transport/field_trial_based_config.h"
 #include "rtc_base/logging.h"
 
@@ -39,7 +40,7 @@
 }
 
 absl::optional<AlrExperimentSettings>
-AlrExperimentSettings::CreateFromFieldTrial(const char* experiment_name) {
+AlrExperimentSettings::CreateFromFieldTrial(absl::string_view experiment_name) {
   return AlrExperimentSettings::CreateFromFieldTrial(FieldTrialBasedConfig(),
                                                      experiment_name);
 }
@@ -47,7 +48,7 @@
 absl::optional<AlrExperimentSettings>
 AlrExperimentSettings::CreateFromFieldTrial(
     const FieldTrialsView& key_value_config,
-    const char* experiment_name) {
+    absl::string_view experiment_name) {
   absl::optional<AlrExperimentSettings> ret;
   std::string group_name = key_value_config.Lookup(experiment_name);
 
diff --git a/rtc_base/experiments/alr_experiment.h b/rtc_base/experiments/alr_experiment.h
index bf6aa34..048fd90 100644
--- a/rtc_base/experiments/alr_experiment.h
+++ b/rtc_base/experiments/alr_experiment.h
@@ -13,6 +13,7 @@
 
 #include <stdint.h>
 
+#include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "api/field_trials_view.h"
 
@@ -32,10 +33,10 @@
   static const char kScreenshareProbingBweExperimentName[];
   static const char kStrictPacingAndProbingExperimentName[];
   static absl::optional<AlrExperimentSettings> CreateFromFieldTrial(
-      const char* experiment_name);
+      absl::string_view experiment_name);
   static absl::optional<AlrExperimentSettings> CreateFromFieldTrial(
       const FieldTrialsView& key_value_config,
-      const char* experiment_name);
+      absl::string_view experiment_name);
   static bool MaxOneFieldTrialEnabled();
   static bool MaxOneFieldTrialEnabled(const FieldTrialsView& key_value_config);
 
diff --git a/rtc_base/file_rotating_stream_unittest.cc b/rtc_base/file_rotating_stream_unittest.cc
index ee03d3f..1d1e5b6 100644
--- a/rtc_base/file_rotating_stream_unittest.cc
+++ b/rtc_base/file_rotating_stream_unittest.cc
@@ -79,28 +79,28 @@
 
   // Checks that the stream reads in the expected contents and then returns an
   // end of stream result.
-  void VerifyStreamRead(const char* expected_contents,
-                        const size_t expected_length,
+  void VerifyStreamRead(absl::string_view expected_contents,
                         absl::string_view dir_path,
-                        const char* file_prefix) {
+                        absl::string_view file_prefix) {
+    size_t expected_length = expected_contents.size();
     FileRotatingStreamReader reader(dir_path, file_prefix);
     EXPECT_EQ(reader.GetSize(), expected_length);
     std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length]);
     memset(buffer.get(), 0, expected_length);
     EXPECT_EQ(expected_length, reader.ReadAll(buffer.get(), expected_length));
-    EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), expected_length));
+    EXPECT_EQ(0,
+              memcmp(expected_contents.data(), buffer.get(), expected_length));
   }
 
-  void VerifyFileContents(const char* expected_contents,
-                          const size_t expected_length,
+  void VerifyFileContents(absl::string_view expected_contents,
                           absl::string_view file_path) {
+    size_t expected_length = expected_contents.size();
     std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length + 1]);
-    webrtc::FileWrapper f =
-        webrtc::FileWrapper::OpenReadOnly(std::string(file_path));
+    webrtc::FileWrapper f = webrtc::FileWrapper::OpenReadOnly(file_path);
     ASSERT_TRUE(f.is_open());
     size_t size_read = f.Read(buffer.get(), expected_length + 1);
     EXPECT_EQ(size_read, expected_length);
-    EXPECT_EQ(0, memcmp(expected_contents, buffer.get(),
+    EXPECT_EQ(0, memcmp(expected_contents.data(), buffer.get(),
                         std::min(expected_length, size_read)));
   }
 
@@ -151,8 +151,7 @@
     WriteAndFlush(message.c_str(), message.size());
     // Since the max log size is 2, we will be causing rotation. Read from the
     // next file.
-    VerifyFileContents(message.c_str(), message.size(),
-                       stream_->GetFilePath(1));
+    VerifyFileContents(message, stream_->GetFilePath(1));
   }
   // Check that exactly three files exist.
   for (size_t i = 0; i < arraysize(messages); ++i) {
@@ -167,8 +166,7 @@
 
   // Reopen for read.
   std::string expected_contents("bbccd");
-  VerifyStreamRead(expected_contents.c_str(), expected_contents.size(),
-                   dir_path_, kFilePrefix);
+  VerifyStreamRead(expected_contents, dir_path_, kFilePrefix);
 }
 
 // Tests that a write operation (with dir name without delimiter) followed by a
@@ -191,7 +189,7 @@
 
   // Reopen for read.
   std::string expected_contents("bbccd");
-  VerifyStreamRead(expected_contents.c_str(), expected_contents.size(),
+  VerifyStreamRead(expected_contents,
                    dir_path_ + std::string(webrtc::test::kPathDelimiter),
                    kFilePrefix);
 }
@@ -215,8 +213,8 @@
 
   // Reopen for read.
   std::string expected_contents("bbccd");
-  VerifyStreamRead(expected_contents.c_str(), expected_contents.size(),
-                   dir_path_.substr(0, dir_path_.size() - 1), kFilePrefix);
+  VerifyStreamRead(expected_contents, dir_path_.substr(0, dir_path_.size() - 1),
+                   kFilePrefix);
 }
 
 // Tests that writing data greater than the total capacity of the files
@@ -230,11 +228,9 @@
   std::string message("foobarbaz");
   WriteAndFlush(message.c_str(), message.size());
   std::string expected_file_contents("z");
-  VerifyFileContents(expected_file_contents.c_str(),
-                     expected_file_contents.size(), stream_->GetFilePath(0));
+  VerifyFileContents(expected_file_contents, stream_->GetFilePath(0));
   std::string expected_stream_contents("arbaz");
-  VerifyStreamRead(expected_stream_contents.c_str(),
-                   expected_stream_contents.size(), dir_path_, kFilePrefix);
+  VerifyStreamRead(expected_stream_contents, dir_path_, kFilePrefix);
 }
 
 // Tests that the returned file paths have the right folder and prefix.
@@ -286,15 +282,16 @@
 
   // Checks that the stream reads in the expected contents and then returns an
   // end of stream result.
-  void VerifyStreamRead(const char* expected_contents,
-                        const size_t expected_length,
+  void VerifyStreamRead(absl::string_view expected_contents,
                         absl::string_view dir_path) {
+    size_t expected_length = expected_contents.size();
     CallSessionFileRotatingStreamReader reader(dir_path);
     EXPECT_EQ(reader.GetSize(), expected_length);
     std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length]);
     memset(buffer.get(), 0, expected_length);
     EXPECT_EQ(expected_length, reader.ReadAll(buffer.get(), expected_length));
-    EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), expected_length));
+    EXPECT_EQ(0,
+              memcmp(expected_contents.data(), buffer.get(), expected_length));
   }
 
   std::unique_ptr<CallSessionFileRotatingStream> stream_;
@@ -310,8 +307,7 @@
   std::string message("abcde");
   WriteAndFlush(message.c_str(), message.size());
   std::string expected_contents("abe");
-  VerifyStreamRead(expected_contents.c_str(), expected_contents.size(),
-                   dir_path_);
+  VerifyStreamRead(expected_contents, dir_path_);
 }
 
 // Tests that writing and reading to a stream with capacity lesser than 4MB
@@ -323,8 +319,7 @@
   std::string message("123456789");
   WriteAndFlush(message.c_str(), message.size());
   std::string expected_contents("1234789");
-  VerifyStreamRead(expected_contents.c_str(), expected_contents.size(),
-                   dir_path_);
+  VerifyStreamRead(expected_contents, dir_path_);
 }
 
 // Tests that writing and reading to a stream with capacity greater than 4MB
diff --git a/rtc_base/http_common.cc b/rtc_base/http_common.cc
index 5ac222f..2968cf1 100644
--- a/rtc_base/http_common.cc
+++ b/rtc_base/http_common.cc
@@ -120,14 +120,14 @@
 typedef std::pair<std::string, std::string> HttpAttribute;
 typedef std::vector<HttpAttribute> HttpAttributeList;
 
-inline bool IsEndOfAttributeName(size_t pos, size_t len, const char* data) {
-  if (pos >= len)
+inline bool IsEndOfAttributeName(size_t pos, absl::string_view data) {
+  if (pos >= data.size())
     return true;
   if (isspace(static_cast<unsigned char>(data[pos])))
     return true;
   // The reason for this complexity is that some attributes may contain trailing
   // equal signs (like base64 tokens in Negotiate auth headers)
-  if ((pos + 1 < len) && (data[pos] == '=') &&
+  if ((pos + 1 < data.size()) && (data[pos] == '=') &&
       !isspace(static_cast<unsigned char>(data[pos + 1])) &&
       (data[pos + 1] != '=')) {
     return true;
@@ -135,10 +135,10 @@
   return false;
 }
 
-void HttpParseAttributes(const char* data,
-                         size_t len,
+void HttpParseAttributes(absl::string_view data,
                          HttpAttributeList& attributes) {
   size_t pos = 0;
+  const size_t len = data.size();
   while (true) {
     // Skip leading whitespace
     while ((pos < len) && isspace(static_cast<unsigned char>(data[pos]))) {
@@ -151,12 +151,12 @@
 
     // Find end of attribute name
     size_t start = pos;
-    while (!IsEndOfAttributeName(pos, len, data)) {
+    while (!IsEndOfAttributeName(pos, data)) {
       ++pos;
     }
 
     HttpAttribute attribute;
-    attribute.first.assign(data + start, data + pos);
+    attribute.first.assign(data.data() + start, data.data() + pos);
 
     // Attribute has value?
     if ((pos < len) && (data[pos] == '=')) {
@@ -250,8 +250,7 @@
 
 }  // anonymous namespace
 
-HttpAuthResult HttpAuthenticate(const char* challenge,
-                                size_t len,
+HttpAuthResult HttpAuthenticate(absl::string_view challenge,
                                 const SocketAddress& server,
                                 absl::string_view method,
                                 absl::string_view uri,
@@ -261,7 +260,7 @@
                                 std::string& response,
                                 std::string& auth_method) {
   HttpAttributeList args;
-  HttpParseAttributes(challenge, len, args);
+  HttpParseAttributes(challenge, args);
   HttpHasNthAttribute(args, 0, &auth_method, nullptr);
 
   if (context && (context->auth_method != auth_method))
diff --git a/rtc_base/http_common.h b/rtc_base/http_common.h
index d287bd5..06e42c6 100644
--- a/rtc_base/http_common.h
+++ b/rtc_base/http_common.h
@@ -36,8 +36,7 @@
 // Start by passing a null pointer, then pass the same pointer each additional
 // call.  When the authentication attempt is finished, delete the context.
 // TODO(bugs.webrtc.org/8905): Change "response" to "ZeroOnFreeBuffer".
-HttpAuthResult HttpAuthenticate(const char* challenge,
-                                size_t len,
+HttpAuthResult HttpAuthenticate(absl::string_view challenge,
                                 const SocketAddress& server,
                                 absl::string_view method,
                                 absl::string_view uri,
diff --git a/rtc_base/ip_address.cc b/rtc_base/ip_address.cc
index 5ebb402..d544b61 100644
--- a/rtc_base/ip_address.cc
+++ b/rtc_base/ip_address.cc
@@ -283,10 +283,9 @@
     return false;
   }
   in_addr addr;
-  const std::string str_copy = std::string(str);
-  if (rtc::inet_pton(AF_INET, str_copy.c_str(), &addr) == 0) {
+  if (rtc::inet_pton(AF_INET, str, &addr) == 0) {
     in6_addr addr6;
-    if (rtc::inet_pton(AF_INET6, str_copy.c_str(), &addr6) == 0) {
+    if (rtc::inet_pton(AF_INET6, str, &addr6) == 0) {
       *out = IPAddress();
       return false;
     }
diff --git a/rtc_base/log_sinks.cc b/rtc_base/log_sinks.cc
index b237e87..e8e1d40 100644
--- a/rtc_base/log_sinks.cc
+++ b/rtc_base/log_sinks.cc
@@ -20,8 +20,8 @@
 
 namespace rtc {
 
-FileRotatingLogSink::FileRotatingLogSink(const std::string& log_dir_path,
-                                         const std::string& log_prefix,
+FileRotatingLogSink::FileRotatingLogSink(absl::string_view log_dir_path,
+                                         absl::string_view log_prefix,
                                          size_t max_log_size,
                                          size_t num_log_files)
     : FileRotatingLogSink(new FileRotatingStream(log_dir_path,
@@ -69,7 +69,7 @@
 }
 
 CallSessionFileRotatingLogSink::CallSessionFileRotatingLogSink(
-    const std::string& log_dir_path,
+    absl::string_view log_dir_path,
     size_t max_total_log_size)
     : FileRotatingLogSink(
           new CallSessionFileRotatingStream(log_dir_path, max_total_log_size)) {
diff --git a/rtc_base/log_sinks.h b/rtc_base/log_sinks.h
index da339a5..54f7750 100644
--- a/rtc_base/log_sinks.h
+++ b/rtc_base/log_sinks.h
@@ -28,8 +28,8 @@
  public:
   // `num_log_files` must be greater than 1 and `max_log_size` must be greater
   // than 0.
-  FileRotatingLogSink(const std::string& log_dir_path,
-                      const std::string& log_prefix,
+  FileRotatingLogSink(absl::string_view log_dir_path,
+                      absl::string_view log_prefix,
                       size_t max_log_size,
                       size_t num_log_files);
   ~FileRotatingLogSink() override;
@@ -62,7 +62,7 @@
 // Init() must be called before adding this sink.
 class CallSessionFileRotatingLogSink : public FileRotatingLogSink {
  public:
-  CallSessionFileRotatingLogSink(const std::string& log_dir_path,
+  CallSessionFileRotatingLogSink(absl::string_view log_dir_path,
                                  size_t max_total_log_size);
   ~CallSessionFileRotatingLogSink() override;
 
diff --git a/rtc_base/logging.cc b/rtc_base/logging.cc
index 102c1d1..b93474d 100644
--- a/rtc_base/logging.cc
+++ b/rtc_base/logging.cc
@@ -188,7 +188,7 @@
 LogMessage::LogMessage(const char* file,
                        int line,
                        LoggingSeverity sev,
-                       const std::string& tag)
+                       absl::string_view tag)
     : LogMessage(file, line, sev) {
   print_stream_ << tag << ": ";
 }
@@ -296,7 +296,7 @@
   UpdateMinLogSeverity();
 }
 
-void LogMessage::ConfigureLogging(const char* params) {
+void LogMessage::ConfigureLogging(absl::string_view params) {
   LoggingSeverity current_level = LS_VERBOSE;
   LoggingSeverity debug_level = GetLogToDebug();
 
@@ -355,13 +355,14 @@
 }
 
 #if defined(WEBRTC_ANDROID)
-void LogMessage::OutputToDebug(const std::string& str,
+void LogMessage::OutputToDebug(absl::string_view str,
                                LoggingSeverity severity,
                                const char* tag) {
 #else
-void LogMessage::OutputToDebug(const std::string& str,
+void LogMessage::OutputToDebug(absl::string_view str,
                                LoggingSeverity severity) {
 #endif
+  std::string str_str = std::string(str);
   bool log_to_stderr = log_to_stderr_;
 #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) && defined(NDEBUG)
   // On the Mac, all stderr output goes to the Console log and causes clutter.
@@ -386,7 +387,7 @@
 #if defined(WEBRTC_WIN)
   // Always log to the debugger.
   // Perhaps stderr should be controlled by a preference, as on Mac?
-  OutputDebugStringA(str.c_str());
+  OutputDebugStringA(str_str.c_str());
   if (log_to_stderr) {
     // This handles dynamically allocated consoles, too.
     if (HANDLE error_handle = ::GetStdHandle(STD_ERROR_HANDLE)) {
@@ -426,14 +427,14 @@
   int idx = 0;
   const int max_lines = size / kMaxLogLineSize + 1;
   if (max_lines == 1) {
-    __android_log_print(prio, tag, "%.*s", size, str.c_str());
+    __android_log_print(prio, tag, "%.*s", size, str_str.c_str());
   } else {
     while (size > 0) {
       const int len = std::min(size, kMaxLogLineSize);
       // Use the size of the string in the format (str may have \0 in the
       // middle).
       __android_log_print(prio, tag, "[%d/%d] %.*s", line + 1, max_lines, len,
-                          str.c_str() + idx);
+                          str_str.c_str() + idx);
       idx += len;
       size -= len;
       ++line;
@@ -441,7 +442,7 @@
   }
 #endif  // WEBRTC_ANDROID
   if (log_to_stderr) {
-    fprintf(stderr, "%s", str.c_str());
+    fprintf(stderr, "%s", str_str.c_str());
     fflush(stderr);
   }
 }
diff --git a/rtc_base/logging.h b/rtc_base/logging.h
index ee4d410..a1339aa 100644
--- a/rtc_base/logging.h
+++ b/rtc_base/logging.h
@@ -439,7 +439,7 @@
   LogMessage(const char* file,
              int line,
              LoggingSeverity sev,
-             const std::string& tag);
+             absl::string_view tag);
   ~LogMessage();
 
   LogMessage(const LogMessage&) = delete;
@@ -485,7 +485,7 @@
   static int GetMinLogSeverity();
   // Parses the provided parameter stream to configure the options above.
   // Useful for configuring logging from the command line.
-  static void ConfigureLogging(const char* params);
+  static void ConfigureLogging(absl::string_view params);
   // Checks the current global debug severity and if the `streams_` collection
   // is empty. If `severity` is smaller than the global severity and if the
   // `streams_` collection is empty, the LogMessage will be considered a noop
@@ -516,7 +516,7 @@
   LogMessage(const char* file,
              int line,
              LoggingSeverity sev,
-             const std::string& tag) {}
+             absl::string_view tag) {}
   ~LogMessage() = default;
 
   inline void AddTag(const char* tag) {}
@@ -534,7 +534,7 @@
   inline static void RemoveLogToStream(LogSink* stream) {}
   inline static int GetLogToStream(LogSink* stream = nullptr) { return 0; }
   inline static int GetMinLogSeverity() { return 0; }
-  inline static void ConfigureLogging(const char* params) {}
+  inline static void ConfigureLogging(absl::string_view params) {}
   static constexpr bool IsNoop(LoggingSeverity severity) { return true; }
   template <LoggingSeverity S>
   static constexpr bool IsNoop() {
@@ -551,11 +551,11 @@
 
 // These write out the actual log messages.
 #if defined(WEBRTC_ANDROID)
-  static void OutputToDebug(const std::string& msg,
+  static void OutputToDebug(absl::string_view msg,
                             LoggingSeverity severity,
                             const char* tag);
 #else
-  static void OutputToDebug(const std::string& msg, LoggingSeverity severity);
+  static void OutputToDebug(absl::string_view msg, LoggingSeverity severity);
 #endif  // defined(WEBRTC_ANDROID)
 
   // Called from the dtor (or from a test) to append optional extra error
@@ -592,11 +592,11 @@
   // Next methods do nothing; no one will call these functions.
   inline static void UpdateMinLogSeverity() {}
 #if defined(WEBRTC_ANDROID)
-  inline static void OutputToDebug(const std::string& msg,
+  inline static void OutputToDebug(absl::string_view msg,
                                    LoggingSeverity severity,
                                    const char* tag) {}
 #else
-  inline static void OutputToDebug(const std::string& msg,
+  inline static void OutputToDebug(absl::string_view msg,
                                    LoggingSeverity severity) {}
 #endif  // defined(WEBRTC_ANDROID)
   inline void FinishPrintStream() {}
diff --git a/rtc_base/net_helpers.cc b/rtc_base/net_helpers.cc
index f521f0f..f092989 100644
--- a/rtc_base/net_helpers.cc
+++ b/rtc_base/net_helpers.cc
@@ -11,6 +11,9 @@
 #include "rtc_base/net_helpers.h"
 
 #include <memory>
+#include <string>
+
+#include "absl/strings/string_view.h"
 
 #if defined(WEBRTC_WIN)
 #include <ws2spi.h>
@@ -37,11 +40,12 @@
 #endif
 }
 
-int inet_pton(int af, const char* src, void* dst) {
+int inet_pton(int af, absl::string_view src, void* dst) {
+  std::string src_str = std::string(src);
 #if defined(WEBRTC_WIN)
-  return win32_inet_pton(af, src, dst);
+  return win32_inet_pton(af, src_str.c_str(), dst);
 #else
-  return ::inet_pton(af, src, dst);
+  return ::inet_pton(af, src_str.c_str(), dst);
 #endif
 }
 
diff --git a/rtc_base/net_helpers.h b/rtc_base/net_helpers.h
index 4ed8478..631c634 100644
--- a/rtc_base/net_helpers.h
+++ b/rtc_base/net_helpers.h
@@ -19,12 +19,14 @@
 #include "rtc_base/win32.h"
 #endif
 
+#include "absl/strings/string_view.h"
+
 namespace rtc {
 
 // rtc namespaced wrappers for inet_ntop and inet_pton so we can avoid
 // the windows-native versions of these.
 const char* inet_ntop(int af, const void* src, char* dst, socklen_t size);
-int inet_pton(int af, const char* src, void* dst);
+int inet_pton(int af, absl::string_view src, void* dst);
 
 bool HasIPv4Enabled();
 bool HasIPv6Enabled();
diff --git a/rtc_base/network.cc b/rtc_base/network.cc
index 0369ccc..a7b9197 100644
--- a/rtc_base/network.cc
+++ b/rtc_base/network.cc
@@ -216,7 +216,7 @@
 // result of the downstream network filtering, see e.g.
 // BasicPortAllocatorSession::GetNetworks when
 // PORTALLOCATOR_DISABLE_COSTLY_NETWORKS is turned on.
-AdapterType GetAdapterTypeFromName(const char* network_name) {
+AdapterType GetAdapterTypeFromName(absl::string_view network_name) {
   if (MatchTypeNameWithIndexPattern(network_name, "lo")) {
     // Note that we have a more robust way to determine if a network interface
     // is a loopback interface by checking the flag IFF_LOOPBACK in ifa_flags of
diff --git a/rtc_base/network.h b/rtc_base/network.h
index 04c91cc..715982c 100644
--- a/rtc_base/network.h
+++ b/rtc_base/network.h
@@ -63,7 +63,7 @@
 // Utility function that attempts to determine an adapter type by an interface
 // name (e.g., "wlan0"). Can be used by NetworkManager subclasses when other
 // mechanisms fail to determine the type.
-RTC_EXPORT AdapterType GetAdapterTypeFromName(const char* network_name);
+RTC_EXPORT AdapterType GetAdapterTypeFromName(absl::string_view network_name);
 
 class DefaultLocalAddressProvider {
  public:
diff --git a/rtc_base/openssl_adapter.cc b/rtc_base/openssl_adapter.cc
index dc9aefa..d5c51ff 100644
--- a/rtc_base/openssl_adapter.cc
+++ b/rtc_base/openssl_adapter.cc
@@ -252,11 +252,11 @@
   role_ = role;
 }
 
-int OpenSSLAdapter::StartSSL(const char* hostname) {
+int OpenSSLAdapter::StartSSL(absl::string_view hostname) {
   if (state_ != SSL_NONE)
     return -1;
 
-  ssl_host_name_ = hostname;
+  ssl_host_name_.assign(hostname.data(), hostname.size());
 
   if (GetSocket()->GetState() != Socket::CS_CONNECTED) {
     state_ = SSL_WAIT;
@@ -422,7 +422,7 @@
   return 0;
 }
 
-void OpenSSLAdapter::Error(const char* context, int err, bool signal) {
+void OpenSSLAdapter::Error(absl::string_view context, int err, bool signal) {
   RTC_LOG(LS_WARNING) << "OpenSSLAdapter::Error(" << context << ", " << err
                       << ")";
   state_ = SSL_ERROR;
diff --git a/rtc_base/openssl_adapter.h b/rtc_base/openssl_adapter.h
index 942d1fe..d5e8b9e 100644
--- a/rtc_base/openssl_adapter.h
+++ b/rtc_base/openssl_adapter.h
@@ -61,7 +61,7 @@
   void SetCertVerifier(SSLCertificateVerifier* ssl_cert_verifier) override;
   void SetIdentity(std::unique_ptr<SSLIdentity> identity) override;
   void SetRole(SSLRole role) override;
-  int StartSSL(const char* hostname) override;
+  int StartSSL(absl::string_view hostname) override;
   int Send(const void* pv, size_t cb) override;
   int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
   int Recv(void* pv, size_t cb, int64_t* timestamp) override;
@@ -110,7 +110,7 @@
 
   int BeginSSL();
   int ContinueSSL();
-  void Error(const char* context, int err, bool signal = true);
+  void Error(absl::string_view context, int err, bool signal = true);
   void Cleanup();
 
   // Return value and arguments have the same meanings as for Send; `error` is
diff --git a/rtc_base/openssl_stream_adapter.cc b/rtc_base/openssl_stream_adapter.cc
index 90870cd..94b97d7 100644
--- a/rtc_base/openssl_stream_adapter.cc
+++ b/rtc_base/openssl_stream_adapter.cc
@@ -956,7 +956,7 @@
   return 0;
 }
 
-void OpenSSLStreamAdapter::Error(const char* context,
+void OpenSSLStreamAdapter::Error(absl::string_view context,
                                  int err,
                                  uint8_t alert,
                                  bool signal) {
diff --git a/rtc_base/openssl_stream_adapter.h b/rtc_base/openssl_stream_adapter.h
index de20ba9..288ed84 100644
--- a/rtc_base/openssl_stream_adapter.h
+++ b/rtc_base/openssl_stream_adapter.h
@@ -173,7 +173,7 @@
   // `alert` indicates an alert description (one of the SSL_AD constants) to
   // send to the remote endpoint when closing the association. If 0, a normal
   // shutdown will be performed.
-  void Error(const char* context, int err, uint8_t alert, bool signal);
+  void Error(absl::string_view context, int err, uint8_t alert, bool signal);
   void Cleanup(uint8_t alert);
 
   // Flush the input buffers by reading left bytes (for DTLS)
diff --git a/rtc_base/socket_adapters.cc b/rtc_base/socket_adapters.cc
index bc7d2d8..4ec93ae 100644
--- a/rtc_base/socket_adapters.cc
+++ b/rtc_base/socket_adapters.cc
@@ -411,8 +411,9 @@
   } else if ((state_ == PS_AUTHENTICATE) &&
              absl::StartsWithIgnoreCase(data, "Proxy-Authenticate:")) {
     std::string response, auth_method;
-    switch (HttpAuthenticate(data + 19, len - 19, proxy_, "CONNECT", "/", user_,
-                             pass_, context_, response, auth_method)) {
+    switch (HttpAuthenticate(absl::string_view(data + 19, len - 19), proxy_,
+                             "CONNECT", "/", user_, pass_, context_, response,
+                             auth_method)) {
       case HAR_IGNORE:
         RTC_LOG(LS_VERBOSE) << "Ignoring Proxy-Authenticate: " << auth_method;
         if (!unknown_mechanisms_.empty())
diff --git a/rtc_base/ssl_adapter.h b/rtc_base/ssl_adapter.h
index 8f98141..4b8b9c7 100644
--- a/rtc_base/ssl_adapter.h
+++ b/rtc_base/ssl_adapter.h
@@ -14,6 +14,7 @@
 #include <string>
 #include <vector>
 
+#include "absl/strings/string_view.h"
 #include "rtc_base/async_socket.h"
 #include "rtc_base/ssl_certificate.h"
 #include "rtc_base/ssl_identity.h"
@@ -89,7 +90,7 @@
   // StartSSL returns 0 if successful.
   // If StartSSL is called while the socket is closed or connecting, the SSL
   // negotiation will begin as soon as the socket connects.
-  virtual int StartSSL(const char* hostname) = 0;
+  virtual int StartSSL(absl::string_view hostname) = 0;
 
   // When an SSLAdapterFactory is used, an SSLAdapter may be used to resume
   // a previous SSL session, which results in an abbreviated handshake.
diff --git a/rtc_base/ssl_adapter_unittest.cc b/rtc_base/ssl_adapter_unittest.cc
index 430343e..cd63249 100644
--- a/rtc_base/ssl_adapter_unittest.cc
+++ b/rtc_base/ssl_adapter_unittest.cc
@@ -110,7 +110,7 @@
       RTC_LOG(LS_INFO) << "Starting " << GetSSLProtocolName(ssl_mode_)
                        << " handshake with " << hostname;
 
-      if (ssl_adapter_->StartSSL(std::string(hostname).c_str()) != 0) {
+      if (ssl_adapter_->StartSSL(hostname) != 0) {
         return -1;
       }
     }
diff --git a/rtc_base/ssl_stream_adapter_unittest.cc b/rtc_base/ssl_stream_adapter_unittest.cc
index 262eeef..f26166f 100644
--- a/rtc_base/ssl_stream_adapter_unittest.cc
+++ b/rtc_base/ssl_stream_adapter_unittest.cc
@@ -685,7 +685,7 @@
       return server_ssl_->GetSslVersion();
   }
 
-  bool ExportKeyingMaterial(const char* label,
+  bool ExportKeyingMaterial(absl::string_view label,
                             const unsigned char* context,
                             size_t context_len,
                             bool use_context,
diff --git a/rtc_base/system/BUILD.gn b/rtc_base/system/BUILD.gn
index 87b2d9d..a34a151 100644
--- a/rtc_base/system/BUILD.gn
+++ b/rtc_base/system/BUILD.gn
@@ -30,6 +30,7 @@
     "..:criticalsection",
     "..:safe_conversions",
   ]
+  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
 }
 
 if (rtc_include_tests) {
diff --git a/rtc_base/system/file_wrapper.cc b/rtc_base/system/file_wrapper.cc
index 3e49315..1979e6f 100644
--- a/rtc_base/system/file_wrapper.cc
+++ b/rtc_base/system/file_wrapper.cc
@@ -9,10 +9,12 @@
  */
 
 #include "rtc_base/system/file_wrapper.h"
-#include "rtc_base/numerics/safe_conversions.h"
 
 #include <cerrno>
 
+#include "absl/strings/string_view.h"
+#include "rtc_base/numerics/safe_conversions.h"
+
 #ifdef _WIN32
 #include <Windows.h>
 #else
@@ -23,14 +25,17 @@
 
 namespace webrtc {
 namespace {
-FILE* FileOpen(const char* file_name_utf8, bool read_only, int* error) {
+FILE* FileOpen(absl::string_view file_name_utf8, bool read_only, int* error) {
+  RTC_CHECK_EQ(file_name_utf8.find_first_of('\0'), absl::string_view::npos)
+      << "Invalid filename, containing NUL character";
+  std::string file_name = std::string(file_name_utf8);
 #if defined(_WIN32)
-  int len = MultiByteToWideChar(CP_UTF8, 0, file_name_utf8, -1, nullptr, 0);
+  int len = MultiByteToWideChar(CP_UTF8, 0, file_name.c_str(), -1, nullptr, 0);
   std::wstring wstr(len, 0);
-  MultiByteToWideChar(CP_UTF8, 0, file_name_utf8, -1, &wstr[0], len);
+  MultiByteToWideChar(CP_UTF8, 0, file_name.c_str(), -1, &wstr[0], len);
   FILE* file = _wfopen(wstr.c_str(), read_only ? L"rb" : L"wb");
 #else
-  FILE* file = fopen(file_name_utf8, read_only ? "rb" : "wb");
+  FILE* file = fopen(file_name.c_str(), read_only ? "rb" : "wb");
 #endif
   if (!file && error) {
     *error = errno;
@@ -38,36 +43,19 @@
   return file;
 }
 
-const char* GetCstrCheckNoEmbeddedNul(const std::string& s) {
-  const char* p = s.c_str();
-  RTC_CHECK_EQ(strlen(p), s.size())
-      << "Invalid filename, containing NUL character";
-  return p;
-}
 }  // namespace
 
 // static
-FileWrapper FileWrapper::OpenReadOnly(const char* file_name_utf8) {
+FileWrapper FileWrapper::OpenReadOnly(absl::string_view file_name_utf8) {
   return FileWrapper(FileOpen(file_name_utf8, true, nullptr));
 }
 
 // static
-FileWrapper FileWrapper::OpenReadOnly(const std::string& file_name_utf8) {
-  return OpenReadOnly(GetCstrCheckNoEmbeddedNul(file_name_utf8));
-}
-
-// static
-FileWrapper FileWrapper::OpenWriteOnly(const char* file_name_utf8,
+FileWrapper FileWrapper::OpenWriteOnly(absl::string_view file_name_utf8,
                                        int* error /*=nullptr*/) {
   return FileWrapper(FileOpen(file_name_utf8, false, error));
 }
 
-// static
-FileWrapper FileWrapper::OpenWriteOnly(const std::string& file_name_utf8,
-                                       int* error /*=nullptr*/) {
-  return OpenWriteOnly(GetCstrCheckNoEmbeddedNul(file_name_utf8), error);
-}
-
 FileWrapper::FileWrapper(FileWrapper&& other) {
   operator=(std::move(other));
 }
diff --git a/rtc_base/system/file_wrapper.h b/rtc_base/system/file_wrapper.h
index b55b0b9..5e1e3d6 100644
--- a/rtc_base/system/file_wrapper.h
+++ b/rtc_base/system/file_wrapper.h
@@ -16,6 +16,8 @@
 
 #include <string>
 
+#include "absl/strings/string_view.h"
+
 // Implementation that can read (exclusive) or write from/to a file.
 
 namespace webrtc {
@@ -34,11 +36,8 @@
   // returned object to check if the open operation was successful. On failure,
   // and if `error` is non-null, the system errno value is stored at |*error|.
   // The file is closed by the destructor.
-  static FileWrapper OpenReadOnly(const char* file_name_utf8);
-  static FileWrapper OpenReadOnly(const std::string& file_name_utf8);
-  static FileWrapper OpenWriteOnly(const char* file_name_utf8,
-                                   int* error = nullptr);
-  static FileWrapper OpenWriteOnly(const std::string& file_name_utf8,
+  static FileWrapper OpenReadOnly(absl::string_view file_name_utf8);
+  static FileWrapper OpenWriteOnly(absl::string_view file_name_utf8,
                                    int* error = nullptr);
 
   FileWrapper() = default;
diff --git a/test/test_main_lib.cc b/test/test_main_lib.cc
index ea3b714..839f76c 100644
--- a/test/test_main_lib.cc
+++ b/test/test_main_lib.cc
@@ -201,7 +201,7 @@
     const bool capture_events = !trace_event_path.empty();
     if (capture_events) {
       rtc::tracing::SetupInternalTracer();
-      rtc::tracing::StartInternalCapture(trace_event_path.c_str());
+      rtc::tracing::StartInternalCapture(trace_event_path);
     }
 
     absl::optional<std::vector<std::string>> metrics_to_plot =
diff --git a/video/rtp_video_stream_receiver2_unittest.cc b/video/rtp_video_stream_receiver2_unittest.cc
index 0624762..360fbdd 100644
--- a/video/rtp_video_stream_receiver2_unittest.cc
+++ b/video/rtp_video_stream_receiver2_unittest.cc
@@ -356,7 +356,7 @@
 
 TEST_F(RtpVideoStreamReceiver2Test, GenericKeyFrame) {
   RtpPacketReceived rtp_packet;
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetPayloadType(kPayloadType);
   rtp_packet.SetSequenceNumber(1);
   RTPVideoHeader video_header =
@@ -376,7 +376,7 @@
   extension_map.Register<AbsoluteCaptureTimeExtension>(kId0);
   RtpPacketReceived rtp_packet(&extension_map);
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetSequenceNumber(1);
   rtp_packet.SetTimestamp(1);
   rtp_packet.SetSsrc(kSsrc);
@@ -407,7 +407,7 @@
   RtpPacketReceived rtp_packet(&extension_map);
   rtp_packet.SetPayloadType(kPayloadType);
 
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   uint16_t sequence_number = 1;
   uint32_t rtp_timestamp = 1;
   rtp_packet.SetSequenceNumber(sequence_number);
@@ -485,7 +485,7 @@
 TEST_F(RtpVideoStreamReceiver2Test, GenericKeyFrameBitstreamError) {
   RtpPacketReceived rtp_packet;
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetSequenceNumber(1);
   RTPVideoHeader video_header =
       GetGenericVideoHeader(VideoFrameType::kVideoFrameKey);
@@ -587,7 +587,7 @@
   video_header.is_last_packet_in_frame = true;
   video_header.codec = kVideoCodecH264;
   video_header.frame_type = VideoFrameType::kVideoFrameKey;
-  rtc::CopyOnWriteBuffer data({1, 2, 3});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3'});
   mock_on_complete_frame_callback_.AppendExpectedBitstream(
       kH264StartCode, sizeof(kH264StartCode));
   mock_on_complete_frame_callback_.AppendExpectedBitstream(data.data(),
@@ -669,7 +669,7 @@
 TEST_F(RtpVideoStreamReceiver2Test, PaddingInMediaStream) {
   RtpPacketReceived rtp_packet;
   RTPVideoHeader video_header = GetDefaultH264VideoHeader();
-  rtc::CopyOnWriteBuffer data({1, 2, 3});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3'});
   rtp_packet.SetPayloadType(kPayloadType);
   rtp_packet.SetSequenceNumber(2);
   video_header.is_first_packet_in_frame = true;
@@ -706,7 +706,7 @@
 TEST_F(RtpVideoStreamReceiver2Test, RequestKeyframeIfFirstFrameIsDelta) {
   RtpPacketReceived rtp_packet;
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetSequenceNumber(1);
   RTPVideoHeader video_header =
       GetGenericVideoHeader(VideoFrameType::kVideoFrameDelta);
@@ -720,7 +720,7 @@
 
   RtpPacketReceived rtp_packet;
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   RTPVideoHeader video_header =
       GetGenericVideoHeader(VideoFrameType::kVideoFrameDelta);
   // Incomplete frames so that the packet buffer is filling up.
@@ -1125,7 +1125,7 @@
 
   RtpPacketReceived rtp_packet;
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetSequenceNumber(1);
   RTPVideoHeader video_header =
       GetGenericVideoHeader(VideoFrameType::kVideoFrameKey);
@@ -1165,7 +1165,7 @@
                          Values(kDefaultBehavior, kOverridePlayoutDelay));
 
 TEST_P(RtpVideoStreamReceiver2TestPlayoutDelay, PlayoutDelay) {
-  rtc::CopyOnWriteBuffer payload_data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer payload_data({'1', '2', '3', '4'});
   RtpHeaderExtensionMap extension_map;
   extension_map.Register<PlayoutDelayLimits>(1);
   RtpPacketToSend packet_to_send(&extension_map);
diff --git a/video/rtp_video_stream_receiver_unittest.cc b/video/rtp_video_stream_receiver_unittest.cc
index 0dc8075..c765c91 100644
--- a/video/rtp_video_stream_receiver_unittest.cc
+++ b/video/rtp_video_stream_receiver_unittest.cc
@@ -337,7 +337,7 @@
 
 TEST_F(RtpVideoStreamReceiverTest, GenericKeyFrame) {
   RtpPacketReceived rtp_packet;
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetPayloadType(kPayloadType);
   rtp_packet.SetSequenceNumber(1);
   RTPVideoHeader video_header =
@@ -357,7 +357,7 @@
   extension_map.Register<AbsoluteCaptureTimeExtension>(kId0);
   RtpPacketReceived rtp_packet(&extension_map);
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetSequenceNumber(1);
   rtp_packet.SetTimestamp(1);
   rtp_packet.SetSsrc(kSsrc);
@@ -388,7 +388,7 @@
   RtpPacketReceived rtp_packet(&extension_map);
   rtp_packet.SetPayloadType(kPayloadType);
 
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   uint16_t sequence_number = 1;
   uint32_t rtp_timestamp = 1;
   rtp_packet.SetSequenceNumber(sequence_number);
@@ -465,7 +465,7 @@
 TEST_F(RtpVideoStreamReceiverTest, GenericKeyFrameBitstreamError) {
   RtpPacketReceived rtp_packet;
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetSequenceNumber(1);
   RTPVideoHeader video_header =
       GetGenericVideoHeader(VideoFrameType::kVideoFrameKey);
@@ -567,7 +567,7 @@
   video_header.is_last_packet_in_frame = true;
   video_header.codec = kVideoCodecH264;
   video_header.frame_type = VideoFrameType::kVideoFrameKey;
-  rtc::CopyOnWriteBuffer data({1, 2, 3});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3'});
   mock_on_complete_frame_callback_.AppendExpectedBitstream(
       kH264StartCode, sizeof(kH264StartCode));
   mock_on_complete_frame_callback_.AppendExpectedBitstream(data.data(),
@@ -649,7 +649,7 @@
 TEST_F(RtpVideoStreamReceiverTest, PaddingInMediaStream) {
   RtpPacketReceived rtp_packet;
   RTPVideoHeader video_header = GetDefaultH264VideoHeader();
-  rtc::CopyOnWriteBuffer data({1, 2, 3});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3'});
   rtp_packet.SetPayloadType(kPayloadType);
   rtp_packet.SetSequenceNumber(2);
   video_header.is_first_packet_in_frame = true;
@@ -686,7 +686,7 @@
 TEST_F(RtpVideoStreamReceiverTest, RequestKeyframeIfFirstFrameIsDelta) {
   RtpPacketReceived rtp_packet;
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetSequenceNumber(1);
   RTPVideoHeader video_header =
       GetGenericVideoHeader(VideoFrameType::kVideoFrameDelta);
@@ -700,7 +700,7 @@
 
   RtpPacketReceived rtp_packet;
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   RTPVideoHeader video_header =
       GetGenericVideoHeader(VideoFrameType::kVideoFrameDelta);
   // Incomplete frames so that the packet buffer is filling up.
@@ -1164,7 +1164,7 @@
 
   RtpPacketReceived rtp_packet;
   rtp_packet.SetPayloadType(kPayloadType);
-  rtc::CopyOnWriteBuffer data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer data({'1', '2', '3', '4'});
   rtp_packet.SetSequenceNumber(1);
   RTPVideoHeader video_header =
       GetGenericVideoHeader(VideoFrameType::kVideoFrameKey);
@@ -1204,7 +1204,7 @@
                          Values(kDefaultBehavior, kOverridePlayoutDelay));
 
 TEST_P(RtpVideoStreamReceiverTestPlayoutDelay, PlayoutDelay) {
-  rtc::CopyOnWriteBuffer payload_data({1, 2, 3, 4});
+  rtc::CopyOnWriteBuffer payload_data({'1', '2', '3', '4'});
   RtpHeaderExtensionMap extension_map;
   extension_map.Register<PlayoutDelayLimits>(1);
   RtpPacketToSend packet_to_send(&extension_map);