Use ByteReader/ByteWriter instead of rtputility and manual shift/add.

BUG=
R=stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/41289004

Cr-Commit-Position: refs/heads/master@{#8761}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8761 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc b/webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc
index e2aa2e5..9d9550b 100644
--- a/webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc
+++ b/webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc
@@ -13,8 +13,8 @@
 #include <assert.h>
 
 #include "webrtc/base/scoped_ptr.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
 #include "webrtc/system_wrappers/interface/logging.h"
 
@@ -179,7 +179,7 @@
         payload_data_length - REDHeaderLength);
     received_packet->pkt->length = payload_data_length - REDHeaderLength;
     received_packet->ssrc =
-        RtpUtility::BufferToUWord32(&incoming_rtp_packet[8]);
+        ByteReader<uint32_t>::ReadBigEndian(&incoming_rtp_packet[8]);
 
   } else {
     // copy the RTP header
diff --git a/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc b/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc
index a85e749..9c14a21 100644
--- a/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc
+++ b/webrtc/modules/rtp_rtcp/source/fec_test_helper.cc
@@ -10,6 +10,7 @@
 
 #include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
 
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 
 namespace webrtc {
@@ -86,9 +87,9 @@
   data[0] = 0x80;  // Version 2.
   data[1] = header->payloadType;
   data[1] |= (header->markerBit ? kRtpMarkerBitMask : 0);
-  RtpUtility::AssignUWord16ToBuffer(data + 2, header->sequenceNumber);
-  RtpUtility::AssignUWord32ToBuffer(data + 4, header->timestamp);
-  RtpUtility::AssignUWord32ToBuffer(data + 8, header->ssrc);
+  ByteWriter<uint16_t>::WriteBigEndian(data + 2, header->sequenceNumber);
+  ByteWriter<uint32_t>::WriteBigEndian(data + 4, header->timestamp);
+  ByteWriter<uint32_t>::WriteBigEndian(data + 8, header->ssrc);
 }
 
 }  // namespace webrtc
