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

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: Added TODO to test with hidden expectations. 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 // TODO(danilchap): Add expectation RtcpPacketTypesCounterUpdated
163 // is not called once parser would be adjusted to avoid that callback on
164 // semi-valid packets.
165 InjectRtcpPacket(bad_packet);
167 } 166 }
168 167
169 TEST_F(RtcpReceiverTest, RpsiWithFractionalPaddingIsIgnored) { 168 TEST_F(RtcpReceiverTest, RpsiWithFractionalPaddingIsIgnored) {
170 // Padding size represent fractional number of bytes. 169 // Padding size represent fractional number of bytes.
171 const uint8_t kPaddingSizeBits = 0x0b; 170 const uint8_t kPaddingSizeBits = 0x0b;
172 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 3, 171 // clang-format off
172 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
173 rtcp::Rpsi::kPacketType, 0, 3,
173 0x12, 0x34, 0x56, 0x78, 174 0x12, 0x34, 0x56, 0x78,
174 0x98, 0x76, 0x54, 0x32, 175 0x98, 0x76, 0x54, 0x32,
175 kPaddingSizeBits, 0x00, 0x00, 0x00}; 176 kPaddingSizeBits, 0x00, 0x00, 0x00};
176 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 177 // clang-format on
177 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 178 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
179 InjectRtcpPacket(bad_packet);
178 } 180 }
179 181
180 TEST_F(RtcpReceiverTest, RpsiWithTooLargePaddingIsIgnored) { 182 TEST_F(RtcpReceiverTest, RpsiWithTooLargePaddingIsIgnored) {
181 // Padding size exceeds packet size. 183 // Padding size exceeds packet size.
182 const uint8_t kPaddingSizeBits = 0xa8; 184 const uint8_t kPaddingSizeBits = 0xa8;
183 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 3, 185 // clang-format off
186 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
187 rtcp::Rpsi::kPacketType, 0, 3,
184 0x12, 0x34, 0x56, 0x78, 188 0x12, 0x34, 0x56, 0x78,
185 0x98, 0x76, 0x54, 0x32, 189 0x98, 0x76, 0x54, 0x32,
186 kPaddingSizeBits, 0x00, 0x00, 0x00}; 190 kPaddingSizeBits, 0x00, 0x00, 0x00};
187 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 191 // clang-format on
188 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 192 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
193 InjectRtcpPacket(bad_packet);
189 } 194 }
190 195
191 // With parsing using rtcp classes this test will make no sense. 196 // With parsing using rtcp classes this test will make no sense.
192 // With current stateful parser this test was failing. 197 // With current stateful parser this test was failing.
193 TEST_F(RtcpReceiverTest, TwoHalfValidRpsiAreIgnored) { 198 TEST_F(RtcpReceiverTest, TwoHalfValidRpsiAreIgnored) {
194 const uint8_t bad_packet[] = {0x83, RTCPUtility::PT_PSFB, 0, 2, 199 // clang-format off
200 const uint8_t bad_packet[] = {0x80 | rtcp::Rpsi::kFeedbackMessageType,
201 rtcp::Rpsi::kPacketType, 0, 2,
195 0x12, 0x34, 0x56, 0x78, 202 0x12, 0x34, 0x56, 0x78,
196 0x98, 0x76, 0x54, 0x32, 203 0x98, 0x76, 0x54, 0x32,
197 0x83, RTCPUtility::PT_PSFB, 0, 2, 204 0x80 | rtcp::Rpsi::kFeedbackMessageType,
205 rtcp::Rpsi::kPacketType, 0, 2,
198 0x12, 0x34, 0x56, 0x78, 206 0x12, 0x34, 0x56, 0x78,
199 0x98, 0x76, 0x54, 0x32}; 207 0x98, 0x76, 0x54, 0x32};
200 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 208 // clang-format on
201 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 209 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, _)).Times(0);
210 InjectRtcpPacket(bad_packet);
202 } 211 }
203 212
204 TEST_F(RtcpReceiverTest, InjectRpsiPacket) { 213 TEST_F(RtcpReceiverTest, InjectRpsiPacket) {
205 const uint64_t kPictureId = 0x123456789; 214 const uint64_t kPictureId = 0x123456789;
206 rtcp::Rpsi rpsi; 215 rtcp::Rpsi rpsi;
207 rpsi.WithPictureId(kPictureId); 216 rpsi.WithPictureId(kPictureId);
208 rtc::Buffer packet = rpsi.Build(); 217
209 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 218 EXPECT_CALL(intra_frame_observer_, OnReceivedRPSI(_, kPictureId));
210 EXPECT_EQ(kRtcpRpsi, rtcp_packet_info_.rtcpPacketTypeFlags); 219 InjectRtcpPacket(rpsi);
211 } 220 }
212 221
213 TEST_F(RtcpReceiverTest, InjectSrPacket) { 222 TEST_F(RtcpReceiverTest, InjectSrPacket) {
214 const uint32_t kSenderSsrc = 0x10203; 223 RTCPSenderInfo info;
224 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
225
226 int64_t now = system_clock_.TimeInMilliseconds();
215 rtcp::SenderReport sr; 227 rtcp::SenderReport sr;
216 sr.From(kSenderSsrc); 228 sr.From(kSenderSsrc);
217 rtc::Buffer packet = sr.Build(); 229
218 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 230 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
219 // The parser will note the remote SSRC on a SR from other than his 231 EXPECT_CALL(bandwidth_observer_,
220 // expected peer, but will not flag that he's gotten a packet. 232 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
221 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 233 InjectRtcpPacket(sr);
222 EXPECT_EQ(0U, kRtcpSr & rtcp_packet_info_.rtcpPacketTypeFlags); 234
223 } 235 EXPECT_EQ(0, rtcp_receiver_.SenderInfoReceived(&info));
224 236 }
225 TEST_F(RtcpReceiverTest, InjectSrPacketFromExpectedPeer) { 237
226 const uint32_t kSenderSsrc = 0x10203; 238 TEST_F(RtcpReceiverTest, InjectSrPacketFromUnknownSender) {
227 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 239 int64_t now = system_clock_.TimeInMilliseconds();
228 rtcp::SenderReport sr; 240 rtcp::SenderReport sr;
229 sr.From(kSenderSsrc); 241 sr.From(kUnknownSenderSsrc);
230 rtc::Buffer packet = sr.Build(); 242
231 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 243 // The parser will handle report blocks in Sender Report from other than his
232 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 244 // expected peer.
233 EXPECT_EQ(kRtcpSr, rtcp_packet_info_.rtcpPacketTypeFlags); 245 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
246 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, now));
247 InjectRtcpPacket(sr);
248
249 // But will not flag that he's gotten sender information.
250 RTCPSenderInfo info;
251 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
234 } 252 }
235 253
236 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesRTT) { 254 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesRTT) {
237 Random r(0x0123456789abcdef); 255 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); 256 const int64_t kRttMs = r.Rand(1, 9 * 3600 * 1000);
241 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff); 257 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff);
242 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 258 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
243 259
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; 260 int64_t rtt_ms = 0;
250 EXPECT_EQ( 261 EXPECT_EQ(
251 -1, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 262 -1, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
252 263
253 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_)); 264 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_));
254 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 265 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
255 266
256 rtcp::SenderReport sr; 267 rtcp::SenderReport sr;
257 sr.From(kSenderSsrc); 268 sr.From(kSenderSsrc);
258 rtcp::ReportBlock block; 269 rtcp::ReportBlock block;
259 block.To(kRemoteSsrc); 270 block.To(kReceiverMainSsrc);
260 block.WithLastSr(sent_ntp); 271 block.WithLastSr(sent_ntp);
261 block.WithDelayLastSr(kDelayNtp); 272 block.WithDelayLastSr(kDelayNtp);
262 sr.WithReportBlock(block); 273 sr.WithReportBlock(block);
263 274
264 rtc::Buffer packet = sr.Build(); 275 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
265 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 276 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
277 InjectRtcpPacket(sr);
266 278
267 EXPECT_EQ( 279 EXPECT_EQ(
268 0, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 280 0, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
269 EXPECT_NEAR(kRttMs, rtt_ms, 1); 281 EXPECT_NEAR(kRttMs, rtt_ms, 1);
270 } 282 }
271 283
272 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOne) { 284 TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOne) {
273 Random r(0x0123456789abcdef); 285 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); 286 const int64_t kRttMs = r.Rand(-3600 * 1000, -1);
277 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff); 287 const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff);
278 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 288 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
279 289
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; 290 int64_t rtt_ms = 0;
286 EXPECT_EQ( 291 EXPECT_EQ(
287 -1, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 292 -1, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
288 293
289 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_)); 294 uint32_t sent_ntp = CompactNtp(NtpTime(system_clock_));
290 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 295 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
291 296
292 rtcp::SenderReport sr; 297 rtcp::SenderReport sr;
293 sr.From(kSenderSsrc); 298 sr.From(kSenderSsrc);
294 rtcp::ReportBlock block; 299 rtcp::ReportBlock block;
295 block.To(kRemoteSsrc); 300 block.To(kReceiverMainSsrc);
296 block.WithLastSr(sent_ntp); 301 block.WithLastSr(sent_ntp);
297 block.WithDelayLastSr(kDelayNtp); 302 block.WithDelayLastSr(kDelayNtp);
298 sr.WithReportBlock(block); 303 sr.WithReportBlock(block);
299 304
300 rtc::Buffer packet = sr.Build(); 305 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
301 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 306 EXPECT_CALL(bandwidth_observer_,
307 OnReceivedRtcpReceiverReport(SizeIs(1), _, _));
308 InjectRtcpPacket(sr);
302 309
303 EXPECT_EQ( 310 EXPECT_EQ(
304 0, rtcp_receiver_->RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr)); 311 0, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
305 EXPECT_EQ(1, rtt_ms); 312 EXPECT_EQ(1, rtt_ms);
306 } 313 }
307 314
308 TEST_F(RtcpReceiverTest, InjectRrPacket) { 315 TEST_F(RtcpReceiverTest, InjectRrPacket) {
309 const uint32_t kSenderSsrc = 0x10203; 316 int64_t now = system_clock_.TimeInMilliseconds();
310 rtcp::ReceiverReport rr; 317 rtcp::ReceiverReport rr;
311 rr.From(kSenderSsrc); 318 rr.From(kSenderSsrc);
312 rtc::Buffer packet = rr.Build(); 319
313 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 320 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
314 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 321 EXPECT_CALL(bandwidth_observer_,
315 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 322 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
316 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); 323 InjectRtcpPacket(rr);
324
325 RTCPSenderInfo info;
326 EXPECT_EQ(-1, rtcp_receiver_.SenderInfoReceived(&info));
327 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
328 std::vector<RTCPReportBlock> report_blocks;
329 rtcp_receiver_.StatisticsReceived(&report_blocks);
330 EXPECT_TRUE(report_blocks.empty());
317 } 331 }
318 332
319 TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { 333 TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) {
320 const uint32_t kSenderSsrc = 0x10203; 334 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; 335 rtcp::ReportBlock rb;
327 rb.To(kSourceSsrc + 1); 336 rb.To(kNotToUsSsrc);
328 rtcp::ReceiverReport rr; 337 rtcp::ReceiverReport rr;
329 rr.From(kSenderSsrc); 338 rr.From(kSenderSsrc);
330 rr.WithReportBlock(rb); 339 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 340
341 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
342 EXPECT_CALL(bandwidth_observer_,
343 OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
344 InjectRtcpPacket(rr);
345
346 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
337 std::vector<RTCPReportBlock> received_blocks; 347 std::vector<RTCPReportBlock> received_blocks;
338 rtcp_receiver_->StatisticsReceived(&received_blocks); 348 rtcp_receiver_.StatisticsReceived(&received_blocks);
339 EXPECT_TRUE(received_blocks.empty()); 349 EXPECT_TRUE(received_blocks.empty());
340 } 350 }
341 351
342 TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { 352 TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) {
343 const uint32_t kSenderSsrc = 0x10203; 353 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 354
349 rtcp::ReportBlock rb; 355 rtcp::ReportBlock rb;
350 rb.To(kSourceSsrc); 356 rb.To(kReceiverMainSsrc);
351 rtcp::ReceiverReport rr; 357 rtcp::ReceiverReport rr;
352 rr.From(kSenderSsrc); 358 rr.From(kSenderSsrc);
353 rr.WithReportBlock(rb); 359 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 360
361 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
362 EXPECT_CALL(bandwidth_observer_,
363 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
364 InjectRtcpPacket(rr);
365
366 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
360 std::vector<RTCPReportBlock> received_blocks; 367 std::vector<RTCPReportBlock> received_blocks;
361 rtcp_receiver_->StatisticsReceived(&received_blocks); 368 rtcp_receiver_.StatisticsReceived(&received_blocks);
362 EXPECT_EQ(1u, received_blocks.size()); 369 EXPECT_EQ(1u, received_blocks.size());
363 } 370 }
364 371
365 TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) { 372 TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) {
366 const uint32_t kSenderSsrc = 0x10203;
367 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607};
368 const uint16_t kSequenceNumbers[] = {10, 12423}; 373 const uint16_t kSequenceNumbers[] = {10, 12423};
369 const uint32_t kCumLost[] = {13, 555}; 374 const uint32_t kCumLost[] = {13, 555};
370 const uint8_t kFracLost[] = {20, 11}; 375 const uint8_t kFracLost[] = {20, 11};
371 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]); 376 int64_t now = system_clock_.TimeInMilliseconds();
372
373 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs);
374 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs);
375 377
376 rtcp::ReportBlock rb1; 378 rtcp::ReportBlock rb1;
377 rb1.To(kSourceSsrcs[0]); 379 rb1.To(kReceiverMainSsrc);
378 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 380 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]);
379 rb1.WithFractionLost(10); 381 rb1.WithFractionLost(10);
380 rb1.WithCumulativeLost(5);
381 382
382 rtcp::ReportBlock rb2; 383 rtcp::ReportBlock rb2;
383 rb2.To(kSourceSsrcs[1]); 384 rb2.To(kReceiverExtraSsrc);
384 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 385 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]);
386 rb2.WithFractionLost(0);
385 387
386 rtcp::ReceiverReport rr1; 388 rtcp::ReceiverReport rr1;
387 rr1.From(kSenderSsrc); 389 rr1.From(kSenderSsrc);
388 rr1.WithReportBlock(rb1); 390 rr1.WithReportBlock(rb1);
389 rr1.WithReportBlock(rb2); 391 rr1.WithReportBlock(rb2);
390 392
391 rtc::Buffer p1 = rr1.Build(); 393 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(2)));
392 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 394 EXPECT_CALL(bandwidth_observer_,
393 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 395 OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
394 EXPECT_EQ(10, rtcp_packet_info_.report_blocks.front().fractionLost); 396 InjectRtcpPacket(rr1);
395 EXPECT_EQ(0, rtcp_packet_info_.report_blocks.back().fractionLost);
396 397
398 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
399 std::vector<RTCPReportBlock> received_blocks;
400 rtcp_receiver_.StatisticsReceived(&received_blocks);
401 EXPECT_THAT(received_blocks,
402 UnorderedElementsAre(Field(&RTCPReportBlock::fractionLost, 0),
403 Field(&RTCPReportBlock::fractionLost, 10)));
404
405 // Insert next receiver report with same ssrc but new values.
397 rtcp::ReportBlock rb3; 406 rtcp::ReportBlock rb3;
398 rb3.To(kSourceSsrcs[0]); 407 rb3.To(kReceiverMainSsrc);
399 rb3.WithExtHighestSeqNum(kSequenceNumbers[0]); 408 rb3.WithExtHighestSeqNum(kSequenceNumbers[0]);
400 rb3.WithFractionLost(kFracLost[0]); 409 rb3.WithFractionLost(kFracLost[0]);
401 rb3.WithCumulativeLost(kCumLost[0]); 410 rb3.WithCumulativeLost(kCumLost[0]);
402 411
403 rtcp::ReportBlock rb4; 412 rtcp::ReportBlock rb4;
404 rb4.To(kSourceSsrcs[1]); 413 rb4.To(kReceiverExtraSsrc);
405 rb4.WithExtHighestSeqNum(kSequenceNumbers[1]); 414 rb4.WithExtHighestSeqNum(kSequenceNumbers[1]);
406 rb4.WithFractionLost(kFracLost[1]); 415 rb4.WithFractionLost(kFracLost[1]);
407 rb4.WithCumulativeLost(kCumLost[1]); 416 rb4.WithCumulativeLost(kCumLost[1]);
408 417
409 rtcp::ReceiverReport rr2; 418 rtcp::ReceiverReport rr2;
410 rr2.From(kSenderSsrc); 419 rr2.From(kSenderSsrc);
411 rr2.WithReportBlock(rb3); 420 rr2.WithReportBlock(rb3);
412 rr2.WithReportBlock(rb4); 421 rr2.WithReportBlock(rb4);
413 422
414 rtc::Buffer p2 = rr2.Build(); 423 // Advance time to make 1st sent time and 2nd sent time different.
415 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 424 system_clock_.AdvanceTimeMilliseconds(500);
416 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 425 now = system_clock_.TimeInMilliseconds();
417 EXPECT_EQ(kFracLost[0], rtcp_packet_info_.report_blocks.front().fractionLost); 426
418 EXPECT_EQ(kFracLost[1], rtcp_packet_info_.report_blocks.back().fractionLost); 427 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(2)));
419 428 EXPECT_CALL(bandwidth_observer_,
420 std::vector<RTCPReportBlock> received_blocks; 429 OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
421 rtcp_receiver_->StatisticsReceived(&received_blocks); 430 InjectRtcpPacket(rr2);
431
432 received_blocks.clear();
433 rtcp_receiver_.StatisticsReceived(&received_blocks);
422 EXPECT_EQ(2u, received_blocks.size()); 434 EXPECT_EQ(2u, received_blocks.size());
423 for (size_t i = 0; i < received_blocks.size(); ++i) { 435 EXPECT_THAT(received_blocks,
424 EXPECT_EQ(kSenderSsrc, received_blocks[i].remoteSSRC); 436 UnorderedElementsAre(
425 EXPECT_EQ(kSourceSsrcs[i], received_blocks[i].sourceSSRC); 437 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverMainSsrc),
426 EXPECT_EQ(kFracLost[i], received_blocks[i].fractionLost); 438 Field(&RTCPReportBlock::fractionLost, kFracLost[0]),
427 EXPECT_EQ(kCumLost[i], received_blocks[i].cumulativeLost); 439 Field(&RTCPReportBlock::cumulativeLost, kCumLost[0]),
428 EXPECT_EQ(kSequenceNumbers[i], received_blocks[i].extendedHighSeqNum); 440 Field(&RTCPReportBlock::extendedHighSeqNum,
429 } 441 kSequenceNumbers[0])),
442 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverExtraSsrc),
443 Field(&RTCPReportBlock::fractionLost, kFracLost[1]),
444 Field(&RTCPReportBlock::cumulativeLost, kCumLost[1]),
445 Field(&RTCPReportBlock::extendedHighSeqNum,
446 kSequenceNumbers[1]))));
430 } 447 }
431 448
432 TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) { 449 TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) {
433 const uint32_t kSenderSsrc1 = 0x10203;
434 const uint32_t kSenderSsrc2 = 0x20304; 450 const uint32_t kSenderSsrc2 = 0x20304;
435 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607};
436 const uint16_t kSequenceNumbers[] = {10, 12423}; 451 const uint16_t kSequenceNumbers[] = {10, 12423};
437 const uint32_t kCumLost[] = {13, 555}; 452 const uint32_t kCumLost[] = {13, 555};
438 const uint8_t kFracLost[] = {20, 11}; 453 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 454
444 rtcp::ReportBlock rb1; 455 rtcp::ReportBlock rb1;
445 rb1.To(kSourceSsrcs[0]); 456 rb1.To(kReceiverMainSsrc);
446 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 457 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]);
447 rb1.WithFractionLost(kFracLost[0]); 458 rb1.WithFractionLost(kFracLost[0]);
448 rb1.WithCumulativeLost(kCumLost[0]); 459 rb1.WithCumulativeLost(kCumLost[0]);
449 rtcp::ReceiverReport rr1; 460 rtcp::ReceiverReport rr1;
450 rr1.From(kSenderSsrc1); 461 rr1.From(kSenderSsrc);
451 rr1.WithReportBlock(rb1); 462 rr1.WithReportBlock(rb1);
452 463
453 rtc::Buffer p1 = rr1.Build(); 464 int64_t now = system_clock_.TimeInMilliseconds();
454 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 465
455 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 466 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
456 EXPECT_EQ(kFracLost[0], rtcp_packet_info_.report_blocks.front().fractionLost); 467 EXPECT_CALL(bandwidth_observer_,
468 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
469 InjectRtcpPacket(rr1);
470
471 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
457 472
458 std::vector<RTCPReportBlock> received_blocks; 473 std::vector<RTCPReportBlock> received_blocks;
459 rtcp_receiver_->StatisticsReceived(&received_blocks); 474 rtcp_receiver_.StatisticsReceived(&received_blocks);
460 EXPECT_EQ(1u, received_blocks.size()); 475 EXPECT_EQ(1u, received_blocks.size());
461 EXPECT_EQ(kSenderSsrc1, received_blocks[0].remoteSSRC); 476 EXPECT_EQ(kSenderSsrc, received_blocks[0].remoteSSRC);
462 EXPECT_EQ(kSourceSsrcs[0], received_blocks[0].sourceSSRC); 477 EXPECT_EQ(kReceiverMainSsrc, received_blocks[0].sourceSSRC);
463 EXPECT_EQ(kFracLost[0], received_blocks[0].fractionLost); 478 EXPECT_EQ(kFracLost[0], received_blocks[0].fractionLost);
464 EXPECT_EQ(kCumLost[0], received_blocks[0].cumulativeLost); 479 EXPECT_EQ(kCumLost[0], received_blocks[0].cumulativeLost);
465 EXPECT_EQ(kSequenceNumbers[0], received_blocks[0].extendedHighSeqNum); 480 EXPECT_EQ(kSequenceNumbers[0], received_blocks[0].extendedHighSeqNum);
466 481
467 rtcp::ReportBlock rb2; 482 rtcp::ReportBlock rb2;
468 rb2.To(kSourceSsrcs[0]); 483 rb2.To(kReceiverMainSsrc);
469 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 484 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]);
470 rb2.WithFractionLost(kFracLost[1]); 485 rb2.WithFractionLost(kFracLost[1]);
471 rb2.WithCumulativeLost(kCumLost[1]); 486 rb2.WithCumulativeLost(kCumLost[1]);
472 rtcp::ReceiverReport rr2; 487 rtcp::ReceiverReport rr2;
473 rr2.From(kSenderSsrc2); 488 rr2.From(kSenderSsrc2);
474 rr2.WithReportBlock(rb2); 489 rr2.WithReportBlock(rb2);
475 rtc::Buffer p2 = rr2.Build(); 490
476 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 491 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
477 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 492 EXPECT_CALL(bandwidth_observer_,
478 EXPECT_EQ(kFracLost[1], rtcp_packet_info_.report_blocks.front().fractionLost); 493 OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
494 InjectRtcpPacket(rr2);
479 495
480 received_blocks.clear(); 496 received_blocks.clear();
481 rtcp_receiver_->StatisticsReceived(&received_blocks); 497 rtcp_receiver_.StatisticsReceived(&received_blocks);
482 ASSERT_EQ(2u, received_blocks.size()); 498 ASSERT_EQ(2u, received_blocks.size());
483 EXPECT_EQ(kSenderSsrc1, received_blocks[0].remoteSSRC); 499 EXPECT_THAT(received_blocks,
484 EXPECT_EQ(kSenderSsrc2, received_blocks[1].remoteSSRC); 500 UnorderedElementsAre(
485 for (size_t i = 0; i < received_blocks.size(); ++i) { 501 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverMainSsrc),
486 EXPECT_EQ(kSourceSsrcs[0], received_blocks[i].sourceSSRC); 502 Field(&RTCPReportBlock::remoteSSRC, kSenderSsrc),
487 EXPECT_EQ(kFracLost[i], received_blocks[i].fractionLost); 503 Field(&RTCPReportBlock::fractionLost, kFracLost[0]),
488 EXPECT_EQ(kCumLost[i], received_blocks[i].cumulativeLost); 504 Field(&RTCPReportBlock::cumulativeLost, kCumLost[0]),
489 EXPECT_EQ(kSequenceNumbers[i], received_blocks[i].extendedHighSeqNum); 505 Field(&RTCPReportBlock::extendedHighSeqNum,
490 } 506 kSequenceNumbers[0])),
507 AllOf(Field(&RTCPReportBlock::sourceSSRC, kReceiverMainSsrc),
508 Field(&RTCPReportBlock::remoteSSRC, kSenderSsrc2),
509 Field(&RTCPReportBlock::fractionLost, kFracLost[1]),
510 Field(&RTCPReportBlock::cumulativeLost, kCumLost[1]),
511 Field(&RTCPReportBlock::extendedHighSeqNum,
512 kSequenceNumbers[1]))));
491 } 513 }
492 514
493 TEST_F(RtcpReceiverTest, GetRtt) { 515 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. 516 // No report block received.
501 EXPECT_EQ( 517 EXPECT_EQ(
502 -1, rtcp_receiver_->RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); 518 -1, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
503 519
504 rtcp::ReportBlock rb; 520 rtcp::ReportBlock rb;
505 rb.To(kSourceSsrc); 521 rb.To(kReceiverMainSsrc);
522
506 rtcp::ReceiverReport rr; 523 rtcp::ReceiverReport rr;
507 rr.From(kSenderSsrc); 524 rr.From(kSenderSsrc);
508 rr.WithReportBlock(rb); 525 rr.WithReportBlock(rb);
509 rtc::Buffer packet = rr.Build(); 526 int64_t now = system_clock_.TimeInMilliseconds();
510 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 527
511 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 528 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
512 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 529 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
513 EXPECT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 530 InjectRtcpPacket(rr);
531
532 EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
514 EXPECT_EQ( 533 EXPECT_EQ(
515 0, rtcp_receiver_->RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr)); 534 0, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
516 535 }
517 // Report block not received. 536
518 EXPECT_EQ(-1, rtcp_receiver_->RTT(kSenderSsrc + 1, nullptr, nullptr, nullptr, 537 // Ij packets are ignored.
519 nullptr));
520 }
521
522 TEST_F(RtcpReceiverTest, InjectIjWithNoItem) { 538 TEST_F(RtcpReceiverTest, InjectIjWithNoItem) {
523 rtcp::ExtendedJitterReport ij; 539 rtcp::ExtendedJitterReport ij;
524 rtc::Buffer packet = ij.Build(); 540 InjectRtcpPacket(ij);
525 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 541 }
526 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 542
527 } 543 // App packets are ignored.
528 544 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; 545 rtcp::App app;
541 app.WithSubType(30); 546 app.WithSubType(30);
542 uint32_t name = 'n' << 24; 547 app.WithName(0x17a177e);
543 name += 'a' << 16; 548 const uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
544 name += 'm' << 8; 549 app.WithData(kData, sizeof(kData));
545 name += 'e'; 550
546 app.WithName(name); 551 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 } 552 }
575 553
576 TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) { 554 TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) {
577 const uint32_t kSenderSsrc = 0x123456; 555 const char kCname[] = "alice@host";
556 MockRtcpCallbackImpl callback;
557 rtcp_receiver_.RegisterRtcpStatisticsCallback(&callback);
578 rtcp::Sdes sdes; 558 rtcp::Sdes sdes;
579 sdes.WithCName(kSenderSsrc, "alice@host"); 559 sdes.WithCName(kSenderSsrc, kCname);
580 560
581 rtc::Buffer packet = sdes.Build(); 561 EXPECT_CALL(callback, CNameChanged(StrEq(kCname), kSenderSsrc));
582 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 562 InjectRtcpPacket(sdes);
563
583 char cName[RTCP_CNAME_SIZE]; 564 char cName[RTCP_CNAME_SIZE];
584 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 565 EXPECT_EQ(0, rtcp_receiver_.CNAME(kSenderSsrc, cName));
585 EXPECT_EQ(0, strncmp(cName, "alice@host", RTCP_CNAME_SIZE)); 566 EXPECT_EQ(0, strncmp(cName, kCname, RTCP_CNAME_SIZE));
586 } 567 }
587 568
588 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesCname) { 569 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesCname) {
589 const uint32_t kSenderSsrc = 0x123456; 570 const char kCname[] = "alice@host";
590 rtcp::Sdes sdes; 571 rtcp::Sdes sdes;
591 sdes.WithCName(kSenderSsrc, "alice@host"); 572 sdes.WithCName(kSenderSsrc, kCname);
592 573
593 rtc::Buffer packet = sdes.Build(); 574 InjectRtcpPacket(sdes);
594 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 575
595 char cName[RTCP_CNAME_SIZE]; 576 char cName[RTCP_CNAME_SIZE];
596 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 577 EXPECT_EQ(0, rtcp_receiver_.CNAME(kSenderSsrc, cName));
597 578
598 // Verify that BYE removes the CNAME. 579 // Verify that BYE removes the CNAME.
599 rtcp::Bye bye; 580 rtcp::Bye bye;
600 bye.From(kSenderSsrc); 581 bye.From(kSenderSsrc);
601 rtc::Buffer p2 = bye.Build(); 582
602 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 583 InjectRtcpPacket(bye);
603 EXPECT_EQ(-1, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 584
585 EXPECT_EQ(-1, rtcp_receiver_.CNAME(kSenderSsrc, cName));
604 } 586 }
605 587
606 TEST_F(RtcpReceiverTest, InjectByePacket_RemovesReportBlocks) { 588 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; 589 rtcp::ReportBlock rb1;
615 rb1.To(kSourceSsrcs[0]); 590 rb1.To(kReceiverMainSsrc);
616 rtcp::ReportBlock rb2; 591 rtcp::ReportBlock rb2;
617 rb2.To(kSourceSsrcs[1]); 592 rb2.To(kReceiverExtraSsrc);
618 rtcp::ReceiverReport rr; 593 rtcp::ReceiverReport rr;
619 rr.From(kSenderSsrc); 594 rr.From(kSenderSsrc);
620 rr.WithReportBlock(rb1); 595 rr.WithReportBlock(rb1);
621 rr.WithReportBlock(rb2); 596 rr.WithReportBlock(rb2);
622 597
623 rtc::Buffer p1 = rr.Build(); 598 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
624 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 599 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
625 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 600 InjectRtcpPacket(rr);
601
626 std::vector<RTCPReportBlock> received_blocks; 602 std::vector<RTCPReportBlock> received_blocks;
627 rtcp_receiver_->StatisticsReceived(&received_blocks); 603 rtcp_receiver_.StatisticsReceived(&received_blocks);
628 EXPECT_EQ(2u, received_blocks.size()); 604 EXPECT_EQ(2u, received_blocks.size());
629 605
630 // Verify that BYE removes the report blocks. 606 // Verify that BYE removes the report blocks.
631 rtcp::Bye bye; 607 rtcp::Bye bye;
632 bye.From(kSenderSsrc); 608 bye.From(kSenderSsrc);
633 rtc::Buffer p2 = bye.Build(); 609
634 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 610 InjectRtcpPacket(bye);
611
635 received_blocks.clear(); 612 received_blocks.clear();
636 rtcp_receiver_->StatisticsReceived(&received_blocks); 613 rtcp_receiver_.StatisticsReceived(&received_blocks);
637 EXPECT_TRUE(received_blocks.empty()); 614 EXPECT_TRUE(received_blocks.empty());
638 615
639 // Inject packet. 616 // Inject packet again.
640 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 617 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
641 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 618 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
619 InjectRtcpPacket(rr);
620
642 received_blocks.clear(); 621 received_blocks.clear();
643 rtcp_receiver_->StatisticsReceived(&received_blocks); 622 rtcp_receiver_.StatisticsReceived(&received_blocks);
644 EXPECT_EQ(2u, received_blocks.size()); 623 EXPECT_EQ(2u, received_blocks.size());
645 } 624 }
646 625
647 TEST_F(RtcpReceiverTest, InjectPliPacket) { 626 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; 627 rtcp::Pli pli;
654 pli.To(kSourceSsrc); 628 pli.To(kReceiverMainSsrc);
655 rtc::Buffer packet = pli.Build(); 629
656 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 630 EXPECT_CALL(
657 EXPECT_EQ(kRtcpPli, rtcp_packet_info_.rtcpPacketTypeFlags); 631 packet_type_counter_observer_,
632 RtcpPacketTypesCounterUpdated(
633 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 1)));
634 EXPECT_CALL(intra_frame_observer_,
635 OnReceivedIntraFrameRequest(kReceiverMainSsrc));
636 InjectRtcpPacket(pli);
658 } 637 }
659 638
660 TEST_F(RtcpReceiverTest, PliPacketNotToUsIgnored) { 639 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; 640 rtcp::Pli pli;
667 pli.To(kSourceSsrc + 1); 641 pli.To(kNotToUsSsrc);
668 rtc::Buffer packet = pli.Build(); 642
669 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 643 EXPECT_CALL(
670 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 644 packet_type_counter_observer_,
645 RtcpPacketTypesCounterUpdated(
646 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 0)));
647 EXPECT_CALL(intra_frame_observer_, OnReceivedIntraFrameRequest(_)).Times(0);
648 InjectRtcpPacket(pli);
671 } 649 }
672 650
673 TEST_F(RtcpReceiverTest, InjectFirPacket) { 651 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; 652 rtcp::Fir fir;
680 fir.WithRequestTo(kSourceSsrc, 13); 653 fir.WithRequestTo(kReceiverMainSsrc, 13);
681 rtc::Buffer packet = fir.Build(); 654
682 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 655 EXPECT_CALL(
683 EXPECT_EQ(kRtcpFir, rtcp_packet_info_.rtcpPacketTypeFlags); 656 packet_type_counter_observer_,
657 RtcpPacketTypesCounterUpdated(
658 kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::fir_packets, 1)));
659 EXPECT_CALL(intra_frame_observer_,
660 OnReceivedIntraFrameRequest(kReceiverMainSsrc));
661 InjectRtcpPacket(fir);
684 } 662 }
685 663
686 TEST_F(RtcpReceiverTest, FirPacketNotToUsIgnored) { 664 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; 665 rtcp::Fir fir;
693 fir.WithRequestTo(kSourceSsrc + 1, 13); 666 fir.WithRequestTo(kNotToUsSsrc, 13);
694 rtc::Buffer packet = fir.Build(); 667
695 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 668 EXPECT_CALL(intra_frame_observer_, OnReceivedIntraFrameRequest(_)).Times(0);
696 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 669 InjectRtcpPacket(fir);
697 } 670 }
698 671
699 TEST_F(RtcpReceiverTest, InjectSliPacket) { 672 TEST_F(RtcpReceiverTest, InjectSliPacket) {
673 const uint8_t kPictureId = 40;
700 rtcp::Sli sli; 674 rtcp::Sli sli;
701 sli.WithPictureId(40); 675 sli.WithPictureId(kPictureId);
702 rtc::Buffer packet = sli.Build(); 676
703 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 677 EXPECT_CALL(intra_frame_observer_, OnReceivedSLI(_, kPictureId));
704 EXPECT_EQ(kRtcpSli, rtcp_packet_info_.rtcpPacketTypeFlags); 678 InjectRtcpPacket(sli);
705 EXPECT_EQ(40, rtcp_packet_info_.sliPictureId);
706 } 679 }
707 680
708 TEST_F(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) { 681 TEST_F(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) {
709 rtcp::ExtendedReports xr; 682 rtcp::ExtendedReports xr;
710 xr.From(0x2345); 683 xr.From(kSenderSsrc);
711 rtc::Buffer packet = xr.Build(); 684
712 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 685 InjectRtcpPacket(xr);
713 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 686 }
714 } 687
715 688 // VOiP reports are ignored.
716 TEST_F(RtcpReceiverTest, InjectExtendedReportsVoipPacket) { 689 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; 690 const uint8_t kLossRate = 123;
723 rtcp::VoipMetric voip_metric; 691 rtcp::VoipMetric voip_metric;
724 voip_metric.To(kSourceSsrc); 692 voip_metric.To(kReceiverMainSsrc);
725 RTCPVoIPMetric metric; 693 RTCPVoIPMetric metric;
726 metric.lossRate = kLossRate; 694 metric.lossRate = kLossRate;
727 voip_metric.WithVoipMetric(metric); 695 voip_metric.WithVoipMetric(metric);
728 rtcp::ExtendedReports xr; 696 rtcp::ExtendedReports xr;
729 xr.From(0x2345); 697 xr.From(kSenderSsrc);
730 xr.WithVoipMetric(voip_metric); 698 xr.WithVoipMetric(voip_metric);
731 rtc::Buffer packet = xr.Build(); 699
732 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 700 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 } 701 }
737 702
738 TEST_F(RtcpReceiverTest, ExtendedReportsVoipPacketNotToUsIgnored) { 703 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; 704 rtcp::VoipMetric voip_metric;
745 voip_metric.To(kSourceSsrc + 1); 705 voip_metric.To(kNotToUsSsrc);
746 rtcp::ExtendedReports xr; 706 rtcp::ExtendedReports xr;
747 xr.From(0x2345); 707 xr.From(kSenderSsrc);
748 xr.WithVoipMetric(voip_metric); 708 xr.WithVoipMetric(voip_metric);
749 rtc::Buffer packet = xr.Build(); 709
750 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 710 InjectRtcpPacket(xr);
751 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags);
752 } 711 }
753 712
754 TEST_F(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) { 713 TEST_F(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) {
714 const NtpTime kNtp(0x10203, 0x40506);
755 rtcp::Rrtr rrtr; 715 rtcp::Rrtr rrtr;
756 rrtr.WithNtp(NtpTime(0x10203, 0x40506)); 716 rrtr.WithNtp(kNtp);
757 rtcp::ExtendedReports xr; 717 rtcp::ExtendedReports xr;
758 xr.From(0x2345); 718 xr.From(kSenderSsrc);
759 xr.WithRrtr(rrtr); 719 xr.WithRrtr(rrtr);
760 720
761 rtc::Buffer packet = xr.Build(); 721 RtcpReceiveTimeInfo rrtime;
762 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 722 EXPECT_FALSE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
763 EXPECT_EQ(kRtcpXrReceiverReferenceTime, 723
764 rtcp_packet_info_.rtcpPacketTypeFlags); 724 InjectRtcpPacket(xr);
725
726 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
727 EXPECT_EQ(rrtime.sourceSSRC, kSenderSsrc);
728 EXPECT_EQ(rrtime.lastRR, CompactNtp(kNtp));
729 EXPECT_EQ(0u, rrtime.delaySinceLastRR);
730
731 system_clock_.AdvanceTimeMilliseconds(1500);
732 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
733 EXPECT_NEAR(1500, CompactNtpRttToMs(rrtime.delaySinceLastRR), 1);
765 } 734 }
766 735
767 TEST_F(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) { 736 TEST_F(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) {
768 const uint32_t kSourceSsrc = 0x123456; 737 // Allow calculate rtt using dlrr/rrtr, simulating media receiver side.
769 std::set<uint32_t> ssrcs; 738 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
770 ssrcs.insert(kSourceSsrc); 739
771 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 740 rtcp::Dlrr dlrr;
772 741 dlrr.WithDlrrItem(kNotToUsSsrc, 0x12345, 0x67890);
773 rtcp::Dlrr dlrr; 742 rtcp::ExtendedReports xr;
774 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 743 xr.From(kSenderSsrc);
775 rtcp::ExtendedReports xr; 744 xr.WithDlrr(dlrr);
776 xr.From(0x2345); 745
777 xr.WithDlrr(dlrr); 746 InjectRtcpPacket(xr);
778 rtc::Buffer packet = xr.Build(); 747
779 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 748 int64_t rtt_ms = 0;
780 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 749 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
781 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item);
782 } 750 }
783 751
784 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) { 752 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) {
785 const uint32_t kSourceSsrc = 0x123456; 753 const uint32_t kLastRR = 0x12345;
786 std::set<uint32_t> ssrcs; 754 const uint32_t kDelay = 0x23456;
787 ssrcs.insert(kSourceSsrc); 755 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
788 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 756 int64_t rtt_ms = 0;
789 757 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
790 rtcp::Dlrr dlrr; 758
791 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 759 rtcp::Dlrr dlrr;
792 rtcp::ExtendedReports xr; 760 dlrr.WithDlrrItem(kReceiverMainSsrc, kLastRR, kDelay);
793 xr.From(0x2345); 761 rtcp::ExtendedReports xr;
794 xr.WithDlrr(dlrr); 762 xr.From(kSenderSsrc);
795 rtc::Buffer packet = xr.Build(); 763 xr.WithDlrr(dlrr);
796 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 764
797 // The parser should note the DLRR report block item. 765 InjectRtcpPacket(xr);
798 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 766
767 uint32_t compact_ntp_now = CompactNtp(NtpTime(system_clock_));
768 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
769 uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
770 EXPECT_NEAR(CompactNtpRttToMs(rtt_ntp), rtt_ms, 1);
799 } 771 }
800 772
801 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) { 773 TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) {
802 const uint32_t kSourceSsrc = 0x123456; 774 const uint32_t kLastRR = 0x12345;
803 std::set<uint32_t> ssrcs; 775 const uint32_t kDelay = 0x56789;
804 ssrcs.insert(kSourceSsrc); 776 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
805 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 777
806 778 rtcp::ExtendedReports xr;
807 rtcp::Dlrr dlrr; 779 xr.From(kSenderSsrc);
808 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 780 rtcp::Dlrr dlrr;
809 dlrr.WithDlrrItem(kSourceSsrc + 2, 0x12345, 0x67890); 781 dlrr.WithDlrrItem(kReceiverMainSsrc, kLastRR, kDelay);
810 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 782 dlrr.WithDlrrItem(kReceiverMainSsrc + 1, 0x12345, 0x67890);
811 rtcp::ExtendedReports xr; 783 dlrr.WithDlrrItem(kReceiverMainSsrc + 2, 0x12345, 0x67890);
812 xr.From(0x2345); 784 xr.WithDlrr(dlrr);
813 xr.WithDlrr(dlrr); 785
814 rtc::Buffer packet = xr.Build(); 786 InjectRtcpPacket(xr);
815 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 787
816 // The parser should note the DLRR report block item. 788 uint32_t compact_ntp_now = CompactNtp(NtpTime(system_clock_));
817 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 789 int64_t rtt_ms = 0;
790 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
791 uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
792 EXPECT_NEAR(CompactNtpRttToMs(rtt_ntp), rtt_ms, 1);
818 } 793 }
819 794
820 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) { 795 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) {
821 const uint32_t kSourceSsrc = 0x123456; 796 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
822 std::set<uint32_t> ssrcs;
823 ssrcs.insert(kSourceSsrc);
824 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
825 797
826 rtcp::Rrtr rrtr; 798 rtcp::Rrtr rrtr;
827 rtcp::Dlrr dlrr; 799 rtcp::Dlrr dlrr;
828 dlrr.WithDlrrItem(kSourceSsrc, 0, 0x67890); 800 dlrr.WithDlrrItem(kReceiverMainSsrc, 0x12345, 0x67890);
829 rtcp::VoipMetric metric; 801 rtcp::VoipMetric metric;
830 metric.To(kSourceSsrc); 802 metric.To(kReceiverMainSsrc);
831 rtcp::ExtendedReports xr; 803 rtcp::ExtendedReports xr;
832 xr.From(0x2345); 804 xr.From(kSenderSsrc);
833 xr.WithRrtr(rrtr); 805 xr.WithRrtr(rrtr);
834 xr.WithDlrr(dlrr); 806 xr.WithDlrr(dlrr);
835 xr.WithVoipMetric(metric); 807 xr.WithVoipMetric(metric);
836 rtc::Buffer packet = xr.Build(); 808
837 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 809 InjectRtcpPacket(xr);
838 // The parser should not flag the packet since the RTT is not estimated. 810
839 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 811 RtcpReceiveTimeInfo rrtime;
840 kRtcpXrVoipMetric), 812 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
841 rtcp_packet_info_.rtcpPacketTypeFlags); 813 int64_t rtt_ms = 0;
842 // The parser should note the DLRR report block item. 814 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
843 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item);
844 } 815 }
845 816
846 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) { 817 TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) {
847 const uint32_t kSourceSsrc = 0x123456; 818 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 819
854 rtcp::Rrtr rrtr; 820 rtcp::Rrtr rrtr;
855 rtcp::Dlrr dlrr; 821 rtcp::Dlrr dlrr;
856 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 822 dlrr.WithDlrrItem(kReceiverMainSsrc, 0x12345, 0x67890);
857 rtcp::VoipMetric metric; 823 rtcp::VoipMetric metric;
858 metric.To(kSourceSsrc); 824 metric.To(kReceiverMainSsrc);
859 rtcp::ExtendedReports xr; 825 rtcp::ExtendedReports xr;
860 xr.From(0x2345); 826 xr.From(kSenderSsrc);
861 xr.WithRrtr(rrtr); 827 xr.WithRrtr(rrtr);
862 xr.WithDlrr(dlrr); 828 xr.WithDlrr(dlrr);
863 xr.WithVoipMetric(metric); 829 xr.WithVoipMetric(metric);
830
864 rtc::Buffer packet = xr.Build(); 831 rtc::Buffer packet = xr.Build();
865 // Modify the DLRR block to have an unsupported block type, from 5 to 6. 832 // Modify the DLRR block to have an unsupported block type, from 5 to 6.
866 uint8_t* buffer = packet.data(); 833 ASSERT_EQ(5, packet.data()[20]);
867 EXPECT_EQ(5, buffer[20]); 834 packet.data()[20] = 6;
868 buffer[20] = 6; 835 InjectRtcpPacket(packet);
869 836
870 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 837 // Validate Rrtr was received and processed.
871 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 838 RtcpReceiveTimeInfo rrtime;
872 kRtcpXrVoipMetric), 839 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
873 rtcp_packet_info_.rtcpPacketTypeFlags); 840 // Validate Dlrr report wasn't processed.
874 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); 841 int64_t rtt_ms = 0;
875 } 842 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
876 843 }
877 TEST_F(RtcpReceiverTest, TestXrRrRttInitiallyFalse) { 844
845 TEST_F(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) {
846 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
847
878 int64_t rtt_ms; 848 int64_t rtt_ms;
879 EXPECT_FALSE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 849 EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
880 } 850 }
881 851
882 TEST_F(RtcpReceiverTest, XrDlrrCalculatesRtt) { 852 TEST_F(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) {
883 Random rand(0x0123456789abcdef); 853 Random rand(0x0123456789abcdef);
884 const uint32_t kSourceSsrc = rand.Rand(0x00000001u, 0xfffffffeu);
885 const int64_t kRttMs = rand.Rand(1, 9 * 3600 * 1000); 854 const int64_t kRttMs = rand.Rand(1, 9 * 3600 * 1000);
886 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 855 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
887 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 856 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
888 rtcp_receiver_->SetRtcpXrRrtrStatus(true); 857 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_); 858 NtpTime now(system_clock_);
893 uint32_t sent_ntp = CompactNtp(now); 859 uint32_t sent_ntp = CompactNtp(now);
894 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 860 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
895 861
896 rtcp::Dlrr dlrr; 862 rtcp::Dlrr dlrr;
897 dlrr.WithDlrrItem(kSourceSsrc, sent_ntp, kDelayNtp); 863 dlrr.WithDlrrItem(kReceiverMainSsrc, sent_ntp, kDelayNtp);
898 rtcp::ExtendedReports xr; 864 rtcp::ExtendedReports xr;
899 xr.From(0x2345); 865 xr.From(kSenderSsrc);
900 xr.WithDlrr(dlrr); 866 xr.WithDlrr(dlrr);
901 rtc::Buffer packet = xr.Build(); 867
902 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 868 InjectRtcpPacket(xr);
903 869
904 int64_t rtt_ms = 0; 870 int64_t rtt_ms = 0;
905 EXPECT_TRUE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 871 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
906 EXPECT_NEAR(kRttMs, rtt_ms, 1); 872 EXPECT_NEAR(kRttMs, rtt_ms, 1);
907 } 873 }
908 874
909 TEST_F(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOne) { 875 TEST_F(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOne) {
910 Random rand(0x0123456789abcdef); 876 Random rand(0x0123456789abcdef);
911 const uint32_t kSourceSsrc = rand.Rand(0x00000001u, 0xfffffffeu);
912 const int64_t kRttMs = rand.Rand(-3600 * 1000, -1); 877 const int64_t kRttMs = rand.Rand(-3600 * 1000, -1);
913 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff); 878 const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
914 const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp); 879 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_); 880 NtpTime now(system_clock_);
920 uint32_t sent_ntp = CompactNtp(now); 881 uint32_t sent_ntp = CompactNtp(now);
921 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs); 882 system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
922 883 rtcp_receiver_.SetRtcpXrRrtrStatus(true);
923 rtcp::Dlrr dlrr; 884
924 dlrr.WithDlrrItem(kSourceSsrc, sent_ntp, kDelayNtp); 885 rtcp::Dlrr dlrr;
925 rtcp::ExtendedReports xr; 886 dlrr.WithDlrrItem(kReceiverMainSsrc, sent_ntp, kDelayNtp);
926 xr.From(0x2345); 887 rtcp::ExtendedReports xr;
927 xr.WithDlrr(dlrr); 888 xr.From(kSenderSsrc);
928 rtc::Buffer packet = xr.Build(); 889 xr.WithDlrr(dlrr);
929 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 890
930 891 InjectRtcpPacket(xr);
931 int64_t rtt_ms = 0; 892
932 EXPECT_TRUE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 893 int64_t rtt_ms = 0;
894 EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
933 EXPECT_EQ(1, rtt_ms); 895 EXPECT_EQ(1, rtt_ms);
934 } 896 }
935 897
936 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) { 898 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) {
937 RtcpReceiveTimeInfo info; 899 RtcpReceiveTimeInfo info;
938 EXPECT_FALSE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 900 EXPECT_FALSE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
939 } 901 }
940 902
941 TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) { 903 TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) {
942 const uint32_t kSenderSsrc = 0x123456;
943 const NtpTime kNtp(0x10203, 0x40506); 904 const NtpTime kNtp(0x10203, 0x40506);
944 const uint32_t kNtpMid = CompactNtp(kNtp); 905 const uint32_t kNtpMid = CompactNtp(kNtp);
945 906
946 rtcp::Rrtr rrtr; 907 rtcp::Rrtr rrtr;
947 rrtr.WithNtp(kNtp); 908 rrtr.WithNtp(kNtp);
948 rtcp::ExtendedReports xr; 909 rtcp::ExtendedReports xr;
949 xr.From(kSenderSsrc); 910 xr.From(kSenderSsrc);
950 xr.WithRrtr(rrtr); 911 xr.WithRrtr(rrtr);
951 rtc::Buffer packet = xr.Build(); 912
952 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 913 InjectRtcpPacket(xr);
953 EXPECT_EQ(kRtcpXrReceiverReferenceTime,
954 rtcp_packet_info_.rtcpPacketTypeFlags);
955 914
956 RtcpReceiveTimeInfo info; 915 RtcpReceiveTimeInfo info;
957 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 916 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
958 EXPECT_EQ(kSenderSsrc, info.sourceSSRC); 917 EXPECT_EQ(kSenderSsrc, info.sourceSSRC);
959 EXPECT_EQ(kNtpMid, info.lastRR); 918 EXPECT_EQ(kNtpMid, info.lastRR);
960 EXPECT_EQ(0U, info.delaySinceLastRR); 919 EXPECT_EQ(0U, info.delaySinceLastRR);
961 920
962 system_clock_.AdvanceTimeMilliseconds(1000); 921 system_clock_.AdvanceTimeMilliseconds(1000);
963 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 922 EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
964 EXPECT_EQ(65536U, info.delaySinceLastRR); 923 EXPECT_EQ(65536U, info.delaySinceLastRR);
965 } 924 }
966 925
967 TEST_F(RtcpReceiverTest, ReceiveReportTimeout) { 926 TEST_F(RtcpReceiverTest, ReceiveReportTimeout) {
968 const uint32_t kSenderSsrc = 0x10203;
969 const uint32_t kSourceSsrc = 0x40506;
970 const int64_t kRtcpIntervalMs = 1000; 927 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; 928 const uint16_t kSequenceNumber = 1234;
977 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 929 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
978 930
979 // No RR received, shouldn't trigger a timeout. 931 // No RR received, shouldn't trigger a timeout.
980 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 932 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
981 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 933 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
982 934
983 // Add a RR and advance the clock just enough to not trigger a timeout. 935 // Add a RR and advance the clock just enough to not trigger a timeout.
984 rtcp::ReportBlock rb1; 936 rtcp::ReportBlock rb1;
985 rb1.To(kSourceSsrc); 937 rb1.To(kReceiverMainSsrc);
986 rb1.WithExtHighestSeqNum(kSequenceNumber); 938 rb1.WithExtHighestSeqNum(kSequenceNumber);
987 rtcp::ReceiverReport rr1; 939 rtcp::ReceiverReport rr1;
988 rr1.From(kSenderSsrc); 940 rr1.From(kSenderSsrc);
989 rr1.WithReportBlock(rb1); 941 rr1.WithReportBlock(rb1);
990 rtc::Buffer p1 = rr1.Build(); 942
991 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 943 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
944 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
945 InjectRtcpPacket(rr1);
946
992 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1); 947 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1);
993 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 948 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
994 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 949 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
995 950
996 // Add a RR with the same extended max as the previous RR to trigger a 951 // Add a RR with the same extended max as the previous RR to trigger a
997 // sequence number timeout, but not a RR timeout. 952 // sequence number timeout, but not a RR timeout.
998 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 953 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
954 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
955 InjectRtcpPacket(rr1);
956
999 system_clock_.AdvanceTimeMilliseconds(2); 957 system_clock_.AdvanceTimeMilliseconds(2);
1000 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 958 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1001 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 959 EXPECT_TRUE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1002 960
1003 // Advance clock enough to trigger an RR timeout too. 961 // Advance clock enough to trigger an RR timeout too.
1004 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 962 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
1005 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 963 EXPECT_TRUE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1006 964
1007 // We should only get one timeout even though we still haven't received a new 965 // We should only get one timeout even though we still haven't received a new
1008 // RR. 966 // RR.
1009 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 967 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1010 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 968 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1011 969
1012 // Add a new RR with increase sequence number to reset timers. 970 // Add a new RR with increase sequence number to reset timers.
1013 rtcp::ReportBlock rb2; 971 rtcp::ReportBlock rb2;
1014 rb2.To(kSourceSsrc); 972 rb2.To(kReceiverMainSsrc);
1015 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 973 rb2.WithExtHighestSeqNum(kSequenceNumber + 1);
1016 rtcp::ReceiverReport rr2; 974 rtcp::ReceiverReport rr2;
1017 rr2.From(kSenderSsrc); 975 rr2.From(kSenderSsrc);
1018 rr2.WithReportBlock(rb2); 976 rr2.WithReportBlock(rb2);
1019 rtc::Buffer p2 = rr2.Build(); 977
1020 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 978 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1021 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 979 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1022 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 980 InjectRtcpPacket(rr2);
981
982 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
983 EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
1023 984
1024 // Verify we can get a timeout again once we've received new RR. 985 // Verify we can get a timeout again once we've received new RR.
1025 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 986 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
1026 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 987 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
988 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
989 InjectRtcpPacket(rr2);
990
1027 system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1); 991 system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1);
1028 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 992 EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1029 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 993 EXPECT_TRUE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
994
1030 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 995 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
1031 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 996 EXPECT_TRUE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
1032 } 997 }
1033 998
1034 TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) { 999 TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) {
1035 // This call is expected to fail because no data has arrived. 1000 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1036 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size());
1037 } 1001 }
1038 1002
1039 TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) { 1003 TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) {
1040 const uint32_t kMediaFlowSsrc = 0x2040608; 1004 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; 1005 rtcp::Tmmbr tmmbr;
1047 tmmbr.From(kSenderSsrc); 1006 tmmbr.From(kSenderSsrc);
1048 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); 1007 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, kBitrateBps, 0));
1049
1050 rtcp::SenderReport sr; 1008 rtcp::SenderReport sr;
1051 sr.From(kSenderSsrc); 1009 sr.From(kSenderSsrc);
1052 rtcp::CompoundPacket compound; 1010 rtcp::CompoundPacket compound;
1053 compound.Append(&sr); 1011 compound.Append(&sr);
1054 compound.Append(&tmmbr); 1012 compound.Append(&tmmbr);
1055 rtc::Buffer packet = compound.Build(); 1013
1056 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1014 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1057 1015 EXPECT_CALL(rtp_rtcp_impl_, SetTmmbn(SizeIs(1)));
1058 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_->TmmbrReceived(); 1016 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1059 EXPECT_EQ(1u, candidate_set.size()); 1017 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
1060 EXPECT_LT(0U, candidate_set[0].bitrate_bps()); 1018 InjectRtcpPacket(compound);
1061 EXPECT_EQ(kSenderSsrc, candidate_set[0].ssrc()); 1019
1020 std::vector<rtcp::TmmbItem> tmmbr_received = rtcp_receiver_.TmmbrReceived();
1021 ASSERT_EQ(1u, tmmbr_received.size());
1022 EXPECT_EQ(kBitrateBps, tmmbr_received[0].bitrate_bps());
1023 EXPECT_EQ(kSenderSsrc, tmmbr_received[0].ssrc());
1062 } 1024 }
1063 1025
1064 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { 1026 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) {
1065 const uint32_t kMediaFlowSsrc = 0x2040608; 1027 const uint32_t kBitrateBps = 30000;
1066 const uint32_t kSenderSsrc = 0x10203;
1067
1068 rtcp::Tmmbr tmmbr; 1028 rtcp::Tmmbr tmmbr;
1069 tmmbr.From(kSenderSsrc); 1029 tmmbr.From(kSenderSsrc);
1070 // This SSRC is not what we are sending. 1030 tmmbr.WithTmmbr(rtcp::TmmbItem(kNotToUsSsrc, kBitrateBps, 0));
1071 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc + 1, 30000, 0));
1072 1031
1073 rtcp::SenderReport sr; 1032 rtcp::SenderReport sr;
1074 sr.From(kSenderSsrc); 1033 sr.From(kSenderSsrc);
1075 rtcp::CompoundPacket compound; 1034 rtcp::CompoundPacket compound;
1076 compound.Append(&sr); 1035 compound.Append(&sr);
1077 compound.Append(&tmmbr); 1036 compound.Append(&tmmbr);
1078 rtc::Buffer packet = compound.Build(); 1037
1079 1038 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1080 std::set<uint32_t> ssrcs; 1039 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1081 ssrcs.insert(kMediaFlowSsrc); 1040 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_)).Times(0);
1082 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 1041 InjectRtcpPacket(compound);
1083 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1042
1084 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size()); 1043 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1085 } 1044 }
1086 1045
1087 TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { 1046 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; 1047 rtcp::Tmmbr tmmbr;
1095 tmmbr.From(kSenderSsrc); 1048 tmmbr.From(kSenderSsrc);
1096 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 0, 0)); 1049 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 0, 0));
1097
1098 rtcp::SenderReport sr; 1050 rtcp::SenderReport sr;
1099 sr.From(kSenderSsrc); 1051 sr.From(kSenderSsrc);
1100 rtcp::CompoundPacket compound; 1052 rtcp::CompoundPacket compound;
1101 compound.Append(&sr); 1053 compound.Append(&sr);
1102 compound.Append(&tmmbr); 1054 compound.Append(&tmmbr);
1103 rtc::Buffer packet = compound.Build(); 1055
1104 1056 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1105 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1057 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1106 EXPECT_EQ(0u, rtcp_receiver_->TmmbrReceived().size()); 1058 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_)).Times(0);
1059 InjectRtcpPacket(compound);
1060
1061 EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
1107 } 1062 }
1108 1063
1109 TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { 1064 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. 1065 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2.
1117 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10. 1066 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10.
1118 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) { 1067 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) {
1119 rtcp::Tmmbr tmmbr; 1068 rtcp::Tmmbr tmmbr;
1120 tmmbr.From(ssrc); 1069 tmmbr.From(ssrc);
1121 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); 1070 tmmbr.WithTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 30000, 0));
1122
1123 rtcp::SenderReport sr; 1071 rtcp::SenderReport sr;
1124 sr.From(ssrc); 1072 sr.From(ssrc);
1125 rtcp::CompoundPacket compound; 1073 rtcp::CompoundPacket compound;
1126 compound.Append(&sr); 1074 compound.Append(&sr);
1127 compound.Append(&tmmbr); 1075 compound.Append(&tmmbr);
1128 rtc::Buffer packet = compound.Build(); 1076
1129 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); 1077 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1078 EXPECT_CALL(rtp_rtcp_impl_, SetTmmbn(_));
1079 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1080 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_));
1081 InjectRtcpPacket(compound);
1082
1130 // 5 seconds between each packet. 1083 // 5 seconds between each packet.
1131 system_clock_.AdvanceTimeMilliseconds(5000); 1084 system_clock_.AdvanceTimeMilliseconds(5000);
1132 } 1085 }
1133 // It is now starttime + 15. 1086 // It is now starttime + 15.
1134 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_->TmmbrReceived(); 1087 std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_.TmmbrReceived();
1135 EXPECT_EQ(3u, candidate_set.size()); 1088 ASSERT_EQ(3u, candidate_set.size());
1136 EXPECT_LT(0U, candidate_set[0].bitrate_bps()); 1089 EXPECT_EQ(30000U, candidate_set[0].bitrate_bps());
1090
1137 // We expect the timeout to be 25 seconds. Advance the clock by 12 1091 // We expect the timeout to be 25 seconds. Advance the clock by 12
1138 // seconds, timing out the first packet. 1092 // seconds, timing out the first packet.
1139 system_clock_.AdvanceTimeMilliseconds(12000); 1093 system_clock_.AdvanceTimeMilliseconds(12000);
1140 candidate_set = rtcp_receiver_->TmmbrReceived(); 1094 candidate_set = rtcp_receiver_.TmmbrReceived();
1141 EXPECT_EQ(2u, candidate_set.size()); 1095 ASSERT_EQ(2u, candidate_set.size());
1142 EXPECT_EQ(kSenderSsrc + 1, candidate_set[0].ssrc()); 1096 EXPECT_EQ(kSenderSsrc + 1, candidate_set[0].ssrc());
1143 } 1097 }
1144 1098
1145 TEST_F(RtcpReceiverTest, Callbacks) { 1099 TEST_F(RtcpReceiverTest, Callbacks) {
1146 class RtcpCallbackImpl : public RtcpStatisticsCallback { 1100 MockRtcpCallbackImpl callback;
1147 public: 1101 rtcp_receiver_.RegisterRtcpStatisticsCallback(&callback);
1148 RtcpCallbackImpl() : RtcpStatisticsCallback(), ssrc_(0) {} 1102
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; 1103 const uint8_t kFractionLoss = 3;
1177 const uint32_t kCumulativeLoss = 7; 1104 const uint32_t kCumulativeLoss = 7;
1178 const uint32_t kJitter = 9; 1105 const uint32_t kJitter = 9;
1179 const uint16_t kSequenceNumber = 1234; 1106 const uint16_t kSequenceNumber = 1234;
1180 1107
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. 1108 // First packet, all numbers should just propagate.
1186 rtcp::ReportBlock rb1; 1109 rtcp::ReportBlock rb1;
1187 rb1.To(kSourceSsrc); 1110 rb1.To(kReceiverMainSsrc);
1188 rb1.WithExtHighestSeqNum(kSequenceNumber); 1111 rb1.WithExtHighestSeqNum(kSequenceNumber);
1189 rb1.WithFractionLost(kFractionLoss); 1112 rb1.WithFractionLost(kFractionLoss);
1190 rb1.WithCumulativeLost(kCumulativeLoss); 1113 rb1.WithCumulativeLost(kCumulativeLoss);
1191 rb1.WithJitter(kJitter); 1114 rb1.WithJitter(kJitter);
1192 1115
1193 rtcp::ReceiverReport rr1; 1116 rtcp::ReceiverReport rr1;
1194 rr1.From(kSenderSsrc); 1117 rr1.From(kSenderSsrc);
1195 rr1.WithReportBlock(rb1); 1118 rr1.WithReportBlock(rb1);
1196 rtc::Buffer p1 = rr1.Build(); 1119 EXPECT_CALL(
1197 EXPECT_EQ(0, InjectRtcpPacket(p1.data(), p1.size())); 1120 callback,
1198 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 1121 StatisticsUpdated(
1199 kCumulativeLoss, kJitter)); 1122 AllOf(Field(&RtcpStatistics::fraction_lost, kFractionLoss),
1123 Field(&RtcpStatistics::cumulative_lost, kCumulativeLoss),
1124 Field(&RtcpStatistics::extended_max_sequence_number,
1125 kSequenceNumber),
1126 Field(&RtcpStatistics::jitter, kJitter)),
1127 kReceiverMainSsrc));
1128 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1129 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1130 InjectRtcpPacket(rr1);
1200 1131
1201 rtcp_receiver_->RegisterRtcpStatisticsCallback(nullptr); 1132 rtcp_receiver_.RegisterRtcpStatisticsCallback(nullptr);
1202 1133
1203 // Add arbitrary numbers, callback should not be called (retain old values). 1134 // Add arbitrary numbers, callback should not be called.
1204 rtcp::ReportBlock rb2; 1135 rtcp::ReportBlock rb2;
1205 rb2.To(kSourceSsrc); 1136 rb2.To(kReceiverMainSsrc);
1206 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 1137 rb2.WithExtHighestSeqNum(kSequenceNumber + 1);
1207 rb2.WithFractionLost(42); 1138 rb2.WithFractionLost(42);
1208 rb2.WithCumulativeLost(137); 1139 rb2.WithCumulativeLost(137);
1209 rb2.WithJitter(4711); 1140 rb2.WithJitter(4711);
1210 1141
1211 rtcp::ReceiverReport rr2; 1142 rtcp::ReceiverReport rr2;
1212 rr2.From(kSenderSsrc); 1143 rr2.From(kSenderSsrc);
1213 rr2.WithReportBlock(rb2); 1144 rr2.WithReportBlock(rb2);
1214 rtc::Buffer p2 = rr2.Build(); 1145
1215 EXPECT_EQ(0, InjectRtcpPacket(p2.data(), p2.size())); 1146 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
1216 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 1147 EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
1217 kCumulativeLoss, kJitter)); 1148 EXPECT_CALL(callback, StatisticsUpdated(_, _)).Times(0);
1149 InjectRtcpPacket(rr2);
1218 } 1150 }
1219 1151
1220 TEST_F(RtcpReceiverTest, ReceivesTransportFeedback) { 1152 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; 1153 rtcp::TransportFeedback packet;
1229 packet.WithMediaSourceSsrc(kSourceSsrc); 1154 packet.To(kReceiverMainSsrc);
1230 packet.WithPacketSenderSsrc(kSenderSsrc); 1155 packet.From(kSenderSsrc);
1231 packet.WithBase(1, 1000); 1156 packet.WithBase(1, 1000);
1232 packet.WithReceivedPacket(1, 1000); 1157 packet.WithReceivedPacket(1, 1000);
1233 1158
1234 rtc::Buffer built_packet = packet.Build(); 1159 EXPECT_CALL(
1235 1160 transport_feedback_observer_,
1236 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1161 OnTransportFeedback(AllOf(
1237 1162 Property(&rtcp::TransportFeedback::media_ssrc, kReceiverMainSsrc),
1238 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); 1163 Property(&rtcp::TransportFeedback::sender_ssrc, kSenderSsrc))));
1239 EXPECT_TRUE(rtcp_packet_info_.transport_feedback_.get() != nullptr); 1164 InjectRtcpPacket(packet);
1240 } 1165 }
1241 1166
1242 TEST_F(RtcpReceiverTest, ReceivesRemb) { 1167 TEST_F(RtcpReceiverTest, ReceivesRemb) {
1243 const uint32_t kSenderSsrc = 0x123456;
1244 const uint32_t kBitrateBps = 500000; 1168 const uint32_t kBitrateBps = 500000;
1245 rtcp::Remb remb; 1169 rtcp::Remb remb;
1246 remb.From(kSenderSsrc); 1170 remb.From(kSenderSsrc);
1247 remb.WithBitrateBps(kBitrateBps); 1171 remb.WithBitrateBps(kBitrateBps);
1248 rtc::Buffer built_packet = remb.Build();
1249 1172
1250 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1173 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
1251 1174 InjectRtcpPacket(remb);
1252 EXPECT_EQ(kRtcpRemb, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb);
1253 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate);
1254 } 1175 }
1255 1176
1256 TEST_F(RtcpReceiverTest, HandlesInvalidTransportFeedback) { 1177 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. 1178 // Send a compound packet with a TransportFeedback followed by something else.
1265 rtcp::TransportFeedback packet; 1179 rtcp::TransportFeedback packet;
1266 packet.WithMediaSourceSsrc(kSourceSsrc); 1180 packet.To(kReceiverMainSsrc);
1267 packet.WithPacketSenderSsrc(kSenderSsrc); 1181 packet.From(kSenderSsrc);
1268 packet.WithBase(1, 1000); 1182 packet.WithBase(1, 1000);
1269 packet.WithReceivedPacket(1, 1000); 1183 packet.WithReceivedPacket(1, 1000);
1270 1184
1271 static uint32_t kBitrateBps = 50000; 1185 static uint32_t kBitrateBps = 50000;
1272 rtcp::Remb remb; 1186 rtcp::Remb remb;
1273 remb.From(kSenderSsrc); 1187 remb.From(kSenderSsrc);
1274 remb.WithBitrateBps(kBitrateBps); 1188 remb.WithBitrateBps(kBitrateBps);
1275 rtcp::CompoundPacket compound; 1189 rtcp::CompoundPacket compound;
1276 compound.Append(&packet); 1190 compound.Append(&packet);
1277 compound.Append(&remb); 1191 compound.Append(&remb);
1278 rtc::Buffer built_packet = compound.Build(); 1192 rtc::Buffer built_packet = compound.Build();
1279 1193
1280 // Modify the TransportFeedback packet so that it is invalid. 1194 // Modify the TransportFeedback packet so that it is invalid.
1281 const size_t kStatusCountOffset = 14; 1195 const size_t kStatusCountOffset = 14;
1282 ByteWriter<uint16_t>::WriteBigEndian( 1196 ByteWriter<uint16_t>::WriteBigEndian(
1283 &built_packet.data()[kStatusCountOffset], 42); 1197 &built_packet.data()[kStatusCountOffset], 42);
1284 1198
1285 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); 1199 // Stress no transport feedback is expected.
1286 1200 EXPECT_CALL(transport_feedback_observer_, OnTransportFeedback(_)).Times(0);
1287 // Transport feedback should be ignored, but next packet should work. 1201 // But remb should be processed and cause a callback
1288 EXPECT_EQ(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); 1202 EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
1289 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb); 1203 InjectRtcpPacket(built_packet);
1290 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate);
1291 } 1204 }
1292 1205
1293 } // Anonymous namespace 1206 TEST_F(RtcpReceiverTest, Nack) {
1207 const uint16_t kNackList1[] = {1, 2, 3, 5};
1208 const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1);
1209 const uint16_t kNackList2[] = {5, 7, 30, 40};
1210 const size_t kNackListLength2 = std::end(kNackList2) - std::begin(kNackList2);
1211 std::set<uint16_t> nack_set;
1212 nack_set.insert(std::begin(kNackList1), std::end(kNackList1));
1213 nack_set.insert(std::begin(kNackList2), std::end(kNackList2));
1214
1215 rtcp::Nack nack;
1216 nack.From(kSenderSsrc);
1217 nack.To(kReceiverMainSsrc);
1218 nack.WithList(kNackList1, kNackListLength1);
1219
1220 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedNack(ElementsAreArray(kNackList1)));
1221 EXPECT_CALL(
1222 packet_type_counter_observer_,
1223 RtcpPacketTypesCounterUpdated(
1224 kReceiverMainSsrc,
1225 AllOf(Field(&RtcpPacketTypeCounter::nack_requests, kNackListLength1),
1226 Field(&RtcpPacketTypeCounter::unique_nack_requests,
1227 kNackListLength1))));
1228 InjectRtcpPacket(nack);
1229
1230 rtcp::Nack nack2;
1231 nack2.From(kSenderSsrc);
1232 nack2.To(kReceiverMainSsrc);
1233 nack2.WithList(kNackList2, kNackListLength2);
1234 EXPECT_CALL(rtp_rtcp_impl_, OnReceivedNack(ElementsAreArray(kNackList2)));
1235 EXPECT_CALL(packet_type_counter_observer_,
1236 RtcpPacketTypesCounterUpdated(
1237 kReceiverMainSsrc,
1238 AllOf(Field(&RtcpPacketTypeCounter::nack_requests,
1239 kNackListLength1 + kNackListLength2),
1240 Field(&RtcpPacketTypeCounter::unique_nack_requests,
1241 nack_set.size()))));
1242 InjectRtcpPacket(nack2);
1243 }
1244
1245 TEST_F(RtcpReceiverTest, NackNotForUsIgnored) {
1246 const uint16_t kNackList1[] = {1, 2, 3, 5};
1247 const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1);
1248
1249 rtcp::Nack nack;
1250 nack.From(kSenderSsrc);
1251 nack.To(kNotToUsSsrc);
1252 nack.WithList(kNackList1, kNackListLength1);
1253
1254 EXPECT_CALL(packet_type_counter_observer_,
1255 RtcpPacketTypesCounterUpdated(
1256 _, Field(&RtcpPacketTypeCounter::nack_requests, 0)));
1257 InjectRtcpPacket(nack);
1258 }
1259
1260 TEST_F(RtcpReceiverTest, ForceSenderReport) {
1261 rtcp::RapidResyncRequest rr;
1262 rr.From(kSenderSsrc);
1263 rr.To(kReceiverMainSsrc);
1264
1265 EXPECT_CALL(rtp_rtcp_impl_, OnRequestSendReport());
1266 InjectRtcpPacket(rr);
1267 }
1294 1268
1295 } // namespace webrtc 1269 } // 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