diff --git a/webrtc/modules/rtp_rtcp/source/byte_io.h b/webrtc/modules/rtp_rtcp/source/byte_io.h index c69c178078..1724bb0a2e 100644 --- a/webrtc/modules/rtp_rtcp/source/byte_io.h +++ b/webrtc/modules/rtp_rtcp/source/byte_io.h @@ -310,12 +310,19 @@ class ByteReader { public: static T ReadBigEndian(const uint8_t* data) { static_assert(sizeof(T) >= 4, kSizeErrorMsg); - return (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; + return (Get(data, 0) << 24) | (Get(data, 1) << 16) | (Get(data, 2) << 8) | + Get(data, 3); } static T ReadLittleEndian(const uint8_t* data) { static_assert(sizeof(T) >= 4, kSizeErrorMsg); - return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); + return Get(data, 0) | (Get(data, 1) << 8) | (Get(data, 2) << 16) | + (Get(data, 3) << 24); + } + + private: + inline static T Get(const uint8_t* data, unsigned int index) { + return static_cast(data[index]); } }; diff --git a/webrtc/modules/rtp_rtcp/source/byte_io_unittest.cc b/webrtc/modules/rtp_rtcp/source/byte_io_unittest.cc index 8b626189a0..d0e6cbb6eb 100644 --- a/webrtc/modules/rtp_rtcp/source/byte_io_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/byte_io_unittest.cc @@ -206,5 +206,43 @@ TEST_F(ByteIoTest, Test64SBitLittleEndian) { sizeof(int64_t)>(false); } +// Sets up a fixed byte array and converts N bytes from the array into a +// uint64_t. Verifies the value with hard-coded reference. +TEST(ByteIo, SanityCheckFixedByteArrayUnsignedReadBigEndian) { + uint8_t data[8] = {0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88}; + uint64_t value = ByteReader::ReadBigEndian(data); + EXPECT_EQ(static_cast(0xFFEE), value); + value = ByteReader::ReadBigEndian(data); + EXPECT_EQ(static_cast(0xFFEEDD), value); + value = ByteReader::ReadBigEndian(data); + EXPECT_EQ(static_cast(0xFFEEDDCC), value); + value = ByteReader::ReadBigEndian(data); + EXPECT_EQ(static_cast(0xFFEEDDCCBB), value); + value = ByteReader::ReadBigEndian(data); + EXPECT_EQ(static_cast(0xFFEEDDCCBBAA), value); + value = ByteReader::ReadBigEndian(data); + EXPECT_EQ(static_cast(0xFFEEDDCCBBAA99), value); + value = ByteReader::ReadBigEndian(data); + EXPECT_EQ(static_cast(0xFFEEDDCCBBAA9988), value); +} + +// Same as above, but for little-endian reading. +TEST(ByteIo, SanityCheckFixedByteArrayUnsignedReadLittleEndian) { + uint8_t data[8] = {0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88}; + uint64_t value = ByteReader::ReadLittleEndian(data); + EXPECT_EQ(static_cast(0xEEFF), value); + value = ByteReader::ReadLittleEndian(data); + EXPECT_EQ(static_cast(0xDDEEFF), value); + value = ByteReader::ReadLittleEndian(data); + EXPECT_EQ(static_cast(0xCCDDEEFF), value); + value = ByteReader::ReadLittleEndian(data); + EXPECT_EQ(static_cast(0xBBCCDDEEFF), value); + value = ByteReader::ReadLittleEndian(data); + EXPECT_EQ(static_cast(0xAABBCCDDEEFF), value); + value = ByteReader::ReadLittleEndian(data); + EXPECT_EQ(static_cast(0x99AABBCCDDEEFF), value); + value = ByteReader::ReadLittleEndian(data); + EXPECT_EQ(static_cast(0x8899AABBCCDDEEFF), value); +} } // namespace } // namespace webrtc