diff --git a/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc b/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc
index 9010e7e..abef1dd 100644
--- a/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc
+++ b/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc
@@ -18,8 +18,8 @@
 #include <iterator>
 
 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 #include "webrtc/system_wrappers/interface/logging.h"
 
 namespace webrtc {
@@ -230,7 +230,7 @@
         Packet* media_packet = *media_list_it;
 
         // Assign network-ordered media payload length.
-        RtpUtility::AssignUWord16ToBuffer(
+        ByteWriter<uint16_t>::WriteBigEndian(
             media_payload_length, media_packet->length - kRtpHeaderSize);
 
         fec_packet_length = media_packet->length + fec_rtp_offset;
@@ -432,7 +432,7 @@
     // -- ULP header --
     // Copy the payload size to the protection length field.
     // (We protect the entire packet.)
-    RtpUtility::AssignUWord16ToBuffer(
+    ByteWriter<uint16_t>::WriteBigEndian(
         &generated_fec_packets_[i].data[10],
         generated_fec_packets_[i].length - kFecHeaderSize - ulp_header_size);
 
@@ -537,7 +537,7 @@
   fec_packet->ssrc = rx_packet->ssrc;
 
   const uint16_t seq_num_base =
-      RtpUtility::BufferToUWord16(&fec_packet->pkt->data[2]);
+      ByteReader<uint16_t>::ReadBigEndian(&fec_packet->pkt->data[2]);
   const uint16_t maskSizeBytes =
       (fec_packet->pkt->data[0] & 0x40) ? kMaskSizeLBitSet
                                         : kMaskSizeLBitClear;  // L bit set?
@@ -650,7 +650,7 @@
   // Copy FEC payload, skipping the ULP header.
   memcpy(&recovered->pkt->data[kRtpHeaderSize],
          &fec_packet->pkt->data[kFecHeaderSize + ulp_header_size],
-         RtpUtility::BufferToUWord16(protection_length));
+         ByteReader<uint16_t>::ReadBigEndian(protection_length));
   // Copy the length recovery field.
   memcpy(recovered->length_recovery, &fec_packet->pkt->data[8], 2);
   // Copy the first 2 bytes of the FEC header.
@@ -658,7 +658,8 @@
   // Copy the 5th to 8th bytes of the FEC header.
   memcpy(&recovered->pkt->data[4], &fec_packet->pkt->data[4], 4);
   // Set the SSRC field.
-  RtpUtility::AssignUWord32ToBuffer(&recovered->pkt->data[8], fec_packet->ssrc);
+  ByteWriter<uint32_t>::WriteBigEndian(&recovered->pkt->data[8],
+                                       fec_packet->ssrc);
 }
 
 void ForwardErrorCorrection::FinishRecovery(RecoveredPacket* recovered) {
@@ -667,11 +668,12 @@
   recovered->pkt->data[0] &= 0xbf;  // Clear the 2nd bit.
 
   // Set the SN field.
-  RtpUtility::AssignUWord16ToBuffer(&recovered->pkt->data[2],
-                                    recovered->seq_num);
+  ByteWriter<uint16_t>::WriteBigEndian(&recovered->pkt->data[2],
+                                       recovered->seq_num);
   // Recover the packet length.
   recovered->pkt->length =
-      RtpUtility::BufferToUWord16(recovered->length_recovery) + kRtpHeaderSize;
+      ByteReader<uint16_t>::ReadBigEndian(recovered->length_recovery) +
+      kRtpHeaderSize;
 }
 
 void ForwardErrorCorrection::XorPackets(const Packet* src_packet,
@@ -686,8 +688,8 @@
   }
   // XOR with the network-ordered payload size.
   uint8_t media_payload_length[2];
-  RtpUtility::AssignUWord16ToBuffer(media_payload_length,
-                                    src_packet->length - kRtpHeaderSize);
+  ByteWriter<uint16_t>::WriteBigEndian(media_payload_length,
+                                       src_packet->length - kRtpHeaderSize);
   dst_packet->length_recovery[0] ^= media_payload_length[0];
   dst_packet->length_recovery[1] ^= media_payload_length[1];
 
diff --git a/webrtc/modules/rtp_rtcp/source/producer_fec.cc b/webrtc/modules/rtp_rtcp/source/producer_fec.cc
index 4c62dad..a271a75 100644
--- a/webrtc/modules/rtp_rtcp/source/producer_fec.cc
+++ b/webrtc/modules/rtp_rtcp/source/producer_fec.cc
@@ -10,6 +10,7 @@
 
 #include "webrtc/modules/rtp_rtcp/source/producer_fec.h"
 
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 
@@ -61,7 +62,8 @@
 
 void RedPacket::SetSeqNum(int seq_num) {
   assert(seq_num >= 0 && seq_num < (1<<16));
-  RtpUtility::AssignUWord16ToBuffer(&data_[2], seq_num);
+
+  ByteWriter<uint16_t>::WriteBigEndian(&data_[2], seq_num);
 }
 
 void RedPacket::AssignPayload(const uint8_t* payload, size_t length) {
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
index 4228cfb..f44021e 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
@@ -10,7 +10,7 @@
 
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
 
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/system_wrappers/interface/logging.h"
 
 using webrtc::RTCPUtility::kBtDlrr;
@@ -61,15 +61,15 @@
   buffer[(*offset)++] = value;
 }
 void AssignUWord16(uint8_t* buffer, size_t* offset, uint16_t value) {
-  RtpUtility::AssignUWord16ToBuffer(buffer + *offset, value);
+  ByteWriter<uint16_t>::WriteBigEndian(buffer + *offset, value);
   *offset += 2;
 }
 void AssignUWord24(uint8_t* buffer, size_t* offset, uint32_t value) {
-  RtpUtility::AssignUWord24ToBuffer(buffer + *offset, value);
+  ByteWriter<uint32_t, 3>::WriteBigEndian(buffer + *offset, value);
   *offset += 3;
 }
 void AssignUWord32(uint8_t* buffer, size_t* offset, uint32_t value) {
-  RtpUtility::AssignUWord32ToBuffer(buffer + *offset, value);
+  ByteWriter<uint32_t>::WriteBigEndian(buffer + *offset, value);
   *offset += 4;
 }
 
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
index c713852..82b1203 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
@@ -17,6 +17,7 @@
 #include <algorithm>  // min
 
 #include "webrtc/common_types.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
 #include "webrtc/system_wrappers/interface/logging.h"
@@ -556,24 +557,24 @@
     pos++;
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
     // NTP
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, NTPsec);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, NTPsec);
     pos += 4;
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, NTPfrac);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, NTPfrac);
     pos += 4;
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, RTPtime);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, RTPtime);
     pos += 4;
 
     //sender's packet count
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos,
-                                      feedback_state.packets_sent);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos,
+                                         feedback_state.packets_sent);
     pos += 4;
 
     //sender's octet count
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos,
-                                      feedback_state.media_bytes_sent);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos,
+                                         feedback_state.media_bytes_sent);
     pos += 4;
 
     uint8_t numberOfReportBlocks = 0;
@@ -589,7 +590,7 @@
     rtcpbuffer[posNumberOfReportBlocks] += numberOfReportBlocks;
 
     uint16_t len = uint16_t((pos/4) -1);
-    RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + 2, len);
+    ByteWriter<uint16_t>::WriteBigEndian(rtcpbuffer + 2, len);
     return 0;
 }
 
@@ -615,7 +616,7 @@
   pos++;
 
   // Add our own SSRC
-  RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+  ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
   pos += 4;
 
   // CNAME = 1
@@ -650,7 +651,7 @@
     uint32_t SSRC = it->first;
 
     // Add SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, SSRC);
     pos += 4;
 
     // CNAME = 1
@@ -681,7 +682,8 @@
   }
   // in 32-bit words minus one and we don't count the header
   uint16_t buffer_length = (SDESLength / 4) - 1;
-  RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + SDESLengthPos, buffer_length);
+  ByteWriter<uint16_t>::WriteBigEndian(rtcpbuffer + SDESLengthPos,
+                                       buffer_length);
   return 0;
 }
 
@@ -704,7 +706,7 @@
     pos++;
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     uint8_t numberOfReportBlocks = 0;
@@ -719,7 +721,7 @@
     rtcpbuffer[posNumberOfReportBlocks] += numberOfReportBlocks;
 
     uint16_t len = uint16_t((pos)/4 -1);
-    RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + 2, len);
+    ByteWriter<uint16_t>::WriteBigEndian(rtcpbuffer + 2, len);
     return 0;
 }
 
@@ -770,8 +772,8 @@
     rtcpbuffer[pos++]=(uint8_t)(1);
 
     // Add inter-arrival jitter
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos,
-                                      jitterTransmissionTimeOffset);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos,
+                                         jitterTransmissionTimeOffset);
     pos += 4;
     return 0;
 }
