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);