Use Abseil container algorithms in pc/

Bug: None
Change-Id: If784461b54d95bdc6f8a7d4e5d1bbfa52d1a390e
Reviewed-on: https://webrtc-review.googlesource.com/c/119862
Commit-Queue: Steve Anton <steveanton@webrtc.org>
Reviewed-by: Amit Hilbuch <amithi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26433}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 8dab052..87d7bd3 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -95,6 +95,7 @@
     "../rtc_base/third_party/base64",
     "../rtc_base/third_party/sigslot",
     "../system_wrappers:metrics",
+    "//third_party/abseil-cpp/absl/algorithm:container",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/types:optional",
@@ -219,6 +220,7 @@
     "../system_wrappers",
     "../system_wrappers:field_trial",
     "../system_wrappers:metrics",
+    "//third_party/abseil-cpp/absl/algorithm:container",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/types:optional",
@@ -294,6 +296,7 @@
       "../rtc_base/third_party/sigslot",
       "../system_wrappers:metrics",
       "../test:test_support",
+      "//third_party/abseil-cpp/absl/algorithm:container",
       "//third_party/abseil-cpp/absl/memory",
     ]
 
@@ -523,6 +526,7 @@
       "../rtc_base/third_party/sigslot:sigslot",
       "../system_wrappers:metrics",
       "../test:fileutils",
+      "//third_party/abseil-cpp/absl/algorithm:container",
       "//third_party/abseil-cpp/absl/memory",
       "//third_party/abseil-cpp/absl/strings",
     ]
diff --git a/pc/channel.cc b/pc/channel.cc
index 049e950..e5b6bb0 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -8,12 +8,12 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include <algorithm>
 #include <iterator>
 #include <utility>
 
 #include "pc/channel.h"
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "api/call/audio_sink.h"
 #include "media/base/media_constants.h"
@@ -746,11 +746,10 @@
   RTC_DCHECK(rtp_transport_);
   if (crypto_options_.srtp.enable_encrypted_rtp_header_extensions) {
     RtpHeaderExtensions filtered;
-    auto pred = [](const webrtc::RtpExtension& extension) {
-      return !extension.encrypt;
-    };
-    std::copy_if(extensions.begin(), extensions.end(),
-                 std::back_inserter(filtered), pred);
+    absl::c_copy_if(extensions, std::back_inserter(filtered),
+                    [](const webrtc::RtpExtension& extension) {
+                      return !extension.encrypt;
+                    });
     return filtered;
   }
 
diff --git a/pc/channel_manager.cc b/pc/channel_manager.cc
index f5798a2..49da430 100644
--- a/pc/channel_manager.cc
+++ b/pc/channel_manager.cc
@@ -10,9 +10,9 @@
 
 #include "pc/channel_manager.h"
 
-#include <algorithm>
 #include <utility>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "absl/strings/match.h"
 #include "media/base/media_constants.h"
@@ -211,10 +211,10 @@
 
   RTC_DCHECK(initialized_);
 