@@ -794,11 +796,11 @@
     rtcpbuffer[pos++]=(uint8_t)(2);
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     // Add the remote SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _remoteSSRC);
     pos += 4;
     return 0;
 }
@@ -824,7 +826,7 @@
   rtcpbuffer[pos++] = (uint8_t)(4);
 
   // Add our own SSRC
-  RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+  ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
   pos += 4;
 
   // RFC 5104     4.3.1.2.  Semantics
@@ -835,7 +837,7 @@
   rtcpbuffer[pos++] = (uint8_t)0;
 
   // Additional Feedback Control Information (FCI)
-  RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC);
+  ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _remoteSSRC);
   pos += 4;
 
   rtcpbuffer[pos++] = (uint8_t)(_sequenceNumberFIR);
@@ -868,18 +870,18 @@
     rtcpbuffer[pos++]=(uint8_t)(3);
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     // Add the remote SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _remoteSSRC);
     pos += 4;
 
     // Add first, number & picture ID 6 bits
     // first  = 0, 13 - bits
     // number = 0x1fff, 13 - bits only ones for now
     uint32_t sliField = (0x1fff << 6)+ (0x3f & pictureID);
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, sliField);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, sliField);
     pos += 4;
     return 0;
 }
@@ -931,11 +933,11 @@
     rtcpbuffer[pos++]=size;
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     // Add the remote SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _remoteSSRC);
     pos += 4;
 
     // calc padding length
@@ -988,11 +990,11 @@
     rtcpbuffer[pos++]=remb_ssrcs_.size() + 4;
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     // Remote SSRC must be 0
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, 0);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, 0);
     pos += 4;
 
     rtcpbuffer[pos++]='R';
@@ -1019,7 +1021,7 @@
 
     for (size_t i = 0; i < remb_ssrcs_.size(); i++)
     {
-      RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, remb_ssrcs_[i]);
+      ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, remb_ssrcs_[i]);
       pos += 4;
     }
     return 0;
@@ -1105,7 +1107,7 @@
         rtcpbuffer[pos++]=(uint8_t)(4);
 
         // Add our own SSRC
-        RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+        ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
         pos += 4;
 
         // RFC 5104     4.2.1.2.  Semantics
@@ -1117,7 +1119,7 @@
         rtcpbuffer[pos++]=(uint8_t)0;
 
         // Additional Feedback Control Information (FCI)
-        RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC);
+        ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _remoteSSRC);
         pos += 4;
 
         uint32_t bitRate = _tmmbr_Send*1000;
@@ -1165,7 +1167,7 @@
     pos++;
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     // RFC 5104     4.2.2.2.  Semantics
@@ -1183,7 +1185,7 @@
         if (boundingSet->Tmmbr(n) > 0)
         {
             uint32_t tmmbrSSRC = boundingSet->Ssrc(n);
-            RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, tmmbrSSRC);
+            ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, tmmbrSSRC);
             pos += 4;
 
             uint32_t bitRate = boundingSet->Tmmbr(n) * 1000;
@@ -1236,11 +1238,11 @@
     rtcpbuffer[pos++]=(uint8_t)(length);
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     // Add our application name
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _appName);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _appName);
     pos += 4;
 
     // Add the data
@@ -1272,11 +1274,11 @@
     rtcpbuffer[pos++]=(uint8_t)(3); //setting it to one kNACK signal as default
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     // Add the remote SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _remoteSSRC);
     pos += 4;
 
     // Build NACK bitmasks and write them to the RTCP message.
@@ -1300,9 +1302,9 @@
       }
       // Write the sequence number and the bitmask to the packet.
       assert(pos + 4 < IP_PACKET_SIZE);
-      RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + pos, nack);
+      ByteWriter<uint16_t>::WriteBigEndian(rtcpbuffer + pos, nack);
       pos += 2;
-      RtpUtility::AssignUWord16ToBuffer(rtcpbuffer + pos, bitmask);
+      ByteWriter<uint16_t>::WriteBigEndian(rtcpbuffer + pos, bitmask);
       pos += 2;
       numOfNackFields++;
     }
@@ -1340,12 +1342,12 @@
   rtcpbuffer[pos++] = (uint8_t)(1 + csrcs_.size());
 
   // Add our own SSRC
-  RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+  ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
   pos += 4;
 
   // add CSRCs
   for (size_t i = 0; i < csrcs_.size(); i++) {
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, csrcs_[i]);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, csrcs_[i]);
     pos += 4;
   }
 
@@ -1375,7 +1377,7 @@
   buffer[pos++] = 4;  // XR packet length.
 
   // Add our own SSRC.
-  RtpUtility::AssignUWord32ToBuffer(buffer + pos, _SSRC);
+  ByteWriter<uint32_t>::WriteBigEndian(buffer + pos, _SSRC);
   pos += 4;
 
   //    0                   1                   2                   3
@@ -1395,9 +1397,9 @@
   buffer[pos++] = 2;  // Block length.
 
   // NTP timestamp.
-  RtpUtility::AssignUWord32ToBuffer(buffer + pos, ntp_sec);
+  ByteWriter<uint32_t>::WriteBigEndian(buffer + pos, ntp_sec);
   pos += 4;
