Move helpers to parse base rtp packet fields to rtp_rtcp module
rtp_rtcp_format is lighter build target than rtc_media_base and
a more natural place to keep rtp parsing functions.
Bug: None
Change-Id: Ibcb5661cc65edbdc89a63f3e411d7ad1218353cc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/226330
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34504}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 5f0f527..0e6b340 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -292,6 +292,7 @@
"../modules/audio_processing:api",
"../modules/audio_processing/aec_dump",
"../modules/audio_processing/agc:gain_control_interface",
+ "../modules/rtp_rtcp:rtp_rtcp_format",
"../modules/video_coding",
"../modules/video_coding:video_codec_interface",
"../modules/video_coding:video_coding_utility",
diff --git a/media/base/fake_network_interface.h b/media/base/fake_network_interface.h
index 45b7aa0..043e559 100644
--- a/media/base/fake_network_interface.h
+++ b/media/base/fake_network_interface.h
@@ -17,6 +17,7 @@
#include "media/base/media_channel.h"
#include "media/base/rtp_utils.h"
+#include "modules/rtp_rtcp/source/rtp_util.h"
#include "rtc_base/byte_order.h"
#include "rtc_base/checks.h"
#include "rtc_base/copy_on_write_buffer.h"
@@ -116,13 +117,12 @@
virtual bool SendPacket(rtc::CopyOnWriteBuffer* packet,
const rtc::PacketOptions& options)
RTC_LOCKS_EXCLUDED(mutex_) {
- webrtc::MutexLock lock(&mutex_);
-
- uint32_t cur_ssrc = 0;
- if (!GetRtpSsrc(packet->data(), packet->size(), &cur_ssrc)) {
+ if (!webrtc::IsRtpPacket(*packet)) {
return false;
}
- sent_ssrcs_[cur_ssrc]++;
+
+ webrtc::MutexLock lock(&mutex_);
+ sent_ssrcs_[webrtc::ParseRtpSsrc(*packet)]++;
options_ = options;
rtp_packets_.push_back(*packet);
@@ -192,13 +192,8 @@
if (packets) {
*packets = 0;
}
- uint32_t cur_ssrc = 0;
for (size_t i = 0; i < rtp_packets_.size(); ++i) {
- if (!GetRtpSsrc(rtp_packets_[i].data(), rtp_packets_[i].size(),
- &cur_ssrc)) {
- return;
- }
- if (ssrc == cur_ssrc) {
+ if (ssrc == webrtc::ParseRtpSsrc(rtp_packets_[i])) {
if (bytes) {
*bytes += static_cast<int>(rtp_packets_[i].size());
}
diff --git a/media/base/rtp_utils.cc b/media/base/rtp_utils.cc
index 9f90c46..e796482 100644
--- a/media/base/rtp_utils.cc
+++ b/media/base/rtp_utils.cc
@@ -25,10 +25,6 @@
namespace cricket {
-static const size_t kRtpPayloadTypeOffset = 1;
-static const size_t kRtpSeqNumOffset = 2;
-static const size_t kRtpTimestampOffset = 4;
-static const size_t kRtpSsrcOffset = 8;
static const size_t kRtcpPayloadTypeOffset = 1;
static const size_t kRtpExtensionHeaderLen = 4;
static const size_t kAbsSendTimeExtensionLen = 3;
@@ -126,57 +122,8 @@
return true;
}
-bool GetUint16(const void* data, size_t offset, int* value) {
- if (!data || !value) {
- return false;
- }
- *value = static_cast<int>(
- rtc::GetBE16(static_cast<const uint8_t*>(data) + offset));
- return true;
-}
-
-bool GetUint32(const void* data, size_t offset, uint32_t* value) {
- if (!data || !value) {
- return false;
- }
- *value = rtc::GetBE32(static_cast<const uint8_t*>(data) + offset);
- return true;
-}
-
} // namespace
-bool GetRtpPayloadType(const void* data, size_t len, int* value) {
- if (len < kMinRtpPacketLen) {
- return false;
- }
- if (!GetUint8(data, kRtpPayloadTypeOffset, value)) {
- return false;
- }
- *value &= 0x7F;
- return true;
-}
-
-bool GetRtpSeqNum(const void* data, size_t len, int* value) {
- if (len < kMinRtpPacketLen) {
- return false;
- }
- return GetUint16(data, kRtpSeqNumOffset, value);
-}
-
-bool GetRtpTimestamp(const void* data, size_t len, uint32_t* value) {
- if (len < kMinRtpPacketLen) {
- return false;
- }
- return GetUint32(data, kRtpTimestampOffset, value);
-}
-
-bool GetRtpSsrc(const void* data, size_t len, uint32_t* value) {
- if (len < kMinRtpPacketLen) {
- return false;
- }
- return GetUint32(data, kRtpSsrcOffset, value);
-}
-
bool GetRtcpType(const void* data, size_t len, int* value) {
if (len < kMinRtcpPacketLen) {
return false;
diff --git a/media/base/rtp_utils.h b/media/base/rtp_utils.h
index f6b5dbc..e10403c 100644
--- a/media/base/rtp_utils.h
+++ b/media/base/rtp_utils.h
@@ -42,11 +42,6 @@
kUnknown,
};
-bool GetRtpPayloadType(const void* data, size_t len, int* value);
-bool GetRtpSeqNum(const void* data, size_t len, int* value);
-bool GetRtpTimestamp(const void* data, size_t len, uint32_t* value);
-bool GetRtpSsrc(const void* data, size_t len, uint32_t* value);
-
bool GetRtcpType(const void* data, size_t len, int* value);
bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value);
diff --git a/media/base/rtp_utils_unittest.cc b/media/base/rtp_utils_unittest.cc
index 14599ab..543babe 100644
--- a/media/base/rtp_utils_unittest.cc
+++ b/media/base/rtp_utils_unittest.cc
@@ -21,8 +21,6 @@
namespace cricket {
-static const uint8_t kRtpPacketWithMarker[] = {
- 0x80, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
static const uint8_t kInvalidPacket[] = {0x80, 0x00};
// PT = 206, FMT = 1, Sender SSRC = 0x1111, Media SSRC = 0x1111
@@ -84,32 +82,6 @@
rtc::MakeArrayView(reinterpret_cast<const char*>(kInvalidPacket),
sizeof(kInvalidPacket));
-TEST(RtpUtilsTest, GetRtp) {
- int pt;
- EXPECT_TRUE(GetRtpPayloadType(kPcmuFrame, sizeof(kPcmuFrame), &pt));
- EXPECT_EQ(0, pt);
- EXPECT_TRUE(GetRtpPayloadType(kRtpPacketWithMarker,
- sizeof(kRtpPacketWithMarker), &pt));
- EXPECT_EQ(0, pt);
-
- int seq_num;
- EXPECT_TRUE(GetRtpSeqNum(kPcmuFrame, sizeof(kPcmuFrame), &seq_num));
- EXPECT_EQ(1, seq_num);
-
- uint32_t ts;
- EXPECT_TRUE(GetRtpTimestamp(kPcmuFrame, sizeof(kPcmuFrame), &ts));
- EXPECT_EQ(0u, ts);
-
- uint32_t ssrc;
- EXPECT_TRUE(GetRtpSsrc(kPcmuFrame, sizeof(kPcmuFrame), &ssrc));
- EXPECT_EQ(1u, ssrc);
-
- EXPECT_FALSE(GetRtpPayloadType(kInvalidPacket, sizeof(kInvalidPacket), &pt));
- EXPECT_FALSE(GetRtpSeqNum(kInvalidPacket, sizeof(kInvalidPacket), &seq_num));
- EXPECT_FALSE(GetRtpTimestamp(kInvalidPacket, sizeof(kInvalidPacket), &ts));
- EXPECT_FALSE(GetRtpSsrc(kInvalidPacket, sizeof(kInvalidPacket), &ssrc));
-}
-
TEST(RtpUtilsTest, GetRtcp) {
int pt;
EXPECT_TRUE(GetRtcpType(kRtcpReport, sizeof(kRtcpReport), &pt));
diff --git a/media/engine/fake_webrtc_call.cc b/media/engine/fake_webrtc_call.cc
index e8c7f6e..1340151 100644
--- a/media/engine/fake_webrtc_call.cc
+++ b/media/engine/fake_webrtc_call.cc
@@ -14,12 +14,15 @@
#include "absl/algorithm/container.h"
#include "api/call/audio_sink.h"
-#include "media/base/rtp_utils.h"
+#include "modules/rtp_rtcp/source/rtp_util.h"
#include "rtc_base/checks.h"
#include "rtc_base/gunit.h"
#include "rtc_base/thread.h"
namespace cricket {
+
+using ::webrtc::ParseRtpSsrc;
+
FakeAudioSendStream::FakeAudioSendStream(
int id,
const webrtc::AudioSendStream::Config& config)
@@ -601,10 +604,11 @@
RTC_DCHECK(media_type == webrtc::MediaType::AUDIO ||
media_type == webrtc::MediaType::VIDEO);
- uint32_t ssrc;
- if (!GetRtpSsrc(packet.cdata(), packet.size(), &ssrc))
+ if (!webrtc::IsRtpPacket(packet)) {
return DELIVERY_PACKET_ERROR;
+ }
+ uint32_t ssrc = ParseRtpSsrc(packet);
if (media_type == webrtc::MediaType::VIDEO) {
for (auto receiver : video_receive_streams_) {
if (receiver->GetConfig().rtp.remote_ssrc == ssrc) {
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index 38a210e..017ce53 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -31,6 +31,7 @@
#include "media/engine/simulcast.h"
#include "media/engine/webrtc_media_engine.h"
#include "media/engine/webrtc_voice_engine.h"
+#include "modules/rtp_rtcp/source/rtp_util.h"
#include "rtc_base/copy_on_write_buffer.h"
#include "rtc_base/experiments/field_trial_parser.h"
#include "rtc_base/experiments/field_trial_units.h"
@@ -46,6 +47,9 @@
namespace {
+using ::webrtc::ParseRtpPayloadType;
+using ::webrtc::ParseRtpSsrc;
+
const int kMinLayerSize = 16;
constexpr int64_t kUnsignaledSsrcCooldownMs = rtc::kNumMillisecsPerSec / 2;
@@ -1727,10 +1731,7 @@
break;
}
- uint32_t ssrc = 0;
- if (!GetRtpSsrc(packet.cdata(), packet.size(), &ssrc)) {
- return;
- }
+ uint32_t ssrc = ParseRtpSsrc(packet);
if (unknown_ssrc_packet_buffer_) {
unknown_ssrc_packet_buffer_->AddPacket(ssrc, packet_time_us, packet);
@@ -1741,10 +1742,7 @@
return;
}
- int payload_type = 0;
- if (!GetRtpPayloadType(packet.cdata(), packet.size(), &payload_type)) {
- return;
- }
+ int payload_type = ParseRtpPayloadType(packet);
// See if this payload_type is registered as one that usually gets its
// own SSRC (RTX) or at least is safe to drop either way (FEC). If it
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index d0745e3..97764f8 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -77,8 +77,9 @@
using ::testing::SizeIs;
using ::testing::StrNe;
using ::testing::Values;
-using webrtc::BitrateConstraints;
-using webrtc::RtpExtension;
+using ::webrtc::BitrateConstraints;
+using ::webrtc::RtpExtension;
+using ::webrtc::RtpPacket;
namespace {
static const int kDefaultQpMax = 56;
@@ -1425,7 +1426,7 @@
}
void DeliverKeyFrame(uint32_t ssrc) {
- webrtc::RtpPacket packet;
+ RtpPacket packet;
packet.SetMarker(true);
packet.SetPayloadType(96); // VP8
packet.SetSsrc(ssrc);
@@ -1666,7 +1667,7 @@
return network_interface_.GetRtpPacket(index);
}
static int GetPayloadType(rtc::CopyOnWriteBuffer p) {
- webrtc::RtpPacket header;
+ RtpPacket header;
EXPECT_TRUE(header.Parse(std::move(p)));
return header.PayloadType();
}
@@ -2060,7 +2061,7 @@
EXPECT_TRUE(SetSend(true));
SendFrame();
EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout);
- webrtc::RtpPacket header;
+ RtpPacket header;
EXPECT_TRUE(header.Parse(GetRtpPacket(0)));
EXPECT_EQ(kSsrc, header.Ssrc());
@@ -2084,7 +2085,7 @@
EXPECT_TRUE(SetSend(true));
EXPECT_TRUE(WaitAndSendFrame(0));
EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout);
- webrtc::RtpPacket header;
+ RtpPacket header;
EXPECT_TRUE(header.Parse(GetRtpPacket(0)));
EXPECT_EQ(999u, header.Ssrc());
// Packets are being paced out, so these can mismatch between the first and
@@ -2099,16 +2100,13 @@
// Test that we can set the default video renderer before and after
// media is received.
TEST_F(WebRtcVideoChannelBaseTest, SetSink) {
- uint8_t data1[] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
- rtc::CopyOnWriteBuffer packet1(data1, sizeof(data1));
- rtc::SetBE32(packet1.MutableData() + 8, kSsrc);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc);
channel_->SetDefaultSink(NULL);
EXPECT_TRUE(SetDefaultCodec());
EXPECT_TRUE(SetSend(true));
EXPECT_EQ(0, renderer_.num_rendered_frames());
- channel_->OnPacketReceived(packet1, /* packet_time_us */ -1);
+ channel_->OnPacketReceived(packet.Buffer(), /* packet_time_us */ -1);
channel_->SetDefaultSink(&renderer_);
SendFrame();
EXPECT_FRAME_WAIT(1, kVideoWidth, kVideoHeight, kTimeout);
@@ -2122,7 +2120,7 @@
SendFrame();
EXPECT_FRAME_WAIT(1, kVideoWidth, kVideoHeight, kTimeout);
EXPECT_GT(NumRtpPackets(), 0);
- webrtc::RtpPacket header;
+ RtpPacket header;
size_t last_packet = NumRtpPackets() - 1;
EXPECT_TRUE(header.Parse(GetRtpPacket(static_cast<int>(last_packet))));
EXPECT_EQ(kSsrc, header.Ssrc());
@@ -6301,12 +6299,9 @@
const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], ssrcs[0]);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(ssrcs[0]);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
<< "No default receive stream created.";
@@ -6462,12 +6457,9 @@
EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
// Create and deliver packet.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kIncomingUnsignalledSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
// The stream should now be created with the appropriate sync label.
EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
@@ -6482,14 +6474,14 @@
// Until the demuxer criteria has been updated, we ignore in-flight ssrcs of
// the recently removed unsignaled receive stream.
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
// After the demuxer criteria has been updated, we should proceed to create
// unsignalled receive streams. This time when a default video receive stream
// is created it won't have a sync_group.
channel_->OnDemuxerCriteriaUpdateComplete();
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
EXPECT_TRUE(
fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group.empty());
@@ -6501,12 +6493,9 @@
EXPECT_TRUE(fake_call_->GetVideoReceiveStreams().empty());
// Packet with unsignaled SSRC is received.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kIncomingUnsignalledSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
// Default receive stream created.
const auto& receivers1 = fake_call_->GetVideoReceiveStreams();
@@ -6551,21 +6540,15 @@
// the demuxer is updated.
{
// Receive a packet for kSsrc1.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc1);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc1);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
{
// Receive a packet for kSsrc2.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc2);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc2);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
// No unsignaled ssrc for kSsrc2 should have been created, but kSsrc1 should
@@ -6583,21 +6566,15 @@
// Receive packets for kSsrc1 and kSsrc2 again.
{
// Receive a packet for kSsrc1.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc1);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc1);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
{
// Receive a packet for kSsrc2.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc2);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc2);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
// An unsignalled ssrc for kSsrc2 should be created and the packet counter
@@ -6634,21 +6611,15 @@
// the demuxer is updated.
{
// Receive a packet for kSsrc1.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc1);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc1);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
{
// Receive a packet for kSsrc2.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc2);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc2);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
// No unsignaled ssrc for kSsrc1 should have been created, but the packet
@@ -6665,21 +6636,15 @@
// Receive packets for kSsrc1 and kSsrc2 again.
{
// Receive a packet for kSsrc1.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc1);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc1);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
{
// Receive a packet for kSsrc2.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc2);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc2);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
// An unsignalled ssrc for kSsrc1 should be created and the packet counter
@@ -6712,12 +6677,9 @@
// In-flight packets should arrive because the stream was recreated, even
// though demuxer criteria updates are pending...
{
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 1u);
@@ -6728,12 +6690,9 @@
// This still should not prevent in-flight packets from arriving because we
// have a receive stream for it.
{
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u);
@@ -6745,12 +6704,9 @@
// Now the packet should be dropped and not create an unsignalled receive
// stream.
{
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u);
EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u);
@@ -6762,12 +6718,9 @@
// The packets should continue to be dropped because removal happened after
// the most recently completed demuxer update.
{
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 0u);
EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 2u);
@@ -6779,12 +6732,9 @@
// If packets still arrive after the demuxer knows about the latest removal we
// should finally create an unsignalled receive stream.
{
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
}
EXPECT_EQ(fake_call_->GetVideoReceiveStreams().size(), 1u);
EXPECT_EQ(fake_call_->GetDeliveredPacketsForSsrc(kSsrc), 3u);
@@ -6797,12 +6747,9 @@
// Send packets for kSsrc1, creating an unsignalled receive stream.
{
// Receive a packet for kSsrc1.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc1);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- channel_->OnPacketReceived(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc1);
+ channel_->OnPacketReceived(packet.Buffer(), /* packet_time_us */ -1);
}
rtc::Thread::Current()->ProcessMessages(0);
fake_clock_.AdvanceTime(
@@ -6815,12 +6762,9 @@
{
// Receive a packet for kSsrc2.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc2);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- channel_->OnPacketReceived(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc2);
+ channel_->OnPacketReceived(packet.Buffer(), /* packet_time_us */ -1);
}
rtc::Thread::Current()->ProcessMessages(0);
@@ -6835,12 +6779,9 @@
fake_clock_.AdvanceTime(webrtc::TimeDelta::Millis(1));
{
// Receive a packet for kSsrc2.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kSsrc2);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- channel_->OnPacketReceived(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kSsrc2);
+ channel_->OnPacketReceived(packet.Buffer(), /* packet_time_us */ -1);
}
rtc::Thread::Current()->ProcessMessages(0);
@@ -6880,12 +6821,9 @@
// Spawn an unsignaled stream by sending a packet, it should inherit
// default delay 200.
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
- rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetSsrc(kIncomingUnsignalledSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
recv_stream = fake_call_->GetVideoReceiveStream(kIncomingUnsignalledSsrc);
EXPECT_EQ(recv_stream->base_mininum_playout_delay_ms(), 200);
@@ -6915,14 +6853,10 @@
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
- const size_t kDataLength = 12;
- uint8_t data[kDataLength];
- memset(data, 0, sizeof(data));
-
- rtc::Set8(data, 1, payload_type);
- rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc);
- rtc::CopyOnWriteBuffer packet(data, kDataLength);
- ReceivePacketAndAdvanceTime(packet, /* packet_time_us */ -1);
+ RtpPacket packet;
+ packet.SetPayloadType(payload_type);
+ packet.SetSsrc(kIncomingUnsignalledSsrc);
+ ReceivePacketAndAdvanceTime(packet.Buffer(), /* packet_time_us */ -1);
if (expect_created_receive_stream) {
EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
@@ -7002,7 +6936,7 @@
channel_->SetDefaultSink(&renderer);
// Receive VP8 packet on first SSRC.
- webrtc::RtpPacket rtp_packet;
+ RtpPacket rtp_packet;
rtp_packet.SetPayloadType(GetEngineCodec("VP8").id);
rtp_packet.SetSsrc(kIncomingUnsignalledSsrc + 1);
ReceivePacketAndAdvanceTime(rtp_packet.Buffer(), /* packet_time_us */ -1);
@@ -7076,7 +7010,7 @@
EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
// Receive packet on an unsignaled SSRC.
- webrtc::RtpPacket rtp_packet;
+ RtpPacket rtp_packet;
rtp_packet.SetPayloadType(GetEngineCodec("VP8").id);
rtp_packet.SetSsrc(kSsrcs3[0]);
ReceivePacketAndAdvanceTime(rtp_packet.Buffer(), /* packet_time_us */ -1);
@@ -8701,7 +8635,7 @@
EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
// Receive VP8 packet.
- webrtc::RtpPacket rtp_packet;
+ RtpPacket rtp_packet;
rtp_packet.SetPayloadType(GetEngineCodec("VP8").id);
rtp_packet.SetSsrc(kIncomingUnsignalledSsrc);
ReceivePacketAndAdvanceTime(rtp_packet.Buffer(), /* packet_time_us */ -1);
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 7ce61b0..a2741f7 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -35,6 +35,7 @@
#include "modules/audio_mixer/audio_mixer_impl.h"
#include "modules/audio_processing/aec_dump/aec_dump_factory.h"
#include "modules/audio_processing/include/audio_processing.h"
+#include "modules/rtp_rtcp/source/rtp_util.h"
#include "rtc_base/arraysize.h"
#include "rtc_base/byte_order.h"
#include "rtc_base/experiments/field_trial_parser.h"
@@ -66,6 +67,8 @@
namespace cricket {
namespace {
+using ::webrtc::ParseRtpSsrc;
+
constexpr size_t kMaxUnsignaledRecvStreams = 4;
constexpr int kNackRtpHistoryMs = 5000;
@@ -2179,10 +2182,7 @@
// Create an unsignaled receive stream for this previously not received
// ssrc. If there already is N unsignaled receive streams, delete the
// oldest. See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5208
- uint32_t ssrc = 0;
- if (!GetRtpSsrc(packet.cdata(), packet.size(), &ssrc)) {
- return;
- }
+ uint32_t ssrc = ParseRtpSsrc(packet);
RTC_DCHECK(!absl::c_linear_search(unsignaled_recv_ssrcs_, ssrc));
// Add new stream.
diff --git a/modules/rtp_rtcp/source/rtp_util.cc b/modules/rtp_rtcp/source/rtp_util.cc
index 46c641e..cf1e542 100644
--- a/modules/rtp_rtcp/source/rtp_util.cc
+++ b/modules/rtp_rtcp/source/rtp_util.cc
@@ -14,6 +14,8 @@
#include <cstdint>
#include "api/array_view.h"
+#include "modules/rtp_rtcp/source/byte_io.h"
+#include "rtc_base/checks.h"
namespace webrtc {
namespace {
@@ -43,4 +45,19 @@
PayloadTypeIsReservedForRtcp(packet[1] & 0x7F);
}
+int ParseRtpPayloadType(rtc::ArrayView<const uint8_t> rtp_packet) {
+ RTC_DCHECK(IsRtpPacket(rtp_packet));
+ return rtp_packet[1] & 0x7F;
+}
+
+uint16_t ParseRtpSequenceNumber(rtc::ArrayView<const uint8_t> rtp_packet) {
+ RTC_DCHECK(IsRtpPacket(rtp_packet));
+ return ByteReader<uint16_t>::ReadBigEndian(rtp_packet.data() + 2);
+}
+
+uint32_t ParseRtpSsrc(rtc::ArrayView<const uint8_t> rtp_packet) {
+ RTC_DCHECK(IsRtpPacket(rtp_packet));
+ return ByteReader<uint32_t>::ReadBigEndian(rtp_packet.data() + 8);
+}
+
} // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_util.h b/modules/rtp_rtcp/source/rtp_util.h
index b85727b..835cfcd 100644
--- a/modules/rtp_rtcp/source/rtp_util.h
+++ b/modules/rtp_rtcp/source/rtp_util.h
@@ -20,6 +20,12 @@
bool IsRtcpPacket(rtc::ArrayView<const uint8_t> packet);
bool IsRtpPacket(rtc::ArrayView<const uint8_t> packet);
+// Returns base rtp header fields of the rtp packet.
+// Behaviour is undefined when `!IsRtpPacket(rtp_packet)`.
+int ParseRtpPayloadType(rtc::ArrayView<const uint8_t> rtp_packet);
+uint16_t ParseRtpSequenceNumber(rtc::ArrayView<const uint8_t> rtp_packet);
+uint32_t ParseRtpSsrc(rtc::ArrayView<const uint8_t> rtp_packet);
+
} // namespace webrtc
#endif // MODULES_RTP_RTCP_SOURCE_RTP_UTIL_H_
diff --git a/modules/rtp_rtcp/source/rtp_util_unittest.cc b/modules/rtp_rtcp/source/rtp_util_unittest.cc
index 8f980ec..3e23416 100644
--- a/modules/rtp_rtcp/source/rtp_util_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_util_unittest.cc
@@ -15,7 +15,7 @@
namespace webrtc {
namespace {
-TEST(RtpUtil, IsRtpPacket) {
+TEST(RtpUtilTest, IsRtpPacket) {
constexpr uint8_t kMinimalisticRtpPacket[] = {0x80, 97, 0, 0, //
0, 0, 0, 0, //
0, 0, 0, 0};
@@ -39,7 +39,7 @@
EXPECT_FALSE(IsRtpPacket({}));
}
-TEST(RtpUtil, IsRtcpPacket) {
+TEST(RtpUtilTest, IsRtcpPacket) {
constexpr uint8_t kMinimalisticRtcpPacket[] = {0x80, 202, 0, 0};
EXPECT_TRUE(IsRtcpPacket(kMinimalisticRtcpPacket));
@@ -55,5 +55,32 @@
EXPECT_FALSE(IsRtcpPacket({}));
}
+TEST(RtpUtilTest, ParseRtpPayloadType) {
+ constexpr uint8_t kMinimalisticRtpPacket[] = {0x80, 97, 0, 0, //
+ 0, 0, 0, 0, //
+ 0x12, 0x34, 0x56, 0x78};
+ EXPECT_EQ(ParseRtpPayloadType(kMinimalisticRtpPacket), 97);
+
+ constexpr uint8_t kMinimalisticRtpPacketWithMarker[] = {
+ 0x80, 0x80 | 97, 0, 0, //
+ 0, 0, 0, 0, //
+ 0x12, 0x34, 0x56, 0x78};
+ EXPECT_EQ(ParseRtpPayloadType(kMinimalisticRtpPacketWithMarker), 97);
+}
+
+TEST(RtpUtilTest, ParseRtpSequenceNumber) {
+ constexpr uint8_t kMinimalisticRtpPacket[] = {0x80, 97, 0x12, 0x34, //
+ 0, 0, 0, 0, //
+ 0, 0, 0, 0};
+ EXPECT_EQ(ParseRtpSequenceNumber(kMinimalisticRtpPacket), 0x1234);
+}
+
+TEST(RtpUtilTest, ParseRtpSsrc) {
+ constexpr uint8_t kMinimalisticRtpPacket[] = {0x80, 97, 0, 0, //
+ 0, 0, 0, 0, //
+ 0x12, 0x34, 0x56, 0x78};
+ EXPECT_EQ(ParseRtpSsrc(kMinimalisticRtpPacket), 0x12345678u);
+}
+
} // namespace
} // namespace webrtc
diff --git a/pc/srtp_session.cc b/pc/srtp_session.cc
index 45f6b67..76ab3a8 100644
--- a/pc/srtp_session.cc
+++ b/pc/srtp_session.cc
@@ -13,7 +13,8 @@
#include <iomanip>
#include "absl/base/attributes.h"
-#include "media/base/rtp_utils.h"
+#include "api/array_view.h"
+#include "modules/rtp_rtcp/source/rtp_util.h"
#include "pc/external_hmac.h"
#include "rtc_base/logging.h"
#include "rtc_base/ssl_stream_adapter.h"
@@ -26,6 +27,8 @@
namespace cricket {
+using ::webrtc::ParseRtpSequenceNumber;
+
// One more than the maximum libsrtp error code. Required by
// RTC_HISTOGRAM_ENUMERATION. Keep this in sync with srtp_error_status_t defined
// in srtp.h.
@@ -96,8 +99,8 @@
*out_len = in_len;
int err = srtp_protect(session_, p, out_len);
- int seq_num;
- GetRtpSeqNum(p, in_len, &seq_num);
+ int seq_num = ParseRtpSequenceNumber(
+ rtc::MakeArrayView(reinterpret_cast<const uint8_t*>(p), in_len));
if (err != srtp_err_status_ok) {
RTC_LOG(LS_WARNING) << "Failed to protect SRTP packet, seqnum=" << seq_num
<< ", err=" << err
diff --git a/pc/srtp_transport.cc b/pc/srtp_transport.cc
index c90b3fa..47ba6d6 100644
--- a/pc/srtp_transport.cc
+++ b/pc/srtp_transport.cc
@@ -18,6 +18,7 @@
#include "absl/strings/match.h"
#include "media/base/rtp_utils.h"
+#include "modules/rtp_rtcp/source/rtp_util.h"
#include "pc/rtp_transport.h"
#include "pc/srtp_session.h"
#include "rtc_base/async_packet_socket.h"
@@ -160,10 +161,8 @@
}
#endif
if (!res) {
- int seq_num = -1;
- uint32_t ssrc = 0;
- cricket::GetRtpSeqNum(data, len, &seq_num);
- cricket::GetRtpSsrc(data, len, &ssrc);
+ uint16_t seq_num = ParseRtpSequenceNumber(*packet);
+ uint32_t ssrc = ParseRtpSsrc(*packet);
RTC_LOG(LS_ERROR) << "Failed to protect RTP packet: size=" << len
<< ", seqnum=" << seq_num << ", SSRC=" << ssrc;
return false;
@@ -210,17 +209,13 @@
char* data = packet.MutableData<char>();
int len = rtc::checked_cast<int>(packet.size());
if (!UnprotectRtp(data, len, &len)) {
- int seq_num = -1;
- uint32_t ssrc = 0;
- cricket::GetRtpSeqNum(data, len, &seq_num);
- cricket::GetRtpSsrc(data, len, &ssrc);
-
// Limit the error logging to avoid excessive logs when there are lots of
// bad packets.
const int kFailureLogThrottleCount = 100;
if (decryption_failure_count_ % kFailureLogThrottleCount == 0) {
RTC_LOG(LS_ERROR) << "Failed to unprotect RTP packet: size=" << len
- << ", seqnum=" << seq_num << ", SSRC=" << ssrc
+ << ", seqnum=" << ParseRtpSequenceNumber(packet)
+ << ", SSRC=" << ParseRtpSsrc(packet)
<< ", previous failure count: "
<< decryption_failure_count_;
}