-  auto it = std::find_if(voice_channels_.begin(), voice_channels_.end(),
-                         [&](const std::unique_ptr<VoiceChannel>& p) {
-                           return p.get() == voice_channel;
-                         });
+  auto it = absl::c_find_if(voice_channels_,
+                            [&](const std::unique_ptr<VoiceChannel>& p) {
+                              return p.get() == voice_channel;
+                            });
   RTC_DCHECK(it != voice_channels_.end());
   if (it == voice_channels_.end()) {
     return;
@@ -280,10 +280,10 @@
 
   RTC_DCHECK(initialized_);
 
-  auto it = std::find_if(video_channels_.begin(), video_channels_.end(),
-                         [&](const std::unique_ptr<VideoChannel>& p) {
-                           return p.get() == video_channel;
-                         });
+  auto it = absl::c_find_if(video_channels_,
+                            [&](const std::unique_ptr<VideoChannel>& p) {
+                              return p.get() == video_channel;
+                            });
   RTC_DCHECK(it != video_channels_.end());
   if (it == video_channels_.end()) {
     return;
@@ -340,10 +340,10 @@
 
   RTC_DCHECK(initialized_);
 
-  auto it = std::find_if(data_channels_.begin(), data_channels_.end(),
-                         [&](const std::unique_ptr<RtpDataChannel>& p) {
-                           return p.get() == data_channel;
-                         });
+  auto it = absl::c_find_if(data_channels_,
+                            [&](const std::unique_ptr<RtpDataChannel>& p) {
+                              return p.get() == data_channel;
+                            });
   RTC_DCHECK(it != data_channels_.end());
   if (it == data_channels_.end()) {
     return;
diff --git a/pc/jsep_transport_controller.cc b/pc/jsep_transport_controller.cc
index fa0aa7d..7020c6c 100644
--- a/pc/jsep_transport_controller.cc
+++ b/pc/jsep_transport_controller.cc
@@ -10,10 +10,10 @@
 
 #include "pc/jsep_transport_controller.h"
 
-#include <algorithm>
 #include <memory>
 #include <utility>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "p2p/base/ice_transport_internal.h"
 #include "p2p/base/no_op_dtls_transport.h"
@@ -885,9 +885,7 @@
     if (!extension.encrypt) {
       continue;
     }
-    auto it = std::find(encrypted_header_extension_ids.begin(),
-                        encrypted_header_extension_ids.end(), extension.id);
-    if (it == encrypted_header_extension_ids.end()) {
+    if (!absl::c_linear_search(encrypted_header_extension_ids, extension.id)) {
       encrypted_header_extension_ids.push_back(extension.id);
     }
   }
@@ -907,8 +905,7 @@
       std::vector<int> extension_ids =
           GetEncryptedHeaderExtensionIds(content_info);
       for (int id : extension_ids) {
-        auto it = std::find(merged_ids.begin(), merged_ids.end(), id);
-        if (it == merged_ids.end()) {
+        if (!absl::c_linear_search(merged_ids, id)) {
           merged_ids.push_back(id);
         }
       }
diff --git a/pc/media_session.cc b/pc/media_session.cc
index e840b33..e18c86a 100644
--- a/pc/media_session.cc
+++ b/pc/media_session.cc
@@ -10,7 +10,6 @@
 
 #include "pc/media_session.h"
 
-#include <algorithm>  // For std::find_if, std::sort.
 #include <functional>
 #include <map>
 #include <memory>
@@ -18,6 +17,7 @@
 #include <unordered_map>
 #include <utility>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "absl/strings/match.h"
 #include "absl/types/optional.h"
@@ -185,9 +185,8 @@
 bool FindMatchingCrypto(const CryptoParamsVec& cryptos,
                         const CryptoParams& crypto,
                         CryptoParams* crypto_out) {
-  auto it = std::find_if(
-      cryptos.begin(), cryptos.end(),
-      [&crypto](const CryptoParams& c) { return crypto.Matches(c); });
+  auto it = absl::c_find_if(
+      cryptos, [&crypto](const CryptoParams& c) { return crypto.Matches(c); });
   if (it == cryptos.end()) {
     return false;
   }
@@ -417,14 +416,12 @@
 static bool ValidateSimulcastLayers(
     const std::vector<RidDescription>& rids,
     const SimulcastLayerList& simulcast_layers) {
-  std::vector<SimulcastLayer> all_layers = simulcast_layers.GetAllLayers();
-  return std::all_of(all_layers.begin(), all_layers.end(),
-                     [&rids](const SimulcastLayer& layer) {
-                       return std::find_if(rids.begin(), rids.end(),
-                                           [&layer](const RidDescription& rid) {
-                                             return rid.rid == layer.rid;
-                                           }) != rids.end();
-                     });
+  return absl::c_all_of(
+      simulcast_layers.GetAllLayers(), [&rids](const SimulcastLayer& layer) {
+        return absl::c_any_of(rids, [&layer](const RidDescription& rid) {
+          return rid.rid == layer.rid;
+        });
+      });
 }
 
 static StreamParams CreateStreamParamsForNewSenderWithRids(
@@ -455,9 +452,9 @@
   RTC_DCHECK(description);
 
   // Check if we are using RIDs in this scenario.
-  if (std::all_of(
-          description->streams().begin(), description->streams().end(),
-          [](const StreamParams& params) { return !params.has_rids(); })) {
+  if (absl::c_all_of(description->streams(), [](const StreamParams& params) {
+        return !params.has_rids();
+      })) {
     return;
   }
 
@@ -833,11 +830,10 @@
   for (const C& codec : offered_codecs) {
     payload_type_preferences[codec.id] = preference--;
   }
-  std::sort(negotiated_codecs->begin(), negotiated_codecs->end(),
-            [&payload_type_preferences](const C& a, const C& b) {
-              return payload_type_preferences[a.id] >
-                     payload_type_preferences[b.id];
-            });
+  absl::c_sort(
+      *negotiated_codecs, [&payload_type_preferences](const C& a, const C& b) {
+        return payload_type_preferences[a.id] > payload_type_preferences[b.id];
+      });
 }
 
 // Finds a codec in |codecs2| that matches |codec_to_match|, which is
@@ -850,10 +846,9 @@
                               C* found_codec) {
   // |codec_to_match| should be a member of |codecs1|, in order to look up RTX
   // codecs' associated codecs correctly. If not, that's a programming error.
-  RTC_DCHECK(std::find_if(codecs1.begin(), codecs1.end(),
-                          [&codec_to_match](const C& codec) {
-                            return &codec == &codec_to_match;
-                          }) != codecs1.end());
+  RTC_DCHECK(absl::c_any_of(codecs1, [&codec_to_match](const C& codec) {
+    return &codec == &codec_to_match;
+  }));
   for (const C& potential_match : codecs2) {
     if (potential_match.Matches(codec_to_match)) {
       if (IsRtxCodec(codec_to_match)) {
@@ -960,14 +955,13 @@
 static bool FindByUriAndEncryption(const RtpHeaderExtensions& extensions,
                                    const webrtc::RtpExtension& ext_to_match,
                                    webrtc::RtpExtension* found_extension) {
-  auto it =
-      std::find_if(extensions.begin(), extensions.end(),
-                   [&ext_to_match](const webrtc::RtpExtension& extension) {
-                     // We assume that all URIs are given in a canonical
-                     // format.
-                     return extension.uri == ext_to_match.uri &&
-                            extension.encrypt == ext_to_match.encrypt;
-                   });
+  auto it = absl::c_find_if(
+      extensions, [&ext_to_match](const webrtc::RtpExtension& extension) {
+        // We assume that all URIs are given in a canonical
+        // format.
+        return extension.uri == ext_to_match.uri &&
+               extension.encrypt == ext_to_match.encrypt;
+      });
   if (it == extensions.end()) {
     return false;
   }
@@ -1303,11 +1297,9 @@
 }
 
 bool MediaSessionOptions::HasMediaDescription(MediaType type) const {
-  return std::find_if(media_description_options.begin(),
-                      media_description_options.end(),
-                      [type](const MediaDescriptionOptions& t) {
-                        return t.type == type;
-                      }) != media_description_options.end();
+  return absl::c_any_of(
+      media_description_options,
+      [type](const MediaDescriptionOptions& t) { return t.type == type; });
 }
 
 MediaSessionDescriptionFactory::MediaSessionDescriptionFactory(
diff --git a/pc/media_session.h b/pc/media_session.h
index 54fa7da..a459c4c 100644
--- a/pc/media_session.h
+++ b/pc/media_session.h
@@ -13,7 +13,6 @@
 #ifndef PC_MEDIA_SESSION_H_
 #define PC_MEDIA_SESSION_H_
 
-#include <algorithm>
 #include <map>
 #include <memory>
 #include <string>
diff --git a/pc/media_session_unittest.cc b/pc/media_session_unittest.cc
index d1a151f..534e4fc 100644
--- a/pc/media_session_unittest.cc
+++ b/pc/media_session_unittest.cc
@@ -13,6 +13,7 @@
 #include <string>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "media/base/codec.h"
 #include "media/base/test_utils.h"
@@ -81,6 +82,7 @@
 using rtc::CS_AES_CM_128_HMAC_SHA1_32;
 using rtc::CS_AES_CM_128_HMAC_SHA1_80;
 using rtc::UniqueRandomIdGenerator;
+using testing::Contains;
 using testing::Each;
 using testing::ElementsAreArray;
 using testing::Eq;
@@ -88,6 +90,7 @@
 using testing::IsEmpty;
 using testing::IsFalse;
 using testing::Ne;
+using testing::Not;
 using testing::Pointwise;
 using testing::SizeIs;
 using webrtc::RtpExtension;
@@ -275,18 +278,16 @@
 std::vector<MediaDescriptionOptions>::iterator FindFirstMediaDescriptionByMid(
     const std::string& mid,
     MediaSessionOptions* opts) {
-  return std::find_if(
-      opts->media_description_options.begin(),
-      opts->media_description_options.end(),
+  return absl::c_find_if(
+      opts->media_description_options,
       [&mid](const MediaDescriptionOptions& t) { return t.mid == mid; });
 }
 
 std::vector<MediaDescriptionOptions>::const_iterator
 FindFirstMediaDescriptionByMid(const std::string& mid,
                                const MediaSessionOptions& opts) {
-  return std::find_if(
-      opts.media_description_options.begin(),
-      opts.media_description_options.end(),
+  return absl::c_find_if(
+      opts.media_description_options,
       [&mid](const MediaDescriptionOptions& t) { return t.mid == mid; });
 }
 
@@ -360,10 +361,10 @@
   std::vector<cricket::SenderOptions>& sender_options_list =
       FindFirstMediaDescriptionByMid(mid, session_options)->sender_options;
   auto sender_it =
-      std::find_if(sender_options_list.begin(), sender_options_list.end(),
-                   [track_id](const cricket::SenderOptions& sender_options) {
-                     return sender_options.track_id == track_id;
-                   });
+      absl::c_find_if(sender_options_list,
+                      [track_id](const cricket::SenderOptions& sender_options) {
+                        return sender_options.track_id == track_id;
+                      });
   RTC_DCHECK(sender_it != sender_options_list.end());
   sender_options_list.erase(sender_it);
 }
@@ -442,11 +443,8 @@
   // Returns true if the transport info contains "renomination" as an
   // ICE option.
   bool GetIceRenomination(const TransportInfo* transport_info) {
-    const std::vector<std::string>& ice_options =
-        transport_info->description.transport_options;
-    auto iter =
-        std::find(ice_options.begin(), ice_options.end(), "renomination");
-    return iter != ice_options.end();
+    return absl::c_linear_search(transport_info->description.transport_options,
+                                 "renomination");
   }
 
   void TestTransportInfo(bool offer,
@@ -2741,10 +2739,9 @@
   std::unique_ptr<SessionDescription> answer =
       f2_.CreateAnswer(offer.get(), opts, NULL);
 
-  std::vector<std::string> codec_names =
-      GetCodecNames(GetFirstVideoContentDescription(answer.get())->codecs());
-  EXPECT_EQ(codec_names.end(), std::find(codec_names.begin(), codec_names.end(),
-                                         cricket::kRtxCodecName));
+  EXPECT_THAT(
+      GetCodecNames(GetFirstVideoContentDescription(answer.get())->codecs()),
+      Not(Contains(cricket::kRtxCodecName)));
 }
 
 // Test that RTX will be filtered out in the answer if its associated payload
@@ -2771,10 +2768,9 @@
   std::unique_ptr<SessionDescription> answer =
       f2_.CreateAnswer(offer.get(), opts, NULL);
 
-  std::vector<std::string> codec_names =
-      GetCodecNames(GetFirstVideoContentDescription(answer.get())->codecs());
-  EXPECT_EQ(codec_names.end(), std::find(codec_names.begin(), codec_names.end(),
-                                         cricket::kRtxCodecName));
+  EXPECT_THAT(
+      GetCodecNames(GetFirstVideoContentDescription(answer.get())->codecs()),
+      Not(Contains(cricket::kRtxCodecName)));
 }
 
 // Test that when multiple RTX codecs are offered, only the matched RTX codec
@@ -4121,16 +4117,10 @@
   cricket::RtpHeaderExtensions result = sf.video_rtp_header_extensions();
   // Check to see that RID extensions were added to the extension list
   EXPECT_GE(result.size(), 2u);
-  auto rid_extension = std::find_if(
-      result.begin(), result.end(), [](const RtpExtension& extension) {
-        return extension.uri == webrtc::RtpExtension::kRidUri;
-      });
-  EXPECT_NE(rid_extension, extensions.end());
-  auto repaired_rid_extension = std::find_if(
-      result.begin(), result.end(), [](const RtpExtension& extension) {
-        return extension.uri == webrtc::RtpExtension::kRepairedRidUri;
-      });
-  EXPECT_NE(repaired_rid_extension, extensions.end());
+  EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
+                                     RtpExtension::kRidUri)));
+  EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
+                                     RtpExtension::kRepairedRidUri)));
 }
 
 // Checks that the RID extensions are added to the audio RTP header extensions.
@@ -4147,16 +4137,10 @@
   cricket::RtpHeaderExtensions result = sf.audio_rtp_header_extensions();
   // Check to see that RID extensions were added to the extension list
   EXPECT_GE(result.size(), 2u);
-  auto rid_extension = std::find_if(
-      result.begin(), result.end(), [](const RtpExtension& extension) {
-        return extension.uri == webrtc::RtpExtension::kRidUri;
-      });
-  EXPECT_NE(rid_extension, extensions.end());
-  auto repaired_rid_extension = std::find_if(
-      result.begin(), result.end(), [](const RtpExtension& extension) {
-        return extension.uri == webrtc::RtpExtension::kRepairedRidUri;
-      });
-  EXPECT_NE(repaired_rid_extension, extensions.end());
+  EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
+                                     RtpExtension::kRidUri)));
+  EXPECT_THAT(result, Contains(Field("uri", &RtpExtension::uri,
+                                     RtpExtension::kRepairedRidUri)));
 }
 
 namespace {
diff --git a/pc/media_stream_observer.cc b/pc/media_stream_observer.cc
index e3ef3c7..e66634a 100644
--- a/pc/media_stream_observer.cc
+++ b/pc/media_stream_observer.cc
@@ -10,10 +10,11 @@
 
 #include "pc/media_stream_observer.h"
 
-#include <algorithm>
 #include <string>
 #include <vector>
 
+#include "absl/algorithm/container.h"
+
 namespace webrtc {
 
 MediaStreamObserver::MediaStreamObserver(MediaStreamInterface* stream)
@@ -33,48 +34,44 @@
 
   // Find removed audio tracks.
   for (const auto& cached_track : cached_audio_tracks_) {
-    auto it = std::find_if(
-        new_audio_tracks.begin(), new_audio_tracks.end(),
-        [cached_track](const AudioTrackVector::value_type& new_track) {
-          return new_track->id().compare(cached_track->id()) == 0;
-        });
-    if (it == new_audio_tracks.end()) {
+    if (absl::c_none_of(
+            new_audio_tracks,
+            [cached_track](const AudioTrackVector::value_type& new_track) {
+              return new_track->id() == cached_track->id();
+            })) {
       SignalAudioTrackRemoved(cached_track.get(), stream_);
     }
   }
 
   // Find added audio tracks.
   for (const auto& new_track : new_audio_tracks) {
-    auto it = std::find_if(
-        cached_audio_tracks_.begin(), cached_audio_tracks_.end(),
-        [new_track](const AudioTrackVector::value_type& cached_track) {
-          return new_track->id().compare(cached_track->id()) == 0;
-        });
-    if (it == cached_audio_tracks_.end()) {
+    if (absl::c_none_of(
+            cached_audio_tracks_,
+            [new_track](const AudioTrackVector::value_type& cached_track) {
+              return new_track->id() == cached_track->id();
+            })) {
       SignalAudioTrackAdded(new_track.get(), stream_);
     }
   }
 
   // Find removed video tracks.
   for (const auto& cached_track : cached_video_tracks_) {
-    auto it = std::find_if(
-        new_video_tracks.begin(), new_video_tracks.end(),
-        [cached_track](const VideoTrackVector::value_type& new_track) {
-          return new_track->id().compare(cached_track->id()) == 0;
-        });
-    if (it == new_video_tracks.end()) {
+    if (absl::c_none_of(
+            new_video_tracks,
+            [cached_track](const VideoTrackVector::value_type& new_track) {
+              return new_track->id() == cached_track->id();
+            })) {
       SignalVideoTrackRemoved(cached_track.get(), stream_);
     }
   }
 
   // Find added video tracks.
   for (const auto& new_track : new_video_tracks) {
-    auto it = std::find_if(
-        cached_video_tracks_.begin(), cached_video_tracks_.end(),
-        [new_track](const VideoTrackVector::value_type& cached_track) {
-          return new_track->id().compare(cached_track->id()) == 0;
-        });
-    if (it == cached_video_tracks_.end()) {
+    if (absl::c_none_of(
+            cached_video_tracks_,
+            [new_track](const VideoTrackVector::value_type& cached_track) {
+              return new_track->id() == cached_track->id();
+            })) {
       SignalVideoTrackAdded(new_track.get(), stream_);
     }
   }
diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc
index 393526d..22cd60a 100644
--- a/pc/peer_connection.cc
+++ b/pc/peer_connection.cc
@@ -17,6 +17,7 @@
 #include <utility>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "absl/strings/match.h"
 #include "api/jsep_ice_candidate.h"
@@ -4828,8 +4829,7 @@
   auto it = rtp_data_channels_.begin();
   while (it != rtp_data_channels_.end()) {
     DataChannel* data_channel = it->second;
-    if (std::find(active_channels.begin(), active_channels.end(),
-                  data_channel->label()) != active_channels.end()) {
+    if (absl::c_linear_search(active_channels, data_channel->label())) {
       ++it;
       continue;
     }
diff --git a/pc/peer_connection_integrationtest.cc b/pc/peer_connection_integrationtest.cc
index c28f0de..54af495 100644
--- a/pc/peer_connection_integrationtest.cc
+++ b/pc/peer_connection_integrationtest.cc
@@ -14,7 +14,6 @@
 
 #include <stdio.h>
 
-#include <algorithm>
 #include <functional>
 #include <list>
 #include <map>
@@ -22,6 +21,7 @@
 #include <utility>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "api/audio_codecs/builtin_audio_decoder_factory.h"
 #include "api/audio_codecs/builtin_audio_encoder_factory.h"
@@ -78,9 +78,10 @@
 using ::rtc::SocketAddress;
 using ::testing::_;
 using ::testing::Combine;
+using ::testing::Contains;
 using ::testing::ElementsAre;
-using ::testing::Return;
 using ::testing::NiceMock;
+using ::testing::Return;
 using ::testing::SetArgPointee;
 using ::testing::UnorderedElementsAreArray;
 using ::testing::Values;
@@ -1639,18 +1640,16 @@
   EXPECT_EQ(2U, callee()->rtp_receiver_observers().size());
   // Wait for all "first packet received" callbacks to be fired.
   EXPECT_TRUE_WAIT(
-      std::all_of(caller()->rtp_receiver_observers().begin(),
-                  caller()->rtp_receiver_observers().end(),
-                  [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
-                    return o->first_packet_received();
-                  }),
+      absl::c_all_of(caller()->rtp_receiver_observers(),
+                     [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
+                       return o->first_packet_received();
+                     }),
       kMaxWaitForFramesMs);
   EXPECT_TRUE_WAIT(
-      std::all_of(callee()->rtp_receiver_observers().begin(),
-                  callee()->rtp_receiver_observers().end(),
-                  [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
-                    return o->first_packet_received();
-                  }),
+      absl::c_all_of(callee()->rtp_receiver_observers(),
+                     [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
+                       return o->first_packet_received();
+                     }),
       kMaxWaitForFramesMs);
   // If new observers are set after the first packet was already received, the
   // callback should still be invoked.
@@ -1659,17 +1658,15 @@
   EXPECT_EQ(2U, caller()->rtp_receiver_observers().size());
   EXPECT_EQ(2U, callee()->rtp_receiver_observers().size());
   EXPECT_TRUE(
-      std::all_of(caller()->rtp_receiver_observers().begin(),
-                  caller()->rtp_receiver_observers().end(),
-                  [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
-                    return o->first_packet_received();
-                  }));
+      absl::c_all_of(caller()->rtp_receiver_observers(),
+                     [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
+                       return o->first_packet_received();
+                     }));
   EXPECT_TRUE(
-      std::all_of(callee()->rtp_receiver_observers().begin(),
-                  callee()->rtp_receiver_observers().end(),
-                  [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
-                    return o->first_packet_received();
-                  }));
+      absl::c_all_of(callee()->rtp_receiver_observers(),
+                     [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
+                       return o->first_packet_received();
+                     }));
 }
 
 class DummyDtmfObserver : public DtmfSenderObserverInterface {
@@ -3364,9 +3361,9 @@
       caller()->data_observer()->messages();
   std::vector<std::string> callee_received_messages =
       callee()->data_observer()->messages();
-  std::sort(sent_messages.begin(), sent_messages.end());
-  std::sort(caller_received_messages.begin(), caller_received_messages.end());
-  std::sort(callee_received_messages.begin(), callee_received_messages.end());
+  absl::c_sort(sent_messages);
+  absl::c_sort(caller_received_messages);
+  absl::c_sort(callee_received_messages);
   EXPECT_EQ(sent_messages, caller_received_messages);
   EXPECT_EQ(sent_messages, callee_received_messages);
 }
@@ -4049,17 +4046,11 @@
   const cricket::SessionDescription* desc =
       caller()->pc()->local_description()->description();
   for (const cricket::TransportInfo& info : desc->transport_infos()) {
-    ASSERT_NE(
-        info.description.transport_options.end(),
-        std::find(info.description.transport_options.begin(),
-                  info.description.transport_options.end(), "renomination"));
+    ASSERT_THAT(info.description.transport_options, Contains("renomination"));
   }
   desc = callee()->pc()->local_description()->description();
   for (const cricket::TransportInfo& info : desc->transport_infos()) {
-    ASSERT_NE(
-        info.description.transport_options.end(),
-        std::find(info.description.transport_options.begin(),
-                  info.description.transport_options.end(), "renomination"));
+    ASSERT_THAT(info.description.transport_options, Contains("renomination"));
   }
   MediaExpectations media_expectations;
   media_expectations.ExpectBidirectionalAudioAndVideo();
diff --git a/pc/peer_connection_media_unittest.cc b/pc/peer_connection_media_unittest.cc
index 3115eb6..ca03656 100644
--- a/pc/peer_connection_media_unittest.cc
+++ b/pc/peer_connection_media_unittest.cc
@@ -14,6 +14,7 @@
 
 #include <tuple>
 
+#include "absl/algorithm/container.h"
 #include "api/call/call_factory_interface.h"
 #include "api/test/fake_media_transport.h"
 #include "logging/rtc_event_log/rtc_event_log_factory.h"
@@ -812,8 +813,8 @@
 }
 
 void ReverseMediaContent(cricket::SessionDescription* desc) {
-  std::reverse(desc->contents().begin(), desc->contents().end());
-  std::reverse(desc->transport_infos().begin(), desc->transport_infos().end());
+  absl::c_reverse(desc->contents());
+  absl::c_reverse(desc->transport_infos());
 }
 
 void ChangeMediaTypeAudioToVideo(cricket::SessionDescription* desc) {
diff --git a/pc/remote_audio_source.cc b/pc/remote_audio_source.cc
index c789d45..9f599bb 100644
--- a/pc/remote_audio_source.cc
+++ b/pc/remote_audio_source.cc
@@ -11,9 +11,9 @@
 #include "pc/remote_audio_source.h"
 
 #include <stddef.h>
-#include <algorithm>
 #include <string>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "api/scoped_refptr.h"
 #include "rtc_base/checks.h"
@@ -101,8 +101,7 @@
 
 void RemoteAudioSource::RegisterAudioObserver(AudioObserver* observer) {
   RTC_DCHECK(observer != NULL);
-  RTC_DCHECK(std::find(audio_observers_.begin(), audio_observers_.end(),
-                       observer) == audio_observers_.end());
+  RTC_DCHECK(!absl::c_linear_search(audio_observers_, observer));
   audio_observers_.push_back(observer);
 }
 
@@ -121,7 +120,7 @@
   }
 
   rtc::CritScope lock(&sink_lock_);
-  RTC_DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
+  RTC_DCHECK(absl::c_linear_search(sinks_, sink));
   sinks_.push_back(sink);
 }
 
diff --git a/pc/rtc_stats_integrationtest.cc b/pc/rtc_stats_integrationtest.cc
index 14fd366..afe7649 100644
--- a/pc/rtc_stats_integrationtest.cc
+++ b/pc/rtc_stats_integrationtest.cc
@@ -16,6 +16,7 @@
 #include <string>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "absl/strings/match.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
@@ -41,8 +42,11 @@
 #include "rtc_base/thread.h"
 #include "rtc_base/trace_event.h"
 #include "rtc_base/virtual_socket_server.h"
+#include "test/gmock.h"
 #include "test/gtest.h"
 
+using ::testing::Contains;
+
 namespace webrtc {
 
 namespace {
@@ -402,8 +406,7 @@
       }
     }
     for (const char* missing : missing_stats) {
-      if (std::find(allowed_missing_stats.begin(), allowed_missing_stats.end(),
-                    missing) == allowed_missing_stats.end()) {
+      if (!absl::c_linear_search(allowed_missing_stats, missing)) {
         verify_successful = false;
         EXPECT_TRUE(false) << "Missing expected stats type: " << missing;
       }
@@ -897,13 +900,10 @@
     std::vector<const std::string*> neighbor_ids = GetStatsReferencedIds(stats);
     EXPECT_EQ(neighbor_ids.size(), expected_ids.size());
     for (const std::string* neighbor_id : neighbor_ids) {
-      EXPECT_TRUE(expected_ids.find(neighbor_id) != expected_ids.end())
-          << "Unexpected neighbor ID: " << *neighbor_id;
+      EXPECT_THAT(expected_ids, Contains(neighbor_id));
     }
     for (const std::string* expected_id : expected_ids) {
-      EXPECT_TRUE(std::find(neighbor_ids.begin(), neighbor_ids.end(),
-                            expected_id) != neighbor_ids.end())
-          << "Missing expected neighbor ID: " << *expected_id;
+      EXPECT_THAT(neighbor_ids, Contains(expected_id));
     }
   }
 }
diff --git a/pc/rtp_parameters_conversion_unittest.cc b/pc/rtp_parameters_conversion_unittest.cc
index 27708cc..9874ed3 100644
--- a/pc/rtp_parameters_conversion_unittest.cc
+++ b/pc/rtp_parameters_conversion_unittest.cc
@@ -12,6 +12,9 @@
 
 #include "pc/rtp_parameters_conversion.h"
 #include "rtc_base/gunit.h"
+#include "test/gmock.h"
+
+using ::testing::UnorderedElementsAre;
 
 namespace webrtc {
 
@@ -601,24 +604,15 @@
   capabilities = ToRtpCapabilities<cricket::VideoCodec>(
       {vp8, red, ulpfec, rtx}, cricket::RtpHeaderExtensions());
   EXPECT_EQ(4u, capabilities.codecs.size());
-  EXPECT_EQ(2u, capabilities.fec.size());
-  EXPECT_NE(capabilities.fec.end(),
-            std::find(capabilities.fec.begin(), capabilities.fec.end(),
-                      FecMechanism::RED));
-  EXPECT_NE(capabilities.fec.end(),
-            std::find(capabilities.fec.begin(), capabilities.fec.end(),
-                      FecMechanism::RED_AND_ULPFEC));
+  EXPECT_THAT(
+      capabilities.fec,
+      UnorderedElementsAre(FecMechanism::RED, FecMechanism::RED_AND_ULPFEC));
 
   capabilities = ToRtpCapabilities<cricket::VideoCodec>(
       {vp8, red, flexfec}, cricket::RtpHeaderExtensions());
   EXPECT_EQ(3u, capabilities.codecs.size());
-  EXPECT_EQ(2u, capabilities.fec.size());
-  EXPECT_NE(capabilities.fec.end(),
-            std::find(capabilities.fec.begin(), capabilities.fec.end(),
-                      FecMechanism::RED));
-  EXPECT_NE(capabilities.fec.end(),
-            std::find(capabilities.fec.begin(), capabilities.fec.end(),
-                      FecMechanism::FLEXFEC));
+  EXPECT_THAT(capabilities.fec,
+              UnorderedElementsAre(FecMechanism::RED, FecMechanism::FLEXFEC));
 }
 
 TEST(RtpParametersConversionTest, ToRtpParameters) {
diff --git a/pc/rtp_transceiver.cc b/pc/rtp_transceiver.cc
index 8c7b575..a000b58 100644
--- a/pc/rtp_transceiver.cc
+++ b/pc/rtp_transceiver.cc
@@ -10,9 +10,9 @@
 
 #include "pc/rtp_transceiver.h"
 
-#include <algorithm>
 #include <string>
 
+#include "absl/algorithm/container.h"
 #include "pc/rtp_media_utils.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
@@ -83,8 +83,7 @@
   RTC_DCHECK(!unified_plan_);
   RTC_DCHECK(sender);
   RTC_DCHECK_EQ(media_type(), sender->media_type());
-  RTC_DCHECK(std::find(senders_.begin(), senders_.end(), sender) ==
-             senders_.end());
+  RTC_DCHECK(!absl::c_linear_search(senders_, sender));
   senders_.push_back(sender);
 }
 
@@ -93,7 +92,7 @@
   if (sender) {
     RTC_DCHECK_EQ(media_type(), sender->media_type());
   }
-  auto it = std::find(senders_.begin(), senders_.end(), sender);
+  auto it = absl::c_find(senders_, sender);
   if (it == senders_.end()) {
     return false;
   }
@@ -109,8 +108,7 @@
   RTC_DCHECK(!unified_plan_);
   RTC_DCHECK(receiver);
   RTC_DCHECK_EQ(media_type(), receiver->media_type());
-  RTC_DCHECK(std::find(receivers_.begin(), receivers_.end(), receiver) ==
-             receivers_.end());
+  RTC_DCHECK(!absl::c_linear_search(receivers_, receiver));
   receivers_.push_back(receiver);
 }
 
@@ -119,7 +117,7 @@
   if (receiver) {
     RTC_DCHECK_EQ(media_type(), receiver->media_type());
   }
-  auto it = std::find(receivers_.begin(), receivers_.end(), receiver);
+  auto it = absl::c_find(receivers_, receiver);
   if (it == receivers_.end()) {
     return false;
   }
diff --git a/pc/sdp_serializer.cc b/pc/sdp_serializer.cc
index 8b0d696..482dd07 100644
--- a/pc/sdp_serializer.cc
+++ b/pc/sdp_serializer.cc
@@ -10,11 +10,11 @@
 
 #include "pc/sdp_serializer.h"
 
-#include <algorithm>
 #include <string>
 #include <utility>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "api/jsep.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/string_encode.h"
@@ -166,8 +166,7 @@
     }
 
     // Check if the value already appears in the payload list.
-    if (std::find(payload_types.begin(), payload_types.end(), value.value()) !=
-        payload_types.end()) {
+    if (absl::c_linear_search(payload_types, value.value())) {
       return ParseError("Duplicate payload type in list: " + payload_type);
     }
     payload_types.push_back(value.value());
diff --git a/pc/session_description.cc b/pc/session_description.cc
index 1029ee8..a081f8a 100644
--- a/pc/session_description.cc
+++ b/pc/session_description.cc
@@ -10,9 +10,9 @@
 
 #include "pc/session_description.h"
 
-#include <algorithm>
 #include <utility>
 
+#include "absl/algorithm/container.h"
 #include "rtc_base/checks.h"
 
 namespace cricket {
@@ -66,8 +66,7 @@
 }
 
 bool ContentGroup::HasContentName(const std::string& content_name) const {
-  return (std::find(content_names_.begin(), content_names_.end(),
-                    content_name) != content_names_.end());
+  return absl::c_linear_search(content_names_, content_name);
 }
 
 void ContentGroup::AddContentName(const std::string& content_name) {
@@ -77,8 +76,7 @@
 }
 
 bool ContentGroup::RemoveContentName(const std::string& content_name) {
-  ContentNames::iterator iter =
-      std::find(content_names_.begin(), content_names_.end(), content_name);
+  ContentNames::iterator iter = absl::c_find(content_names_, content_name);
   if (iter == content_names_.end()) {
     return false;
   }
diff --git a/pc/stats_collector_unittest.cc b/pc/stats_collector_unittest.cc
index dc5a47a..3fe6a9e 100644
--- a/pc/stats_collector_unittest.cc
+++ b/pc/stats_collector_unittest.cc
@@ -9,9 +9,9 @@
  */
 
 #include <stdio.h>
-#include <algorithm>
 #include <memory>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "absl/types/optional.h"
 #include "api/audio_codecs/audio_encoder.h"
@@ -235,7 +235,7 @@
 
 std::vector<std::string> DersToPems(const std::vector<std::string>& ders) {
   std::vector<std::string> pems(ders.size());
-  std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem);
+  absl::c_transform(ders, pems.begin(), DerToPem);
   return pems;
 }
 
diff --git a/pc/test/fake_audio_capture_module_unittest.cc b/pc/test/fake_audio_capture_module_unittest.cc
index 250953f..0130af1 100644
--- a/pc/test/fake_audio_capture_module_unittest.cc
+++ b/pc/test/fake_audio_capture_module_unittest.cc
@@ -18,8 +18,6 @@
 #include "rtc_base/gunit.h"
 #include "test/gtest.h"
 
-using std::min;
-
 class FakeAdmTest : public testing::Test, public webrtc::AudioTransport {
  protected:
   static const int kMsInSecond = 1000;
@@ -110,7 +108,8 @@
   }
   size_t CopyFromRecBuffer(void* audio_buffer, size_t audio_buffer_size) {
     EXPECT_EQ(audio_buffer_size, rec_buffer_bytes_);
-    const size_t min_buffer_size = min(audio_buffer_size, rec_buffer_bytes_);
+    const size_t min_buffer_size =
+        std::min(audio_buffer_size, rec_buffer_bytes_);
     memcpy(audio_buffer, rec_buffer_, min_buffer_size);
     return min_buffer_size;
   }
diff --git a/pc/webrtc_sdp.cc b/pc/webrtc_sdp.cc
index 97f2455..736122b 100644
--- a/pc/webrtc_sdp.cc
+++ b/pc/webrtc_sdp.cc
@@ -23,6 +23,7 @@
 #include <utility>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "absl/strings/match.h"
 #include "api/candidate.h"
@@ -611,8 +612,8 @@
 }
 
 static bool CaseInsensitiveFind(std::string str1, std::string str2) {
-  std::transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
-  std::transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
+  absl::c_transform(str1, str1.begin(), ::tolower);
+  absl::c_transform(str2, str2.begin(), ::tolower);
   return str1.find(str2) != std::string::npos;
 }
 
@@ -699,8 +700,8 @@
       track_id = rtc::CreateRandomString(8);
     }
 
