OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/test/simple_test_tick_clock.h" |
6 #include "media/cast/cast_defines.h" | 7 #include "media/cast/cast_defines.h" |
7 #include "media/cast/pacing/paced_sender.h" | 8 #include "media/cast/pacing/paced_sender.h" |
8 #include "media/cast/rtcp/rtcp_sender.h" | 9 #include "media/cast/rtcp/rtcp_sender.h" |
| 10 #include "media/cast/rtcp/rtcp_utility.h" |
9 #include "media/cast/rtcp/test_rtcp_packet_builder.h" | 11 #include "media/cast/rtcp/test_rtcp_packet_builder.h" |
10 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
11 | 13 |
12 namespace media { | 14 namespace media { |
13 namespace cast { | 15 namespace cast { |
14 | 16 |
15 static const uint32 kSendingSsrc = 0x12345678; | 17 static const uint32 kSendingSsrc = 0x12345678; |
16 static const uint32 kMediaSsrc = 0x87654321; | 18 static const uint32 kMediaSsrc = 0x87654321; |
17 static const std::string kCName("test@10.1.1.1"); | 19 static const std::string kCName("test@10.1.1.1"); |
18 | 20 |
(...skipping 28 matching lines...) Expand all Loading... |
47 | 49 |
48 private: | 50 private: |
49 uint8 expected_packet_[kIpPacketSize]; | 51 uint8 expected_packet_[kIpPacketSize]; |
50 size_t expected_packet_length_; | 52 size_t expected_packet_length_; |
51 int packet_count_; | 53 int packet_count_; |
52 }; | 54 }; |
53 | 55 |
54 class RtcpSenderTest : public ::testing::Test { | 56 class RtcpSenderTest : public ::testing::Test { |
55 protected: | 57 protected: |
56 RtcpSenderTest() | 58 RtcpSenderTest() |
57 : rtcp_sender_(new RtcpSender(&test_transport_, | 59 : rtcp_sender_(new RtcpSender(&test_transport_, kSendingSsrc, kCName)) {} |
58 kSendingSsrc, | |
59 kCName)) { | |
60 } | |
61 | 60 |
62 TestRtcpTransport test_transport_; | 61 TestRtcpTransport test_transport_; |
63 scoped_ptr<RtcpSender> rtcp_sender_; | 62 scoped_ptr<RtcpSender> rtcp_sender_; |
64 }; | 63 }; |
65 | 64 |
66 TEST_F(RtcpSenderTest, RtcpSenderReport) { | 65 TEST_F(RtcpSenderTest, RtcpSenderReport) { |
67 RtcpSenderInfo sender_info; | 66 RtcpSenderInfo sender_info; |
68 sender_info.ntp_seconds = kNtpHigh; | 67 sender_info.ntp_seconds = kNtpHigh; |
69 sender_info.ntp_fraction = kNtpLow; | 68 sender_info.ntp_fraction = kNtpLow; |
70 sender_info.rtp_timestamp = kRtpTimestamp; | 69 sender_info.rtp_timestamp = kRtpTimestamp; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 | 142 |
144 rtcp_sender_->SendRtcpFromRtpSender( | 143 rtcp_sender_->SendRtcpFromRtpSender( |
145 RtcpSender::kRtcpSr | RtcpSender::kRtcpDlrr, | 144 RtcpSender::kRtcpSr | RtcpSender::kRtcpDlrr, |
146 &sender_info, | 145 &sender_info, |
147 &dlrr_rb, | 146 &dlrr_rb, |
148 NULL); | 147 NULL); |
149 | 148 |
150 EXPECT_EQ(1, test_transport_.packet_count()); | 149 EXPECT_EQ(1, test_transport_.packet_count()); |
151 } | 150 } |
152 | 151 |
| 152 TEST_F(RtcpSenderTest, RtcpSenderReportWithDlrrAndLog) { |
| 153 RtcpSenderInfo sender_info; |
| 154 sender_info.ntp_seconds = kNtpHigh; |
| 155 sender_info.ntp_fraction = kNtpLow; |
| 156 sender_info.rtp_timestamp = kRtpTimestamp; |
| 157 sender_info.send_packet_count = kSendPacketCount; |
| 158 sender_info.send_octet_count = kSendOctetCount; |
| 159 |
| 160 // Sender report + c_name + dlrr + sender log. |
| 161 TestRtcpPacketBuilder p; |
| 162 p.AddSr(kSendingSsrc, 0); |
| 163 p.AddSdesCname(kSendingSsrc, kCName); |
| 164 p.AddXrHeader(kSendingSsrc); |
| 165 p.AddXrDlrrBlock(kSendingSsrc); |
| 166 p.AddSenderLog(kSendingSsrc); |
| 167 p.AddSenderFrameLog(kRtcpSenderFrameStatusSentToNetwork, kRtpTimestamp); |
| 168 |
| 169 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); |
| 170 |
| 171 RtcpDlrrReportBlock dlrr_rb; |
| 172 dlrr_rb.last_rr = kLastRr; |
| 173 dlrr_rb.delay_since_last_rr = kDelayLastRr; |
| 174 |
| 175 RtcpSenderFrameLogMessage sender_frame_log; |
| 176 sender_frame_log.frame_status = kRtcpSenderFrameStatusSentToNetwork; |
| 177 sender_frame_log.rtp_timestamp = kRtpTimestamp; |
| 178 |
| 179 RtcpSenderLogMessage sender_log; |
| 180 sender_log.push_back(sender_frame_log); |
| 181 |
| 182 rtcp_sender_->SendRtcpFromRtpSender( |
| 183 RtcpSender::kRtcpSr | RtcpSender::kRtcpDlrr | RtcpSender::kRtcpSenderLog, |
| 184 &sender_info, |
| 185 &dlrr_rb, |
| 186 &sender_log); |
| 187 |
| 188 EXPECT_EQ(1, test_transport_.packet_count()); |
| 189 EXPECT_TRUE(sender_log.empty()); |
| 190 } |
| 191 |
| 192 TEST_F(RtcpSenderTest, RtcpSenderReporWithTooManyLogFrames) { |
| 193 RtcpSenderInfo sender_info; |
| 194 sender_info.ntp_seconds = kNtpHigh; |
| 195 sender_info.ntp_fraction = kNtpLow; |
| 196 sender_info.rtp_timestamp = kRtpTimestamp; |
| 197 sender_info.send_packet_count = kSendPacketCount; |
| 198 sender_info.send_octet_count = kSendOctetCount; |
| 199 |
| 200 // Sender report + c_name + sender log. |
| 201 TestRtcpPacketBuilder p; |
| 202 p.AddSr(kSendingSsrc, 0); |
| 203 p.AddSdesCname(kSendingSsrc, kCName); |
| 204 p.AddSenderLog(kSendingSsrc); |
| 205 |
| 206 for (int i = 0; i < 359; ++i) { |
| 207 p.AddSenderFrameLog(kRtcpSenderFrameStatusSentToNetwork, |
| 208 kRtpTimestamp + i * 90); |
| 209 } |
| 210 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); |
| 211 |
| 212 |
| 213 RtcpSenderLogMessage sender_log; |
| 214 for (int j = 0; j < 400; ++j) { |
| 215 RtcpSenderFrameLogMessage sender_frame_log; |
| 216 sender_frame_log.frame_status = kRtcpSenderFrameStatusSentToNetwork; |
| 217 sender_frame_log.rtp_timestamp = kRtpTimestamp + j * 90; |
| 218 sender_log.push_back(sender_frame_log); |
| 219 } |
| 220 |
| 221 rtcp_sender_->SendRtcpFromRtpSender( |
| 222 RtcpSender::kRtcpSr | RtcpSender::kRtcpSenderLog, |
| 223 &sender_info, |
| 224 NULL, |
| 225 &sender_log); |
| 226 |
| 227 EXPECT_EQ(1, test_transport_.packet_count()); |
| 228 EXPECT_EQ(41u, sender_log.size()); |
| 229 } |
| 230 |
153 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtr) { | 231 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtr) { |
154 // Receiver report with report block + c_name. | 232 // Receiver report with report block + c_name. |
155 TestRtcpPacketBuilder p; | 233 TestRtcpPacketBuilder p; |
156 p.AddRr(kSendingSsrc, 1); | 234 p.AddRr(kSendingSsrc, 1); |
157 p.AddRb(kMediaSsrc); | 235 p.AddRb(kMediaSsrc); |
158 p.AddSdesCname(kSendingSsrc, kCName); | 236 p.AddSdesCname(kSendingSsrc, kCName); |
159 p.AddXrHeader(kSendingSsrc); | 237 p.AddXrHeader(kSendingSsrc); |
160 p.AddXrRrtrBlock(); | 238 p.AddXrRrtrBlock(); |
161 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); | 239 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); |
162 | 240 |
163 RtcpReportBlock report_block; | 241 RtcpReportBlock report_block; |
164 // Initialize remote_ssrc to a "clearly illegal" value. | 242 // Initialize remote_ssrc to a "clearly illegal" value. |
165 report_block.remote_ssrc = 0xDEAD; | 243 report_block.remote_ssrc = 0xDEAD; |
166 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. | 244 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. |
167 report_block.fraction_lost = kLoss >> 24; | 245 report_block.fraction_lost = kLoss >> 24; |
168 report_block.cumulative_lost = kLoss; // 24 bits valid. | 246 report_block.cumulative_lost = kLoss; // 24 bits valid. |
169 report_block.extended_high_sequence_number = | 247 report_block.extended_high_sequence_number = kExtendedMax; |
170 kExtendedMax; | |
171 report_block.jitter = kTestJitter; | 248 report_block.jitter = kTestJitter; |
172 report_block.last_sr = kLastSr; | 249 report_block.last_sr = kLastSr; |
173 report_block.delay_since_last_sr = kDelayLastSr; | 250 report_block.delay_since_last_sr = kDelayLastSr; |
174 | 251 |
175 RtcpReceiverReferenceTimeReport rrtr; | 252 RtcpReceiverReferenceTimeReport rrtr; |
176 rrtr.ntp_seconds = kNtpHigh; | 253 rrtr.ntp_seconds = kNtpHigh; |
177 rrtr.ntp_fraction = kNtpLow; | 254 rrtr.ntp_fraction = kNtpLow; |
178 | 255 |
179 rtcp_sender_->SendRtcpFromRtpReceiver( | 256 rtcp_sender_->SendRtcpFromRtpReceiver( |
180 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr, | 257 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr, |
(...skipping 21 matching lines...) Expand all Loading... |
202 report_block.fraction_lost = kLoss >> 24; | 279 report_block.fraction_lost = kLoss >> 24; |
203 report_block.cumulative_lost = kLoss; // 24 bits valid. | 280 report_block.cumulative_lost = kLoss; // 24 bits valid. |
204 report_block.extended_high_sequence_number = kExtendedMax; | 281 report_block.extended_high_sequence_number = kExtendedMax; |
205 report_block.jitter = kTestJitter; | 282 report_block.jitter = kTestJitter; |
206 report_block.last_sr = kLastSr; | 283 report_block.last_sr = kLastSr; |
207 report_block.delay_since_last_sr = kDelayLastSr; | 284 report_block.delay_since_last_sr = kDelayLastSr; |
208 | 285 |
209 RtcpCastMessage cast_message(kMediaSsrc); | 286 RtcpCastMessage cast_message(kMediaSsrc); |
210 cast_message.ack_frame_id_ = kAckFrameId; | 287 cast_message.ack_frame_id_ = kAckFrameId; |
211 PacketIdSet missing_packets; | 288 PacketIdSet missing_packets; |
212 cast_message.missing_frames_and_packets_[ | 289 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; |
213 kLostFrameId] = missing_packets; | |
214 | 290 |
215 missing_packets.insert(kLostPacketId1); | 291 missing_packets.insert(kLostPacketId1); |
216 missing_packets.insert(kLostPacketId2); | 292 missing_packets.insert(kLostPacketId2); |
217 missing_packets.insert(kLostPacketId3); | 293 missing_packets.insert(kLostPacketId3); |
218 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = | 294 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = |
219 missing_packets; | 295 missing_packets; |
220 | 296 |
221 rtcp_sender_->SendRtcpFromRtpReceiver( | 297 rtcp_sender_->SendRtcpFromRtpReceiver( |
222 RtcpSender::kRtcpRr | RtcpSender::kRtcpCast, | 298 RtcpSender::kRtcpRr | RtcpSender::kRtcpCast, |
223 &report_block, | 299 &report_block, |
224 NULL, | 300 NULL, |
225 &cast_message, | 301 &cast_message, |
226 NULL); | 302 NULL); |
227 | 303 |
228 EXPECT_EQ(1, test_transport_.packet_count()); | 304 EXPECT_EQ(1, test_transport_.packet_count()); |
229 } | 305 } |
230 | 306 |
| 307 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtraAndCastMessage) { |
| 308 TestRtcpPacketBuilder p; |
| 309 p.AddRr(kSendingSsrc, 1); |
| 310 p.AddRb(kMediaSsrc); |
| 311 p.AddSdesCname(kSendingSsrc, kCName); |
| 312 p.AddXrHeader(kSendingSsrc); |
| 313 p.AddXrRrtrBlock(); |
| 314 p.AddCast(kSendingSsrc, kMediaSsrc); |
| 315 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); |
| 316 |
| 317 RtcpReportBlock report_block; |
| 318 // Initialize remote_ssrc to a "clearly illegal" value. |
| 319 report_block.remote_ssrc = 0xDEAD; |
| 320 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. |
| 321 report_block.fraction_lost = kLoss >> 24; |
| 322 report_block.cumulative_lost = kLoss; // 24 bits valid. |
| 323 report_block.extended_high_sequence_number = kExtendedMax; |
| 324 report_block.jitter = kTestJitter; |
| 325 report_block.last_sr = kLastSr; |
| 326 report_block.delay_since_last_sr = kDelayLastSr; |
| 327 |
| 328 RtcpReceiverReferenceTimeReport rrtr; |
| 329 rrtr.ntp_seconds = kNtpHigh; |
| 330 rrtr.ntp_fraction = kNtpLow; |
| 331 |
| 332 RtcpCastMessage cast_message(kMediaSsrc); |
| 333 cast_message.ack_frame_id_ = kAckFrameId; |
| 334 PacketIdSet missing_packets; |
| 335 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; |
| 336 |
| 337 missing_packets.insert(kLostPacketId1); |
| 338 missing_packets.insert(kLostPacketId2); |
| 339 missing_packets.insert(kLostPacketId3); |
| 340 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = |
| 341 missing_packets; |
| 342 |
| 343 rtcp_sender_->SendRtcpFromRtpReceiver( |
| 344 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr | RtcpSender::kRtcpCast, |
| 345 &report_block, |
| 346 &rrtr, |
| 347 &cast_message, |
| 348 NULL); |
| 349 |
| 350 EXPECT_EQ(1, test_transport_.packet_count()); |
| 351 } |
| 352 |
| 353 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { |
| 354 static const uint32 kTimeBaseMs = 12345678; |
| 355 static const uint32 kTimeDelayMs = 10; |
| 356 static const uint32 kDelayDeltaMs = 123; |
| 357 |
| 358 TestRtcpPacketBuilder p; |
| 359 p.AddRr(kSendingSsrc, 1); |
| 360 p.AddRb(kMediaSsrc); |
| 361 p.AddSdesCname(kSendingSsrc, kCName); |
| 362 p.AddXrHeader(kSendingSsrc); |
| 363 p.AddXrRrtrBlock(); |
| 364 p.AddCast(kSendingSsrc, kMediaSsrc); |
| 365 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); |
| 366 |
| 367 RtcpReportBlock report_block; |
| 368 // Initialize remote_ssrc to a "clearly illegal" value. |
| 369 report_block.remote_ssrc = 0xDEAD; |
| 370 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. |
| 371 report_block.fraction_lost = kLoss >> 24; |
| 372 report_block.cumulative_lost = kLoss; // 24 bits valid. |
| 373 report_block.extended_high_sequence_number = kExtendedMax; |
| 374 report_block.jitter = kTestJitter; |
| 375 report_block.last_sr = kLastSr; |
| 376 report_block.delay_since_last_sr = kDelayLastSr; |
| 377 |
| 378 RtcpReceiverReferenceTimeReport rrtr; |
| 379 rrtr.ntp_seconds = kNtpHigh; |
| 380 rrtr.ntp_fraction = kNtpLow; |
| 381 |
| 382 RtcpCastMessage cast_message(kMediaSsrc); |
| 383 cast_message.ack_frame_id_ = kAckFrameId; |
| 384 PacketIdSet missing_packets; |
| 385 cast_message.missing_frames_and_packets_[kLostFrameId] = missing_packets; |
| 386 |
| 387 missing_packets.insert(kLostPacketId1); |
| 388 missing_packets.insert(kLostPacketId2); |
| 389 missing_packets.insert(kLostPacketId3); |
| 390 cast_message.missing_frames_and_packets_[kFrameIdWithLostPackets] = |
| 391 missing_packets; |
| 392 |
| 393 // Test empty Log message. |
| 394 RtcpReceiverLogMessage receiver_log; |
| 395 |
| 396 rtcp_sender_->SendRtcpFromRtpReceiver( |
| 397 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr | RtcpSender::kRtcpCast | |
| 398 RtcpSender::kRtcpReceiverLog, |
| 399 &report_block, |
| 400 &rrtr, |
| 401 &cast_message, |
| 402 &receiver_log); |
| 403 |
| 404 base::SimpleTestTickClock testing_clock; |
| 405 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 406 |
| 407 p.AddReceiverLog(kSendingSsrc); |
| 408 p.AddReceiverFrameLog(kRtpTimestamp, 2, kTimeBaseMs); |
| 409 p.AddReceiverEventLog(kDelayDeltaMs, 1, 0); |
| 410 p.AddReceiverEventLog(kLostPacketId1, 6, kTimeDelayMs); |
| 411 |
| 412 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); |
| 413 |
| 414 RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp); |
| 415 RtcpReceiverEventLogMessage event_log; |
| 416 |
| 417 event_log.type = kAckSent; |
| 418 event_log.event_timestamp = testing_clock.NowTicks(); |
| 419 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); |
| 420 frame_log.event_log_messages.push_back(event_log); |
| 421 |
| 422 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 423 event_log.type = kPacketReceived; |
| 424 event_log.event_timestamp = testing_clock.NowTicks(); |
| 425 event_log.packet_id = kLostPacketId1; |
| 426 frame_log.event_log_messages.push_back(event_log); |
| 427 |
| 428 receiver_log.push_back(frame_log); |
| 429 |
| 430 rtcp_sender_->SendRtcpFromRtpReceiver( |
| 431 RtcpSender::kRtcpRr | RtcpSender::kRtcpRrtr | RtcpSender::kRtcpCast | |
| 432 RtcpSender::kRtcpReceiverLog, |
| 433 &report_block, |
| 434 &rrtr, |
| 435 &cast_message, |
| 436 &receiver_log); |
| 437 |
| 438 EXPECT_TRUE(receiver_log.empty()); |
| 439 EXPECT_EQ(2, test_transport_.packet_count()); |
| 440 } |
| 441 |
| 442 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { |
| 443 static const uint32 kTimeBaseMs = 12345678; |
| 444 static const uint32 kTimeDelayMs = 10; |
| 445 static const uint32 kDelayDeltaMs = 123; |
| 446 |
| 447 TestRtcpPacketBuilder p; |
| 448 p.AddRr(kSendingSsrc, 1); |
| 449 p.AddRb(kMediaSsrc); |
| 450 p.AddSdesCname(kSendingSsrc, kCName); |
| 451 |
| 452 RtcpReportBlock report_block; |
| 453 // Initialize remote_ssrc to a "clearly illegal" value. |
| 454 report_block.remote_ssrc = 0xDEAD; |
| 455 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. |
| 456 report_block.fraction_lost = kLoss >> 24; |
| 457 report_block.cumulative_lost = kLoss; // 24 bits valid. |
| 458 report_block.extended_high_sequence_number = kExtendedMax; |
| 459 report_block.jitter = kTestJitter; |
| 460 report_block.last_sr = kLastSr; |
| 461 report_block.delay_since_last_sr = kDelayLastSr; |
| 462 |
| 463 base::SimpleTestTickClock testing_clock; |
| 464 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 465 |
| 466 p.AddReceiverLog(kSendingSsrc); |
| 467 |
| 468 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs); |
| 469 p.AddReceiverEventLog(kDelayDeltaMs, 1, 0); |
| 470 p.AddReceiverFrameLog(kRtpTimestamp + 2345, |
| 471 kRtcpMaxReceiverLogMessages, kTimeBaseMs); |
| 472 |
| 473 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { |
| 474 p.AddReceiverEventLog(kLostPacketId1, 6, kTimeDelayMs * i); |
| 475 } |
| 476 |
| 477 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); |
| 478 |
| 479 RtcpReceiverFrameLogMessage frame_1_log(kRtpTimestamp); |
| 480 RtcpReceiverEventLogMessage event_log; |
| 481 |
| 482 event_log.type = kAckSent; |
| 483 event_log.event_timestamp = testing_clock.NowTicks(); |
| 484 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); |
| 485 frame_1_log.event_log_messages.push_back(event_log); |
| 486 |
| 487 RtcpReceiverLogMessage receiver_log; |
| 488 receiver_log.push_back(frame_1_log); |
| 489 |
| 490 RtcpReceiverFrameLogMessage frame_2_log(kRtpTimestamp + 2345); |
| 491 |
| 492 for (int j = 0; j < 300; ++j) { |
| 493 event_log.type = kPacketReceived; |
| 494 event_log.event_timestamp = testing_clock.NowTicks(); |
| 495 event_log.packet_id = kLostPacketId1; |
| 496 frame_2_log.event_log_messages.push_back(event_log); |
| 497 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 498 } |
| 499 receiver_log.push_back(frame_2_log); |
| 500 |
| 501 rtcp_sender_->SendRtcpFromRtpReceiver( |
| 502 RtcpSender::kRtcpRr | RtcpSender::kRtcpReceiverLog, |
| 503 &report_block, |
| 504 NULL, |
| 505 NULL, |
| 506 &receiver_log); |
| 507 |
| 508 EXPECT_EQ(1, test_transport_.packet_count()); |
| 509 EXPECT_EQ(1u, receiver_log.size()); |
| 510 EXPECT_EQ(300u - kRtcpMaxReceiverLogMessages, |
| 511 receiver_log.front().event_log_messages.size()); |
| 512 } |
| 513 |
| 514 TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { |
| 515 static const uint32 kTimeBaseMs = 12345678; |
| 516 static const uint32 kTimeDelayMs = 10; |
| 517 static const uint32 kDelayDeltaMs = 123; |
| 518 |
| 519 TestRtcpPacketBuilder p; |
| 520 p.AddRr(kSendingSsrc, 1); |
| 521 p.AddRb(kMediaSsrc); |
| 522 p.AddSdesCname(kSendingSsrc, kCName); |
| 523 |
| 524 RtcpReportBlock report_block; |
| 525 // Initialize remote_ssrc to a "clearly illegal" value. |
| 526 report_block.remote_ssrc = 0xDEAD; |
| 527 report_block.media_ssrc = kMediaSsrc; // SSRC of the RTP packet sender. |
| 528 report_block.fraction_lost = kLoss >> 24; |
| 529 report_block.cumulative_lost = kLoss; // 24 bits valid. |
| 530 report_block.extended_high_sequence_number = kExtendedMax; |
| 531 report_block.jitter = kTestJitter; |
| 532 report_block.last_sr = kLastSr; |
| 533 report_block.delay_since_last_sr = kDelayLastSr; |
| 534 |
| 535 base::SimpleTestTickClock testing_clock; |
| 536 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 537 |
| 538 p.AddReceiverLog(kSendingSsrc); |
| 539 |
| 540 for (int i = 0; i < 119; ++i) { |
| 541 p.AddReceiverFrameLog(kRtpTimestamp, 1, kTimeBaseMs + i * kTimeDelayMs); |
| 542 p.AddReceiverEventLog(kDelayDeltaMs, 1, 0); |
| 543 } |
| 544 test_transport_.SetExpectedRtcpPacket(p.Packet(), p.Length()); |
| 545 |
| 546 RtcpReceiverLogMessage receiver_log; |
| 547 |
| 548 for (int j = 0; j < 200; ++j) { |
| 549 RtcpReceiverFrameLogMessage frame_log(kRtpTimestamp); |
| 550 RtcpReceiverEventLogMessage event_log; |
| 551 |
| 552 event_log.type = kAckSent; |
| 553 event_log.event_timestamp = testing_clock.NowTicks(); |
| 554 event_log.delay_delta = base::TimeDelta::FromMilliseconds(kDelayDeltaMs); |
| 555 frame_log.event_log_messages.push_back(event_log); |
| 556 receiver_log.push_back(frame_log); |
| 557 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 558 } |
| 559 rtcp_sender_->SendRtcpFromRtpReceiver( |
| 560 RtcpSender::kRtcpRr | RtcpSender::kRtcpReceiverLog, |
| 561 &report_block, |
| 562 NULL, |
| 563 NULL, |
| 564 &receiver_log); |
| 565 |
| 566 EXPECT_EQ(1, test_transport_.packet_count()); |
| 567 EXPECT_EQ(81u, receiver_log.size()); |
| 568 } |
| 569 |
231 } // namespace cast | 570 } // namespace cast |
232 } // namespace media | 571 } // namespace media |
OLD | NEW |