Move SendsPacketsWithTransportSequenceNumber to RtpRtcp level.
New tests (transport sequence number plus newly added abs send time) now test more of production code and less of rtp_sender_unittest.cc test fixture code. Bug: webrtc:11340 Change-Id: I8ec0022c3d18467a4144ce984996af1a452760dc Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/216327 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33895}
This commit is contained in:

committed by
WebRTC LUCI CQ

parent
1a1795768e
commit
12d24113dc
@ -51,6 +51,12 @@ const uint8_t kPayloadType = 100;
|
|||||||
const int kWidth = 320;
|
const int kWidth = 320;
|
||||||
const int kHeight = 100;
|
const int kHeight = 100;
|
||||||
|
|
||||||
|
// RTP header extension ids.
|
||||||
|
enum : int {
|
||||||
|
kAbsoluteSendTimeExtensionId = 1,
|
||||||
|
kTransportSequenceNumberExtensionId,
|
||||||
|
};
|
||||||
|
|
||||||
class RtcpRttStatsTestImpl : public RtcpRttStats {
|
class RtcpRttStatsTestImpl : public RtcpRttStats {
|
||||||
public:
|
public:
|
||||||
RtcpRttStatsTestImpl() : rtt_ms_(0) {}
|
RtcpRttStatsTestImpl() : rtt_ms_(0) {}
|
||||||
@ -68,7 +74,8 @@ class SendTransport : public Transport {
|
|||||||
time_controller_(nullptr),
|
time_controller_(nullptr),
|
||||||
delay_ms_(0),
|
delay_ms_(0),
|
||||||
rtp_packets_sent_(0),
|
rtp_packets_sent_(0),
|
||||||
rtcp_packets_sent_(0) {}
|
rtcp_packets_sent_(0),
|
||||||
|
last_packet_(&header_extensions_) {}
|
||||||
|
|
||||||
void SetRtpRtcpModule(ModuleRtpRtcpImpl2* receiver) { receiver_ = receiver; }
|
void SetRtpRtcpModule(ModuleRtpRtcpImpl2* receiver) { receiver_ = receiver; }
|
||||||
void SimulateNetworkDelay(int64_t delay_ms, TimeController* time_controller) {
|
void SimulateNetworkDelay(int64_t delay_ms, TimeController* time_controller) {
|
||||||
@ -78,11 +85,8 @@ class SendTransport : public Transport {
|
|||||||
bool SendRtp(const uint8_t* data,
|
bool SendRtp(const uint8_t* data,
|
||||||
size_t len,
|
size_t len,
|
||||||
const PacketOptions& options) override {
|
const PacketOptions& options) override {
|
||||||
RTPHeader header;
|
EXPECT_TRUE(last_packet_.Parse(data, len));
|
||||||
std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::CreateForTest());
|
|
||||||
EXPECT_TRUE(parser->Parse(static_cast<const uint8_t*>(data), len, &header));
|
|
||||||
++rtp_packets_sent_;
|
++rtp_packets_sent_;
|
||||||
last_rtp_header_ = header;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SendRtcp(const uint8_t* data, size_t len) override {
|
bool SendRtcp(const uint8_t* data, size_t len) override {
|
||||||
@ -106,8 +110,9 @@ class SendTransport : public Transport {
|
|||||||
int64_t delay_ms_;
|
int64_t delay_ms_;
|
||||||
int rtp_packets_sent_;
|
int rtp_packets_sent_;
|
||||||
size_t rtcp_packets_sent_;
|
size_t rtcp_packets_sent_;
|
||||||
RTPHeader last_rtp_header_;
|
|
||||||
std::vector<uint16_t> last_nack_list_;
|
std::vector<uint16_t> last_nack_list_;
|
||||||
|
RtpHeaderExtensionMap header_extensions_;
|
||||||
|
RtpPacketReceived last_packet_;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TestConfig {
|
struct TestConfig {
|
||||||
@ -187,9 +192,7 @@ class RtpRtcpModule : public RtcpPacketTypeCounterObserver {
|
|||||||
return counter_map_[impl_->SSRC()];
|
return counter_map_[impl_->SSRC()];
|
||||||
}
|
}
|
||||||
int RtpSent() { return transport_.rtp_packets_sent_; }
|
int RtpSent() { return transport_.rtp_packets_sent_; }
|
||||||
uint16_t LastRtpSequenceNumber() {
|
uint16_t LastRtpSequenceNumber() { return last_packet().SequenceNumber(); }
|
||||||
return transport_.last_rtp_header_.sequenceNumber;
|
|
||||||
}
|
|
||||||
std::vector<uint16_t> LastNackListSent() {
|
std::vector<uint16_t> LastNackListSent() {
|
||||||
return transport_.last_nack_list_;
|
return transport_.last_nack_list_;
|
||||||
}
|
}
|
||||||
@ -197,6 +200,12 @@ class RtpRtcpModule : public RtcpPacketTypeCounterObserver {
|
|||||||
rtcp_report_interval_ms_ = rtcp_report_interval_ms;
|
rtcp_report_interval_ms_ = rtcp_report_interval_ms;
|
||||||
CreateModuleImpl();
|
CreateModuleImpl();
|
||||||
}
|
}
|
||||||
|
const RtpPacketReceived& last_packet() { return transport_.last_packet_; }
|
||||||
|
void RegisterHeaderExtension(absl::string_view uri, int id) {
|
||||||
|
impl_->RegisterRtpHeaderExtension(uri, id);
|
||||||
|
transport_.header_extensions_.RegisterByUri(id, uri);
|
||||||
|
transport_.last_packet_.IdentifyExtensions(transport_.header_extensions_);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void CreateModuleImpl() {
|
void CreateModuleImpl() {
|
||||||
@ -863,8 +872,8 @@ TEST_P(RtpRtcpImpl2Test, PaddingTimestampMatchesMedia) {
|
|||||||
|
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(
|
||||||
SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, kTimestamp));
|
SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, kTimestamp));
|
||||||
EXPECT_EQ(sender_.transport_.last_rtp_header_.timestamp, kTimestamp);
|
EXPECT_EQ(sender_.last_packet().Timestamp(), kTimestamp);
|
||||||
uint16_t media_seq = sender_.transport_.last_rtp_header_.sequenceNumber;
|
uint16_t media_seq = sender_.last_packet().SequenceNumber();
|
||||||
|
|
||||||
// Generate and send padding.
|
// Generate and send padding.
|
||||||
auto padding = sender_.impl_->GeneratePadding(kPaddingSize);
|
auto padding = sender_.impl_->GeneratePadding(kPaddingSize);
|
||||||
@ -874,8 +883,36 @@ TEST_P(RtpRtcpImpl2Test, PaddingTimestampMatchesMedia) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Verify we sent a new packet, but with the same timestamp.
|
// Verify we sent a new packet, but with the same timestamp.
|
||||||
EXPECT_NE(sender_.transport_.last_rtp_header_.sequenceNumber, media_seq);
|
EXPECT_NE(sender_.last_packet().SequenceNumber(), media_seq);
|
||||||
EXPECT_EQ(sender_.transport_.last_rtp_header_.timestamp, kTimestamp);
|
EXPECT_EQ(sender_.last_packet().Timestamp(), kTimestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(RtpRtcpImpl2Test, AssignsTransportSequenceNumber) {
|
||||||
|
sender_.RegisterHeaderExtension(TransportSequenceNumber::kUri,
|
||||||
|
kTransportSequenceNumberExtensionId);
|
||||||
|
|
||||||
|
EXPECT_TRUE(
|
||||||
|
SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
|
||||||
|
uint16_t first_transport_seq = 0;
|
||||||
|
EXPECT_TRUE(sender_.last_packet().GetExtension<TransportSequenceNumber>(
|
||||||
|
&first_transport_seq));
|
||||||
|
|
||||||
|
EXPECT_TRUE(
|
||||||
|
SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
|
||||||
|
uint16_t second_transport_seq = 0;
|
||||||
|
EXPECT_TRUE(sender_.last_packet().GetExtension<TransportSequenceNumber>(
|
||||||
|
&second_transport_seq));
|
||||||
|
|
||||||
|
EXPECT_EQ(first_transport_seq + 1, second_transport_seq);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(RtpRtcpImpl2Test, AssignsAbsoluteSendTime) {
|
||||||
|
sender_.RegisterHeaderExtension(AbsoluteSendTime::kUri,
|
||||||
|
kAbsoluteSendTimeExtensionId);
|
||||||
|
|
||||||
|
EXPECT_TRUE(
|
||||||
|
SendFrame(&sender_, sender_video_.get(), kBaseLayerTid, /*timestamp=*/0));
|
||||||
|
EXPECT_NE(sender_.last_packet().GetExtension<AbsoluteSendTime>(), 0u);
|
||||||
}
|
}
|
||||||
|
|
||||||
INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
|
INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
|
||||||
|
@ -545,45 +545,6 @@ TEST_P(RtpSenderTest, PaddingAlwaysAllowedOnAudio) {
|
|||||||
EXPECT_EQ(kMinPaddingSize, GenerateAndSendPadding(kMinPaddingSize - 5));
|
EXPECT_EQ(kMinPaddingSize, GenerateAndSendPadding(kMinPaddingSize - 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) {
|
|
||||||
RtpRtcpInterface::Configuration config;
|
|
||||||
config.clock = clock_;
|
|
||||||
config.outgoing_transport = &transport_;
|
|
||||||
config.local_media_ssrc = kSsrc;
|
|
||||||
config.transport_feedback_callback = &feedback_observer_;
|
|
||||||
config.event_log = &mock_rtc_event_log_;
|
|
||||||
config.send_packet_observer = &send_packet_observer_;
|
|
||||||
config.retransmission_rate_limiter = &retransmission_rate_limiter_;
|
|
||||||
rtp_sender_context_ =
|
|
||||||
std::make_unique<RtpSenderContext>(config, &time_controller_);
|
|
||||||
|
|
||||||
EXPECT_TRUE(rtp_sender()->RegisterRtpHeaderExtension(
|
|
||||||
TransportSequenceNumber::kUri, kTransportSequenceNumberExtensionId));
|
|
||||||
|
|
||||||
EXPECT_CALL(send_packet_observer_,
|
|
||||||
OnSendPacket(kTransportSequenceNumber, _, _))
|
|
||||||
.Times(1);
|
|
||||||
|
|
||||||
EXPECT_CALL(feedback_observer_,
|
|
||||||
OnAddPacket(AllOf(
|
|
||||||
Field(&RtpPacketSendInfo::ssrc, rtp_sender()->SSRC()),
|
|
||||||
Field(&RtpPacketSendInfo::transport_sequence_number,
|
|
||||||
kTransportSequenceNumber),
|
|
||||||
Field(&RtpPacketSendInfo::rtp_sequence_number,
|
|
||||||
rtp_sender()->SequenceNumber()),
|
|
||||||
Field(&RtpPacketSendInfo::pacing_info, PacedPacketInfo()))))
|
|
||||||
.Times(1);
|
|
||||||
|
|
||||||
SendGenericPacket();
|
|
||||||
|
|
||||||
const auto& packet = transport_.last_sent_packet();
|
|
||||||
uint16_t transport_seq_no;
|
|
||||||
ASSERT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
|
|
||||||
EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
|
|
||||||
EXPECT_EQ(transport_.last_options_.packet_id, transport_seq_no);
|
|
||||||
EXPECT_TRUE(transport_.last_options_.included_in_allocation);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_P(RtpSenderTestWithoutPacer, PacketOptionsNoRetransmission) {
|
TEST_P(RtpSenderTestWithoutPacer, PacketOptionsNoRetransmission) {
|
||||||
RtpRtcpInterface::Configuration config;
|
RtpRtcpInterface::Configuration config;
|
||||||
config.clock = clock_;
|
config.clock = clock_;
|
||||||
|
Reference in New Issue
Block a user