-  RtpUtility::AssignUWord32ToBuffer(buffer + pos, ntp_frac);
+  ByteWriter<uint32_t>::WriteBigEndian(buffer + pos, ntp_frac);
   pos += 4;
 
   return 0;
@@ -1418,7 +1420,7 @@
   buffer[pos++] = 5;  // XR packet length.
 
   // Add our own SSRC.
-  RtpUtility::AssignUWord32ToBuffer(buffer + pos, _SSRC);
+  ByteWriter<uint32_t>::WriteBigEndian(buffer + pos, _SSRC);
   pos += 4;
 
   //   0                   1                   2                   3
@@ -1443,11 +1445,11 @@
   buffer[pos++] = 3;  // Block length.
 
   // NTP timestamp.
-  RtpUtility::AssignUWord32ToBuffer(buffer + pos, info.sourceSSRC);
+  ByteWriter<uint32_t>::WriteBigEndian(buffer + pos, info.sourceSSRC);
   pos += 4;
-  RtpUtility::AssignUWord32ToBuffer(buffer + pos, info.lastRR);
+  ByteWriter<uint32_t>::WriteBigEndian(buffer + pos, info.lastRR);
   pos += 4;
-  RtpUtility::AssignUWord32ToBuffer(buffer + pos, info.delaySinceLastRR);
+  ByteWriter<uint32_t>::WriteBigEndian(buffer + pos, info.delaySinceLastRR);
   pos += 4;
 
   return 0;
@@ -1473,7 +1475,7 @@
     pos++;
 
     // Add our own SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _SSRC);
     pos += 4;
 
     // Add a VoIP metrics block
@@ -1483,7 +1485,7 @@
     rtcpbuffer[pos++]=8;
 
     // Add the remote SSRC
-    RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _remoteSSRC);
+    ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + pos, _remoteSSRC);
     pos += 4;
 
     rtcpbuffer[pos++] = _xrVoIPMetric.lossRate;
@@ -2034,33 +2036,33 @@
     RTCPReportBlock* reportBlock = it->second;
     if (reportBlock) {
       // Remote SSRC
-      RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position, remoteSSRC);
+      ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + position, remoteSSRC);
       position += 4;
 
       // fraction lost
       rtcpbuffer[position++] = reportBlock->fractionLost;
 
       // cumulative loss
-      RtpUtility::AssignUWord24ToBuffer(rtcpbuffer + position,
-                                        reportBlock->cumulativeLost);
+      ByteWriter<uint32_t, 3>::WriteBigEndian(rtcpbuffer + position,
+                                              reportBlock->cumulativeLost);
       position += 3;
 
       // extended highest seq_no, contain the highest sequence number received
-      RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position,
-                                        reportBlock->extendedHighSeqNum);
+      ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + position,
+                                           reportBlock->extendedHighSeqNum);
       position += 4;
 
       // Jitter
-      RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position,
-                                        reportBlock->jitter);
+      ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + position,
+                                           reportBlock->jitter);
       position += 4;
 
-      RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position,
-                                        reportBlock->lastSR);
+      ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + position,
+                                           reportBlock->lastSR);
       position += 4;
 
-      RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + position,
-                                        reportBlock->delaySinceLastSR);
+      ByteWriter<uint32_t>::WriteBigEndian(rtcpbuffer + position,
+                                           reportBlock->delaySinceLastSR);
       position += 4;
     }
   }
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc
index 5a3eb39..541f522 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_fec_unittest.cc
@@ -11,8 +11,8 @@
 #include <list>
 
 #include "testing/gtest/include/gtest/gtest.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 
 using webrtc::ForwardErrorCorrection;
 
@@ -866,7 +866,7 @@
         // For media packets, the sequence number and marker bit is
         // obtained from RTP header. These were set in ConstructMediaPackets().
         received_packet->seq_num =