-    auto track_it = std::find_if(
-        tracks->begin(), tracks->end(),
+    auto track_it = absl::c_find_if(
+        *tracks,
         [track_id](const StreamParams& track) { return track.id == track_id; });
     if (track_it == tracks->end()) {
       // If we don't find an existing track, create a new one.
@@ -1803,9 +1804,8 @@
   if (values.empty()) {
     return false;
   }
-  std::vector<int>::const_iterator found =
-      std::min_element(values.begin(), values.end());
-  *value = *found;
+  auto it = absl::c_min_element(values);
+  *value = *it;
   return true;
 }
 
@@ -2252,8 +2252,7 @@
 
   // Downcase the algorithm. Note that we don't need to downcase the
   // fingerprint because hex_decode can handle upper-case.
-  std::transform(algorithm.begin(), algorithm.end(), algorithm.begin(),
-                 ::tolower);
+  absl::c_transform(algorithm, algorithm.begin(), ::tolower);
 
   // The second field is the digest value. De-hexify it.
   *fingerprint =
@@ -2360,8 +2359,7 @@
     // Media section does not handle duplicates either.
     std::set<int> removed_formats;
     for (int payload_type : rid.payload_types) {
-      if (std::find(payload_types.begin(), payload_types.end(), payload_type) ==
-          payload_types.end()) {
+      if (!absl::c_linear_search(payload_types, payload_type)) {
         removed_formats.insert(payload_type);
       }
     }
@@ -2430,30 +2428,29 @@
   // This algorithm runs in O(n^2) time, but for small n (as is the case with
   // simulcast layers) it should still perform well.
   for (const SimulcastLayer& send_layer : all_send_layers) {
-    if (std::find_if(all_receive_layers.begin(), all_receive_layers.end(),
-                     [&send_layer](const SimulcastLayer& layer) {
-                       return layer.rid == send_layer.rid;
-                     }) != all_receive_layers.end()) {
+    if (absl::c_any_of(all_receive_layers,
+                       [&send_layer](const SimulcastLayer& layer) {
+                         return layer.rid == send_layer.rid;
+                       })) {
       to_remove.insert(send_layer.rid);
     }
   }
 
   // Add any rid that is not in the valid list to the remove set.
   for (const SimulcastLayer& send_layer : all_send_layers) {
-    if (std::find_if(valid_rids.begin(), valid_rids.end(),
-                     [&send_layer](const RidDescription& rid) {
-                       return send_layer.rid == rid.rid;
-                     }) == valid_rids.end()) {
+    if (absl::c_none_of(valid_rids, [&send_layer](const RidDescription& rid) {
+          return send_layer.rid == rid.rid;
+        })) {
       to_remove.insert(send_layer.rid);
     }
   }
 
   // Add any rid that is not in the valid list to the remove set.
   for (const SimulcastLayer& receive_layer : all_receive_layers) {
-    if (std::find_if(valid_rids.begin(), valid_rids.end(),
-                     [&receive_layer](const RidDescription& rid) {
-                       return receive_layer.rid == rid.rid;
-                     }) == valid_rids.end()) {
+    if (absl::c_none_of(valid_rids,
+                        [&receive_layer](const RidDescription& rid) {
+                          return receive_layer.rid == rid.rid;
+                        })) {
       to_remove.insert(receive_layer.rid);
     }
   }
@@ -2550,12 +2547,11 @@
     payload_type_preferences[pt] = preference--;
   }
   std::vector<typename C::CodecType> codecs = media_desc->codecs();
-  std::sort(codecs.begin(), codecs.end(),
-            [&payload_type_preferences](const typename C::CodecType& a,
-                                        const typename C::CodecType& b) {
-              return payload_type_preferences[a.id] >
-                     payload_type_preferences[b.id];
-            });
+  absl::c_sort(
+      codecs, [&payload_type_preferences](const typename C::CodecType& a,
+                                          const typename C::CodecType& b) {
+        return payload_type_preferences[a.id] > payload_type_preferences[b.id];
+      });
   media_desc->set_codecs(codecs);
   return media_desc;
 }
@@ -2739,13 +2735,11 @@
 }
 
 bool VerifyAudioCodecs(const AudioContentDescription* audio_desc) {
-  const std::vector<cricket::AudioCodec>& codecs = audio_desc->codecs();
-  return std::all_of(codecs.begin(), codecs.end(), &VerifyCodec);
+  return absl::c_all_of(audio_desc->codecs(), &VerifyCodec);
 }
 
 bool VerifyVideoCodecs(const VideoContentDescription* video_desc) {
-  const std::vector<cricket::VideoCodec>& codecs = video_desc->codecs();
-  return std::all_of(codecs.begin(), codecs.end(), &VerifyCodec);
+  return absl::c_all_of(video_desc->codecs(), &VerifyCodec);
 }
 
 void AddParameters(const cricket::CodecParameterMap& parameters,
@@ -3301,10 +3295,10 @@
 
   // Check if there's already an item for this |ssrc_id|. Create a new one if
   // there isn't.
-  auto ssrc_info_it = std::find_if(ssrc_infos->begin(), ssrc_infos->end(),
-                                   [ssrc_id](const SsrcInfo& ssrc_info) {
-                                     return ssrc_info.ssrc_id == ssrc_id;
-                                   });
+  auto ssrc_info_it =
+      absl::c_find_if(*ssrc_infos, [ssrc_id](const SsrcInfo& ssrc_info) {
+        return ssrc_info.ssrc_id == ssrc_id;
+      });
   if (ssrc_info_it == ssrc_infos->end()) {
     SsrcInfo info;
     info.ssrc_id = ssrc_id;
@@ -3459,8 +3453,7 @@
     return false;
   }
 
-  if (std::find(payload_types.begin(), payload_types.end(), payload_type) ==
-      payload_types.end()) {
+  if (!absl::c_linear_search(payload_types, payload_type)) {
     RTC_LOG(LS_WARNING) << "Ignore rtpmap line that did not appear in the "
                            "<fmt> of the m-line: "
                         << line;
diff --git a/pc/webrtc_sdp_unittest.cc b/pc/webrtc_sdp_unittest.cc
index 654246e..b1ecf7e 100644
--- a/pc/webrtc_sdp_unittest.cc
+++ b/pc/webrtc_sdp_unittest.cc
@@ -17,6 +17,7 @@
 #include <utility>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "api/array_view.h"
 #include "api/crypto_params.h"
 #include "api/jsep_session_description.h"
@@ -1431,10 +1432,9 @@
     // Order of elements does not matter, only equivalence of sets.
     EXPECT_EQ(rids.size(), ids.size());
     for (const std::string& id : ids) {
-      EXPECT_EQ(1l, std::count_if(rids.begin(), rids.end(),
-                                  [id](const RidDescription& rid) {
-                                    return rid.rid == id;
-                                  }));
+      EXPECT_EQ(1l, absl::c_count_if(rids, [id](const RidDescription& rid) {
+                  return rid.rid == id;
+                }));
     }
   }
 
@@ -4105,10 +4105,10 @@
   std::vector<SimulcastLayer> all_send_layers =
       simulcast.send_layers().GetAllLayers();
   EXPECT_EQ(2ul, all_send_layers.size());
-  EXPECT_EQ(0, std::count_if(all_send_layers.begin(), all_send_layers.end(),
-                             [](const SimulcastLayer& layer) {
-                               return layer.rid == "2";
-                             }));
+  EXPECT_EQ(0,
+            absl::c_count_if(all_send_layers, [](const SimulcastLayer& layer) {
+              return layer.rid == "2";
+            }));
 
   std::vector<SimulcastLayer> all_receive_layers =
       simulcast.receive_layers().GetAllLayers();
diff --git a/pc/webrtc_session_description_factory.cc b/pc/webrtc_session_description_factory.cc
index d859559..ad7a0c1 100644
--- a/pc/webrtc_session_description_factory.cc
+++ b/pc/webrtc_session_description_factory.cc
@@ -11,11 +11,11 @@
 #include "pc/webrtc_session_description_factory.h"
 
 #include <stddef.h>
-#include <algorithm>
 #include <string>
 #include <utility>
 #include <vector>
 
+#include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "absl/types/optional.h"
 #include "api/jsep.h"
@@ -42,16 +42,6 @@
 
 static const uint64_t kInitSessionVersion = 2;
 
-static bool CompareSenderOptions(const cricket::SenderOptions& sender1,
-                                 const cricket::SenderOptions& sender2) {
-  return sender1.track_id < sender2.track_id;
-}
-
-static bool SameId(const cricket::SenderOptions& sender1,
-                   const cricket::SenderOptions& sender2) {
-  return sender1.track_id == sender2.track_id;
-}
-
 // Check that each sender has a unique ID.
 static bool ValidMediaSessionOptions(
     const cricket::MediaSessionOptions& session_options) {
@@ -62,10 +52,15 @@
                           media_description_options.sender_options.begin(),
                           media_description_options.sender_options.end());
   }
-  std::sort(sorted_senders.begin(), sorted_senders.end(), CompareSenderOptions);
-  std::vector<cricket::SenderOptions>::iterator it =
-      std::adjacent_find(sorted_senders.begin(), sorted_senders.end(), SameId);
-  return it == sorted_senders.end();
+  absl::c_sort(sorted_senders, [](const cricket::SenderOptions& sender1,
+                                  const cricket::SenderOptions& sender2) {
+    return sender1.track_id < sender2.track_id;
+  });
+  return absl::c_adjacent_find(sorted_senders,
+                               [](const cricket::SenderOptions& sender1,
+                                  const cricket::SenderOptions& sender2) {
+                                 return sender1.track_id == sender2.track_id;
+                               }) == sorted_senders.end();
 }
 
 enum {