Use absl instead of self-made function for low-level bit counting

to reduce code duplication and rely on better optimized code.

Bug: None
Change-Id: Ie2f1ff680ff702aae84132229ae0e1743478424f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/229385
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#34857}
diff --git a/DEPS b/DEPS
index 4f27c7b..ccf8f17 100644
--- a/DEPS
+++ b/DEPS
@@ -2658,6 +2658,7 @@
   "+absl/functional/bind_front.h",
   "+absl/memory/memory.h",
   "+absl/meta/type_traits.h",
+  "+absl/numeric/bits.h",
   "+absl/strings/ascii.h",
   "+absl/strings/match.h",
   "+absl/strings/str_replace.h",
diff --git a/g3doc/abseil-in-webrtc.md b/g3doc/abseil-in-webrtc.md
index 692ebe2..9f7b4ab 100644
--- a/g3doc/abseil-in-webrtc.md
+++ b/g3doc/abseil-in-webrtc.md
@@ -41,6 +41,7 @@
 * `absl/base/const_init.h` for mutex initialization.
 * The macros in `absl/base/attributes.h`, `absl/base/config.h` and
   `absl/base/macros.h`.
+* `absl/numeric/bits.h`
 
 
 ## **Disallowed**
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index cbb466c..809bb4a 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -84,6 +84,7 @@
   ]
   absl_deps = [
     "//third_party/abseil-cpp/absl/base:core_headers",
+    "//third_party/abseil-cpp/absl/numeric:bits",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
   public_deps = []  # no-presubmit-check TODO(webrtc:8603)
diff --git a/rtc_base/bit_buffer.cc b/rtc_base/bit_buffer.cc
index 4bb32fe..a73ef5d 100644
--- a/rtc_base/bit_buffer.cc
+++ b/rtc_base/bit_buffer.cc
@@ -13,6 +13,7 @@
 #include <algorithm>
 #include <limits>
 
+#include "absl/numeric/bits.h"
 #include "rtc_base/checks.h"
 
 namespace {
@@ -59,16 +60,6 @@
   return (target & ~mask) | (source >> target_bit_offset);
 }
 
-// Counts the number of bits used in the binary representation of val.
-size_t CountBits(uint64_t val) {
-  size_t bit_count = 0;
-  while (val != 0) {
-    bit_count++;
-    val >>= 1;
-  }
-  return bit_count;
-}
-
 }  // namespace
 
 namespace rtc {
@@ -206,7 +197,7 @@
     val = 0;
     return true;
   }
-  size_t count_bits = CountBits(num_values);
+  size_t count_bits = absl::bit_width(num_values);
   uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values;
 
   if (!ReadBits(count_bits - 1, val)) {
@@ -354,7 +345,7 @@
     // But WriteBits doesn't support writing zero bits.
     return true;
   }
-  size_t count_bits = CountBits(num_values);
+  size_t count_bits = absl::bit_width(num_values);
   uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values;
 
   return val < num_min_bits_values
@@ -366,7 +357,7 @@
                                              uint32_t num_values) {
   RTC_DCHECK_LT(val, num_values);
   RTC_DCHECK_LE(num_values, uint32_t{1} << 31);
-  size_t count_bits = CountBits(num_values);
+  size_t count_bits = absl::bit_width(num_values);
   uint32_t num_min_bits_values = (uint32_t{1} << count_bits) - num_values;
 
   return val < num_min_bits_values ? (count_bits - 1) : count_bits;
@@ -380,10 +371,10 @@
   }
   uint64_t val_to_encode = static_cast<uint64_t>(val) + 1;
 
-  // We need to write CountBits(val+1) 0s and then val+1. Since val (as a
+  // We need to write bit_width(val+1) 0s and then val+1. Since val (as a
   // uint64_t) has leading zeros, we can just write the total golomb encoded
   // size worth of bits, knowing the value will appear last.
-  return WriteBits(val_to_encode, CountBits(val_to_encode) * 2 - 1);
+  return WriteBits(val_to_encode, absl::bit_width(val_to_encode) * 2 - 1);
 }
 
 bool BitBufferWriter::WriteSignedExponentialGolomb(int32_t val) {