-            webrtc::RtpUtility::BufferToUWord16(&packet->data[2]);
+            webrtc::ByteReader<uint16_t>::ReadBigEndian(&packet->data[2]);
       } else {
         // The sequence number, marker bit, and ssrc number are defined in the
         // RTP header of the FEC packet, which is not constructed in this test.
@@ -921,11 +921,11 @@
     // Only push one (fake) frame to the FEC.
     media_packet->data[1] &= 0x7f;
 
-    webrtc::RtpUtility::AssignUWord16ToBuffer(&media_packet->data[2],
-                                              sequence_number);
-    webrtc::RtpUtility::AssignUWord32ToBuffer(&media_packet->data[4],
-                                              time_stamp);
-    webrtc::RtpUtility::AssignUWord32ToBuffer(&media_packet->data[8], ssrc_);
+    webrtc::ByteWriter<uint16_t>::WriteBigEndian(&media_packet->data[2],
+                                                 sequence_number);
+    webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[4],
+                                                 time_stamp);
+    webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[8], ssrc_);
 
     // Generate random values for payload.
     for (size_t j = 12; j < media_packet->length; ++j) {
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc b/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc
index 0d20b30..6568c38 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc
@@ -11,8 +11,8 @@
 #include <string.h>
 
 #include "webrtc/modules/interface/module_common_types.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_format_h264.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 
 namespace webrtc {
 namespace {
@@ -240,7 +240,7 @@
   *bytes_to_send += kNalHeaderSize;
   while (packet.aggregated) {
     // Add NAL unit length field.
-    RtpUtility::AssignUWord16ToBuffer(&buffer[index], packet.size);
+    ByteWriter<uint16_t>::WriteBigEndian(&buffer[index], packet.size);
     index += kLengthFieldSize;
     *bytes_to_send += kLengthFieldSize;
     // Add NAL unit.
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc b/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc
index 9a98e2a..60c27e4 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc
@@ -10,6 +10,7 @@
 
 #include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h"
 
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/system_wrappers/interface/logging.h"
 
 namespace webrtc {
@@ -260,9 +261,9 @@
   *packet_length -= kRtxHeaderSize;
 
   // Replace the SSRC and the sequence number with the originals.
-  RtpUtility::AssignUWord16ToBuffer(*restored_packet + 2,
-                                    original_sequence_number);
-  RtpUtility::AssignUWord32ToBuffer(*restored_packet + 8, original_ssrc);
+  ByteWriter<uint16_t>::WriteBigEndian(*restored_packet + 2,
+                                       original_sequence_number);
+  ByteWriter<uint32_t>::WriteBigEndian(*restored_packet + 8, original_ssrc);
 
   CriticalSectionScoped cs(crit_sect_.get());
 
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
index 30804f9..35f885a 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
@@ -13,6 +13,7 @@
 #include <stdlib.h>  // srand
 
 #include "webrtc/modules/rtp_rtcp/interface/rtp_cvo.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
@@ -1109,15 +1110,15 @@
   if (marker_bit) {
     header[1] |= kRtpMarkerBitMask;  // Marker bit is set.
   }
-  RtpUtility::AssignUWord16ToBuffer(header + 2, sequence_number);
-  RtpUtility::AssignUWord32ToBuffer(header + 4, timestamp);
-  RtpUtility::AssignUWord32ToBuffer(header + 8, ssrc);
+  ByteWriter<uint16_t>::WriteBigEndian(header + 2, sequence_number);
+  ByteWriter<uint32_t>::WriteBigEndian(header + 4, timestamp);
+  ByteWriter<uint32_t>::WriteBigEndian(header + 8, ssrc);
   int32_t rtp_header_length = kRtpHeaderLength;
 
   if (csrcs.size() > 0) {
     uint8_t *ptr = &header[rtp_header_length];
     for (size_t i = 0; i < csrcs.size(); ++i) {
-      RtpUtility::AssignUWord32ToBuffer(ptr, csrcs[i]);
+      ByteWriter<uint32_t>::WriteBigEndian(ptr, csrcs[i]);
       ptr += 4;
     }
     header[0] = (header[0] & 0xf0) | csrcs.size();
@@ -1179,7 +1180,8 @@
   const uint32_t kHeaderLength = kRtpOneByteHeaderLength;
 
   // Add extension ID (0xBEDE).
-  RtpUtility::AssignUWord16ToBuffer(data_buffer, kRtpOneByteHeaderExtensionId);
+  ByteWriter<uint16_t>::WriteBigEndian(data_buffer,
+                                       kRtpOneByteHeaderExtensionId);
 
   // Add extensions.
   uint16_t total_block_length = 0;
@@ -1223,8 +1225,8 @@
     total_block_length += padding_bytes;
   }
   // Set header length (in number of Word32, header excluded).
-  RtpUtility::AssignUWord16ToBuffer(data_buffer + kPosLength,
-                                    total_block_length / 4);
+  ByteWriter<uint16_t>::WriteBigEndian(data_buffer + kPosLength,
+                                       total_block_length / 4);
   // Total added length.
   return kHeaderLength + total_block_length;
 }
@@ -1258,8 +1260,8 @@
   size_t pos = 0;
   const uint8_t len = 2;
   data_buffer[pos++] = (id << 4) + len;
-  RtpUtility::AssignUWord24ToBuffer(data_buffer + pos,
-                                    transmission_time_offset_);
+  ByteWriter<int32_t, 3>::WriteBigEndian(data_buffer + pos,
+                                         transmission_time_offset_);
   pos += 3;
   assert(pos == kTransmissionTimeOffsetLength);
   return kTransmissionTimeOffsetLength;
@@ -1320,7 +1322,8 @@
   size_t pos = 0;
   const uint8_t len = 2;
   data_buffer[pos++] = (id << 4) + len;
-  RtpUtility::AssignUWord24ToBuffer(data_buffer + pos, absolute_send_time_);
+  ByteWriter<uint32_t, 3>::WriteBigEndian(data_buffer + pos,
+                                          absolute_send_time_);
   pos += 3;
   assert(pos == kAbsoluteSendTimeLength);
   return kAbsoluteSendTimeLength;
@@ -1372,8 +1375,8 @@
   size_t pos = 0;
   const uint8_t len = 1;
   data_buffer[pos++] = (id << 4) + len;
-  RtpUtility::AssignUWord16ToBuffer(data_buffer + pos,
-                                    transport_sequence_number_);
+  ByteWriter<uint16_t>::WriteBigEndian(data_buffer + pos,
+                                       transport_sequence_number_);
   pos += 2;
   assert(pos == kTransportSequenceNumberLength);
   return kTransportSequenceNumberLength;
@@ -1444,8 +1447,8 @@
     return;
   }
   // Update transmission offset field (converting to a 90 kHz timestamp).
-  RtpUtility::AssignUWord24ToBuffer(rtp_packet + block_pos + 1,
-                                    time_diff_ms * 90);  // RTP timestamp.
+  ByteWriter<int32_t, 3>::WriteBigEndian(rtp_packet + block_pos + 1,
+                                         time_diff_ms * 90);  // RTP timestamp.
 }
 
 bool RTPSender::UpdateAudioLevel(uint8_t* rtp_packet,
@@ -1560,8 +1563,8 @@
   }
   // Update absolute send time field (convert ms to 24-bit unsigned with 18 bit
   // fractional part).
-  RtpUtility::AssignUWord24ToBuffer(rtp_packet + block_pos + 1,
-                                    ((now_ms << 18) / 1000) & 0x00ffffff);
+  ByteWriter<uint32_t, 3>::WriteBigEndian(rtp_packet + block_pos + 1,
+                                          ((now_ms << 18) / 1000) & 0x00ffffff);
 }
 
 void RTPSender::SetSendingStatus(bool enabled) {
@@ -1786,15 +1789,15 @@
 
   // Replace sequence number.
   uint8_t *ptr = data_buffer_rtx + 2;
-  RtpUtility::AssignUWord16ToBuffer(ptr, sequence_number_rtx_++);
+  ByteWriter<uint16_t>::WriteBigEndian(ptr, sequence_number_rtx_++);
 
   // Replace SSRC.
   ptr += 6;
-  RtpUtility::AssignUWord32ToBuffer(ptr, ssrc_rtx_);
+  ByteWriter<uint32_t>::WriteBigEndian(ptr, ssrc_rtx_);
 
   // Add OSN (original sequence number).
   ptr = data_buffer_rtx + rtp_header.headerLength;
-  RtpUtility::AssignUWord16ToBuffer(ptr, rtp_header.sequenceNumber);
+  ByteWriter<uint16_t>::WriteBigEndian(ptr, rtp_header.sequenceNumber);
   ptr += 2;
 
   // Add original payload data.
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
index cdf5450..de728f0 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
@@ -13,6 +13,7 @@
 #include <assert.h> //assert
 #include <string.h> //memcpy
 
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/system_wrappers/interface/trace_event.h"
 
 namespace webrtc {
@@ -313,8 +314,8 @@
           return -1;
         }
         uint32_t REDheader = (timestampOffset << 10) + blockLength;
-        RtpUtility::AssignUWord24ToBuffer(dataBuffer + rtpHeaderLength,
-                                          REDheader);
+        ByteWriter<uint32_t>::WriteBigEndian(dataBuffer + rtpHeaderLength,
+                                             REDheader);
         rtpHeaderLength += 3;
 
         dataBuffer[rtpHeaderLength++] = fragmentation->fragmentationPlType[0];
@@ -471,7 +472,7 @@
         // First byte is Event number, equals key number
         dtmfbuffer[12] = _dtmfKey;
         dtmfbuffer[13] = E|R|volume;
-        RtpUtility::AssignUWord16ToBuffer(dtmfbuffer + 14, duration);
+        ByteWriter<uint16_t>::WriteBigEndian(dtmfbuffer + 14, duration);
 
         TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
                              "Audio::SendTelephoneEvent", "timestamp",
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc
index c802bd5..2b14cfe 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -15,10 +15,10 @@
 #include <string.h>
 
 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/producer_fec.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
 #include "webrtc/system_wrappers/interface/logging.h"
 #include "webrtc/system_wrappers/interface/trace_event.h"
@@ -195,7 +195,7 @@
   data[2] = 0;
   data[3] = 1;  // length
 
-  RtpUtility::AssignUWord32ToBuffer(data + 4, _rtpSender.SSRC());
+  ByteWriter<uint32_t>::WriteBigEndian(data + 4, _rtpSender.SSRC());
 
   TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
                        "Video::IntraRequest", "seqnum",
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc
index e3be426..3fef053 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_utility.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_utility.cc
@@ -29,6 +29,7 @@
 #include <stdio.h>
 #endif
 
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/system_wrappers/interface/tick_util.h"
 #include "webrtc/system_wrappers/interface/logging.h"
 
@@ -125,65 +126,6 @@
 }
 #endif
 
-/* for RTP/RTCP
-    All integer fields are carried in network byte order, that is, most
-    significant byte (octet) first.  AKA big-endian.
-*/
-void AssignUWord32ToBuffer(uint8_t* dataBuffer, uint32_t value) {
-#if defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-  dataBuffer[0] = static_cast<uint8_t>(value >> 24);
-  dataBuffer[1] = static_cast<uint8_t>(value >> 16);
-  dataBuffer[2] = static_cast<uint8_t>(value >> 8);
-  dataBuffer[3] = static_cast<uint8_t>(value);
-#else
-  uint32_t* ptr = reinterpret_cast<uint32_t*>(dataBuffer);
-  ptr[0] = value;
-#endif
-}
-
-void AssignUWord24ToBuffer(uint8_t* dataBuffer, uint32_t value) {
-#if defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-  dataBuffer[0] = static_cast<uint8_t>(value >> 16);
-  dataBuffer[1] = static_cast<uint8_t>(value >> 8);
-  dataBuffer[2] = static_cast<uint8_t>(value);
-#else
-  dataBuffer[0] = static_cast<uint8_t>(value);
-  dataBuffer[1] = static_cast<uint8_t>(value >> 8);
-  dataBuffer[2] = static_cast<uint8_t>(value >> 16);
-#endif
-}
-
-void AssignUWord16ToBuffer(uint8_t* dataBuffer, uint16_t value) {
-#if defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-  dataBuffer[0] = static_cast<uint8_t>(value >> 8);
-  dataBuffer[1] = static_cast<uint8_t>(value);
-#else
-  uint16_t* ptr = reinterpret_cast<uint16_t*>(dataBuffer);
-  ptr[0] = value;
-#endif
-}
-
-uint16_t BufferToUWord16(const uint8_t* dataBuffer) {
-#if defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-  return (dataBuffer[0] << 8) + dataBuffer[1];
-#else
-  return *reinterpret_cast<const uint16_t*>(dataBuffer);
-#endif
-}
-
-uint32_t BufferToUWord24(const uint8_t* dataBuffer) {
-  return (dataBuffer[0] << 16) + (dataBuffer[1] << 8) + dataBuffer[2];
-}
-
-uint32_t BufferToUWord32(const uint8_t* dataBuffer) {
-#if defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-  return (dataBuffer[0] << 24) + (dataBuffer[1] << 16) + (dataBuffer[2] << 8) +
-      dataBuffer[3];
-#else
-  return *reinterpret_cast<const uint32_t*>(dataBuffer);
-#endif
-}
-
 size_t Word32Align(size_t size) {
   uint32_t remainder = size % 4;
   if (remainder != 0)
@@ -294,10 +236,8 @@
   const size_t len = (_ptrRTPDataBegin[2] << 8) + _ptrRTPDataBegin[3];
   const uint8_t* ptr = &_ptrRTPDataBegin[4];
 
-  uint32_t SSRC = *ptr++ << 24;
-  SSRC += *ptr++ << 16;
-  SSRC += *ptr++ << 8;
-  SSRC += *ptr++;
+  uint32_t SSRC = ByteReader<uint32_t>::ReadBigEndian(ptr);
+  ptr += 4;
 
   header->payloadType  = PT;
   header->ssrc         = SSRC;
@@ -329,15 +269,11 @@
 
   const uint8_t* ptr = &_ptrRTPDataBegin[4];
 
-  uint32_t RTPTimestamp = *ptr++ << 24;
-  RTPTimestamp += *ptr++ << 16;
-  RTPTimestamp += *ptr++ << 8;
-  RTPTimestamp += *ptr++;
+  uint32_t RTPTimestamp = ByteReader<uint32_t>::ReadBigEndian(ptr);
+  ptr += 4;
 
-  uint32_t SSRC = *ptr++ << 24;
-  SSRC += *ptr++ << 16;
-  SSRC += *ptr++ << 8;
-  SSRC += *ptr++;
+  uint32_t SSRC = ByteReader<uint32_t>::ReadBigEndian(ptr);
+  ptr += 4;
 
   if (V != kRtpExpectedVersion) {
     return false;
@@ -358,10 +294,8 @@
   header.paddingLength  = P ? *(_ptrRTPDataEnd - 1) : 0;
 
   for (uint8_t i = 0; i < CC; ++i) {
-    uint32_t CSRC = *ptr++ << 24;
-    CSRC += *ptr++ << 16;
-    CSRC += *ptr++ << 8;
-    CSRC += *ptr++;
+    uint32_t CSRC = ByteReader<uint32_t>::ReadBigEndian(ptr);
+    ptr += 4;
     header.arrOfCSRCs[i] = CSRC;
   }
 
@@ -401,12 +335,13 @@
 
     header.headerLength += 4;
 
-    uint16_t definedByProfile = *ptr++ << 8;
-    definedByProfile += *ptr++;
+    uint16_t definedByProfile = ByteReader<uint16_t>::ReadBigEndian(ptr);
+    ptr += 2;
 
-    size_t XLen = *ptr++ << 8;
-    XLen += *ptr++; // in 32 bit words
-    XLen *= 4; // in octs
+    // in 32 bit words
+    size_t XLen = ByteReader<uint16_t>::ReadBigEndian(ptr);
+    ptr += 2;
+    XLen *= 4;  // in bytes
 
     if (static_cast<size_t>(remain) < (4 + XLen)) {
       return false;
@@ -470,15 +405,8 @@
           // |  ID   | len=2 |              transmission offset              |
           // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
-          int32_t transmissionTimeOffset = ptr[0] << 16;
-          transmissionTimeOffset += ptr[1] << 8;
-          transmissionTimeOffset += ptr[2];
           header.extension.transmissionTimeOffset =
-              transmissionTimeOffset;
-          if (transmissionTimeOffset & 0x800000) {
-            // Negative offset, correct sign for Word24 to Word32.
-            header.extension.transmissionTimeOffset |= 0xFF000000;
-          }
+              ByteReader<int32_t, 3>::ReadBigEndian(ptr);
           header.extension.hasTransmissionTimeOffset = true;
           break;
         }
@@ -515,10 +443,8 @@
           // |  ID   | len=2 |              absolute send time               |
           // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
-          uint32_t absoluteSendTime = ptr[0] << 16;
-          absoluteSendTime += ptr[1] << 8;
-          absoluteSendTime += ptr[2];
-          header.extension.absoluteSendTime = absoluteSendTime;
+          header.extension.absoluteSendTime =
+              ByteReader<uint32_t, 3>::ReadBigEndian(ptr);
           header.extension.hasAbsoluteSendTime = true;
           break;
         }
@@ -528,11 +454,11 @@
                 << "Incorrect coordination of video coordination len: " << len;
             return;
           }
-          //   0                   1
-          //   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-          //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          //  |  ID   | len=0 |0 0 0 0 C F R R|
-          //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+          //  0                   1
+          //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+          // |  ID   | len=0 |0 0 0 0 C F R R|
+          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
           header.extension.hasVideoRotation = true;
           header.extension.videoRotation = ptr[0];
           break;
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_utility.h b/webrtc/modules/rtp_rtcp/source/rtp_utility.h
index 4c8e382..af20f97 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_utility.h
+++ b/webrtc/modules/rtp_rtcp/source/rtp_utility.h
@@ -66,31 +66,6 @@
                        const char* str2,
                        const uint32_t length);
 
