Add ByteBufferReader constructor for ArrayView

Bug: webrtc:14870
Change-Id: I0643af4a44bb2bc26581df971221766316124996
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/327520
Auto-Submit: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41182}
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index ca1a457..51e15b5 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -156,8 +156,12 @@
   deps = [
     ":buffer",
     ":byte_order",
+    "../api:array_view",
   ]
-  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
+  absl_deps = [
+    "//third_party/abseil-cpp/absl/base:core_headers",
+    "//third_party/abseil-cpp/absl/strings",
+  ]
 }
 
 rtc_library("buffer_queue") {
diff --git a/rtc_base/byte_buffer.cc b/rtc_base/byte_buffer.cc
index 4f4235c..3f0e61e 100644
--- a/rtc_base/byte_buffer.cc
+++ b/rtc_base/byte_buffer.cc
@@ -19,6 +19,10 @@
 ByteBufferWriter::ByteBufferWriter(const char* bytes, size_t len)
     : ByteBufferWriterT(bytes, len) {}
 
+ByteBufferReader::ByteBufferReader(rtc::ArrayView<const uint8_t> bytes) {
+  Construct(bytes.data(), bytes.size());
+}
+
 ByteBufferReader::ByteBufferReader(const char* bytes, size_t len) {
   Construct(reinterpret_cast<const uint8_t*>(bytes), len);
 }
@@ -27,10 +31,6 @@
   Construct(reinterpret_cast<const uint8_t*>(bytes), strlen(bytes));
 }
 
-ByteBufferReader::ByteBufferReader(const Buffer& buf) {
-  Construct(buf.data(), buf.size());
-}
-
 ByteBufferReader::ByteBufferReader(const ByteBufferWriter& buf) {
   Construct(reinterpret_cast<const uint8_t*>(buf.Data()), buf.Length());
 }
diff --git a/rtc_base/byte_buffer.h b/rtc_base/byte_buffer.h
index 3161cf4..fe17da2 100644
--- a/rtc_base/byte_buffer.h
+++ b/rtc_base/byte_buffer.h
@@ -16,7 +16,9 @@
 
 #include <string>
 
+#include "absl/base/attributes.h"
 #include "absl/strings/string_view.h"
+#include "api/array_view.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/byte_order.h"
 
@@ -124,11 +126,12 @@
  public:
   ByteBufferReader(const char* bytes, size_t len);
 
+  explicit ByteBufferReader(
+      rtc::ArrayView<const uint8_t> bytes ABSL_ATTRIBUTE_LIFETIME_BOUND);
+
   // Initializes buffer from a zero-terminated string.
   explicit ByteBufferReader(const char* bytes);
 
-  explicit ByteBufferReader(const Buffer& buf);
-
   explicit ByteBufferReader(const ByteBufferWriter& buf);
 
   ByteBufferReader(const ByteBufferReader&) = delete;
diff --git a/rtc_base/byte_buffer_unittest.cc b/rtc_base/byte_buffer_unittest.cc
index 4f8043c..615237c 100644
--- a/rtc_base/byte_buffer_unittest.cc
+++ b/rtc_base/byte_buffer_unittest.cc
@@ -12,6 +12,8 @@
 
 #include <string.h>
 
+#include <cstdint>
+
 #include "rtc_base/arraysize.h"
 #include "rtc_base/byte_order.h"
 #include "test/gtest.h"
@@ -247,4 +249,19 @@
   EXPECT_EQ(size, read_buffer.Length());
 }
 
+TEST(ByteBufferTest, ReadFromArrayView) {
+  const uint8_t buf[] = {'a', 'b', 'c'};
+  ArrayView<const uint8_t> view(buf, 3);
+
+  ByteBufferReader read_buffer(view);
+  uint8_t val;
+  EXPECT_TRUE(read_buffer.ReadUInt8(&val));
+  EXPECT_EQ(val, 'a');
+  EXPECT_TRUE(read_buffer.ReadUInt8(&val));
+  EXPECT_EQ(val, 'b');
+  EXPECT_TRUE(read_buffer.ReadUInt8(&val));
+  EXPECT_EQ(val, 'c');
+  EXPECT_FALSE(read_buffer.ReadUInt8(&val));
+}
+
 }  // namespace rtc