Add helper RtpPacket::SetPayload

For a relatively common case where RTP payload is already pre-built and
just need to be copied into an RtpPacket

Thus hard to read memcpy can be hidden in those places and code become
more readable

Bug: None
Change-Id: I39e4fec28bc150eb80435ac2b26cd3d4db53ea7a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/400880
Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45172}
diff --git a/call/rtx_receive_stream.cc b/call/rtx_receive_stream.cc
index 1607ebb..eae0e7b 100644
--- a/call/rtx_receive_stream.cc
+++ b/call/rtx_receive_stream.cc
@@ -10,7 +10,6 @@
 
 #include "call/rtx_receive_stream.h"
 
-#include <string.h>
 
 #include <cstdint>
 #include <map>
@@ -22,7 +21,6 @@
 #include "modules/rtp_rtcp/include/receive_statistics.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 
 namespace webrtc {
@@ -79,12 +77,7 @@
   media_packet.set_arrival_time(rtx_packet.arrival_time());
 
   // Skip the RTX header.
-  ArrayView<const uint8_t> rtx_payload = payload.subview(kRtxHeaderSize);
-
-  uint8_t* media_payload = media_packet.AllocatePayload(rtx_payload.size());
-  RTC_DCHECK(media_payload != nullptr);
-
-  memcpy(media_payload, rtx_payload.data(), rtx_payload.size());
+  media_packet.SetPayload(payload.subview(kRtxHeaderSize));
 
   media_sink_->OnRtpPacket(media_packet);
 }
diff --git a/modules/audio_coding/acm2/acm_send_test.cc b/modules/audio_coding/acm2/acm_send_test.cc
index f08397a..54dc1c3 100644
--- a/modules/audio_coding/acm2/acm_send_test.cc
+++ b/modules/audio_coding/acm2/acm_send_test.cc
@@ -149,9 +149,7 @@
   rtp_packet->SetSsrc(0x12345678);
   ++sequence_number_;
 
-  // Copy the payload data.
-  memcpy(rtp_packet->AllocatePayload(last_payload_vec_.size()),
-         last_payload_vec_.data(), last_payload_vec_.size());
+  rtp_packet->SetPayload(last_payload_vec_);
   rtp_packet->set_arrival_time(clock_.CurrentTime());
   return rtp_packet;
 }
diff --git a/modules/rtp_rtcp/source/flexfec_sender.cc b/modules/rtp_rtcp/source/flexfec_sender.cc
index 9b5ceac..90a0f20 100644
--- a/modules/rtp_rtcp/source/flexfec_sender.cc
+++ b/modules/rtp_rtcp/source/flexfec_sender.cc
@@ -170,9 +170,7 @@
     }
 
     // RTP payload.
-    uint8_t* payload =
-        fec_packet_to_send->AllocatePayload(fec_packet->data.size());
-    memcpy(payload, fec_packet->data.cdata(), fec_packet->data.size());
+    fec_packet_to_send->SetPayload(fec_packet->data);
 
     total_fec_data_bytes += fec_packet_to_send->size();
     fec_packets_to_send.push_back(std::move(fec_packet_to_send));
diff --git a/modules/rtp_rtcp/source/rtp_format_h264.cc b/modules/rtp_rtcp/source/rtp_format_h264.cc
index fd501a2..c36a56d 100644
--- a/modules/rtp_rtcp/source/rtp_format_h264.cc
+++ b/modules/rtp_rtcp/source/rtp_format_h264.cc
@@ -231,9 +231,7 @@
   PacketUnit packet = packets_.front();
   if (packet.first_fragment && packet.last_fragment) {
     // Single NAL unit packet.
-    size_t bytes_to_send = packet.source_fragment.size();
-    uint8_t* buffer = rtp_packet->AllocatePayload(bytes_to_send);
-    memcpy(buffer, packet.source_fragment.data(), bytes_to_send);
+    rtp_packet->SetPayload(packet.source_fragment);
     packets_.pop();
     input_fragments_.pop_front();
   } else if (packet.aggregated) {
diff --git a/modules/rtp_rtcp/source/rtp_packet.cc b/modules/rtp_rtcp/source/rtp_packet.cc
index fe9d3a7..66147a2 100644
--- a/modules/rtp_rtcp/source/rtp_packet.cc
+++ b/modules/rtp_rtcp/source/rtp_packet.cc
@@ -402,6 +402,10 @@
   return SetPayloadSize(size_bytes);
 }
 