-    void AssignUWord32ToBuffer(uint8_t* dataBuffer, uint32_t value);
-    void AssignUWord24ToBuffer(uint8_t* dataBuffer, uint32_t value);
-    void AssignUWord16ToBuffer(uint8_t* dataBuffer, uint16_t value);
-
-    /**
-     * Converts a network-ordered two-byte input buffer to a host-ordered value.
-     * \param[in] dataBuffer Network-ordered two-byte buffer to convert.
-     * \return Host-ordered value.
-     */
-    uint16_t BufferToUWord16(const uint8_t* dataBuffer);
-
-    /**
-     * Converts a network-ordered three-byte input buffer to a host-ordered value.
-     * \param[in] dataBuffer Network-ordered three-byte buffer to convert.
-     * \return Host-ordered value.
-     */
-    uint32_t BufferToUWord24(const uint8_t* dataBuffer);
-
-    /**
-     * Converts a network-ordered four-byte input buffer to a host-ordered value.
-     * \param[in] dataBuffer Network-ordered four-byte buffer to convert.
-     * \return Host-ordered value.
-     */
-    uint32_t BufferToUWord32(const uint8_t* dataBuffer);
-
     // Round up to the nearest size that is a multiple of 4.
     size_t Word32Align(size_t size);
 
diff --git a/webrtc/modules/rtp_rtcp/test/testAPI/test_api_video.cc b/webrtc/modules/rtp_rtcp/test/testAPI/test_api_video.cc
index e8d4320..e28d5ce 100644
--- a/webrtc/modules/rtp_rtcp/test/testAPI/test_api_video.cc
+++ b/webrtc/modules/rtp_rtcp/test/testAPI/test_api_video.cc
@@ -18,8 +18,8 @@
 #include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h"
 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
 #include "webrtc/modules/rtp_rtcp/test/testAPI/test_api.h"
 
 namespace {
@@ -89,9 +89,9 @@
                          uint32_t sequence_number) {
     dataBuffer[0] = static_cast<uint8_t>(0x80);  // version 2
     dataBuffer[1] = static_cast<uint8_t>(kPayloadType);
-    RtpUtility::AssignUWord16ToBuffer(dataBuffer + 2, sequence_number);
-    RtpUtility::AssignUWord32ToBuffer(dataBuffer + 4, timestamp);
-    RtpUtility::AssignUWord32ToBuffer(dataBuffer + 8, 0x1234);  // SSRC.
+    ByteWriter<uint16_t>::WriteBigEndian(dataBuffer + 2, sequence_number);
+    ByteWriter<uint32_t>::WriteBigEndian(dataBuffer + 4, timestamp);
+    ByteWriter<uint32_t>::WriteBigEndian(dataBuffer + 8, 0x1234);  // SSRC.
     size_t rtpHeaderLength = 12;
     return rtpHeaderLength;
   }
