Added support for sending and receiving RTCP XR packets:
- Receiver reference time report block - DLRR report block (RFC3611). BUG=1613 R=mflodman@webrtc.org, stefan@webrtc.org Review URL: https://webrtc-codereview.appspot.com/2196010 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4898 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@ -274,30 +274,30 @@ class RtcpSenderTest : public ::testing::Test {
|
||||
protected:
|
||||
RtcpSenderTest()
|
||||
: over_use_detector_options_(),
|
||||
system_clock_(Clock::GetRealTimeClock()),
|
||||
clock_(1335900000),
|
||||
rtp_payload_registry_(new RTPPayloadRegistry(
|
||||
0, RTPPayloadStrategy::CreateStrategy(false))),
|
||||
remote_bitrate_observer_(),
|
||||
remote_bitrate_estimator_(
|
||||
RemoteBitrateEstimatorFactory().Create(
|
||||
&remote_bitrate_observer_,
|
||||
system_clock_)),
|
||||
receive_statistics_(ReceiveStatistics::Create(system_clock_)) {
|
||||
&clock_)),
|
||||
receive_statistics_(ReceiveStatistics::Create(&clock_)) {
|
||||
test_transport_ = new TestTransport();
|
||||
|
||||
RtpRtcp::Configuration configuration;
|
||||
configuration.id = 0;
|
||||
configuration.audio = false;
|
||||
configuration.clock = system_clock_;
|
||||
configuration.clock = &clock_;
|
||||
configuration.outgoing_transport = test_transport_;
|
||||
configuration.remote_bitrate_estimator = remote_bitrate_estimator_.get();
|
||||
|
||||
rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration);
|
||||
rtp_receiver_.reset(RtpReceiver::CreateVideoReceiver(
|
||||
0, system_clock_, test_transport_, NULL, rtp_payload_registry_.get()));
|
||||
0, &clock_, test_transport_, NULL, rtp_payload_registry_.get()));
|
||||
rtcp_sender_ =
|
||||
new RTCPSender(0, false, system_clock_, receive_statistics_.get());
|
||||
rtcp_receiver_ = new RTCPReceiver(0, system_clock_, rtp_rtcp_impl_);
|
||||
new RTCPSender(0, false, &clock_, receive_statistics_.get());
|
||||
rtcp_receiver_ = new RTCPReceiver(0, &clock_, rtp_rtcp_impl_);
|
||||
test_transport_->SetRTCPReceiver(rtcp_receiver_);
|
||||
// Initialize
|
||||
EXPECT_EQ(0, rtcp_sender_->Init());
|
||||
@ -317,7 +317,7 @@ class RtcpSenderTest : public ::testing::Test {
|
||||
}
|
||||
|
||||
OverUseDetectorOptions over_use_detector_options_;
|
||||
Clock* system_clock_;
|
||||
SimulatedClock clock_;
|
||||
scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_;
|
||||
scoped_ptr<RtpReceiver> rtp_receiver_;
|
||||
ModuleRtpRtcpImpl* rtp_rtcp_impl_;
|
||||
@ -397,6 +397,70 @@ TEST_F(RtcpSenderTest, TestCompound_NoRtpReceived) {
|
||||
kRtcpTransmissionTimeOffset);
|
||||
}
|
||||
|
||||
TEST_F(RtcpSenderTest, TestXrReceiverReferenceTime) {
|
||||
EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
|
||||
RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
|
||||
EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, false));
|
||||
rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
|
||||
EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
|
||||
|
||||
EXPECT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
|
||||
kRtcpXrReceiverReferenceTime);
|
||||
}
|
||||
|
||||
TEST_F(RtcpSenderTest, TestNoXrReceiverReferenceTimeIfSending) {
|
||||
EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
|
||||
RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
|
||||
EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, true));
|
||||
rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
|
||||
EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
|
||||
|
||||
EXPECT_FALSE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
|
||||
kRtcpXrReceiverReferenceTime);
|
||||
}
|
||||
|
||||
TEST_F(RtcpSenderTest, TestNoXrReceiverReferenceTimeIfNotEnabled) {
|
||||
EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
|
||||
RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
|
||||
EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, false));
|
||||
rtcp_sender_->SendRtcpXrReceiverReferenceTime(false);
|
||||
EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
|
||||
|
||||
EXPECT_FALSE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
|
||||
kRtcpXrReceiverReferenceTime);
|
||||
}
|
||||
|
||||
TEST_F(RtcpSenderTest, TestSendTimeOfXrRrReport) {
|
||||
EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
|
||||
RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
|
||||
EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, false));
|
||||
rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
|
||||
uint32_t ntp_sec;
|
||||
uint32_t ntp_frac;
|
||||
clock_.CurrentNtp(ntp_sec, ntp_frac);
|
||||
uint32_t initial_mid_ntp = RTCPUtility::MidNtp(ntp_sec, ntp_frac);
|
||||
|
||||
// No packet sent.
|
||||
int64_t time_ms;
|
||||
EXPECT_FALSE(rtcp_sender_->SendTimeOfXrRrReport(initial_mid_ntp, &time_ms));
|
||||
|
||||
// Send XR RR packets.
|
||||
for (int i = 0; i <= RTCP_NUMBER_OF_SR; ++i) {
|
||||
EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
|
||||
EXPECT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
|
||||
kRtcpXrReceiverReferenceTime);
|
||||
|
||||
clock_.CurrentNtp(ntp_sec, ntp_frac);
|
||||
uint32_t mid_ntp = RTCPUtility::MidNtp(ntp_sec, ntp_frac);
|
||||
EXPECT_TRUE(rtcp_sender_->SendTimeOfXrRrReport(mid_ntp, &time_ms));
|
||||
EXPECT_EQ(clock_.CurrentNtpInMilliseconds(), time_ms);
|
||||
clock_.AdvanceTimeMilliseconds(1000);
|
||||
}
|
||||
|
||||
// The first report should no longer be stored.
|
||||
EXPECT_FALSE(rtcp_sender_->SendTimeOfXrRrReport(initial_mid_ntp, &time_ms));
|
||||
}
|
||||
|
||||
// This test is written to verify actual behaviour. It does not seem
|
||||
// to make much sense to send an empty TMMBN, since there is no place
|
||||
// to put an actual limit here. It's just information that no limit
|
||||
|
||||
Reference in New Issue
Block a user