+void RtpPacket::SetPayload(ArrayView<const uint8_t> payload) {
+  memcpy(AllocatePayload(payload.size()), payload.data(), payload.size());
+}
+
 uint8_t* RtpPacket::SetPayloadSize(size_t size_bytes) {
   RTC_DCHECK_EQ(padding_size_, 0);
   payload_size_ = size_bytes;
diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h
index 9f98d5b..3d27520 100644
--- a/modules/rtp_rtcp/source/rtp_packet.h
+++ b/modules/rtp_rtcp/source/rtp_packet.h
@@ -165,6 +165,9 @@
   // Same as SetPayloadSize but doesn't guarantee to keep current payload.
   uint8_t* AllocatePayload(size_t size_bytes);
 
+  // Sets payload size to `payload.size()` and copies `payload`.
+  void SetPayload(ArrayView<const uint8_t> payload);
+
   bool SetPadding(size_t padding_size);
 
   // Returns debug string of RTP packet (without detailed extension info).
diff --git a/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_unittest.cc
index 80fe006..ab5cc14 100644
--- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_packet_unittest.cc
@@ -435,6 +435,14 @@
   EXPECT_TRUE(packet.SetExtension<TransmissionOffset>(kTimeOffset));
 }
 
+TEST(RtpPacketTest, SetPayload) {
+  const uint8_t payload[] = {1, 2, 3, 4, 2, 0, 42};
+  RtpPacket packet;
+  packet.SetPayload(payload);
+
+  EXPECT_THAT(packet.payload(), ElementsAreArray(payload));
+}
+
 TEST(RtpPacketTest, CreatePurePadding) {
   const size_t kPaddingSize = kMaxPaddingSize - 1;
   RtpPacketToSend packet(nullptr, 12 + kPaddingSize);
diff --git a/modules/rtp_rtcp/source/rtp_packetizer_h265.cc b/modules/rtp_rtcp/source/rtp_packetizer_h265.cc
index 0ae271c..f404886 100644
--- a/modules/rtp_rtcp/source/rtp_packetizer_h265.cc
+++ b/modules/rtp_rtcp/source/rtp_packetizer_h265.cc
@@ -210,9 +210,7 @@
   if (packet.first_fragment && packet.last_fragment) {
     // Single NAL unit packet. Do not support DONL for single NAL unit packets,
     // DONL field is not present.
-    size_t bytes_to_send = packet.source_fragment.size();
-    uint8_t* buffer = rtp_packet->AllocatePayload(bytes_to_send);
-    memcpy(buffer, packet.source_fragment.data(), bytes_to_send);
+    rtp_packet->SetPayload(packet.source_fragment);
     packets_.pop();
     input_fragments_.pop_front();
   } else if (packet.aggregated) {
diff --git a/modules/rtp_rtcp/source/rtp_sender_audio.cc b/modules/rtp_rtcp/source/rtp_sender_audio.cc
index e6406a3..51c47cd 100644
--- a/modules/rtp_rtcp/source/rtp_sender_audio.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_audio.cc
@@ -256,9 +256,7 @@
     packet->SetExtension<AbsoluteCaptureTimeExtension>(*absolute_capture_time);
   }
 
-  uint8_t* payload = packet->AllocatePayload(frame.payload.size());
-  RTC_CHECK(payload);
-  memcpy(payload, frame.payload.data(), frame.payload.size());
+  packet->SetPayload(frame.payload);
 
   {
     MutexLock lock(&send_audio_mutex_);
diff --git a/video/rtp_video_stream_receiver2_unittest.cc b/video/rtp_video_stream_receiver2_unittest.cc
index a188a00..970d638 100644
--- a/video/rtp_video_stream_receiver2_unittest.cc
+++ b/video/rtp_video_stream_receiver2_unittest.cc
@@ -1733,8 +1733,7 @@
   // Set playout delay on outgoing packet.
   EXPECT_TRUE(packet_to_send.SetExtension<PlayoutDelayLimits>(
       TransmittedPlayoutDelay()));
-  uint8_t* payload = packet_to_send.AllocatePayload(payload_data.size());
-  memcpy(payload, payload_data.data(), payload_data.size());
+  packet_to_send.SetPayload(payload_data);
 
   RtpPacketReceived received_packet(&extension_map);
   received_packet.Parse(packet_to_send.data(), packet_to_send.size());
diff --git a/video/video_receive_stream2_unittest.cc b/video/video_receive_stream2_unittest.cc
index b19e001..ec7f76e 100644
--- a/video/video_receive_stream2_unittest.cc
+++ b/video/video_receive_stream2_unittest.cc
@@ -294,8 +294,7 @@
 TEST_P(VideoReceiveStream2Test, CreateFrameFromH264FmtpSpropAndIdr) {
   constexpr uint8_t idr_nalu[] = {0x05, 0xFF, 0xFF, 0xFF};
   RtpPacketToSend rtppacket(nullptr);
-  uint8_t* payload = rtppacket.AllocatePayload(sizeof(idr_nalu));
-  memcpy(payload, idr_nalu, sizeof(idr_nalu));
+  rtppacket.SetPayload(idr_nalu);
   rtppacket.SetMarker(true);
   rtppacket.SetSsrc(kRemoteSsrc);
   rtppacket.SetPayloadType(kH264PayloadType);
@@ -460,8 +459,7 @@
 TEST_P(VideoReceiveStream2Test, LazyDecoderCreation) {
   constexpr uint8_t idr_nalu[] = {0x05, 0xFF, 0xFF, 0xFF};
   RtpPacketToSend rtppacket(nullptr);
-  uint8_t* payload = rtppacket.AllocatePayload(sizeof(idr_nalu));
-  memcpy(payload, idr_nalu, sizeof(idr_nalu));
+  rtppacket.SetPayload(idr_nalu);
   rtppacket.SetMarker(true);
   rtppacket.SetSsrc(kRemoteSsrc);
   rtppacket.SetPayloadType(kH264PayloadType);
@@ -494,8 +492,7 @@
 TEST_P(VideoReceiveStream2Test, LazyDecoderCreationCodecSwitch) {
   constexpr uint8_t idr_nalu[] = {0x05, 0xFF, 0xFF, 0xFF};
   RtpPacketToSend rtppacket(nullptr);
-  uint8_t* payload = rtppacket.AllocatePayload(sizeof(idr_nalu));
-  memcpy(payload, idr_nalu, sizeof(idr_nalu));
+  rtppacket.SetPayload(idr_nalu);
   rtppacket.SetMarker(true);
   rtppacket.SetSsrc(kRemoteSsrc);
   rtppacket.SetPayloadType(kH264PayloadType);
@@ -528,8 +525,7 @@
   // Switch to AV1.
   const uint8_t av1_key_obu[] = {0x18, 0x48, 0x01, 0xAA};  // \  OBU
   RtpPacketToSend av1_rtppacket(nullptr);
-  uint8_t* av1_payload = av1_rtppacket.AllocatePayload(sizeof(av1_key_obu));
-  memcpy(av1_payload, av1_key_obu, sizeof(av1_key_obu));
+  av1_rtppacket.SetPayload(av1_key_obu);
   av1_rtppacket.SetMarker(true);
   av1_rtppacket.SetSsrc(kRemoteSsrc);
   av1_rtppacket.SetPayloadType(kAv1PayloadType);