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

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

Issue 3011093002: Revert of Delete Rtx-related methods from RTPPayloadRegistry. (Closed)
Patch Set: Created 3 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
OLDNEW
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
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h ('k') | webrtc/modules/rtp_rtcp/source/rtp_payload_registry.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698