diff --git a/webrtc/modules/rtp_rtcp/test/testFec/test_fec.cc b/webrtc/modules/rtp_rtcp/test/testFec/test_fec.cc
index a009f3a..a8eafdd 100644
--- a/webrtc/modules/rtp_rtcp/test/testFec/test_fec.cc
+++ b/webrtc/modules/rtp_rtcp/test/testFec/test_fec.cc
@@ -26,7 +26,7 @@
 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
 
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/test/testsupport/fileutils.h"
 
 //#define VERBOSE_OUTPUT
@@ -259,10 +259,11 @@
               // Only push one (fake) frame to the FEC.
               mediaPacket->data[1] &= 0x7f;
 
-              RtpUtility::AssignUWord16ToBuffer(&mediaPacket->data[2], seqNum);
-              RtpUtility::AssignUWord32ToBuffer(&mediaPacket->data[4],
-                                                timeStamp);
-              RtpUtility::AssignUWord32ToBuffer(&mediaPacket->data[8], ssrc);
+              ByteWriter<uint16_t>::WriteBigEndian(&mediaPacket->data[2],
+                                                   seqNum);
+              ByteWriter<uint32_t>::WriteBigEndian(&mediaPacket->data[4],
+                                                   timeStamp);
+              ByteWriter<uint32_t>::WriteBigEndian(&mediaPacket->data[8], ssrc);
               // Generate random values for payload
               for (size_t j = 12; j < mediaPacket->length; ++j) {
                 mediaPacket->data[j] = static_cast<uint8_t>(rand() % 256);
@@ -301,7 +302,7 @@
                 memcpy(receivedPacket->pkt->data, mediaPacket->data,
                        mediaPacket->length);
                 receivedPacket->seq_num =
-                    RtpUtility::BufferToUWord16(&mediaPacket->data[2]);
+                    ByteReader<uint16_t>::ReadBigEndian(&mediaPacket->data[2]);
                 receivedPacket->is_fec = false;
               }
               mediaPacketIdx++;