Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc

Issue 2292093002: RtcpReceiverTest rewritten using public available interface (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Feedback Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <memory> 11 #include <memory>
12 12
13 #include "testing/gmock/include/gmock/gmock.h" 13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 15 #include "webrtc/base/array_view.h"
16 #include "webrtc/base/rate_limiter.h" 16 #include "webrtc/base/random.h"
17 #include "webrtc/common_types.h" 17 #include "webrtc/common_types.h"
18 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra te_observer.h"
19 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl e_stream.h"
20 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" 18 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
21 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" 19 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" 20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
23 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" 21 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h" 23 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h"
26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" 27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h"
31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi.h" 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi.h"
32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h"
35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" 35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 36 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
37 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" 37 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h"
38 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
39 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
40 #include "webrtc/modules/rtp_rtcp/source/time_util.h" 38 #include "webrtc/modules/rtp_rtcp/source/time_util.h"
41 #include "webrtc/system_wrappers/include/ntp_time.h" 39 #include "webrtc/system_wrappers/include/ntp_time.h"
42 40
43 namespace webrtc { 41 namespace webrtc {
44 42 namespace {
45 namespace { // Anonymous namespace; hide utility functions and classes. 43
46 44 using ::testing::_;
47 // This test transport verifies that no functions get called. 45 using ::testing::AllOf;
48 class TestTransport : public Transport, 46 using ::testing::ElementsAreArray;
49 public NullRtpData { 47 using ::testing::Field;
50 public: 48 using ::testing::IsEmpty;
51 explicit TestTransport() : rtcp_receiver_(nullptr) {} 49 using ::testing::NiceMock;
52 void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) { 50 using ::testing::Property;
53 rtcp_receiver_ = rtcp_receiver; 51 using ::testing::SizeIs;
54 } 52 using ::testing::StrEq;
55 bool SendRtp(const uint8_t* /*data*/, 53 using ::testing::StrictMock;
56 size_t /*len*/, 54 using ::testing::UnorderedElementsAre;
57 const PacketOptions& options) override { 55
58 ADD_FAILURE(); // FAIL() gives a compile error. 56 class MockRtcpPacketTypeCounterObserver : public RtcpPacketTypeCounterObserver {
59 return false; 57 public:
60 } 58 MOCK_METHOD2(RtcpPacketTypesCounterUpdated,
61 59 void(uint32_t, const RtcpPacketTypeCounter&));
62 bool SendRtcp(const uint8_t* packet, size_t packet_len) override { 60 };
63 ADD_FAILURE(); 61
64 return true; 62 class MockRtcpIntraFrameObserver : public RtcpIntraFrameObserver {
65 } 63 public:
66 64 MOCK_METHOD1(OnReceivedIntraFrameRequest, void(uint32_t));
67 int OnReceivedPayloadData(const uint8_t* payloadData, 65 MOCK_METHOD2(OnReceivedSLI, void(uint32_t, uint8_t));
68 const size_t payloadSize, 66 MOCK_METHOD2(OnReceivedRPSI, void(uint32_t, uint64_t));
69 const WebRtcRTPHeader* rtpHeader) override { 67 MOCK_METHOD2(OnLocalSsrcChanged, void(uint32_t, uint32_t));
70 ADD_FAILURE(); 68 };
71 return 0; 69
72 } 70 class MockRtcpCallbackImpl : public RtcpStatisticsCallback {
73 RTCPReceiver* rtcp_receiver_; 71 public:
74 }; 72 MOCK_METHOD2(StatisticsUpdated, void(const RtcpStatistics&, uint32_t));
73 MOCK_METHOD2(CNameChanged, void(const char*, uint32_t));
74 };
75
76 class MockTransportFeedbackObserver : public TransportFeedbackObserver {
77 public:
78 MOCK_METHOD3(AddPacket, void(uint16_t, size_t, int));
79 MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&));
80 };
81
82 class MockRtcpBandwidthObserver : public RtcpBandwidthObserver {
83 public:
84 MOCK_METHOD1(OnReceivedEstimatedBitrate, void(uint32_t));
85 MOCK_METHOD3(OnReceivedRtcpReceiverReport,
86 void(const ReportBlockList&, int64_t, int64_t));
87 };
88
89 class MockModuleRtpRtcp : public RTCPReceiver::ModuleRtpRtcp {
90 public:
91 MOCK_METHOD1(SetTmmbn, void(std::vector<rtcp::TmmbItem>));
92 MOCK_METHOD0(OnRequestSendReport, void());
93 MOCK_METHOD1(OnReceivedNack, void(const std::vector<uint16_t>&));
94 MOCK_METHOD1(OnReceivedRtcpReportBlocks, void(const ReportBlockList&));
95 };
96
97 // SSRC of remote peer, that sends rtcp packet to the rtcp receiver under test.
98 constexpr uint32_t kSenderSsrc = 0x10203;
99 // SSRCs of local peer, that rtcp packet addressed to.
100 constexpr uint32_t kReceiverMainSsrc = 0x123456;
101 // RtcpReceiver can accept several ssrc, e.g. regular and rtx streams.
102 constexpr uint32_t kReceiverExtraSsrc = 0x1234567;
103 // SSRCs to ignore (i.e. not configured in RtcpReceiver).
104 constexpr uint32_t kNotToUsSsrc = 0x654321;
105 constexpr uint32_t kUnknownSenderSsrc = 0x54321;
106
107 } // namespace
75 108
76 class RtcpReceiverTest : public ::testing::Test { 109 class RtcpReceiverTest : public ::testing::Test {
77 protected: 110 protected:
78 RtcpReceiverTest() 111 RtcpReceiverTest()
79 : over_use_detector_options_(), 112 : system_clock_(1335900000),
80 system_clock_(1335900000), 113 rtcp_receiver_(&system_clock_,
81 remote_bitrate_observer_(), 114 false,
82 remote_bitrate_estimator_( 115 &packet_type_counter_observer_,
83 new RemoteBitrateEstimatorSingleStream(&remote_bitrate_observer_, 116 &bandwidth_observer_,
84 &system_clock_)), 117 &intra_frame_observer_,
85 retransmission_rate_limiter_(&system_clock_, 1000) { 118 &transport_feedback_observer_,
86 test_transport_.reset(new TestTransport()); 119 &rtp_rtcp_impl_) {}
87 120 void SetUp() {
88 RtpRtcp::Configuration configuration; 121 std::set<uint32_t> ssrcs = {kReceiverMainSsrc, kReceiverExtraSsrc};
89 configuration.audio = false; 122 EXPECT_CALL(intra_frame_observer_,
90 configuration.clock = &system_clock_; 123 OnLocalSsrcChanged(0, kReceiverMainSsrc));
91 configuration.outgoing_transport = test_transport_.get(); 124 rtcp_receiver_.SetSsrcs(kReceiverMainSsrc, ssrcs);
92 configuration.remote_bitrate_estimator = remote_bitrate_estimator_.get(); 125
93 configuration.retransmission_rate_limiter = &retransmission_rate_limiter_; 126 rtcp_receiver_.SetRemoteSSRC(kSenderSsrc);
94 rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl(configuration));
95 rtcp_receiver_.reset(new RTCPReceiver(&system_clock_, false, nullptr,
96 nullptr, nullptr, nullptr,
97 rtp_rtcp_impl_.get()));
98 test_transport_->SetRTCPReceiver(rtcp_receiver_.get());
99 } 127 }
100 128
101 ~RtcpReceiverTest() {} 129 void InjectRtcpPacket(rtc::ArrayView<const uint8_t> raw) {
102 130 rtcp_receiver_.IncomingPacket(raw.data(), raw.size());
103 // Injects an RTCP packet into the receiver.
104 // Returns 0 for OK, non-0 for failure.
105 int InjectRtcpPacket(const uint8_t* packet,
106 uint16_t packet_len) {
107 RTCPUtility::RTCPParserV2 rtcpParser(packet,
108 packet_len,
109 true); // Allow non-compound RTCP
110
111 RTCPHelp::RTCPPacketInformation rtcpPacketInformation;
112 EXPECT_EQ(0, rtcp_receiver_->IncomingRTCPPacket(rtcpPacketInformation,
113 &rtcpParser));
114 rtcp_receiver_->TriggerCallbacksFromRTCPPacket(rtcpPacketInformation);
115 // The NACK list is on purpose not copied below as it isn't needed by the
116 // test.
117 rtcp_packet_info_.rtcpPacketTypeFlags =
118 rtcpPacketInformation.rtcpPacketTypeFlags;
119 rtcp_packet_info_.remoteSSRC = rtcpPacketInformation.remoteSSRC;
120 rtcp_packet_info_.applicationSubType =
121 rtcpPacketInformation.applicationSubType;
122 rtcp_packet_info_.applicationName = rtcpPacketInformation.applicationName;
123 rtcp_packet_info_.applicationLength =
124 rtcpPacketInformation.applicationLength;
125 rtcp_packet_info_.report_blocks = rtcpPacketInformation.report_blocks;
126 rtcp_packet_info_.rtt = rtcpPacketInformation.rtt;
127 rtcp_packet_info_.interArrivalJitter =
128 rtcpPacketInformation.interArrivalJitter;
129 rtcp_packet_info_.sliPictureId = rtcpPacketInformation.sliPictureId;
130 rtcp_packet_info_.rpsiPictureId = rtcpPacketInformation.rpsiPictureId;
131 rtcp_packet_info_.receiverEstimatedMaxBitrate =
132 rtcpPacketInformation.receiverEstimatedMaxBitrate;
133 rtcp_packet_info_.ntp_secs = rtcpPacketInformation.ntp_secs;
134 rtcp_packet_info_.ntp_frac = rtcpPacketInformation.ntp_frac;
135 rtcp_packet_info_.rtp_timestamp = rtcpPacketInformation.rtp_timestamp;
136 rtcp_packet_info_.xr_dlrr_item = rtcpPacketInformation.xr_dlrr_item;
137 if (rtcpPacketInformation.VoIPMetric)
138 rtcp_packet_info_.AddVoIPMetric(rtcpPacketInformation.VoIPMetric.get());
139 rtcp_packet_info_.transport_feedback_.reset(
140 rtcpPacketInformation.transport_feedback_.release());
141 return 0;
142 } 131 }
143 132
144 OverUseDetectorOptions over_use_detector_options_; 133 void InjectRtcpPacket(const rtcp::RtcpPacket& packet) {
134 rtc::Buffer raw = packet.Build();
135 rtcp_receiver_.IncomingPacket(raw.data(), raw.size());
136 }
137
145 SimulatedClock system_clock_; 138 SimulatedClock system_clock_;
146 std::unique_ptr<TestTransport> test_transport_; 139 // Callbacks to packet_type_counter_observer are frequent but most of the time
147 std::unique_ptr<ModuleRtpRtcpImpl> rtp_rtcp_impl_; 140 // are not interesting.
148 std::unique_ptr<RTCPReceiver> rtcp_receiver_; 141 NiceMock<MockRtcpPacketTypeCounterObserver> packet_type_counter_observer_;
149 RTCPHelp::RTCPPacketInformation rtcp_packet_info_; 142 StrictMock<MockRtcpBandwidthObserver> bandwidth_observer_;
150 MockRemoteBitrateObserver remote_bitrate_observer_; 143 StrictMock<MockRtcpIntraFrameObserver> intra_frame_observer_;
151 std::unique_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_; 144 StrictMock<MockTransportFeedbackObserver> transport_feedback_observer_;
152 RateLimiter retransmission_rate_limiter_; 145 StrictMock<MockModuleRtpRtcp> rtp_rtcp_impl_;
153 }; 146
154 147 RTCPReceiver rtcp_receiver_;
148 };
155 149
156 TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) { 150 TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) {
157 const uint8_t bad_packet[] = {0, 0, 0, 0}; 151 const uint8_t bad_packet[] = {0, 0, 0, 0};
158 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 152 EXPECT_CALL(packet_type_counter_observer_,
159 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 153 RtcpPacketTypesCounterUpdated(_, _))
154 .Times(0);
155 InjectRtcpPacket(bad_packet);
160 } 156 }
161 157
162 TEST_F(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) { 158 TEST_F(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) {
163 // Too short feedback packet. 159 // Too short feedback packet.
164 const uint8_t bad_packet[] = {0x80, RTCPUtility::PT_RTPFB, 0, 0}; 160 const uint8_t bad_packet[] = {0x81, rtcp::Rtpfb::kPacketType, 0, 0};
165 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 161
166 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 162 InjectRtcpPacket(bad_packet);
philipel 2016/09/05 13:38:44 Maybe add EXPECT_CALL(some_object_, (params and s
danilchap 2016/09/05 14:03:13 Here it mostly tests parser won't crash or hang (I
167 } 163 }
168 164
169 TEST_F(RtcpReceiverTest, RpsiWithFractionalPaddingIsIgnored) { 165 TEST_F(RtcpReceiverTest, RpsiWithFractionalPaddingIsIgnored) {
170 // Padding size represent fractional number of bytes. 166 // Padding size represent fractional number of bytes.
171 const uint8_t kPaddingSizeBits = 0x0b; 167 const uint8_t kPaddingSizeBits = 0x0b;
172 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 3, 168 // clang-format off
169 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
170 rtcp::Rpsi::kPacketType, 0, 3,
173 0x12, 0x34, 0x56, 0x78, 171 0x12, 0x34, 0x56, 0x78,
174 0x98, 0x76, 0x54, 0x32, 172 0x98, 0x76, 0x54, 0x32,
175 kPaddingSizeBits, 0x00, 0x00, 0x00}; 173 kPaddingSizeBits, 0x00, 0x00, 0x00};
176 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 174 // clang-format on
177 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 175 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
176 InjectRtcpPacket(bad_packet);
178 } 177 }
179 178
180 TEST_F(RtcpReceiverTest, RpsiWithTooLargePaddingIsIgnored) { 179 TEST_F(RtcpReceiverTest, RpsiWithTooLargePaddingIsIgnored) {
181 // Padding size exceeds packet size. 180 // Padding size exceeds packet size.
182 const uint8_t kPaddingSizeBits = 0xa8; 181 const uint8_t kPaddingSizeBits = 0xa8;
183 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 3, 182 // clang-format off
183 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
184 rtcp::Rpsi::kPacketType, 0, 3,
184 0x12, 0x34, 0x56, 0x78, 185 0x12, 0x34, 0x56, 0x78,
185 0x98, 0x76, 0x54, 0x32, 186 0x98, 0x76, 0x54, 0x32,
186 kPaddingSizeBits, 0x00, 0x00, 0x00}; 187 kPaddingSizeBits, 0x00, 0x00, 0x00};
187 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 188 // clang-format on
188 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 189 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
190 InjectRtcpPacket(bad_packet);
189 } 191 }
190 192
191 // With parsing using rtcp classes this test will make no sense. 193 // With parsing using rtcp classes this test will make no sense.
192 // With current stateful parser this test was failing. 194 // With current stateful parser this test was failing.
193 TEST_F(RtcpReceiverTest, TwoHalfValidRpsiAreIgnored) { 195 TEST_F(RtcpReceiverTest, TwoHalfValidRpsiAreIgnored) {
194 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 2, 196 // clang-format off
197 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
198 rtcp::Rpsi::kPacketType, 0, 2,
195 0x12, 0x34, 0x56, 0x78, 199 0x12, 0x34, 0x56, 0x78,
196 0x98, 0x76, 0x54, 0x32, 200 0x98, 0x76, 0x54, 0x32,
197 0x83, RTCPUtility::PT_PSFB, 0, 2, 201 0x80 | rtcp::Rpsi::kFeedbackMessageType,
202 rtcp::Rpsi::kPacketType, 0, 2,
198 0x12, 0x34, 0x56, 0x78, 203 0x12, 0x34, 0x56, 0x78,
199 0x98, 0x76, 0x54, 0x32}; 204 0x98, 0x76, 0x54, 0x32};
200 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 205 // clang-format on
201 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 206 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
207 InjectRtcpPacket(bad_packet);
202 } 208 }
203 209
204 TEST_F(RtcpReceiverTest, InjectRpsiPacket) { 210 TEST_F(RtcpReceiverTest, InjectRpsiPacket) {
205 const uint64_t kPictureId = 0x123456789; 211 const uint64_t kPictureId = 0x123456789;
206 rtcp::Rpsi rpsi; 212 rtcp::Rpsi rpsi;
207 rpsi.WithPictureId(kPictureId); 213 rpsi.WithPictureId(kPictureId);
208 rtc::Buffer packet = rpsi.Build(); 214
209 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 215 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, kPictureId));
210 EXPECT_EQ(kRtcpRpsi, rtcp_packet_info_.rtcpPacketTypeFlags); 216 InjectRtcpPacket(rpsi);
211 } 217 }
212 218
213 TEST_F(RtcpReceiverTest, InjectSrPacket) { 219 TEST_F(RtcpReceiverTest, InjectSrPacket) {
214 const uint32_t kSenderSsrc = 0x10203; 220 RTCPSenderInfo info;
221 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
222
223 int64_t now = system_clock_.TimeInMilliseconds();
215 rtcp::SenderReport sr; 224 rtcp::SenderReport sr;
216 sr.From(kSenderSsrc); 225 sr.From(kSenderSsrc);
217 rtc::Buffer packet = sr.Build(); 226
218 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 227 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
219 // The parser will note the remote SSRC on a SR from other than his 228 EXPECT_CALL(bandwidth_observer_,
220 // expected peer, but will not flag that he's gotten a packet. 229 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
221 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 230 InjectRtcpPacket(sr);
222 EXPECT_EQ(0U, kRtcpSr & rtcp_packet_info_.rtcpPacketTypeFlags); 231
223 } 232 EXPECT_EQ(0, rtcp_receiver_.SenderInfoReceived(&info));
224 233 }
225 TEST_F(RtcpReceiverTest, InjectSrPacketFromExpectedPeer) { 234
226 const uint32_t kSenderSsrc = 0x10203; 235 TEST_F(RtcpReceiverTest, InjectSrPacketFromUnknownSender) {
227 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 236 int64_t now = system_clock_.TimeInMilliseconds();
228 rtcp::SenderReport sr; 237 rtcp::SenderReport sr;
229 sr.From(kSenderSsrc); 238 sr.From(kUnknownSenderSsrc);
230 rtc::Buffer packet = sr.Build(); 239
231 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 240 // The parser will handle report blocks in Sender Report from other than his
232 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 241 // expected peer.
233 EXPECT_EQ(kRtcpSr, rtcp_packet_info_.rtcpPacketTypeFlags); 242 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
243 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, now));
244 InjectRtcpPacket(sr);
245
246 // But will not flag that he's gotten sender information.
247 RTCPSenderInfo info;
248 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
234 } 249 }
235 250
236 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesRTT) { 251 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesRTT) {
237 Random r(0x0123456789abcdef); 252 Random r(0x0123456789abcdef);
238 const uint32_t kSenderSsrc = r.Rand(0x00000001u, 0xfffffffeu);
239 const uint32_t kRemoteSsrc = r.Rand(0x00000001u, 0xfffffffeu);
240 const int64_t kRttMs = r.Rand(1, 9 * 3600 * 1000); 253 const int64_t kRttMs = r.Rand(1, 9 * 3600 * 1000);
241 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff); 254 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff);
242 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 255 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
243 256
244 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
245 std::set<uint32_t> ssrcs;
246 ssrcs.insert(kRemoteSsrc);
247 rtcp_receiver_->SetSsrcs(kRemoteSsrc, ssrcs);
248
249 int64_t rtt_ms = 0; 257 int64_t rtt_ms = 0;
250 EXPECT_EQ( 258 EXPECT_EQ(
251 -1, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 259 -1, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
252 260
253 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_)); 261 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_));
254 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 262 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
255 263
256 rtcp::SenderReport sr; 264 rtcp::SenderReport sr;
257 sr.From(kSenderSsrc); 265 sr.From(kSenderSsrc);
258 rtcp::ReportBlock block; 266 rtcp::ReportBlock block;
259 block.To(kRemoteSsrc); 267 block.To(kReceiverMainSsrc);
260 block.WithLastSr(sent_ntp); 268 block.WithLastSr(sent_ntp);
261 block.WithDelayLastSr(kDelayNtp); 269 block.WithDelayLastSr(kDelayNtp);
262 sr.WithReportBlock(block); 270 sr.WithReportBlock(block);
263 271
264 rtc::Buffer packet = sr.Build(); 272 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
265 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 273 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
274 InjectRtcpPacket(sr);
266 275
267 EXPECT_EQ( 276 EXPECT_EQ(
268 0, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 277 0, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
269 EXPECT_NEAR(kRttMs, rtt_ms, 1); 278 EXPECT_NEAR(kRttMs, rtt_ms, 1);
270 } 279 }
271 280
272 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOne) { 281 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOne) {
273 Random r(0x0123456789abcdef); 282 Random r(0x0123456789abcdef);
274 const uint32_t kSenderSsrc = r.Rand(0x00000001u, 0xfffffffeu);
275 const uint32_t kRemoteSsrc = r.Rand(0x00000001u, 0xfffffffeu);
276 const int64_t kRttMs = r.Rand(-3600 * 1000, -1); 283 const int64_t kRttMs = r.Rand(-3600 * 1000, -1);
277 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff); 284 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff);
278 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 285 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
279 286
280 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc);
281 std::set<uint32_t> ssrcs;
282 ssrcs.insert(kRemoteSsrc);
283 rtcp_receiver_->SetSsrcs(kRemoteSsrc, ssrcs);
284
285 int64_t rtt_ms = 0; 287 int64_t rtt_ms = 0;
286 EXPECT_EQ( 288 EXPECT_EQ(
287 -1, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 289 -1, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
288 290
289 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_)); 291 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_));
290 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 292 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
291 293
292 rtcp::SenderReport sr; 294 rtcp::SenderReport sr;
293 sr.From(kSenderSsrc); 295 sr.From(kSenderSsrc);
294 rtcp::ReportBlock block; 296 rtcp::ReportBlock block;
295 block.To(kRemoteSsrc); 297 block.To(kReceiverMainSsrc);
296 block.WithLastSr(sent_ntp); 298 block.WithLastSr(sent_ntp);
297 block.WithDelayLastSr(kDelayNtp); 299 block.WithDelayLastSr(kDelayNtp);
298 sr.WithReportBlock(block); 300 sr.WithReportBlock(block);
299 301
300 rtc::Buffer packet = sr.Build(); 302 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
301 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 303 EXPECT_CALL(bandwidth_observer_,
304 OnReceivedRtcpReceiverReport(SizeIs(1), _, _));
305 InjectRtcpPacket(sr);
302 306
303 EXPECT_EQ( 307 EXPECT_EQ(
304 0, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 308 0, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
305 EXPECT_EQ(1, rtt_ms); 309 EXPECT_EQ(1, rtt_ms);
306 } 310 }
307 311
308 TEST_F(RtcpReceiverTest, InjectRrPacket) { 312 TEST_F(RtcpReceiverTest, InjectRrPacket) {
309 const uint32_t kSenderSsrc = 0x10203; 313 int64_t now = system_clock_.TimeInMilliseconds();
310 rtcp::ReceiverReport rr; 314 rtcp::ReceiverReport rr;
311 rr.From(kSenderSsrc); 315 rr.From(kSenderSsrc);
312 rtc::Buffer packet = rr.Build(); 316
313 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 317 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
314 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 318 EXPECT_CALL(bandwidth_observer_,
315 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 319 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
316 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); 320 InjectRtcpPacket(rr);
321
322 RTCPSenderInfo info;
323 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
324 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
325 std::vector<RTCPReportBlock> report_blocks;
326 rtcp_receiver_.StatisticsReceived(&report_blocks);
327 EXPECT_TRUE(report_blocks.empty());
317 } 328 }
318 329
319 TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { 330 TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) {
320 const uint32_t kSenderSsrc = 0x10203; 331 int64_t now = system_clock_.TimeInMilliseconds();
321 const uint32_t kSourceSsrc = 0x123456;
322 std::set<uint32_t> ssrcs;
323 ssrcs.insert(kSourceSsrc);
324 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
325
326 rtcp::ReportBlock rb; 332 rtcp::ReportBlock rb;
327 rb.To(kSourceSsrc + 1); 333 rb.To(kNotToUsSsrc);
328 rtcp::ReceiverReport rr; 334 rtcp::ReceiverReport rr;
329 rr.From(kSenderSsrc); 335 rr.From(kSenderSsrc);
330 rr.WithReportBlock(rb); 336 rr.WithReportBlock(rb);
331 rtc::Buffer packet = rr.Build();
332 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
333 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC);
334 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags);
335 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size());
336 337
338 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
339 EXPECT_CALL(bandwidth_observer_,
340 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
341 InjectRtcpPacket(rr);
342
343 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
337 std::vector<RTCPReportBlock> received_blocks; 344 std::vector<RTCPReportBlock> received_blocks;
338 rtcp_receiver_->StatisticsReceived(&received_blocks); 345 rtcp_receiver_.StatisticsReceived(&received_blocks);
339 EXPECT_TRUE(received_blocks.empty()); 346 EXPECT_TRUE(received_blocks.empty());
340 } 347 }
341 348
342 TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { 349 TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) {
343 const uint32_t kSenderSsrc = 0x10203; 350 int64_t now = system_clock_.TimeInMilliseconds();
344 const uint32_t kSourceSsrc = 0x123456;
345 std::set<uint32_t> ssrcs;
346 ssrcs.insert(kSourceSsrc);
347 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
348 351
349 rtcp::ReportBlock rb; 352 rtcp::ReportBlock rb;
350 rb.To(kSourceSsrc); 353 rb.To(kReceiverMainSsrc);
351 rtcp::ReceiverReport rr; 354 rtcp::ReceiverReport rr;
352 rr.From(kSenderSsrc); 355 rr.From(kSenderSsrc);
353 rr.WithReportBlock(rb); 356 rr.WithReportBlock(rb);
354 rtc::Buffer packet = rr.Build();
355 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
356 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC);
357 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags);
358 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size());
359 357
358 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
359 EXPECT_CALL(bandwidth_observer_,
360 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
361 InjectRtcpPacket(rr);
362
363 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
360 std::vector<RTCPReportBlock> received_blocks; 364 std::vector<RTCPReportBlock> received_blocks;
361 rtcp_receiver_->StatisticsReceived(&received_blocks); 365 rtcp_receiver_.StatisticsReceived(&received_blocks);
362 EXPECT_EQ(1u, received_blocks.size()); 366 EXPECT_EQ(1u, received_blocks.size());
363 } 367 }
364 368
365 TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) { 369 TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) {
366 const uint32_t kSenderSsrc = 0x10203;
367 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607};
368 const uint16_t kSequenceNumbers[] = {10, 12423}; 370 const uint16_t kSequenceNumbers[] = {10, 12423};
369 const uint32_t kCumLost[] = {13, 555}; 371 const uint32_t kCumLost[] = {13, 555};
370 const uint8_t kFracLost[] = {20, 11}; 372 const uint8_t kFracLost[] = {20, 11};
371 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]); 373 int64_t now = system_clock_.TimeInMilliseconds();
372
373 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs);
374 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs);
375 374
376 rtcp::ReportBlock rb1; 375 rtcp::ReportBlock rb1;
377 rb1.To(kSourceSsrcs[0]); 376 rb1.To(kReceiverMainSsrc);
378 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 377 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]);
379 rb1.WithFractionLost(10); 378 rb1.WithFractionLost(10);
380 rb1.WithCumulativeLost(5);
381 379
382 rtcp::ReportBlock rb2; 380 rtcp::ReportBlock rb2;
383 rb2.To(kSourceSsrcs[1]); 381 rb2.To(kReceiverExtraSsrc);
384 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 382 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]);
383 rb2.WithFractionLost(0);
385 384
386 rtcp::ReceiverReport rr1; 385 rtcp::ReceiverReport rr1;
387 rr1.From(kSenderSsrc); 386 rr1.From(kSenderSsrc);
388 rr1.WithReportBlock(rb1); 387 rr1.WithReportBlock(rb1);
389 rr1.WithReportBlock(rb2); 388 rr1.WithReportBlock(rb2);
390 389
391 rtc::Buffer p1 = rr1.Build(); 390 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(2)));
392 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 391 EXPECT_CALL(bandwidth_observer_,
393 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 392 OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
394 EXPECT_EQ(10, rtcp_packet_info_.report_blocks.front().fractionLost); 393 InjectRtcpPacket(rr1);
395 EXPECT_EQ(0, rtcp_packet_info_.report_blocks.back().fractionLost);
396 394
395 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
396 std::vector<RTCPReportBlock> received_blocks;
397 rtcp_receiver_.StatisticsReceived(&received_blocks);
398 EXPECT_THAT(received_blocks,
399 UnorderedElementsAre(Field(&RTCPReportBlock::fractionLost, 0),
400 Field(&RTCPReportBlock::fractionLost, 10)));
401
402 // Insert next receiver report with same ssrc but new values.
397 rtcp::ReportBlock rb3; 403 rtcp::ReportBlock rb3;
398 rb3.To(kSourceSsrcs[0]); 404 rb3.To(kReceiverMainSsrc);
399 rb3.WithExtHighestSeqNum(kSequenceNumbers[0]); 405 rb3.WithExtHighestSeqNum(kSequenceNumbers[0]);
400 rb3.WithFractionLost(kFracLost[0]); 406 rb3.WithFractionLost(kFracLost[0]);
401 rb3.WithCumulativeLost(kCumLost[0]); 407 rb3.WithCumulativeLost(kCumLost[0]);
402 408
403 rtcp::ReportBlock rb4; 409 rtcp::ReportBlock rb4;
404 rb4.To(kSourceSsrcs[1]); 410 rb4.To(kReceiverExtraSsrc);
405 rb4.WithExtHighestSeqNum(kSequenceNumbers[1]); 411 rb4.WithExtHighestSeqNum(kSequenceNumbers[1]);
406 rb4.WithFractionLost(kFracLost[1]); 412 rb4.WithFractionLost(kFracLost[1]);
407 rb4.WithCumulativeLost(kCumLost[1]); 413 rb4.WithCumulativeLost(kCumLost[1]);
408 414
409 rtcp::ReceiverReport rr2; 415 rtcp::ReceiverReport rr2;
410 rr2.From(kSenderSsrc); 416 rr2.From(kSenderSsrc);
411 rr2.WithReportBlock(rb3); 417 rr2.WithReportBlock(rb3);
412 rr2.WithReportBlock(rb4); 418 rr2.WithReportBlock(rb4);
413 419
414 rtc::Buffer p2 = rr2.Build(); 420 // Advance time to make 1st sent time and 2nd sent time different.
415 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 421 system_clock_.AdvanceTimeMilliseconds(500);
416 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 422 now = system_clock_.TimeInMilliseconds();
417 EXPECT_EQ(kFracLost[0], rtcp_packet_info_.report_blocks.front().fractionLost); 423
418 EXPECT_EQ(kFracLost[1], rtcp_packet_info_.report_blocks.back().fractionLost); 424 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(2)));
419 425 EXPECT_CALL(bandwidth_observer_,
420 std::vector<RTCPReportBlock> received_blocks; 426 OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
421 rtcp_receiver_->StatisticsReceived(&received_blocks); 427 InjectRtcpPacket(rr2);
428
429 received_blocks.clear();
430 rtcp_receiver_.StatisticsReceived(&received_blocks);
422 EXPECT_EQ(2u, received_blocks.size()); 431 EXPECT_EQ(2u, received_blocks.size());
423 for (size_t i = 0; i < received_blocks.size(); ++i) { 432 EXPECT_THAT(received_blocks,
424 EXPECT_EQ(kSenderSsrc, received_blocks[i].remoteSSRC); 433 UnorderedElementsAre(
425 EXPECT_EQ(kSourceSsrcs[i], received_blocks[i].sourceSSRC); 434 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverMainSsrc),
426 EXPECT_EQ(kFracLost[i], received_blocks[i].fractionLost); 435 Field(&RTCPReportBlock::fractionLost, kFracLost[0]),
427 EXPECT_EQ(kCumLost[i], received_blocks[i].cumulativeLost); 436 Field(&RTCPReportBlock::cumulativeLost, kCumLost[0]),
428 EXPECT_EQ(kSequenceNumbers[i], received_blocks[i].extendedHighSeqNum); 437 Field(&RTCPReportBlock::extendedHighSeqNum,
429 } 438 kSequenceNumbers[0])),
439 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverExtraSsrc),
440 Field(&RTCPReportBlock::fractionLost, kFracLost[1]),
441 Field(&RTCPReportBlock::cumulativeLost, kCumLost[1]),
442 Field(&RTCPReportBlock::extendedHighSeqNum,
443 kSequenceNumbers[1]))));
430 } 444 }
431 445
432 TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) { 446 TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) {
433 const uint32_t kSenderSsrc1 = 0x10203;
434 const uint32_t kSenderSsrc2 = 0x20304; 447 const uint32_t kSenderSsrc2 = 0x20304;
435 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607};
436 const uint16_t kSequenceNumbers[] = {10, 12423}; 448 const uint16_t kSequenceNumbers[] = {10, 12423};
437 const uint32_t kCumLost[] = {13, 555}; 449 const uint32_t kCumLost[] = {13, 555};
438 const uint8_t kFracLost[] = {20, 11}; 450 const uint8_t kFracLost[] = {20, 11};
439 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]);
440
441 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs);
442 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs);
443 451
444 rtcp::ReportBlock rb1; 452 rtcp::ReportBlock rb1;
445 rb1.To(kSourceSsrcs[0]); 453 rb1.To(kReceiverMainSsrc);
446 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 454 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]);
447 rb1.WithFractionLost(kFracLost[0]); 455 rb1.WithFractionLost(kFracLost[0]);
448 rb1.WithCumulativeLost(kCumLost[0]); 456 rb1.WithCumulativeLost(kCumLost[0]);
449 rtcp::ReceiverReport rr1; 457 rtcp::ReceiverReport rr1;
450 rr1.From(kSenderSsrc1); 458 rr1.From(kSenderSsrc);
451 rr1.WithReportBlock(rb1); 459 rr1.WithReportBlock(rb1);
452 460
453 rtc::Buffer p1 = rr1.Build(); 461 int64_t now = system_clock_.TimeInMilliseconds();
454 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 462
455 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 463 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
456 EXPECT_EQ(kFracLost[0], rtcp_packet_info_.report_blocks.front().fractionLost); 464 EXPECT_CALL(bandwidth_observer_,
465 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
466 InjectRtcpPacket(rr1);
467
468 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
457 469
458 std::vector<RTCPReportBlock> received_blocks; 470 std::vector<RTCPReportBlock> received_blocks;
459 rtcp_receiver_->StatisticsReceived(&received_blocks); 471 rtcp_receiver_.StatisticsReceived(&received_blocks);
460 EXPECT_EQ(1u, received_blocks.size()); 472 EXPECT_EQ(1u, received_blocks.size());
461 EXPECT_EQ(kSenderSsrc1, received_blocks[0].remoteSSRC); 473 EXPECT_EQ(kSenderSsrc, received_blocks[0].remoteSSRC);
462 EXPECT_EQ(kSourceSsrcs[0], received_blocks[0].sourceSSRC); 474 EXPECT_EQ(kReceiverMainSsrc, received_blocks[0].sourceSSRC);
463 EXPECT_EQ(kFracLost[0], received_blocks[0].fractionLost); 475 EXPECT_EQ(kFracLost[0], received_blocks[0].fractionLost);
464 EXPECT_EQ(kCumLost[0], received_blocks[0].cumulativeLost); 476 EXPECT_EQ(kCumLost[0], received_blocks[0].cumulativeLost);
465 EXPECT_EQ(kSequenceNumbers[0], received_blocks[0].extendedHighSeqNum); 477 EXPECT_EQ(kSequenceNumbers[0], received_blocks[0].extendedHighSeqNum);
466 478
467 rtcp::ReportBlock rb2; 479 rtcp::ReportBlock rb2;
468 rb2.To(kSourceSsrcs[0]); 480 rb2.To(kReceiverMainSsrc);
469 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 481 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]);
470 rb2.WithFractionLost(kFracLost[1]); 482 rb2.WithFractionLost(kFracLost[1]);
471 rb2.WithCumulativeLost(kCumLost[1]); 483 rb2.WithCumulativeLost(kCumLost[1]);
472 rtcp::ReceiverReport rr2; 484 rtcp::ReceiverReport rr2;
473 rr2.From(kSenderSsrc2); 485 rr2.From(kSenderSsrc2);
474 rr2.WithReportBlock(rb2); 486 rr2.WithReportBlock(rb2);
475 rtc::Buffer p2 = rr2.Build(); 487
476 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 488 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
477 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 489 EXPECT_CALL(bandwidth_observer_,
478 EXPECT_EQ(kFracLost[1], rtcp_packet_info_.report_blocks.front().fractionLost); 490 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
491 InjectRtcpPacket(rr2);
479 492
480 received_blocks.clear(); 493 received_blocks.clear();
481 rtcp_receiver_->StatisticsReceived(&received_blocks); 494 rtcp_receiver_.StatisticsReceived(&received_blocks);
482 ASSERT_EQ(2u, received_blocks.size()); 495 ASSERT_EQ(2u, received_blocks.size());
483 EXPECT_EQ(kSenderSsrc1, received_blocks[0].remoteSSRC); 496 EXPECT_THAT(received_blocks,
484 EXPECT_EQ(kSenderSsrc2, received_blocks[1].remoteSSRC); 497 UnorderedElementsAre(
485 for (size_t i = 0; i < received_blocks.size(); ++i) { 498 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverMainSsrc),
486 EXPECT_EQ(kSourceSsrcs[0], received_blocks[i].sourceSSRC); 499 Field(&RTCPReportBlock::remoteSSRC, kSenderSsrc),
487 EXPECT_EQ(kFracLost[i], received_blocks[i].fractionLost); 500 Field(&RTCPReportBlock::fractionLost, kFracLost[0]),
488 EXPECT_EQ(kCumLost[i], received_blocks[i].cumulativeLost); 501 Field(&RTCPReportBlock::cumulativeLost, kCumLost[0]),
489 EXPECT_EQ(kSequenceNumbers[i], received_blocks[i].extendedHighSeqNum); 502 Field(&RTCPReportBlock::extendedHighSeqNum,
490 } 503 kSequenceNumbers[0])),
504 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverMainSsrc),
505 Field(&RTCPReportBlock::remoteSSRC, kSenderSsrc2),
506 Field(&RTCPReportBlock::fractionLost, kFracLost[1]),
507 Field(&RTCPReportBlock::cumulativeLost, kCumLost[1]),
508 Field(&RTCPReportBlock::extendedHighSeqNum,
509 kSequenceNumbers[1]))));
491 } 510 }
492 511
493 TEST_F(RtcpReceiverTest, GetRtt) { 512 TEST_F(RtcpReceiverTest, GetRtt) {
494 const uint32_t kSenderSsrc = 0x10203;
495 const uint32_t kSourceSsrc = 0x123456;
496 std::set<uint32_t> ssrcs;
497 ssrcs.insert(kSourceSsrc);
498 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
499
500 // No report block received. 513 // No report block received.
501 EXPECT_EQ( 514 EXPECT_EQ(
502 -1, rtcp_receiver_->RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); 515 -1, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
503 516
504 rtcp::ReportBlock rb; 517 rtcp::ReportBlock rb;
505 rb.To(kSourceSsrc); 518 rb.To(kReceiverMainSsrc);
519
506 rtcp::ReceiverReport rr; 520 rtcp::ReceiverReport rr;
507 rr.From(kSenderSsrc); 521 rr.From(kSenderSsrc);
508 rr.WithReportBlock(rb); 522 rr.WithReportBlock(rb);
509 rtc::Buffer packet = rr.Build(); 523 int64_t now = system_clock_.TimeInMilliseconds();
510 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 524
511 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 525 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
512 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 526 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
513 EXPECT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 527 InjectRtcpPacket(rr);
528
529 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
514 EXPECT_EQ( 530 EXPECT_EQ(
515 0, rtcp_receiver_->RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); 531 0, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
516 532 }
517 // Report block not received. 533
518 EXPECT_EQ(-1, rtcp_receiver_->RTT(kSenderSsrc + 1, nullptr, nullptr, nullptr, 534 // Ij packets are ignored.
519 nullptr));
520 }
521
522 TEST_F(RtcpReceiverTest, InjectIjWithNoItem) { 535 TEST_F(RtcpReceiverTest, InjectIjWithNoItem) {
523 rtcp::ExtendedJitterReport ij; 536 rtcp::ExtendedJitterReport ij;
524 rtc::Buffer packet = ij.Build(); 537 InjectRtcpPacket(ij);
525 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 538 }
526 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 539
527 } 540 // App packets are ignored.
528 541 TEST_F(RtcpReceiverTest, InjectApp) {
529 TEST_F(RtcpReceiverTest, InjectIjWithOneItem) {
530 rtcp::ExtendedJitterReport ij;
531 ij.WithJitter(0x11213141);
532
533 rtc::Buffer packet = ij.Build();
534 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
535 EXPECT_EQ(kRtcpTransmissionTimeOffset, rtcp_packet_info_.rtcpPacketTypeFlags);
536 EXPECT_EQ(0x11213141U, rtcp_packet_info_.interArrivalJitter);
537 }
538
539 TEST_F(RtcpReceiverTest, InjectAppWithNoData) {
540 rtcp::App app; 542 rtcp::App app;
541 app.WithSubType(30); 543 app.WithSubType(30);
542 uint32_t name = 'n' << 24; 544 app.WithName(0x17a177e);
543 name += 'a' << 16; 545 const uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
544 name += 'm' << 8; 546 app.WithData(kData, sizeof(kData));
545 name += 'e'; 547
546 app.WithName(name); 548 InjectRtcpPacket(app);
547
548 rtc::Buffer packet = app.Build();
549 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
550 EXPECT_EQ(kRtcpApp, rtcp_packet_info_.rtcpPacketTypeFlags);
551 EXPECT_EQ(30, rtcp_packet_info_.applicationSubType);
552 EXPECT_EQ(name, rtcp_packet_info_.applicationName);
553 EXPECT_EQ(0, rtcp_packet_info_.applicationLength);
554 }
555
556 TEST_F(RtcpReceiverTest, InjectAppWithData) {
557 rtcp::App app;
558 app.WithSubType(30);
559 uint32_t name = 'n' << 24;
560 name += 'a' << 16;
561 name += 'm' << 8;
562 name += 'e';
563 app.WithName(name);
564 const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
565 const size_t kDataLength = sizeof(kData) / sizeof(kData[0]);
566 app.WithData((const uint8_t*)kData, kDataLength);
567
568 rtc::Buffer packet = app.Build();
569 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size()));
570 EXPECT_EQ(kRtcpApp, rtcp_packet_info_.rtcpPacketTypeFlags);
571 EXPECT_EQ(30, rtcp_packet_info_.applicationSubType);
572 EXPECT_EQ(name, rtcp_packet_info_.applicationName);
573 EXPECT_EQ(kDataLength, rtcp_packet_info_.applicationLength);
574 } 549 }
575 550
576 TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) { 551 TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) {
577 const uint32_t kSenderSsrc = 0x123456; 552 const char kCname[] = "alice@host";
553 MockRtcpCallbackImpl callback;
554 rtcp_receiver_.RegisterRtcpStatisticsCallback(&callback);
578 rtcp::Sdes sdes; 555 rtcp::Sdes sdes;
579 sdes.WithCName(kSenderSsrc, "alice@host"); 556 sdes.WithCName(kSenderSsrc, kCname);
580 557
581 rtc::Buffer packet = sdes.Build(); 558 EXPECT_CALL(callback, CNameChanged(StrEq(kCname), kSenderSsrc));
582 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 559 InjectRtcpPacket(sdes);
560
583 char cName[RTCP_CNAME_SIZE]; 561 char cName[RTCP_CNAME_SIZE];
584 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 562 EXPECT_EQ(0, rtcp_receiver_.CNAME(kSenderSsrc, cName));
585 EXPECT_EQ(0, strncmp(cName, "alice@host", RTCP_CNAME_SIZE)); 563 EXPECT_EQ(0, strncmp(cName, kCname, RTCP_CNAME_SIZE));
586 } 564 }
587 565
588 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesCname) { 566 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesCname) {
589 const uint32_t kSenderSsrc = 0x123456; 567 const char kCname[] = "alice@host";
590 rtcp::Sdes sdes; 568 rtcp::Sdes sdes;
591 sdes.WithCName(kSenderSsrc, "alice@host"); 569 sdes.WithCName(kSenderSsrc, kCname);
592 570
593 rtc::Buffer packet = sdes.Build(); 571 InjectRtcpPacket(sdes);
594 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 572
595 char cName[RTCP_CNAME_SIZE]; 573 char cName[RTCP_CNAME_SIZE];
596 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 574 EXPECT_EQ(0, rtcp_receiver_.CNAME(kSenderSsrc, cName));
597 575
598 // Verify that BYE removes the CNAME. 576 // Verify that BYE removes the CNAME.
599 rtcp::Bye bye; 577 rtcp::Bye bye;
600 bye.From(kSenderSsrc); 578 bye.From(kSenderSsrc);
601 rtc::Buffer p2 = bye.Build(); 579
602 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 580 InjectRtcpPacket(bye);
603 EXPECT_EQ(-1, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 581
582 EXPECT_EQ(-1, rtcp_receiver_.CNAME(kSenderSsrc, cName));
604 } 583 }
605 584
606 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesReportBlocks) { 585 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesReportBlocks) {
607 const uint32_t kSenderSsrc = 0x10203;
608 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607};
609 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]);
610
611 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs);
612 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs);
613
614 rtcp::ReportBlock rb1; 586 rtcp::ReportBlock rb1;
615 rb1.To(kSourceSsrcs[0]); 587 rb1.To(kReceiverMainSsrc);
616 rtcp::ReportBlock rb2; 588 rtcp::ReportBlock rb2;
617 rb2.To(kSourceSsrcs[1]); 589 rb2.To(kReceiverExtraSsrc);
618 rtcp::ReceiverReport rr; 590 rtcp::ReceiverReport rr;
619 rr.From(kSenderSsrc); 591 rr.From(kSenderSsrc);
620 rr.WithReportBlock(rb1); 592 rr.WithReportBlock(rb1);
621 rr.WithReportBlock(rb2); 593 rr.WithReportBlock(rb2);
622 594
623 rtc::Buffer p1 = rr.Build(); 595 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
624 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 596 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
625 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 597 InjectRtcpPacket(rr);
598
626 std::vector<RTCPReportBlock> received_blocks; 599 std::vector<RTCPReportBlock> received_blocks;
627 rtcp_receiver_->StatisticsReceived(&received_blocks); 600 rtcp_receiver_.StatisticsReceived(&received_blocks);
628 EXPECT_EQ(2u, received_blocks.size()); 601 EXPECT_EQ(2u, received_blocks.size());
629 602
630 // Verify that BYE removes the report blocks. 603 // Verify that BYE removes the report blocks.
631 rtcp::Bye bye; 604 rtcp::Bye bye;
632 bye.From(kSenderSsrc); 605 bye.From(kSenderSsrc);
633 rtc::Buffer p2 = bye.Build(); 606
634 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 607 InjectRtcpPacket(bye);
608
635 received_blocks.clear(); 609 received_blocks.clear();
636 rtcp_receiver_->StatisticsReceived(&received_blocks); 610 rtcp_receiver_.StatisticsReceived(&received_blocks);
637 EXPECT_TRUE(received_blocks.empty()); 611 EXPECT_TRUE(received_blocks.empty());
638 612
639 // Inject packet. 613 // Inject packet again.
640 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 614 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
641 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 615 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
616 InjectRtcpPacket(rr);
617
642 received_blocks.clear(); 618 received_blocks.clear();
643 rtcp_receiver_->StatisticsReceived(&received_blocks); 619 rtcp_receiver_.StatisticsReceived(&received_blocks);
644 EXPECT_EQ(2u, received_blocks.size()); 620 EXPECT_EQ(2u, received_blocks.size());
645 } 621 }
646 622
647 TEST_F(RtcpReceiverTest, InjectPliPacket) { 623 TEST_F(RtcpReceiverTest, InjectPliPacket) {
648 const uint32_t kSourceSsrc = 0x123456;
649 std::set<uint32_t> ssrcs;
650 ssrcs.insert(kSourceSsrc);
651 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
652
653 rtcp::Pli pli; 624 rtcp::Pli pli;
654 pli.To(kSourceSsrc); 625 pli.To(kReceiverMainSsrc);
655 rtc::Buffer packet = pli.Build(); 626
656 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 627 EXPECT_CALL(
657 EXPECT_EQ(kRtcpPli, rtcp_packet_info_.rtcpPacketTypeFlags); 628 packet_type_counter_observer_,
629 RtcpPacketTypesCounterUpdated(
630 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 1)));
631 EXPECT_CALL(intra_frame_observer_,
632 OnReceivedIntraFrameRequest(kReceiverMainSsrc));
633 InjectRtcpPacket(pli);
658 } 634 }
659 635
660 TEST_F(RtcpReceiverTest, PliPacketNotToUsIgnored) { 636 TEST_F(RtcpReceiverTest, PliPacketNotToUsIgnored) {
661 const uint32_t kSourceSsrc = 0x123456;
662 std::set<uint32_t> ssrcs;
663 ssrcs.insert(kSourceSsrc);
664 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
665
666 rtcp::Pli pli; 637 rtcp::Pli pli;
667 pli.To(kSourceSsrc + 1); 638 pli.To(kNotToUsSsrc);
668 rtc::Buffer packet = pli.Build(); 639
669 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 640 EXPECT_CALL(
670 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 641 packet_type_counter_observer_,
642 RtcpPacketTypesCounterUpdated(
643 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 0)));
644 EXPECT_CALL(intra_frame_observer_, OnReceivedIntraFrameRequest(_)).Times(0);
645 InjectRtcpPacket(pli);
671 } 646 }
672 647
673 TEST_F(RtcpReceiverTest, InjectFirPacket) { 648 TEST_F(RtcpReceiverTest, InjectFirPacket) {
674 const uint32_t kSourceSsrc = 0x123456;
675 std::set<uint32_t> ssrcs;
676 ssrcs.insert(kSourceSsrc);
677 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
678
679 rtcp::Fir fir; 649 rtcp::Fir fir;
680 fir.WithRequestTo(kSourceSsrc, 13); 650 fir.WithRequestTo(kReceiverMainSsrc, 13);
681 rtc::Buffer packet = fir.Build(); 651
682 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 652 EXPECT_CALL(
683 EXPECT_EQ(kRtcpFir, rtcp_packet_info_.rtcpPacketTypeFlags); 653 packet_type_counter_observer_,
654 RtcpPacketTypesCounterUpdated(
655 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::fir_packets, 1)));
656 EXPECT_CALL(intra_frame_observer_,
657 OnReceivedIntraFrameRequest(kReceiverMainSsrc));
658 InjectRtcpPacket(fir);
684 } 659 }
685 660
686 TEST_F(RtcpReceiverTest, FirPacketNotToUsIgnored) { 661 TEST_F(RtcpReceiverTest, FirPacketNotToUsIgnored) {
687 const uint32_t kSourceSsrc = 0x123456;
688 std::set<uint32_t> ssrcs;
689 ssrcs.insert(kSourceSsrc);
690 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
691
692 rtcp::Fir fir; 662 rtcp::Fir fir;
693 fir.WithRequestTo(kSourceSsrc + 1, 13); 663 fir.WithRequestTo(kNotToUsSsrc, 13);
694 rtc::Buffer packet = fir.Build(); 664
695 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 665 EXPECT_CALL(intra_frame_observer_, OnReceivedIntraFrameRequest(_)).Times(0);
696 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 666 InjectRtcpPacket(fir);
697 } 667 }
698 668
699 TEST_F(RtcpReceiverTest, InjectSliPacket) { 669 TEST_F(RtcpReceiverTest, InjectSliPacket) {
670 const uint8_t kPictureId = 40;
700 rtcp::Sli sli; 671 rtcp::Sli sli;
701 sli.WithPictureId(40); 672 sli.WithPictureId(kPictureId);
702 rtc::Buffer packet = sli.Build(); 673
703 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 674 EXPECT_CALL(intra_frame_observer_, OnReceivedSLI(_, kPictureId));
704 EXPECT_EQ(kRtcpSli, rtcp_packet_info_.rtcpPacketTypeFlags); 675 InjectRtcpPacket(sli);
705 EXPECT_EQ(40, rtcp_packet_info_.sliPictureId);
706 } 676 }
707 677
708 TEST_F(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) { 678 TEST_F(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) {
709 rtcp::ExtendedReports xr; 679 rtcp::ExtendedReports xr;
710 xr.From(0x2345); 680 xr.From(kSenderSsrc);
711 rtc::Buffer packet = xr.Build(); 681
712 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 682 InjectRtcpPacket(xr);
713 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 683 }
714 } 684
715 685 // VOiP reports are ignored.
716 TEST_F(RtcpReceiverTest, InjectExtendedReportsVoipPacket) { 686 TEST_F(RtcpReceiverTest, InjectExtendedReportsVoipPacket) {
717 const uint32_t kSourceSsrc = 0x123456;
718 std::set<uint32_t> ssrcs;
719 ssrcs.insert(kSourceSsrc);
720 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
721
722 const uint8_t kLossRate = 123; 687 const uint8_t kLossRate = 123;
723 rtcp::VoipMetric voip_metric; 688 rtcp::VoipMetric voip_metric;
724 voip_metric.To(kSourceSsrc); 689 voip_metric.To(kReceiverMainSsrc);
725 RTCPVoIPMetric metric; 690 RTCPVoIPMetric metric;
726 metric.lossRate = kLossRate; 691 metric.lossRate = kLossRate;
727 voip_metric.WithVoipMetric(metric); 692 voip_metric.WithVoipMetric(metric);
728 rtcp::ExtendedReports xr; 693 rtcp::ExtendedReports xr;
729 xr.From(0x2345); 694 xr.From(kSenderSsrc);
730 xr.WithVoipMetric(voip_metric); 695 xr.WithVoipMetric(voip_metric);
731 rtc::Buffer packet = xr.Build(); 696
732 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 697 InjectRtcpPacket(xr);
733 ASSERT_TRUE(rtcp_packet_info_.VoIPMetric != nullptr);
734 EXPECT_EQ(kLossRate, rtcp_packet_info_.VoIPMetric->lossRate);
735 EXPECT_EQ(kRtcpXrVoipMetric, rtcp_packet_info_.rtcpPacketTypeFlags);
736 } 698 }
737 699
738 TEST_F(RtcpReceiverTest, ExtendedReportsVoipPacketNotToUsIgnored) { 700 TEST_F(RtcpReceiverTest, ExtendedReportsVoipPacketNotToUsIgnored) {
739 const uint32_t kSourceSsrc = 0x123456;
740 std::set<uint32_t> ssrcs;
741 ssrcs.insert(kSourceSsrc);
742 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
743
744 rtcp::VoipMetric voip_metric; 701 rtcp::VoipMetric voip_metric;
745 voip_metric.To(kSourceSsrc + 1); 702 voip_metric.To(kNotToUsSsrc);
746 rtcp::ExtendedReports xr; 703 rtcp::ExtendedReports xr;
747 xr.From(0x2345); 704 xr.From(kSenderSsrc);
748 xr.WithVoipMetric(voip_metric); 705 xr.WithVoipMetric(voip_metric);
749 rtc::Buffer packet = xr.Build(); 706
750 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 707 InjectRtcpPacket(xr);
751 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags);
752 } 708 }
753 709
754 TEST_F(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) { 710 TEST_F(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) {
711 const NtpTime kNtp(0x10203, 0x40506);
755 rtcp::Rrtr rrtr; 712 rtcp::Rrtr rrtr;
756 rrtr.WithNtp(NtpTime(0x10203, 0x40506)); 713 rrtr.WithNtp(kNtp);
757 rtcp::ExtendedReports xr; 714 rtcp::ExtendedReports xr;
758 xr.From(0x2345); 715 xr.From(kSenderSsrc);
759 xr.WithRrtr(rrtr); 716 xr.WithRrtr(rrtr);
760 717
761 rtc::Buffer packet = xr.Build(); 718 RtcpReceiveTimeInfo rrtime;
762 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 719 EXPECT_FALSE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
763 EXPECT_EQ(kRtcpXrReceiverReferenceTime, 720
764 rtcp_packet_info_.rtcpPacketTypeFlags); 721 InjectRtcpPacket(xr);
722
723 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
724 EXPECT_EQ(rrtime.sourceSSRC, kSenderSsrc);
725 EXPECT_EQ(rrtime.lastRR, CompactNtp(kNtp));
726 EXPECT_EQ(0u, rrtime.delaySinceLastRR);
727
728 system_clock_.AdvanceTimeMilliseconds(1500);
729 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
730 EXPECT_NEAR(1500, CompactNtpRttToMs(rrtime.delaySinceLastRR), 1);
765 } 731 }
766 732
767 TEST_F(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) { 733 TEST_F(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) {
768 const uint32_t kSourceSsrc = 0x123456; 734 // Allow calculate rtt using dlrr/rrtr, simulating media receiver side.
769 std::set<uint32_t> ssrcs; 735 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
770 ssrcs.insert(kSourceSsrc); 736
771 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 737 rtcp::Dlrr dlrr;
772 738 dlrr.WithDlrrItem(kNotToUsSsrc, 0x12345, 0x67890);
773 rtcp::Dlrr dlrr; 739 rtcp::ExtendedReports xr;
774 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 740 xr.From(kSenderSsrc);
775 rtcp::ExtendedReports xr; 741 xr.WithDlrr(dlrr);
776 xr.From(0x2345); 742
777 xr.WithDlrr(dlrr); 743 InjectRtcpPacket(xr);
778 rtc::Buffer packet = xr.Build(); 744
779 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 745 int64_t rtt_ms = 0;
780 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 746 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
781 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item);
782 } 747 }
783 748
784 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) { 749 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) {
785 const uint32_t kSourceSsrc = 0x123456; 750 const uint32_t kLastRR = 0x12345;
786 std::set<uint32_t> ssrcs; 751 const uint32_t kDelay = 0x23456;
787 ssrcs.insert(kSourceSsrc); 752 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
788 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 753 int64_t rtt_ms = 0;
789 754 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
790 rtcp::Dlrr dlrr; 755
791 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 756 rtcp::Dlrr dlrr;
792 rtcp::ExtendedReports xr; 757 dlrr.WithDlrrItem(kReceiverMainSsrc, kLastRR, kDelay);
793 xr.From(0x2345); 758 rtcp::ExtendedReports xr;
794 xr.WithDlrr(dlrr); 759 xr.From(kSenderSsrc);
795 rtc::Buffer packet = xr.Build(); 760 xr.WithDlrr(dlrr);
796 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 761
797 // The parser should note the DLRR report block item. 762 InjectRtcpPacket(xr);
798 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 763
764 uint32_t compact_ntp_now = CompactNtp(NtpTime(system_clock_));
765 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
766 uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
767 EXPECT_NEAR(CompactNtpRttToMs(rtt_ntp), rtt_ms, 1);
799 } 768 }
800 769
801 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) { 770 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) {
802 const uint32_t kSourceSsrc = 0x123456; 771 const uint32_t kLastRR = 0x12345;
803 std::set<uint32_t> ssrcs; 772 const uint32_t kDelay = 0x56789;
804 ssrcs.insert(kSourceSsrc); 773 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
805 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 774
806 775 rtcp::ExtendedReports xr;
807 rtcp::Dlrr dlrr; 776 xr.From(kSenderSsrc);
808 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 777 rtcp::Dlrr dlrr;
809 dlrr.WithDlrrItem(kSourceSsrc + 2, 0x12345, 0x67890); 778 dlrr.WithDlrrItem(kReceiverMainSsrc, kLastRR, kDelay);
810 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 779 dlrr.WithDlrrItem(kReceiverMainSsrc + 1, 0x12345, 0x67890);
811 rtcp::ExtendedReports xr; 780 dlrr.WithDlrrItem(kReceiverMainSsrc + 2, 0x12345, 0x67890);
812 xr.From(0x2345); 781 xr.WithDlrr(dlrr);
813 xr.WithDlrr(dlrr); 782
814 rtc::Buffer packet = xr.Build(); 783 InjectRtcpPacket(xr);
815 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 784
816 // The parser should note the DLRR report block item. 785 uint32_t compact_ntp_now = CompactNtp(NtpTime(system_clock_));
817 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 786 int64_t rtt_ms = 0;
787 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
788 uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
789 EXPECT_NEAR(CompactNtpRttToMs(rtt_ntp), rtt_ms, 1);
818 } 790 }
819 791
820 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) { 792 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) {
821 const uint32_t kSourceSsrc = 0x123456; 793 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
822 std::set<uint32_t> ssrcs;
823 ssrcs.insert(kSourceSsrc);
824 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
825 794
826 rtcp::Rrtr rrtr; 795 rtcp::Rrtr rrtr;
827 rtcp::Dlrr dlrr; 796 rtcp::Dlrr dlrr;
828 dlrr.WithDlrrItem(kSourceSsrc, 0, 0x67890); 797 dlrr.WithDlrrItem(kReceiverMainSsrc, 0x12345, 0x67890);
829 rtcp::VoipMetric metric; 798 rtcp::VoipMetric metric;
830 metric.To(kSourceSsrc); 799 metric.To(kReceiverMainSsrc);
831 rtcp::ExtendedReports xr; 800 rtcp::ExtendedReports xr;
832 xr.From(0x2345); 801 xr.From(kSenderSsrc);
833 xr.WithRrtr(rrtr); 802 xr.WithRrtr(rrtr);
834 xr.WithDlrr(dlrr); 803 xr.WithDlrr(dlrr);
835 xr.WithVoipMetric(metric); 804 xr.WithVoipMetric(metric);
836 rtc::Buffer packet = xr.Build(); 805
837 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 806 InjectRtcpPacket(xr);
838 // The parser should not flag the packet since the RTT is not estimated. 807
839 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 808 RtcpReceiveTimeInfo rrtime;
840 kRtcpXrVoipMetric), 809 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
841 rtcp_packet_info_.rtcpPacketTypeFlags); 810 int64_t rtt_ms = 0;
842 // The parser should note the DLRR report block item. 811 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
843 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item);
844 } 812 }
845 813
846 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) { 814 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) {
847 const uint32_t kSourceSsrc = 0x123456; 815 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
848 std::set<uint32_t> ssrcs;
849 ssrcs.insert(kSourceSsrc);
850 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
851 std::vector<uint32_t> remote_ssrcs;
852 remote_ssrcs.push_back(kSourceSsrc);
853 816
854 rtcp::Rrtr rrtr; 817 rtcp::Rrtr rrtr;
855 rtcp::Dlrr dlrr; 818 rtcp::Dlrr dlrr;
856 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 819 dlrr.WithDlrrItem(kReceiverMainSsrc, 0x12345, 0x67890);
857 rtcp::VoipMetric metric; 820 rtcp::VoipMetric metric;
858 metric.To(kSourceSsrc); 821 metric.To(kReceiverMainSsrc);
859 rtcp::ExtendedReports xr; 822 rtcp::ExtendedReports xr;
860 xr.From(0x2345); 823 xr.From(kSenderSsrc);
861 xr.WithRrtr(rrtr); 824 xr.WithRrtr(rrtr);
862 xr.WithDlrr(dlrr); 825 xr.WithDlrr(dlrr);
863 xr.WithVoipMetric(metric); 826 xr.WithVoipMetric(metric);
827
864 rtc::Buffer packet = xr.Build(); 828 rtc::Buffer packet = xr.Build();
865 // Modify the DLRR block to have an unsupported block type, from 5 to 6. 829 // Modify the DLRR block to have an unsupported block type, from 5 to 6.
866 uint8_t* buffer = packet.data(); 830 ASSERT_EQ(5, packet.data()[20]);
867 EXPECT_EQ(5, buffer[20]); 831 packet.data()[20] = 6;
868 buffer[20] = 6; 832 InjectRtcpPacket(packet);
869 833
870 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 834 // Validate Rrtr was received and processed.
871 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 835 RtcpReceiveTimeInfo rrtime;
872 kRtcpXrVoipMetric), 836 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
873 rtcp_packet_info_.rtcpPacketTypeFlags); 837 // Validate Dlrr report wasn't processed.
874 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); 838 int64_t rtt_ms = 0;
875 } 839 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
876 840 }
877 TEST_F(RtcpReceiverTest, TestXrRrRttInitiallyFalse) { 841
842 TEST_F(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) {
843 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
844
878 int64_t rtt_ms; 845 int64_t rtt_ms;
879 EXPECT_FALSE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 846 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
880 } 847 }
881 848
882 TEST_F(RtcpReceiverTest, XrDlrrCalculatesRtt) { 849 TEST_F(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) {
883 Random rand(0x0123456789abcdef); 850 Random rand(0x0123456789abcdef);
884 const uint32_t kSourceSsrc = rand.Rand(0x00000001u, 0xfffffffeu);
885 const int64_t kRttMs = rand.Rand(1, 9 * 3600 * 1000); 851 const int64_t kRttMs = rand.Rand(1, 9 * 3600 * 1000);
886 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 852 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
887 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 853 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
888 rtcp_receiver_->SetRtcpXrRrtrStatus(true); 854 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
889 std::set<uint32_t> ssrcs;
890 ssrcs.insert(kSourceSsrc);
891 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
892 NtpTime now(system_clock_); 855 NtpTime now(system_clock_);
893 uint32_t sent_ntp = CompactNtp(now); 856 uint32_t sent_ntp = CompactNtp(now);
894 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 857 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
895 858
896 rtcp::Dlrr dlrr; 859 rtcp::Dlrr dlrr;
897 dlrr.WithDlrrItem(kSourceSsrc, sent_ntp, kDelayNtp); 860 dlrr.WithDlrrItem(kReceiverMainSsrc, sent_ntp, kDelayNtp);
898 rtcp::ExtendedReports xr; 861 rtcp::ExtendedReports xr;
899 xr.From(0x2345); 862 xr.From(kSenderSsrc);
900 xr.WithDlrr(dlrr); 863 xr.WithDlrr(dlrr);
901 rtc::Buffer packet = xr.Build(); 864
902 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 865 InjectRtcpPacket(xr);
903 866
904 int64_t rtt_ms = 0; 867 int64_t rtt_ms = 0;
905 EXPECT_TRUE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 868 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
906 EXPECT_NEAR(kRttMs, rtt_ms, 1); 869 EXPECT_NEAR(kRttMs, rtt_ms, 1);
907 } 870 }
908 871
909 TEST_F(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOne) { 872 TEST_F(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOne) {
910 Random rand(0x0123456789abcdef); 873 Random rand(0x0123456789abcdef);
911 const uint32_t kSourceSsrc = rand.Rand(0x00000001u, 0xfffffffeu);
912 const int64_t kRttMs = rand.Rand(-3600 * 1000, -1); 874 const int64_t kRttMs = rand.Rand(-3600 * 1000, -1);
913 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 875 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
914 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 876 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
915 rtcp_receiver_->SetRtcpXrRrtrStatus(true);
916 std::set<uint32_t> ssrcs;
917 ssrcs.insert(kSourceSsrc);
918 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
919 NtpTime now(system_clock_); 877 NtpTime now(system_clock_);
920 uint32_t sent_ntp = CompactNtp(now); 878 uint32_t sent_ntp = CompactNtp(now);
921 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 879 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
922 880 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
923 rtcp::Dlrr dlrr; 881
924 dlrr.WithDlrrItem(kSourceSsrc, sent_ntp, kDelayNtp); 882 rtcp::Dlrr dlrr;
925 rtcp::ExtendedReports xr; 883 dlrr.WithDlrrItem(kReceiverMainSsrc, sent_ntp, kDelayNtp);
926 xr.From(0x2345); 884 rtcp::ExtendedReports xr;
927 xr.WithDlrr(dlrr); 885 xr.From(kSenderSsrc);
928 rtc::Buffer packet = xr.Build(); 886 xr.WithDlrr(dlrr);
929 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 887
930 888 InjectRtcpPacket(xr);
931 int64_t rtt_ms = 0; 889
932 EXPECT_TRUE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 890 int64_t rtt_ms = 0;
891 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
933 EXPECT_EQ(1, rtt_ms); 892 EXPECT_EQ(1, rtt_ms);
934 } 893 }
935 894
936 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) { 895 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) {
937 RtcpReceiveTimeInfo info; 896 RtcpReceiveTimeInfo info;
938 EXPECT_FALSE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 897 EXPECT_FALSE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
939 } 898 }
940 899
941 TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) { 900 TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) {
942 const uint32_t kSenderSsrc = 0x123456;
943 const NtpTime kNtp(0x10203, 0x40506); 901 const NtpTime kNtp(0x10203, 0x40506);
944 const uint32_t kNtpMid = CompactNtp(kNtp); 902 const uint32_t kNtpMid = CompactNtp(kNtp);
945 903
946 rtcp::Rrtr rrtr; 904 rtcp::Rrtr rrtr;
947 rrtr.WithNtp(kNtp); 905 rrtr.WithNtp(kNtp);
948 rtcp::ExtendedReports xr; 906 rtcp::ExtendedReports xr;
949 xr.From(kSenderSsrc); 907 xr.From(kSenderSsrc);
950 xr.WithRrtr(rrtr); 908 xr.WithRrtr(rrtr);
951 rtc::Buffer packet = xr.Build(); 909
952 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 910 InjectRtcpPacket(xr);
953 EXPECT_EQ(kRtcpXrReceiverReferenceTime,
954 rtcp_packet_info_.rtcpPacketTypeFlags);
955 911
956 RtcpReceiveTimeInfo info; 912 RtcpReceiveTimeInfo info;
957 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 913 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
958 EXPECT_EQ(kSenderSsrc, info.sourceSSRC); 914 EXPECT_EQ(kSenderSsrc, info.sourceSSRC);
959 EXPECT_EQ(kNtpMid, info.lastRR); 915 EXPECT_EQ(kNtpMid, info.lastRR);
960 EXPECT_EQ(0U, info.delaySinceLastRR); 916 EXPECT_EQ(0U, info.delaySinceLastRR);
961 917
962 system_clock_.AdvanceTimeMilliseconds(1000); 918 system_clock_.AdvanceTimeMilliseconds(1000);
963 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 919 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
964 EXPECT_EQ(65536U, info.delaySinceLastRR); 920 EXPECT_EQ(65536U, info.delaySinceLastRR);
965 } 921 }
966 922
967 TEST_F(RtcpReceiverTest, ReceiveReportTimeout) { 923 TEST_F(RtcpReceiverTest, ReceiveReportTimeout) {
968 const uint32_t kSenderSsrc = 0x10203;
969 const uint32_t kSourceSsrc = 0x40506;
970 const int64_t kRtcpIntervalMs = 1000; 924 const int64_t kRtcpIntervalMs = 1000;
971
972 std::set<uint32_t> ssrcs;
973 ssrcs.insert(kSourceSsrc);
974 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
975
976 const uint16_t kSequenceNumber = 1234; 925 const uint16_t kSequenceNumber = 1234;
977 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 926 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
978 927
979 // No RR received, shouldn't trigger a timeout. 928 // No RR received, shouldn't trigger a timeout.
980 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 929 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
981 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 930 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
982 931
983 // Add a RR and advance the clock just enough to not trigger a timeout. 932 // Add a RR and advance the clock just enough to not trigger a timeout.
984 rtcp::ReportBlock rb1; 933 rtcp::ReportBlock rb1;
985 rb1.To(kSourceSsrc); 934 rb1.To(kReceiverMainSsrc);
986 rb1.WithExtHighestSeqNum(kSequenceNumber); 935 rb1.WithExtHighestSeqNum(kSequenceNumber);
987 rtcp::ReceiverReport rr1; 936 rtcp::ReceiverReport rr1;
988 rr1.From(kSenderSsrc); 937 rr1.From(kSenderSsrc);
989 rr1.WithReportBlock(rb1); 938 rr1.WithReportBlock(rb1);
990 rtc::Buffer p1 = rr1.Build(); 939
991 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 940 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
941 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
942 InjectRtcpPacket(rr1);
943
992 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1); 944 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1);
993 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 945 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
994 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 946 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
995 947
996 // Add a RR with the same extended max as the previous RR to trigger a 948 // Add a RR with the same extended max as the previous RR to trigger a
997 // sequence number timeout, but not a RR timeout. 949 // sequence number timeout, but not a RR timeout.
998 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 950 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
951 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
952 InjectRtcpPacket(rr1);
953
999 system_clock_.AdvanceTimeMilliseconds(2); 954 system_clock_.AdvanceTimeMilliseconds(2);
1000 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 955 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1001 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 956 EXPECT_TRUE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1002 957
1003 // Advance clock enough to trigger an RR timeout too. 958 // Advance clock enough to trigger an RR timeout too.
1004 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 959 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
1005 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 960 EXPECT_TRUE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1006 961
1007 // We should only get one timeout even though we still haven't received a new 962 // We should only get one timeout even though we still haven't received a new
1008 // RR. 963 // RR.
1009 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 964 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1010 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 965 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1011 966
1012 // Add a new RR with increase sequence number to reset timers. 967 // Add a new RR with increase sequence number to reset timers.
1013 rtcp::ReportBlock rb2; 968 rtcp::ReportBlock rb2;
1014 rb2.To(kSourceSsrc); 969 rb2.To(kReceiverMainSsrc);
1015 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 970 rb2.WithExtHighestSeqNum(kSequenceNumber + 1);
1016 rtcp::ReceiverReport rr2; 971 rtcp::ReceiverReport rr2;
1017 rr2.From(kSenderSsrc); 972 rr2.From(kSenderSsrc);
1018 rr2.WithReportBlock(rb2); 973 rr2.WithReportBlock(rb2);
1019 rtc::Buffer p2 = rr2.Build(); 974
1020 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 975 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1021 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 976 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1022 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 977 InjectRtcpPacket(rr2);
978
979 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
980 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1023 981
1024 // Verify we can get a timeout again once we've received new RR. 982 // Verify we can get a timeout again once we've received new RR.
1025 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 983 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
1026 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 984 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
985 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
986 InjectRtcpPacket(rr2);
987
1027 system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1); 988 system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1);
1028 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 989 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1029 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 990 EXPECT_TRUE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
991
1030 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 992 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
1031 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 993 EXPECT_TRUE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1032 } 994 }
1033 995
1034 TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) { 996 TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) {
1035 // This call is expected to fail because no data has arrived. 997 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1036 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size());
1037 } 998 }
1038 999
1039 TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) { 1000 TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) {
1040 const uint32_t kMediaFlowSsrc = 0x2040608; 1001 const uint32_t kBitrateBps = 30000;
1041 const uint32_t kSenderSsrc = 0x10203;
1042 std::set<uint32_t> ssrcs;
1043 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above.
1044 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs);
1045
1046 rtcp::Tmmbr tmmbr; 1002 rtcp::Tmmbr tmmbr;
1047 tmmbr.From(kSenderSsrc); 1003 tmmbr.From(kSenderSsrc);
1048 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); 1004 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, kBitrateBps, 0));
1049
1050 rtcp::SenderReport sr; 1005 rtcp::SenderReport sr;
1051 sr.From(kSenderSsrc); 1006 sr.From(kSenderSsrc);
1052 rtcp::CompoundPacket compound; 1007 rtcp::CompoundPacket compound;
1053 compound.Append(&sr); 1008 compound.Append(&sr);
1054 compound.Append(&tmmbr); 1009 compound.Append(&tmmbr);
1055 rtc::Buffer packet = compound.Build(); 1010
1056 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1011 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1057 1012 EXPECT_CALL(rtp_rtcp_impl_, SetTmmbn(SizeIs(1)));
1058 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_->TmmbrReceived(); 1013 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1059 EXPECT_EQ(1u, candidate_set.size()); 1014 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
1060 EXPECT_LT(0U, candidate_set[0].bitrate_bps()); 1015 InjectRtcpPacket(compound);
1061 EXPECT_EQ(kSenderSsrc, candidate_set[0].ssrc()); 1016
1017 std::vector<rtcp::TmmbItem> tmmbr_received = rtcp_receiver_.TmmbrReceived();
1018 ASSERT_EQ(1u, tmmbr_received.size());
1019 EXPECT_EQ(kBitrateBps, tmmbr_received[0].bitrate_bps());
1020 EXPECT_EQ(kSenderSsrc, tmmbr_received[0].ssrc());
1062 } 1021 }
1063 1022
1064 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { 1023 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) {
1065 const uint32_t kMediaFlowSsrc = 0x2040608; 1024 const uint32_t kBitrateBps = 30000;
1066 const uint32_t kSenderSsrc = 0x10203;
1067
1068 rtcp::Tmmbr tmmbr; 1025 rtcp::Tmmbr tmmbr;
1069 tmmbr.From(kSenderSsrc); 1026 tmmbr.From(kSenderSsrc);
1070 // This SSRC is not what we are sending. 1027 tmmbr.WithTmmbr(rtcp::TmmbItem(kNotToUsSsrc, kBitrateBps, 0));
1071 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc + 1, 30000, 0));
1072 1028
1073 rtcp::SenderReport sr; 1029 rtcp::SenderReport sr;
1074 sr.From(kSenderSsrc); 1030 sr.From(kSenderSsrc);
1075 rtcp::CompoundPacket compound; 1031 rtcp::CompoundPacket compound;
1076 compound.Append(&sr); 1032 compound.Append(&sr);
1077 compound.Append(&tmmbr); 1033 compound.Append(&tmmbr);
1078 rtc::Buffer packet = compound.Build(); 1034
1079 1035 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1080 std::set<uint32_t> ssrcs; 1036 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1081 ssrcs.insert(kMediaFlowSsrc); 1037 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_)).Times(0);
1082 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 1038 InjectRtcpPacket(compound);
1083 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1039
1084 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size()); 1040 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1085 } 1041 }
1086 1042
1087 TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { 1043 TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) {
1088 const uint32_t kMediaFlowSsrc = 0x2040608;
1089 const uint32_t kSenderSsrc = 0x10203;
1090 std::set<uint32_t> ssrcs;
1091 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above.
1092 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs);
1093
1094 rtcp::Tmmbr tmmbr; 1044 rtcp::Tmmbr tmmbr;
1095 tmmbr.From(kSenderSsrc); 1045 tmmbr.From(kSenderSsrc);
1096 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 0, 0)); 1046 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 0, 0));
1097
1098 rtcp::SenderReport sr; 1047 rtcp::SenderReport sr;
1099 sr.From(kSenderSsrc); 1048 sr.From(kSenderSsrc);
1100 rtcp::CompoundPacket compound; 1049 rtcp::CompoundPacket compound;
1101 compound.Append(&sr); 1050 compound.Append(&sr);
1102 compound.Append(&tmmbr); 1051 compound.Append(&tmmbr);
1103 rtc::Buffer packet = compound.Build(); 1052
1104 1053 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1105 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1054 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1106 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size()); 1055 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_)).Times(0);
1056 InjectRtcpPacket(compound);
1057
1058 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1107 } 1059 }
1108 1060
1109 TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { 1061 TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) {
1110 const uint32_t kMediaFlowSsrc = 0x2040608;
1111 const uint32_t kSenderSsrc = 0x10203;
1112 std::set<uint32_t> ssrcs;
1113 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above.
1114 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs);
1115
1116 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2. 1062 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2.
1117 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10. 1063 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10.
1118 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) { 1064 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) {
1119 rtcp::Tmmbr tmmbr; 1065 rtcp::Tmmbr tmmbr;
1120 tmmbr.From(ssrc); 1066 tmmbr.From(ssrc);
1121 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); 1067 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 30000, 0));
1122
1123 rtcp::SenderReport sr; 1068 rtcp::SenderReport sr;
1124 sr.From(ssrc); 1069 sr.From(ssrc);
1125 rtcp::CompoundPacket compound; 1070 rtcp::CompoundPacket compound;
1126 compound.Append(&sr); 1071 compound.Append(&sr);
1127 compound.Append(&tmmbr); 1072 compound.Append(&tmmbr);
1128 rtc::Buffer packet = compound.Build(); 1073
1129 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1074 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1075 EXPECT_CALL(rtp_rtcp_impl_, SetTmmbn(_));
1076 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1077 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_));
1078 InjectRtcpPacket(compound);
1079
1130 // 5 seconds between each packet. 1080 // 5 seconds between each packet.
1131 system_clock_.AdvanceTimeMilliseconds(5000); 1081 system_clock_.AdvanceTimeMilliseconds(5000);
1132 } 1082 }
1133 // It is now starttime + 15. 1083 // It is now starttime + 15.
1134 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_->TmmbrReceived(); 1084 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_.TmmbrReceived();
1135 EXPECT_EQ(3u, candidate_set.size()); 1085 ASSERT_EQ(3u, candidate_set.size());
1136 EXPECT_LT(0U, candidate_set[0].bitrate_bps()); 1086 EXPECT_EQ(30000U, candidate_set[0].bitrate_bps());
1087
1137 // We expect the timeout to be 25 seconds. Advance the clock by 12 1088 // We expect the timeout to be 25 seconds. Advance the clock by 12
1138 // seconds, timing out the first packet. 1089 // seconds, timing out the first packet.
1139 system_clock_.AdvanceTimeMilliseconds(12000); 1090 system_clock_.AdvanceTimeMilliseconds(12000);
1140 candidate_set = rtcp_receiver_->TmmbrReceived(); 1091 candidate_set = rtcp_receiver_.TmmbrReceived();
1141 EXPECT_EQ(2u, candidate_set.size()); 1092 ASSERT_EQ(2u, candidate_set.size());
1142 EXPECT_EQ(kSenderSsrc + 1, candidate_set[0].ssrc()); 1093 EXPECT_EQ(kSenderSsrc + 1, candidate_set[0].ssrc());
1143 } 1094 }
1144 1095
1145 TEST_F(RtcpReceiverTest, Callbacks) { 1096 TEST_F(RtcpReceiverTest, Callbacks) {
1146 class RtcpCallbackImpl : public RtcpStatisticsCallback { 1097 MockRtcpCallbackImpl callback;
1147 public: 1098 rtcp_receiver_.RegisterRtcpStatisticsCallback(&callback);
1148 RtcpCallbackImpl() : RtcpStatisticsCallback(), ssrc_(0) {} 1099
1149 virtual ~RtcpCallbackImpl() {}
1150
1151 void StatisticsUpdated(const RtcpStatistics& statistics,
1152 uint32_t ssrc) override {
1153 stats_ = statistics;
1154 ssrc_ = ssrc;
1155 }
1156
1157 void CNameChanged(const char* cname, uint32_t ssrc) override {}
1158
1159 bool Matches(uint32_t ssrc, uint32_t extended_max, uint8_t fraction_loss,
1160 uint32_t cumulative_loss, uint32_t jitter) {
1161 return ssrc_ == ssrc &&
1162 stats_.fraction_lost == fraction_loss &&
1163 stats_.cumulative_lost == cumulative_loss &&
1164 stats_.extended_max_sequence_number == extended_max &&
1165 stats_.jitter == jitter;
1166 }
1167
1168 RtcpStatistics stats_;
1169 uint32_t ssrc_;
1170 } callback;
1171
1172 rtcp_receiver_->RegisterRtcpStatisticsCallback(&callback);
1173
1174 const uint32_t kSenderSsrc = 0x10203;
1175 const uint32_t kSourceSsrc = 0x123456;
1176 const uint8_t kFractionLoss = 3; 1100 const uint8_t kFractionLoss = 3;
1177 const uint32_t kCumulativeLoss = 7; 1101 const uint32_t kCumulativeLoss = 7;
1178 const uint32_t kJitter = 9; 1102 const uint32_t kJitter = 9;
1179 const uint16_t kSequenceNumber = 1234; 1103 const uint16_t kSequenceNumber = 1234;
1180 1104
1181 std::set<uint32_t> ssrcs;
1182 ssrcs.insert(kSourceSsrc);
1183 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
1184
1185 // First packet, all numbers should just propagate. 1105 // First packet, all numbers should just propagate.
1186 rtcp::ReportBlock rb1; 1106 rtcp::ReportBlock rb1;
1187 rb1.To(kSourceSsrc); 1107 rb1.To(kReceiverMainSsrc);
1188 rb1.WithExtHighestSeqNum(kSequenceNumber); 1108 rb1.WithExtHighestSeqNum(kSequenceNumber);
1189 rb1.WithFractionLost(kFractionLoss); 1109 rb1.WithFractionLost(kFractionLoss);
1190 rb1.WithCumulativeLost(kCumulativeLoss); 1110 rb1.WithCumulativeLost(kCumulativeLoss);
1191 rb1.WithJitter(kJitter); 1111 rb1.WithJitter(kJitter);
1192 1112
1193 rtcp::ReceiverReport rr1; 1113 rtcp::ReceiverReport rr1;
1194 rr1.From(kSenderSsrc); 1114 rr1.From(kSenderSsrc);
1195 rr1.WithReportBlock(rb1); 1115 rr1.WithReportBlock(rb1);
1196 rtc::Buffer p1 = rr1.Build(); 1116 EXPECT_CALL(
1197 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 1117 callback,
1198 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 1118 StatisticsUpdated(
1199 kCumulativeLoss, kJitter)); 1119 AllOf(Field(&RtcpStatistics::fraction_lost, kFractionLoss),
1120 Field(&RtcpStatistics::cumulative_lost, kCumulativeLoss),
1121 Field(&RtcpStatistics::extended_max_sequence_number,
1122 kSequenceNumber),
1123 Field(&RtcpStatistics::jitter, kJitter)),
1124 kReceiverMainSsrc));
1125 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1126 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1127 InjectRtcpPacket(rr1);
1200 1128
1201 rtcp_receiver_->RegisterRtcpStatisticsCallback(nullptr); 1129 rtcp_receiver_.RegisterRtcpStatisticsCallback(nullptr);
1202 1130
1203 // Add arbitrary numbers, callback should not be called (retain old values). 1131 // Add arbitrary numbers, callback should not be called.
1204 rtcp::ReportBlock rb2; 1132 rtcp::ReportBlock rb2;
1205 rb2.To(kSourceSsrc); 1133 rb2.To(kReceiverMainSsrc);
1206 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 1134 rb2.WithExtHighestSeqNum(kSequenceNumber + 1);
1207 rb2.WithFractionLost(42); 1135 rb2.WithFractionLost(42);
1208 rb2.WithCumulativeLost(137); 1136 rb2.WithCumulativeLost(137);
1209 rb2.WithJitter(4711); 1137 rb2.WithJitter(4711);
1210 1138
1211 rtcp::ReceiverReport rr2; 1139 rtcp::ReceiverReport rr2;
1212 rr2.From(kSenderSsrc); 1140 rr2.From(kSenderSsrc);
1213 rr2.WithReportBlock(rb2); 1141 rr2.WithReportBlock(rb2);
1214 rtc::Buffer p2 = rr2.Build(); 1142
1215 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 1143 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1216 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 1144 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1217 kCumulativeLoss, kJitter)); 1145 EXPECT_CALL(callback, StatisticsUpdated(_, _)).Times(0);
1146 InjectRtcpPacket(rr2);
1218 } 1147 }
1219 1148
1220 TEST_F(RtcpReceiverTest, ReceivesTransportFeedback) { 1149 TEST_F(RtcpReceiverTest, ReceivesTransportFeedback) {
1221 const uint32_t kSenderSsrc = 0x10203;
1222 const uint32_t kSourceSsrc = 0x123456;
1223
1224 std::set<uint32_t> ssrcs;
1225 ssrcs.insert(kSourceSsrc);
1226 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
1227
1228 rtcp::TransportFeedback packet; 1150 rtcp::TransportFeedback packet;
1229 packet.WithMediaSourceSsrc(kSourceSsrc); 1151 packet.To(kReceiverMainSsrc);
1230 packet.WithPacketSenderSsrc(kSenderSsrc); 1152 packet.From(kSenderSsrc);
1231 packet.WithBase(1, 1000); 1153 packet.WithBase(1, 1000);
1232 packet.WithReceivedPacket(1, 1000); 1154 packet.WithReceivedPacket(1, 1000);
1233 1155
1234 rtc::Buffer built_packet = packet.Build(); 1156 EXPECT_CALL(
1235 1157 transport_feedback_observer_,
1236 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1158 OnTransportFeedback(AllOf(
1237 1159 Property(&rtcp::TransportFeedback::media_ssrc, kReceiverMainSsrc),
1238 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); 1160 Property(&rtcp::TransportFeedback::sender_ssrc, kSenderSsrc))));
1239 EXPECT_TRUE(rtcp_packet_info_.transport_feedback_.get() != nullptr); 1161 InjectRtcpPacket(packet);
1240 } 1162 }
1241 1163
1242 TEST_F(RtcpReceiverTest, ReceivesRemb) { 1164 TEST_F(RtcpReceiverTest, ReceivesRemb) {
1243 const uint32_t kSenderSsrc = 0x123456;
1244 const uint32_t kBitrateBps = 500000; 1165 const uint32_t kBitrateBps = 500000;
1245 rtcp::Remb remb; 1166 rtcp::Remb remb;
1246 remb.From(kSenderSsrc); 1167 remb.From(kSenderSsrc);
1247 remb.WithBitrateBps(kBitrateBps); 1168 remb.WithBitrateBps(kBitrateBps);
1248 rtc::Buffer built_packet = remb.Build();
1249 1169
1250 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1170 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
1251 1171 InjectRtcpPacket(remb);
1252 EXPECT_EQ(kRtcpRemb, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb);
1253 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate);
1254 } 1172 }
1255 1173
1256 TEST_F(RtcpReceiverTest, HandlesInvalidTransportFeedback) { 1174 TEST_F(RtcpReceiverTest, HandlesInvalidTransportFeedback) {
1257 const uint32_t kSenderSsrc = 0x10203;
1258 const uint32_t kSourceSsrc = 0x123456;
1259
1260 std::set<uint32_t> ssrcs;
1261 ssrcs.insert(kSourceSsrc);
1262 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
1263
1264 // Send a compound packet with a TransportFeedback followed by something else. 1175 // Send a compound packet with a TransportFeedback followed by something else.
1265 rtcp::TransportFeedback packet; 1176 rtcp::TransportFeedback packet;
1266 packet.WithMediaSourceSsrc(kSourceSsrc); 1177 packet.To(kReceiverMainSsrc);
1267 packet.WithPacketSenderSsrc(kSenderSsrc); 1178 packet.From(kSenderSsrc);
1268 packet.WithBase(1, 1000); 1179 packet.WithBase(1, 1000);
1269 packet.WithReceivedPacket(1, 1000); 1180 packet.WithReceivedPacket(1, 1000);
1270 1181
1271 static uint32_t kBitrateBps = 50000; 1182 static uint32_t kBitrateBps = 50000;
1272 rtcp::Remb remb; 1183 rtcp::Remb remb;
1273 remb.From(kSenderSsrc); 1184 remb.From(kSenderSsrc);
1274 remb.WithBitrateBps(kBitrateBps); 1185 remb.WithBitrateBps(kBitrateBps);
1275 rtcp::CompoundPacket compound; 1186 rtcp::CompoundPacket compound;
1276 compound.Append(&packet); 1187 compound.Append(&packet);
1277 compound.Append(&remb); 1188 compound.Append(&remb);
1278 rtc::Buffer built_packet = compound.Build(); 1189 rtc::Buffer built_packet = compound.Build();
1279 1190
1280 // Modify the TransportFeedback packet so that it is invalid. 1191 // Modify the TransportFeedback packet so that it is invalid.
1281 const size_t kStatusCountOffset = 14; 1192 const size_t kStatusCountOffset = 14;
1282 ByteWriter<uint16_t>::WriteBigEndian( 1193 ByteWriter<uint16_t>::WriteBigEndian(
1283 &built_packet.data()[kStatusCountOffset], 42); 1194 &built_packet.data()[kStatusCountOffset], 42);
1284 1195
1285 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1196 // Stress no transport feedback is expected.
1286 1197 EXPECT_CALL(transport_feedback_observer_, OnTransportFeedback(_)).Times(0);
1287 // Transport feedback should be ignored, but next packet should work. 1198 // But remb should be processed and cause a callback
1288 EXPECT_EQ(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); 1199 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
1289 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb); 1200 InjectRtcpPacket(built_packet);
1290 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate);
1291 } 1201 }
1292 1202
1293 } // Anonymous namespace 1203 TEST_F(RtcpReceiverTest, Nack) {
1204 const uint16_t kNackList1[] = {1, 2, 3, 5};
1205 const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1);
1206 const uint16_t kNackList2[] = {5, 7, 30, 40};
1207 const size_t kNackListLength2 = std::end(kNackList2) - std::begin(kNackList2);
1208 std::set<uint16_t> nack_set;
1209 nack_set.insert(std::begin(kNackList1), std::end(kNackList1));
1210 nack_set.insert(std::begin(kNackList2), std::end(kNackList2));
1211
1212 rtcp::Nack nack;
1213 nack.From(kSenderSsrc);
1214 nack.To(kReceiverMainSsrc);
1215 nack.WithList(kNackList1, kNackListLength1);
1216
1217 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedNack(ElementsAreArray(kNackList1)));
1218 EXPECT_CALL(
1219 packet_type_counter_observer_,
1220 RtcpPacketTypesCounterUpdated(
1221 kReceiverMainSsrc,
1222 AllOf(Field(&RtcpPacketTypeCounter::nack_requests, kNackListLength1),
1223 Field(&RtcpPacketTypeCounter::unique_nack_requests,
1224 kNackListLength1))));
1225 InjectRtcpPacket(nack);
1226
1227 rtcp::Nack nack2;
1228 nack2.From(kSenderSsrc);
1229 nack2.To(kReceiverMainSsrc);
1230 nack2.WithList(kNackList2, kNackListLength2);
1231 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedNack(ElementsAreArray(kNackList2)));
1232 EXPECT_CALL(packet_type_counter_observer_,
1233 RtcpPacketTypesCounterUpdated(
1234 kReceiverMainSsrc,
1235 AllOf(Field(&RtcpPacketTypeCounter::nack_requests,
1236 kNackListLength1 + kNackListLength2),
1237 Field(&RtcpPacketTypeCounter::unique_nack_requests,
1238 nack_set.size()))));
1239 InjectRtcpPacket(nack2);
1240 }
1241
1242 TEST_F(RtcpReceiverTest, NackNotForUsIgnored) {
1243 const uint16_t kNackList1[] = {1, 2, 3, 5};
1244 const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1);
1245
1246 rtcp::Nack nack;
1247 nack.From(kSenderSsrc);
1248 nack.To(kNotToUsSsrc);
1249 nack.WithList(kNackList1, kNackListLength1);
1250
1251 EXPECT_CALL(packet_type_counter_observer_,
1252 RtcpPacketTypesCounterUpdated(
1253 _, Field(&RtcpPacketTypeCounter::nack_requests, 0)));
1254 InjectRtcpPacket(nack);
1255 }
1256
1257 TEST_F(RtcpReceiverTest, ForceSenderReport) {
1258 rtcp::RapidResyncRequest rr;
1259 rr.From(kSenderSsrc);
1260 rr.To(kReceiverMainSsrc);
1261
1262 EXPECT_CALL(rtp_rtcp_impl_, OnRequestSendReport());
1263 InjectRtcpPacket(rr);
1264 }
1294 1265
1295 } // namespace webrtc 1266 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698