OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 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 <algorithm> | 11 #include <algorithm> |
12 #include <iterator> | 12 #include <iterator> |
13 #include <list> | 13 #include <list> |
14 #include <memory> | 14 #include <memory> |
15 #include <set> | 15 #include <set> |
16 | 16 |
17 #include "webrtc/api/call/transport.h" | 17 #include "webrtc/api/call/transport.h" |
18 #include "webrtc/call/rtp_stream_receiver_controller.h" | |
19 #include "webrtc/call/rtx_receive_stream.h" | |
20 #include "webrtc/common_types.h" | 18 #include "webrtc/common_types.h" |
21 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" | 19 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" |
| 20 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
| 21 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" |
| 22 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" |
22 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" | 23 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
23 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 24 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" | |
25 #include "webrtc/rtc_base/rate_limiter.h" | 25 #include "webrtc/rtc_base/rate_limiter.h" |
26 #include "webrtc/test/gtest.h" | 26 #include "webrtc/test/gtest.h" |
27 | 27 |
28 namespace webrtc { | 28 namespace webrtc { |
29 | 29 |
30 const int kVideoNackListSize = 30; | 30 const int kVideoNackListSize = 30; |
31 const uint32_t kTestSsrc = 3456; | 31 const uint32_t kTestSsrc = 3456; |
32 const uint32_t kTestRtxSsrc = kTestSsrc + 1; | |
33 const uint16_t kTestSequenceNumber = 2345; | 32 const uint16_t kTestSequenceNumber = 2345; |
34 const uint32_t kTestNumberOfPackets = 1350; | 33 const uint32_t kTestNumberOfPackets = 1350; |
35 const int kTestNumberOfRtxPackets = 149; | 34 const int kTestNumberOfRtxPackets = 149; |
36 const int kNumFrames = 30; | 35 const int kNumFrames = 30; |
37 const int kPayloadType = 123; | 36 const int kPayloadType = 123; |
38 const int kRtxPayloadType = 98; | 37 const int kRtxPayloadType = 98; |
39 const int64_t kMaxRttMs = 1000; | 38 const int64_t kMaxRttMs = 1000; |
40 | 39 |
41 class VerifyingMediaStream : public RtpPacketSinkInterface { | 40 class VerifyingRtxReceiver : public RtpData { |
42 public: | 41 public: |
43 VerifyingMediaStream() {} | 42 VerifyingRtxReceiver() {} |
44 | 43 |
45 void OnRtpPacket(const RtpPacketReceived& packet) override { | 44 int32_t OnReceivedPayloadData( |
| 45 const uint8_t* data, |
| 46 size_t size, |
| 47 const webrtc::WebRtcRTPHeader* rtp_header) override { |
46 if (!sequence_numbers_.empty()) | 48 if (!sequence_numbers_.empty()) |
47 EXPECT_EQ(kTestSsrc, packet.Ssrc()); | 49 EXPECT_EQ(kTestSsrc, rtp_header->header.ssrc); |
48 | 50 sequence_numbers_.push_back(rtp_header->header.sequenceNumber); |
49 sequence_numbers_.push_back(packet.SequenceNumber()); | 51 return 0; |
50 } | 52 } |
51 std::list<uint16_t> sequence_numbers_; | 53 std::list<uint16_t> sequence_numbers_; |
52 }; | 54 }; |
53 | 55 |
| 56 class TestRtpFeedback : public NullRtpFeedback { |
| 57 public: |
| 58 explicit TestRtpFeedback(RtpRtcp* rtp_rtcp) : rtp_rtcp_(rtp_rtcp) {} |
| 59 virtual ~TestRtpFeedback() {} |
| 60 |
| 61 void OnIncomingSSRCChanged(uint32_t ssrc) override { |
| 62 rtp_rtcp_->SetRemoteSSRC(ssrc); |
| 63 } |
| 64 |
| 65 private: |
| 66 RtpRtcp* rtp_rtcp_; |
| 67 }; |
| 68 |
54 class RtxLoopBackTransport : public webrtc::Transport { | 69 class RtxLoopBackTransport : public webrtc::Transport { |
55 public: | 70 public: |
56 explicit RtxLoopBackTransport(uint32_t rtx_ssrc) | 71 explicit RtxLoopBackTransport(uint32_t rtx_ssrc) |
57 : count_(0), | 72 : count_(0), |
58 packet_loss_(0), | 73 packet_loss_(0), |
59 consecutive_drop_start_(0), | 74 consecutive_drop_start_(0), |
60 consecutive_drop_end_(0), | 75 consecutive_drop_end_(0), |
61 rtx_ssrc_(rtx_ssrc), | 76 rtx_ssrc_(rtx_ssrc), |
62 count_rtx_ssrc_(0), | 77 count_rtx_ssrc_(0), |
| 78 rtp_payload_registry_(NULL), |
| 79 rtp_receiver_(NULL), |
63 module_(NULL) {} | 80 module_(NULL) {} |
64 | 81 |
65 void SetSendModule(RtpRtcp* rtpRtcpModule) { | 82 void SetSendModule(RtpRtcp* rtpRtcpModule, |
| 83 RTPPayloadRegistry* rtp_payload_registry, |
| 84 RtpReceiver* receiver) { |
66 module_ = rtpRtcpModule; | 85 module_ = rtpRtcpModule; |
| 86 rtp_payload_registry_ = rtp_payload_registry; |
| 87 rtp_receiver_ = receiver; |
67 } | 88 } |
68 | 89 |
69 void DropEveryNthPacket(int n) { packet_loss_ = n; } | 90 void DropEveryNthPacket(int n) { packet_loss_ = n; } |
70 | 91 |
71 void DropConsecutivePackets(int start, int total) { | 92 void DropConsecutivePackets(int start, int total) { |
72 consecutive_drop_start_ = start; | 93 consecutive_drop_start_ = start; |
73 consecutive_drop_end_ = start + total; | 94 consecutive_drop_end_ = start + total; |
74 packet_loss_ = 0; | 95 packet_loss_ = 0; |
75 } | 96 } |
76 | 97 |
77 bool SendRtp(const uint8_t* data, | 98 bool SendRtp(const uint8_t* data, |
78 size_t len, | 99 size_t len, |
79 const PacketOptions& options) override { | 100 const PacketOptions& options) override { |
80 count_++; | 101 count_++; |
81 RtpPacketReceived packet; | 102 const unsigned char* ptr = static_cast<const unsigned char*>(data); |
82 if (!packet.Parse(data, len)) | 103 uint32_t ssrc = (ptr[8] << 24) + (ptr[9] << 16) + (ptr[10] << 8) + ptr[11]; |
| 104 if (ssrc == rtx_ssrc_) |
| 105 count_rtx_ssrc_++; |
| 106 uint16_t sequence_number = (ptr[2] << 8) + ptr[3]; |
| 107 size_t packet_length = len; |
| 108 uint8_t restored_packet[1500]; |
| 109 RTPHeader header; |
| 110 std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); |
| 111 if (!parser->Parse(ptr, len, &header)) { |
83 return false; | 112 return false; |
84 if (packet.Ssrc() == rtx_ssrc_) { | 113 } |
85 count_rtx_ssrc_++; | 114 |
86 } else { | 115 if (!rtp_payload_registry_->IsRtx(header)) { |
87 // For non-RTX packets only. | 116 // Don't store retransmitted packets since we compare it to the list |
| 117 // created by the receiver. |
88 expected_sequence_numbers_.insert(expected_sequence_numbers_.end(), | 118 expected_sequence_numbers_.insert(expected_sequence_numbers_.end(), |
89 packet.SequenceNumber()); | 119 sequence_number); |
90 } | 120 } |
91 if (packet_loss_ > 0) { | 121 if (packet_loss_ > 0) { |
92 if ((count_ % packet_loss_) == 0) { | 122 if ((count_ % packet_loss_) == 0) { |
93 return true; | 123 return true; |
94 } | 124 } |
95 } else if (count_ >= consecutive_drop_start_ && | 125 } else if (count_ >= consecutive_drop_start_ && |
96 count_ < consecutive_drop_end_) { | 126 count_ < consecutive_drop_end_) { |
97 return true; | 127 return true; |
98 } | 128 } |
99 EXPECT_TRUE(stream_receiver_controller_.OnRtpPacket(packet)); | 129 if (rtp_payload_registry_->IsRtx(header)) { |
| 130 // Remove the RTX header and parse the original RTP header. |
| 131 EXPECT_TRUE(rtp_payload_registry_->RestoreOriginalPacket( |
| 132 restored_packet, ptr, &packet_length, rtp_receiver_->SSRC(), header)); |
| 133 if (!parser->Parse(restored_packet, packet_length, &header)) { |
| 134 return false; |
| 135 } |
| 136 ptr = restored_packet; |
| 137 } else { |
| 138 rtp_payload_registry_->SetIncomingPayloadType(header); |
| 139 } |
| 140 |
| 141 PayloadUnion payload_specific; |
| 142 if (!rtp_payload_registry_->GetPayloadSpecifics(header.payloadType, |
| 143 &payload_specific)) { |
| 144 return false; |
| 145 } |
| 146 if (!rtp_receiver_->IncomingRtpPacket(header, ptr + header.headerLength, |
| 147 packet_length - header.headerLength, |
| 148 payload_specific, true)) { |
| 149 return false; |
| 150 } |
100 return true; | 151 return true; |
101 } | 152 } |
102 | 153 |
103 bool SendRtcp(const uint8_t* data, size_t len) override { | 154 bool SendRtcp(const uint8_t* data, size_t len) override { |
104 return module_->IncomingRtcpPacket((const uint8_t*)data, len) == 0; | 155 return module_->IncomingRtcpPacket((const uint8_t*)data, len) == 0; |
105 } | 156 } |
106 int count_; | 157 int count_; |
107 int packet_loss_; | 158 int packet_loss_; |
108 int consecutive_drop_start_; | 159 int consecutive_drop_start_; |
109 int consecutive_drop_end_; | 160 int consecutive_drop_end_; |
110 uint32_t rtx_ssrc_; | 161 uint32_t rtx_ssrc_; |
111 int count_rtx_ssrc_; | 162 int count_rtx_ssrc_; |
| 163 RTPPayloadRegistry* rtp_payload_registry_; |
| 164 RtpReceiver* rtp_receiver_; |
112 RtpRtcp* module_; | 165 RtpRtcp* module_; |
113 RtpStreamReceiverController stream_receiver_controller_; | |
114 std::set<uint16_t> expected_sequence_numbers_; | 166 std::set<uint16_t> expected_sequence_numbers_; |
115 }; | 167 }; |
116 | 168 |
117 class RtpRtcpRtxNackTest : public ::testing::Test { | 169 class RtpRtcpRtxNackTest : public ::testing::Test { |
118 protected: | 170 protected: |
119 RtpRtcpRtxNackTest() | 171 RtpRtcpRtxNackTest() |
120 : rtp_rtcp_module_(nullptr), | 172 : rtp_rtcp_module_(nullptr), |
121 transport_(kTestRtxSsrc), | 173 transport_(kTestSsrc + 1), |
122 rtx_stream_(&media_stream_, | 174 receiver_(), |
123 rtx_associated_payload_types_, | |
124 kTestSsrc), | |
125 payload_data_length(sizeof(payload_data)), | 175 payload_data_length(sizeof(payload_data)), |
126 fake_clock(123456), | 176 fake_clock(123456), |
127 retransmission_rate_limiter_(&fake_clock, kMaxRttMs) {} | 177 retransmission_rate_limiter_(&fake_clock, kMaxRttMs) {} |
128 ~RtpRtcpRtxNackTest() {} | 178 ~RtpRtcpRtxNackTest() {} |
129 | 179 |
130 void SetUp() override { | 180 void SetUp() override { |
131 RtpRtcp::Configuration configuration; | 181 RtpRtcp::Configuration configuration; |
132 configuration.audio = false; | 182 configuration.audio = false; |
133 configuration.clock = &fake_clock; | 183 configuration.clock = &fake_clock; |
134 receive_statistics_.reset(ReceiveStatistics::Create(&fake_clock)); | 184 receive_statistics_.reset(ReceiveStatistics::Create(&fake_clock)); |
135 configuration.receive_statistics = receive_statistics_.get(); | 185 configuration.receive_statistics = receive_statistics_.get(); |
136 configuration.outgoing_transport = &transport_; | 186 configuration.outgoing_transport = &transport_; |
137 configuration.retransmission_rate_limiter = &retransmission_rate_limiter_; | 187 configuration.retransmission_rate_limiter = &retransmission_rate_limiter_; |
138 rtp_rtcp_module_ = RtpRtcp::CreateRtpRtcp(configuration); | 188 rtp_rtcp_module_ = RtpRtcp::CreateRtpRtcp(configuration); |
139 | 189 |
| 190 rtp_feedback_.reset(new TestRtpFeedback(rtp_rtcp_module_)); |
| 191 |
| 192 rtp_receiver_.reset(RtpReceiver::CreateVideoReceiver( |
| 193 &fake_clock, &receiver_, rtp_feedback_.get(), &rtp_payload_registry_)); |
| 194 |
140 rtp_rtcp_module_->SetSSRC(kTestSsrc); | 195 rtp_rtcp_module_->SetSSRC(kTestSsrc); |
141 rtp_rtcp_module_->SetRTCPStatus(RtcpMode::kCompound); | 196 rtp_rtcp_module_->SetRTCPStatus(RtcpMode::kCompound); |
142 rtp_rtcp_module_->SetStorePacketsStatus(true, 600); | 197 rtp_rtcp_module_->SetStorePacketsStatus(true, 600); |
143 EXPECT_EQ(0, rtp_rtcp_module_->SetSendingStatus(true)); | 198 EXPECT_EQ(0, rtp_rtcp_module_->SetSendingStatus(true)); |
144 rtp_rtcp_module_->SetSequenceNumber(kTestSequenceNumber); | 199 rtp_rtcp_module_->SetSequenceNumber(kTestSequenceNumber); |
145 rtp_rtcp_module_->SetStartTimestamp(111111); | 200 rtp_rtcp_module_->SetStartTimestamp(111111); |
146 | 201 |
147 // Used for NACK processing. | 202 transport_.SetSendModule(rtp_rtcp_module_, &rtp_payload_registry_, |
148 // TODO(nisse): Unclear on which side? It's confusing to use a | 203 rtp_receiver_.get()); |
149 // single rtp_rtcp module for both send and receive side. | |
150 rtp_rtcp_module_->SetRemoteSSRC(kTestSsrc); | |
151 | 204 |
152 rtp_rtcp_module_->RegisterVideoSendPayload(kPayloadType, "video"); | 205 VideoCodec video_codec; |
| 206 memset(&video_codec, 0, sizeof(video_codec)); |
| 207 video_codec.plType = kPayloadType; |
| 208 memcpy(video_codec.plName, "I420", 5); |
| 209 |
| 210 EXPECT_EQ(0, rtp_rtcp_module_->RegisterSendPayload(video_codec)); |
153 rtp_rtcp_module_->SetRtxSendPayloadType(kRtxPayloadType, kPayloadType); | 211 rtp_rtcp_module_->SetRtxSendPayloadType(kRtxPayloadType, kPayloadType); |
154 transport_.SetSendModule(rtp_rtcp_module_); | 212 EXPECT_EQ(0, rtp_payload_registry_.RegisterReceivePayload(video_codec)); |
155 media_receiver_ = transport_.stream_receiver_controller_.CreateReceiver( | 213 rtp_payload_registry_.SetRtxPayloadType(kRtxPayloadType, kPayloadType); |
156 kTestSsrc, &media_stream_); | |
157 | 214 |
158 for (size_t n = 0; n < payload_data_length; n++) { | 215 for (size_t n = 0; n < payload_data_length; n++) { |
159 payload_data[n] = n % 10; | 216 payload_data[n] = n % 10; |
160 } | 217 } |
161 } | 218 } |
162 | 219 |
163 int BuildNackList(uint16_t* nack_list) { | 220 int BuildNackList(uint16_t* nack_list) { |
164 media_stream_.sequence_numbers_.sort(); | 221 receiver_.sequence_numbers_.sort(); |
165 std::list<uint16_t> missing_sequence_numbers; | 222 std::list<uint16_t> missing_sequence_numbers; |
166 std::list<uint16_t>::iterator it = media_stream_.sequence_numbers_.begin(); | 223 std::list<uint16_t>::iterator it = receiver_.sequence_numbers_.begin(); |
167 | 224 |
168 while (it != media_stream_.sequence_numbers_.end()) { | 225 while (it != receiver_.sequence_numbers_.end()) { |
169 uint16_t sequence_number_1 = *it; | 226 uint16_t sequence_number_1 = *it; |
170 ++it; | 227 ++it; |
171 if (it != media_stream_.sequence_numbers_.end()) { | 228 if (it != receiver_.sequence_numbers_.end()) { |
172 uint16_t sequence_number_2 = *it; | 229 uint16_t sequence_number_2 = *it; |
173 // Add all missing sequence numbers to list | 230 // Add all missing sequence numbers to list |
174 for (uint16_t i = sequence_number_1 + 1; i < sequence_number_2; ++i) { | 231 for (uint16_t i = sequence_number_1 + 1; i < sequence_number_2; ++i) { |
175 missing_sequence_numbers.push_back(i); | 232 missing_sequence_numbers.push_back(i); |
176 } | 233 } |
177 } | 234 } |
178 } | 235 } |
179 int n = 0; | 236 int n = 0; |
180 for (it = missing_sequence_numbers.begin(); | 237 for (it = missing_sequence_numbers.begin(); |
181 it != missing_sequence_numbers.end(); ++it) { | 238 it != missing_sequence_numbers.end(); ++it) { |
182 nack_list[n++] = (*it); | 239 nack_list[n++] = (*it); |
183 } | 240 } |
184 return n; | 241 return n; |
185 } | 242 } |
186 | 243 |
187 bool ExpectedPacketsReceived() { | 244 bool ExpectedPacketsReceived() { |
188 std::list<uint16_t> received_sorted; | 245 std::list<uint16_t> received_sorted; |
189 std::copy(media_stream_.sequence_numbers_.begin(), | 246 std::copy(receiver_.sequence_numbers_.begin(), |
190 media_stream_.sequence_numbers_.end(), | 247 receiver_.sequence_numbers_.end(), |
191 std::back_inserter(received_sorted)); | 248 std::back_inserter(received_sorted)); |
192 received_sorted.sort(); | 249 received_sorted.sort(); |
193 return received_sorted.size() == | 250 return received_sorted.size() == |
194 transport_.expected_sequence_numbers_.size() && | 251 transport_.expected_sequence_numbers_.size() && |
195 std::equal(received_sorted.begin(), received_sorted.end(), | 252 std::equal(received_sorted.begin(), received_sorted.end(), |
196 transport_.expected_sequence_numbers_.begin()); | 253 transport_.expected_sequence_numbers_.begin()); |
197 } | 254 } |
198 | 255 |
199 void RunRtxTest(RtxMode rtx_method, int loss) { | 256 void RunRtxTest(RtxMode rtx_method, int loss) { |
200 rtx_receiver_ = transport_.stream_receiver_controller_.CreateReceiver( | 257 rtp_payload_registry_.SetRtxSsrc(kTestSsrc + 1); |
201 kTestRtxSsrc, &rtx_stream_); | |
202 rtp_rtcp_module_->SetRtxSendStatus(rtx_method); | 258 rtp_rtcp_module_->SetRtxSendStatus(rtx_method); |
203 rtp_rtcp_module_->SetRtxSsrc(kTestRtxSsrc); | 259 rtp_rtcp_module_->SetRtxSsrc(kTestSsrc + 1); |
204 transport_.DropEveryNthPacket(loss); | 260 transport_.DropEveryNthPacket(loss); |
205 uint32_t timestamp = 3000; | 261 uint32_t timestamp = 3000; |
206 uint16_t nack_list[kVideoNackListSize]; | 262 uint16_t nack_list[kVideoNackListSize]; |
207 for (int frame = 0; frame < kNumFrames; ++frame) { | 263 for (int frame = 0; frame < kNumFrames; ++frame) { |
208 EXPECT_TRUE(rtp_rtcp_module_->SendOutgoingData( | 264 EXPECT_TRUE(rtp_rtcp_module_->SendOutgoingData( |
209 webrtc::kVideoFrameDelta, kPayloadType, timestamp, timestamp / 90, | 265 webrtc::kVideoFrameDelta, kPayloadType, timestamp, timestamp / 90, |
210 payload_data, payload_data_length, nullptr, nullptr, nullptr)); | 266 payload_data, payload_data_length, nullptr, nullptr, nullptr)); |
211 // Min required delay until retransmit = 5 + RTT ms (RTT = 0). | 267 // Min required delay until retransmit = 5 + RTT ms (RTT = 0). |
212 fake_clock.AdvanceTimeMilliseconds(5); | 268 fake_clock.AdvanceTimeMilliseconds(5); |
213 int length = BuildNackList(nack_list); | 269 int length = BuildNackList(nack_list); |
214 if (length > 0) | 270 if (length > 0) |
215 rtp_rtcp_module_->SendNACK(nack_list, length); | 271 rtp_rtcp_module_->SendNACK(nack_list, length); |
216 fake_clock.AdvanceTimeMilliseconds(28); // 33ms - 5ms delay. | 272 fake_clock.AdvanceTimeMilliseconds(28); // 33ms - 5ms delay. |
217 rtp_rtcp_module_->Process(); | 273 rtp_rtcp_module_->Process(); |
218 // Prepare next frame. | 274 // Prepare next frame. |
219 timestamp += 3000; | 275 timestamp += 3000; |
220 } | 276 } |
221 media_stream_.sequence_numbers_.sort(); | 277 receiver_.sequence_numbers_.sort(); |
222 } | 278 } |
223 | 279 |
224 void TearDown() override { delete rtp_rtcp_module_; } | 280 void TearDown() override { delete rtp_rtcp_module_; } |
225 | 281 |
226 std::unique_ptr<ReceiveStatistics> receive_statistics_; | 282 std::unique_ptr<ReceiveStatistics> receive_statistics_; |
| 283 RTPPayloadRegistry rtp_payload_registry_; |
| 284 std::unique_ptr<RtpReceiver> rtp_receiver_; |
227 RtpRtcp* rtp_rtcp_module_; | 285 RtpRtcp* rtp_rtcp_module_; |
| 286 std::unique_ptr<TestRtpFeedback> rtp_feedback_; |
228 RtxLoopBackTransport transport_; | 287 RtxLoopBackTransport transport_; |
229 const std::map<int, int> rtx_associated_payload_types_ = | 288 VerifyingRtxReceiver receiver_; |
230 {{kRtxPayloadType, kPayloadType}}; | |
231 VerifyingMediaStream media_stream_; | |
232 RtxReceiveStream rtx_stream_; | |
233 uint8_t payload_data[65000]; | 289 uint8_t payload_data[65000]; |
234 size_t payload_data_length; | 290 size_t payload_data_length; |
235 SimulatedClock fake_clock; | 291 SimulatedClock fake_clock; |
236 RateLimiter retransmission_rate_limiter_; | 292 RateLimiter retransmission_rate_limiter_; |
237 std::unique_ptr<RtpStreamReceiverInterface> media_receiver_; | |
238 std::unique_ptr<RtpStreamReceiverInterface> rtx_receiver_; | |
239 }; | 293 }; |
240 | 294 |
241 TEST_F(RtpRtcpRtxNackTest, LongNackList) { | 295 TEST_F(RtpRtcpRtxNackTest, LongNackList) { |
242 const int kNumPacketsToDrop = 900; | 296 const int kNumPacketsToDrop = 900; |
243 const int kNumRequiredRtcp = 4; | 297 const int kNumRequiredRtcp = 4; |
244 uint32_t timestamp = 3000; | 298 uint32_t timestamp = 3000; |
245 uint16_t nack_list[kNumPacketsToDrop]; | 299 uint16_t nack_list[kNumPacketsToDrop]; |
246 // Disable StorePackets to be able to set a larger packet history. | 300 // Disable StorePackets to be able to set a larger packet history. |
247 rtp_rtcp_module_->SetStorePacketsStatus(false, 0); | 301 rtp_rtcp_module_->SetStorePacketsStatus(false, 0); |
248 // Enable StorePackets with a packet history of 2000 packets. | 302 // Enable StorePackets with a packet history of 2000 packets. |
249 rtp_rtcp_module_->SetStorePacketsStatus(true, 2000); | 303 rtp_rtcp_module_->SetStorePacketsStatus(true, 2000); |
250 // Drop 900 packets from the second one so that we get a NACK list which is | 304 // Drop 900 packets from the second one so that we get a NACK list which is |
251 // big enough to require 4 RTCP packets to be fully transmitted to the sender. | 305 // big enough to require 4 RTCP packets to be fully transmitted to the sender. |
252 transport_.DropConsecutivePackets(2, kNumPacketsToDrop); | 306 transport_.DropConsecutivePackets(2, kNumPacketsToDrop); |
253 // Send 30 frames which at the default size is roughly what we need to get | 307 // Send 30 frames which at the default size is roughly what we need to get |
254 // enough packets. | 308 // enough packets. |
255 for (int frame = 0; frame < kNumFrames; ++frame) { | 309 for (int frame = 0; frame < kNumFrames; ++frame) { |
256 EXPECT_TRUE(rtp_rtcp_module_->SendOutgoingData( | 310 EXPECT_TRUE(rtp_rtcp_module_->SendOutgoingData( |
257 webrtc::kVideoFrameDelta, kPayloadType, timestamp, timestamp / 90, | 311 webrtc::kVideoFrameDelta, kPayloadType, timestamp, timestamp / 90, |
258 payload_data, payload_data_length, nullptr, nullptr, nullptr)); | 312 payload_data, payload_data_length, nullptr, nullptr, nullptr)); |
259 // Prepare next frame. | 313 // Prepare next frame. |
260 timestamp += 3000; | 314 timestamp += 3000; |
261 fake_clock.AdvanceTimeMilliseconds(33); | 315 fake_clock.AdvanceTimeMilliseconds(33); |
262 rtp_rtcp_module_->Process(); | 316 rtp_rtcp_module_->Process(); |
263 } | 317 } |
264 EXPECT_FALSE(transport_.expected_sequence_numbers_.empty()); | 318 EXPECT_FALSE(transport_.expected_sequence_numbers_.empty()); |
265 EXPECT_FALSE(media_stream_.sequence_numbers_.empty()); | 319 EXPECT_FALSE(receiver_.sequence_numbers_.empty()); |
266 size_t last_receive_count = media_stream_.sequence_numbers_.size(); | 320 size_t last_receive_count = receiver_.sequence_numbers_.size(); |
267 int length = BuildNackList(nack_list); | 321 int length = BuildNackList(nack_list); |
268 for (int i = 0; i < kNumRequiredRtcp - 1; ++i) { | 322 for (int i = 0; i < kNumRequiredRtcp - 1; ++i) { |
269 rtp_rtcp_module_->SendNACK(nack_list, length); | 323 rtp_rtcp_module_->SendNACK(nack_list, length); |
270 EXPECT_GT(media_stream_.sequence_numbers_.size(), last_receive_count); | 324 EXPECT_GT(receiver_.sequence_numbers_.size(), last_receive_count); |
271 last_receive_count = media_stream_.sequence_numbers_.size(); | 325 last_receive_count = receiver_.sequence_numbers_.size(); |
272 EXPECT_FALSE(ExpectedPacketsReceived()); | 326 EXPECT_FALSE(ExpectedPacketsReceived()); |
273 } | 327 } |
274 rtp_rtcp_module_->SendNACK(nack_list, length); | 328 rtp_rtcp_module_->SendNACK(nack_list, length); |
275 EXPECT_GT(media_stream_.sequence_numbers_.size(), last_receive_count); | 329 EXPECT_GT(receiver_.sequence_numbers_.size(), last_receive_count); |
276 EXPECT_TRUE(ExpectedPacketsReceived()); | 330 EXPECT_TRUE(ExpectedPacketsReceived()); |
277 } | 331 } |
278 | 332 |
279 TEST_F(RtpRtcpRtxNackTest, RtxNack) { | 333 TEST_F(RtpRtcpRtxNackTest, RtxNack) { |
280 RunRtxTest(kRtxRetransmitted, 10); | 334 RunRtxTest(kRtxRetransmitted, 10); |
281 EXPECT_EQ(kTestSequenceNumber, *(media_stream_.sequence_numbers_.begin())); | 335 EXPECT_EQ(kTestSequenceNumber, *(receiver_.sequence_numbers_.begin())); |
282 EXPECT_EQ(kTestSequenceNumber + kTestNumberOfPackets - 1, | 336 EXPECT_EQ(kTestSequenceNumber + kTestNumberOfPackets - 1, |
283 *(media_stream_.sequence_numbers_.rbegin())); | 337 *(receiver_.sequence_numbers_.rbegin())); |
284 EXPECT_EQ(kTestNumberOfPackets, media_stream_.sequence_numbers_.size()); | 338 EXPECT_EQ(kTestNumberOfPackets, receiver_.sequence_numbers_.size()); |
285 EXPECT_EQ(kTestNumberOfRtxPackets, transport_.count_rtx_ssrc_); | 339 EXPECT_EQ(kTestNumberOfRtxPackets, transport_.count_rtx_ssrc_); |
286 EXPECT_TRUE(ExpectedPacketsReceived()); | 340 EXPECT_TRUE(ExpectedPacketsReceived()); |
287 } | 341 } |
288 | 342 |
289 } // namespace webrtc | 343 } // namespace webrtc |
OLD | NEW |