Index: webrtc/modules/rtp_rtcp/source/nack_rtx_unittest.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/nack_rtx_unittest.cc b/webrtc/modules/rtp_rtcp/source/nack_rtx_unittest.cc |
index 32c9d5b9e80819c118535733110f5ff40846bc13..1a68726b4a6720fa1db145165abdc68696ac75bd 100644 |
--- a/webrtc/modules/rtp_rtcp/source/nack_rtx_unittest.cc |
+++ b/webrtc/modules/rtp_rtcp/source/nack_rtx_unittest.cc |
@@ -15,13 +15,13 @@ |
#include <set> |
#include "webrtc/api/call/transport.h" |
+#include "webrtc/call/rtp_stream_receiver_controller.h" |
+#include "webrtc/call/rtx_receive_stream.h" |
#include "webrtc/common_types.h" |
#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" |
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" |
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" |
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
+#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" |
#include "webrtc/rtc_base/rate_limiter.h" |
#include "webrtc/test/gtest.h" |
@@ -29,6 +29,7 @@ namespace webrtc { |
const int kVideoNackListSize = 30; |
const uint32_t kTestSsrc = 3456; |
+const uint32_t kTestRtxSsrc = kTestSsrc + 1; |
const uint16_t kTestSequenceNumber = 2345; |
const uint32_t kTestNumberOfPackets = 1350; |
const int kTestNumberOfRtxPackets = 149; |
@@ -37,33 +38,17 @@ const int kPayloadType = 123; |
const int kRtxPayloadType = 98; |
const int64_t kMaxRttMs = 1000; |
-class VerifyingRtxReceiver : public RtpData { |
+class VerifyingMediaStream : public RtpPacketSinkInterface { |
public: |
- VerifyingRtxReceiver() {} |
+ VerifyingMediaStream() {} |
- int32_t OnReceivedPayloadData( |
- const uint8_t* data, |
- size_t size, |
- const webrtc::WebRtcRTPHeader* rtp_header) override { |
+ void OnRtpPacket(const RtpPacketReceived& packet) override { |
if (!sequence_numbers_.empty()) |
- EXPECT_EQ(kTestSsrc, rtp_header->header.ssrc); |
- sequence_numbers_.push_back(rtp_header->header.sequenceNumber); |
- return 0; |
- } |
- std::list<uint16_t> sequence_numbers_; |
-}; |
+ EXPECT_EQ(kTestSsrc, packet.Ssrc()); |
-class TestRtpFeedback : public NullRtpFeedback { |
- public: |
- explicit TestRtpFeedback(RtpRtcp* rtp_rtcp) : rtp_rtcp_(rtp_rtcp) {} |
- virtual ~TestRtpFeedback() {} |
- |
- void OnIncomingSSRCChanged(uint32_t ssrc) override { |
- rtp_rtcp_->SetRemoteSSRC(ssrc); |
+ sequence_numbers_.push_back(packet.SequenceNumber()); |
} |
- |
- private: |
- RtpRtcp* rtp_rtcp_; |
+ std::list<uint16_t> sequence_numbers_; |
}; |
class RtxLoopBackTransport : public webrtc::Transport { |
@@ -75,16 +60,10 @@ class RtxLoopBackTransport : public webrtc::Transport { |
consecutive_drop_end_(0), |
rtx_ssrc_(rtx_ssrc), |
count_rtx_ssrc_(0), |
- rtp_payload_registry_(NULL), |
- rtp_receiver_(NULL), |
module_(NULL) {} |
- void SetSendModule(RtpRtcp* rtpRtcpModule, |
- RTPPayloadRegistry* rtp_payload_registry, |
- RtpReceiver* receiver) { |
+ void SetSendModule(RtpRtcp* rtpRtcpModule) { |
module_ = rtpRtcpModule; |
- rtp_payload_registry_ = rtp_payload_registry; |
- rtp_receiver_ = receiver; |
} |
void DropEveryNthPacket(int n) { packet_loss_ = n; } |
@@ -99,24 +78,15 @@ class RtxLoopBackTransport : public webrtc::Transport { |
size_t len, |
const PacketOptions& options) override { |
count_++; |
- const unsigned char* ptr = static_cast<const unsigned char*>(data); |
- uint32_t ssrc = (ptr[8] << 24) + (ptr[9] << 16) + (ptr[10] << 8) + ptr[11]; |
- if (ssrc == rtx_ssrc_) |
- count_rtx_ssrc_++; |
- uint16_t sequence_number = (ptr[2] << 8) + ptr[3]; |
- size_t packet_length = len; |
- uint8_t restored_packet[1500]; |
- RTPHeader header; |
- std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); |
- if (!parser->Parse(ptr, len, &header)) { |
+ RtpPacketReceived packet; |
+ if (!packet.Parse(data, len)) |
return false; |
- } |
- |
- if (!rtp_payload_registry_->IsRtx(header)) { |
- // Don't store retransmitted packets since we compare it to the list |
- // created by the receiver. |
+ if (packet.Ssrc() == rtx_ssrc_) { |
+ count_rtx_ssrc_++; |
+ } else { |
+ // For non-RTX packets only. |
expected_sequence_numbers_.insert(expected_sequence_numbers_.end(), |
- sequence_number); |
+ packet.SequenceNumber()); |
} |
if (packet_loss_ > 0) { |
if ((count_ % packet_loss_) == 0) { |
@@ -126,28 +96,7 @@ class RtxLoopBackTransport : public webrtc::Transport { |
count_ < consecutive_drop_end_) { |
return true; |
} |
- if (rtp_payload_registry_->IsRtx(header)) { |
- // Remove the RTX header and parse the original RTP header. |
- EXPECT_TRUE(rtp_payload_registry_->RestoreOriginalPacket( |
- restored_packet, ptr, &packet_length, rtp_receiver_->SSRC(), header)); |
- if (!parser->Parse(restored_packet, packet_length, &header)) { |
- return false; |
- } |
- ptr = restored_packet; |
- } else { |
- rtp_payload_registry_->SetIncomingPayloadType(header); |
- } |
- |
- PayloadUnion payload_specific; |
- if (!rtp_payload_registry_->GetPayloadSpecifics(header.payloadType, |
- &payload_specific)) { |
- return false; |
- } |
- if (!rtp_receiver_->IncomingRtpPacket(header, ptr + header.headerLength, |
- packet_length - header.headerLength, |
- payload_specific, true)) { |
- return false; |
- } |
+ EXPECT_TRUE(stream_receiver_controller_.OnRtpPacket(packet)); |
return true; |
} |
@@ -160,9 +109,8 @@ class RtxLoopBackTransport : public webrtc::Transport { |
int consecutive_drop_end_; |
uint32_t rtx_ssrc_; |
int count_rtx_ssrc_; |
- RTPPayloadRegistry* rtp_payload_registry_; |
- RtpReceiver* rtp_receiver_; |
RtpRtcp* module_; |
+ RtpStreamReceiverController stream_receiver_controller_; |
std::set<uint16_t> expected_sequence_numbers_; |
}; |
@@ -170,8 +118,10 @@ class RtpRtcpRtxNackTest : public ::testing::Test { |
protected: |
RtpRtcpRtxNackTest() |
: rtp_rtcp_module_(nullptr), |
- transport_(kTestSsrc + 1), |
- receiver_(), |
+ transport_(kTestRtxSsrc), |
+ rtx_stream_(&media_stream_, |
+ rtx_associated_payload_types_, |
+ kTestSsrc), |
payload_data_length(sizeof(payload_data)), |
fake_clock(123456), |
retransmission_rate_limiter_(&fake_clock, kMaxRttMs) {} |
@@ -187,11 +137,6 @@ class RtpRtcpRtxNackTest : public ::testing::Test { |
configuration.retransmission_rate_limiter = &retransmission_rate_limiter_; |
rtp_rtcp_module_ = RtpRtcp::CreateRtpRtcp(configuration); |
- rtp_feedback_.reset(new TestRtpFeedback(rtp_rtcp_module_)); |
- |
- rtp_receiver_.reset(RtpReceiver::CreateVideoReceiver( |
- &fake_clock, &receiver_, rtp_feedback_.get(), &rtp_payload_registry_)); |
- |
rtp_rtcp_module_->SetSSRC(kTestSsrc); |
rtp_rtcp_module_->SetRTCPStatus(RtcpMode::kCompound); |
rtp_rtcp_module_->SetStorePacketsStatus(true, 600); |
@@ -199,18 +144,16 @@ class RtpRtcpRtxNackTest : public ::testing::Test { |
rtp_rtcp_module_->SetSequenceNumber(kTestSequenceNumber); |
rtp_rtcp_module_->SetStartTimestamp(111111); |
- transport_.SetSendModule(rtp_rtcp_module_, &rtp_payload_registry_, |
- rtp_receiver_.get()); |
- |
- VideoCodec video_codec; |
- memset(&video_codec, 0, sizeof(video_codec)); |
- video_codec.plType = kPayloadType; |
- memcpy(video_codec.plName, "I420", 5); |
+ // Used for NACK processing. |
+ // TODO(nisse): Unclear on which side? It's confusing to use a |
+ // single rtp_rtcp module for both send and receive side. |
+ rtp_rtcp_module_->SetRemoteSSRC(kTestSsrc); |
- EXPECT_EQ(0, rtp_rtcp_module_->RegisterSendPayload(video_codec)); |
+ rtp_rtcp_module_->RegisterVideoSendPayload(kPayloadType, "video"); |
rtp_rtcp_module_->SetRtxSendPayloadType(kRtxPayloadType, kPayloadType); |
- EXPECT_EQ(0, rtp_payload_registry_.RegisterReceivePayload(video_codec)); |
- rtp_payload_registry_.SetRtxPayloadType(kRtxPayloadType, kPayloadType); |
+ transport_.SetSendModule(rtp_rtcp_module_); |
+ media_receiver_ = transport_.stream_receiver_controller_.CreateReceiver( |
+ kTestSsrc, &media_stream_); |
for (size_t n = 0; n < payload_data_length; n++) { |
payload_data[n] = n % 10; |
@@ -218,14 +161,14 @@ class RtpRtcpRtxNackTest : public ::testing::Test { |
} |
int BuildNackList(uint16_t* nack_list) { |
- receiver_.sequence_numbers_.sort(); |
+ media_stream_.sequence_numbers_.sort(); |
std::list<uint16_t> missing_sequence_numbers; |
- std::list<uint16_t>::iterator it = receiver_.sequence_numbers_.begin(); |
+ std::list<uint16_t>::iterator it = media_stream_.sequence_numbers_.begin(); |
- while (it != receiver_.sequence_numbers_.end()) { |
+ while (it != media_stream_.sequence_numbers_.end()) { |
uint16_t sequence_number_1 = *it; |
++it; |
- if (it != receiver_.sequence_numbers_.end()) { |
+ if (it != media_stream_.sequence_numbers_.end()) { |
uint16_t sequence_number_2 = *it; |
// Add all missing sequence numbers to list |
for (uint16_t i = sequence_number_1 + 1; i < sequence_number_2; ++i) { |
@@ -243,8 +186,8 @@ class RtpRtcpRtxNackTest : public ::testing::Test { |
bool ExpectedPacketsReceived() { |
std::list<uint16_t> received_sorted; |
- std::copy(receiver_.sequence_numbers_.begin(), |
- receiver_.sequence_numbers_.end(), |
+ std::copy(media_stream_.sequence_numbers_.begin(), |
+ media_stream_.sequence_numbers_.end(), |
std::back_inserter(received_sorted)); |
received_sorted.sort(); |
return received_sorted.size() == |
@@ -254,9 +197,10 @@ class RtpRtcpRtxNackTest : public ::testing::Test { |
} |
void RunRtxTest(RtxMode rtx_method, int loss) { |
- rtp_payload_registry_.SetRtxSsrc(kTestSsrc + 1); |
+ rtx_receiver_ = transport_.stream_receiver_controller_.CreateReceiver( |
+ kTestRtxSsrc, &rtx_stream_); |
rtp_rtcp_module_->SetRtxSendStatus(rtx_method); |
- rtp_rtcp_module_->SetRtxSsrc(kTestSsrc + 1); |
+ rtp_rtcp_module_->SetRtxSsrc(kTestRtxSsrc); |
transport_.DropEveryNthPacket(loss); |
uint32_t timestamp = 3000; |
uint16_t nack_list[kVideoNackListSize]; |
@@ -274,22 +218,24 @@ class RtpRtcpRtxNackTest : public ::testing::Test { |
// Prepare next frame. |
timestamp += 3000; |
} |
- receiver_.sequence_numbers_.sort(); |
+ media_stream_.sequence_numbers_.sort(); |
} |
void TearDown() override { delete rtp_rtcp_module_; } |
std::unique_ptr<ReceiveStatistics> receive_statistics_; |
- RTPPayloadRegistry rtp_payload_registry_; |
- std::unique_ptr<RtpReceiver> rtp_receiver_; |
RtpRtcp* rtp_rtcp_module_; |
- std::unique_ptr<TestRtpFeedback> rtp_feedback_; |
RtxLoopBackTransport transport_; |
- VerifyingRtxReceiver receiver_; |
+ const std::map<int, int> rtx_associated_payload_types_ = |
+ {{kRtxPayloadType, kPayloadType}}; |
+ VerifyingMediaStream media_stream_; |
+ RtxReceiveStream rtx_stream_; |
uint8_t payload_data[65000]; |
size_t payload_data_length; |
SimulatedClock fake_clock; |
RateLimiter retransmission_rate_limiter_; |
+ std::unique_ptr<RtpStreamReceiverInterface> media_receiver_; |
+ std::unique_ptr<RtpStreamReceiverInterface> rtx_receiver_; |
}; |
TEST_F(RtpRtcpRtxNackTest, LongNackList) { |
@@ -316,26 +262,26 @@ TEST_F(RtpRtcpRtxNackTest, LongNackList) { |
rtp_rtcp_module_->Process(); |
} |
EXPECT_FALSE(transport_.expected_sequence_numbers_.empty()); |
- EXPECT_FALSE(receiver_.sequence_numbers_.empty()); |
- size_t last_receive_count = receiver_.sequence_numbers_.size(); |
+ EXPECT_FALSE(media_stream_.sequence_numbers_.empty()); |
+ size_t last_receive_count = media_stream_.sequence_numbers_.size(); |
int length = BuildNackList(nack_list); |
for (int i = 0; i < kNumRequiredRtcp - 1; ++i) { |
rtp_rtcp_module_->SendNACK(nack_list, length); |
- EXPECT_GT(receiver_.sequence_numbers_.size(), last_receive_count); |
- last_receive_count = receiver_.sequence_numbers_.size(); |
+ EXPECT_GT(media_stream_.sequence_numbers_.size(), last_receive_count); |
+ last_receive_count = media_stream_.sequence_numbers_.size(); |
EXPECT_FALSE(ExpectedPacketsReceived()); |
} |
rtp_rtcp_module_->SendNACK(nack_list, length); |
- EXPECT_GT(receiver_.sequence_numbers_.size(), last_receive_count); |
+ EXPECT_GT(media_stream_.sequence_numbers_.size(), last_receive_count); |
EXPECT_TRUE(ExpectedPacketsReceived()); |
} |
TEST_F(RtpRtcpRtxNackTest, RtxNack) { |
RunRtxTest(kRtxRetransmitted, 10); |
- EXPECT_EQ(kTestSequenceNumber, *(receiver_.sequence_numbers_.begin())); |
+ EXPECT_EQ(kTestSequenceNumber, *(media_stream_.sequence_numbers_.begin())); |
EXPECT_EQ(kTestSequenceNumber + kTestNumberOfPackets - 1, |
- *(receiver_.sequence_numbers_.rbegin())); |
- EXPECT_EQ(kTestNumberOfPackets, receiver_.sequence_numbers_.size()); |
+ *(media_stream_.sequence_numbers_.rbegin())); |
+ EXPECT_EQ(kTestNumberOfPackets, media_stream_.sequence_numbers_.size()); |
EXPECT_EQ(kTestNumberOfRtxPackets, transport_.count_rtx_ssrc_); |
EXPECT_TRUE(ExpectedPacketsReceived()); |
} |