1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #include <assert.h> 11 12 #include <algorithm> 13 #include <map> 14 #include <sstream> 15 #include <string> 16 17 #include "testing/gtest/include/gtest/gtest.h" 18 19 #include "webrtc/call.h" 20 #include "webrtc/frame_callback.h" 21 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" 22 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 23 #include "webrtc/system_wrappers/interface/event_wrapper.h" 24 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 25 #include "webrtc/system_wrappers/interface/sleep.h" 26 #include "webrtc/test/call_test.h" 27 #include "webrtc/test/direct_transport.h" 28 #include "webrtc/test/encoder_settings.h" 29 #include "webrtc/test/fake_audio_device.h" 30 #include "webrtc/test/fake_decoder.h" 31 #include "webrtc/test/fake_encoder.h" 32 #include "webrtc/test/frame_generator.h" 33 #include "webrtc/test/frame_generator_capturer.h" 34 #include "webrtc/test/null_transport.h" 35 #include "webrtc/test/rtp_rtcp_observer.h" 36 #include "webrtc/test/testsupport/fileutils.h" 37 #include "webrtc/test/testsupport/gtest_disable.h" 38 #include "webrtc/test/testsupport/perf_test.h" 39 #include "webrtc/video/transport_adapter.h" 40 #include "webrtc/video_encoder.h" 41 42 namespace webrtc { 43 44 static const unsigned long kSilenceTimeoutMs = 2000; 45 46 class EndToEndTest : public test::CallTest { 47 public: 48 EndToEndTest() {} 49 50 virtual ~EndToEndTest() { 51 EXPECT_EQ(NULL, send_stream_); 52 EXPECT_TRUE(receive_streams_.empty()); 53 } 54 55 protected: 56 class UnusedTransport : public newapi::Transport { 57 private: 58 virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE { 59 ADD_FAILURE() << "Unexpected RTP sent."; 60 return false; 61 } 62 63 virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE { 64 ADD_FAILURE() << "Unexpected RTCP sent."; 65 return false; 66 } 67 }; 68 69 void DecodesRetransmittedFrame(bool retransmit_over_rtx); 70 void ReceivesPliAndRecovers(int rtp_history_ms); 71 void RespectsRtcpMode(newapi::RtcpMode rtcp_mode); 72 void TestXrReceiverReferenceTimeReport(bool enable_rrtr); 73 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first); 74 void TestRtpStatePreservation(bool use_rtx); 75 }; 76 77 TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) { 78 test::NullTransport transport; 79 CreateCalls(Call::Config(&transport), Call::Config(&transport)); 80 81 CreateSendConfig(1); 82 CreateMatchingReceiveConfigs(); 83 84 CreateStreams(); 85 86 receive_streams_[0]->Start(); 87 receive_streams_[0]->Start(); 88 89 DestroyStreams(); 90 } 91 92 TEST_F(EndToEndTest, ReceiverCanBeStoppedTwice) { 93 test::NullTransport transport; 94 CreateCalls(Call::Config(&transport), Call::Config(&transport)); 95 96 CreateSendConfig(1); 97 CreateMatchingReceiveConfigs(); 98 99 CreateStreams(); 100 101 receive_streams_[0]->Stop(); 102 receive_streams_[0]->Stop(); 103 104 DestroyStreams(); 105 } 106 107 TEST_F(EndToEndTest, RendersSingleDelayedFrame) { 108 static const int kWidth = 320; 109 static const int kHeight = 240; 110 // This constant is chosen to be higher than the timeout in the video_render 111 // module. This makes sure that frames aren't dropped if there are no other 112 // frames in the queue. 113 static const int kDelayRenderCallbackMs = 1000; 114 115 class Renderer : public VideoRenderer { 116 public: 117 Renderer() : event_(EventWrapper::Create()) {} 118 119 virtual void RenderFrame(const I420VideoFrame& video_frame, 120 int /*time_to_render_ms*/) OVERRIDE { 121 event_->Set(); 122 } 123 124 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } 125 126 scoped_ptr<EventWrapper> event_; 127 } renderer; 128 129 class TestFrameCallback : public I420FrameCallback { 130 public: 131 TestFrameCallback() : event_(EventWrapper::Create()) {} 132 133 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } 134 135 private: 136 virtual void FrameCallback(I420VideoFrame* frame) OVERRIDE { 137 SleepMs(kDelayRenderCallbackMs); 138 event_->Set(); 139 } 140 141 scoped_ptr<EventWrapper> event_; 142 }; 143 144 test::DirectTransport sender_transport, receiver_transport; 145 146 CreateCalls(Call::Config(&sender_transport), 147 Call::Config(&receiver_transport)); 148 149 sender_transport.SetReceiver(receiver_call_->Receiver()); 150 receiver_transport.SetReceiver(sender_call_->Receiver()); 151 152 CreateSendConfig(1); 153 CreateMatchingReceiveConfigs(); 154 155 TestFrameCallback pre_render_callback; 156 receive_configs_[0].pre_render_callback = &pre_render_callback; 157 receive_configs_[0].renderer = &renderer; 158 159 CreateStreams(); 160 Start(); 161 162 // Create frames that are smaller than the send width/height, this is done to 163 // check that the callbacks are done after processing video. 164 scoped_ptr<test::FrameGenerator> frame_generator( 165 test::FrameGenerator::Create(kWidth, kHeight)); 166 send_stream_->Input()->SwapFrame(frame_generator->NextFrame()); 167 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait()) 168 << "Timed out while waiting for pre-render callback."; 169 EXPECT_EQ(kEventSignaled, renderer.Wait()) 170 << "Timed out while waiting for the frame to render."; 171 172 Stop(); 173 174 sender_transport.StopSending(); 175 receiver_transport.StopSending(); 176 177 DestroyStreams(); 178 } 179 180 TEST_F(EndToEndTest, TransmitsFirstFrame) { 181 class Renderer : public VideoRenderer { 182 public: 183 Renderer() : event_(EventWrapper::Create()) {} 184 185 virtual void RenderFrame(const I420VideoFrame& video_frame, 186 int /*time_to_render_ms*/) OVERRIDE { 187 event_->Set(); 188 } 189 190 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } 191 192 scoped_ptr<EventWrapper> event_; 193 } renderer; 194 195 test::DirectTransport sender_transport, receiver_transport; 196 197 CreateCalls(Call::Config(&sender_transport), 198 Call::Config(&receiver_transport)); 199 200 sender_transport.SetReceiver(receiver_call_->Receiver()); 201 receiver_transport.SetReceiver(sender_call_->Receiver()); 202 203 CreateSendConfig(1); 204 CreateMatchingReceiveConfigs(); 205 receive_configs_[0].renderer = &renderer; 206 207 CreateStreams(); 208 Start(); 209 210 scoped_ptr<test::FrameGenerator> frame_generator(test::FrameGenerator::Create( 211 encoder_config_.streams[0].width, encoder_config_.streams[0].height)); 212 send_stream_->Input()->SwapFrame(frame_generator->NextFrame()); 213 214 EXPECT_EQ(kEventSignaled, renderer.Wait()) 215 << "Timed out while waiting for the frame to render."; 216 217 Stop(); 218 219 sender_transport.StopSending(); 220 receiver_transport.StopSending(); 221 222 DestroyStreams(); 223 } 224 225 TEST_F(EndToEndTest, SendsAndReceivesH264) { 226 class H264Observer : public test::EndToEndTest, public VideoRenderer { 227 public: 228 H264Observer() 229 : EndToEndTest(2 * kDefaultTimeoutMs), 230 fake_encoder_(Clock::GetRealTimeClock()), 231 frame_counter_(0) {} 232 233 virtual void PerformTest() OVERRIDE { 234 EXPECT_EQ(kEventSignaled, Wait()) 235 << "Timed out while waiting for enough frames to be decoded."; 236 } 237 238 virtual void ModifyConfigs( 239 VideoSendStream::Config* send_config, 240 std::vector<VideoReceiveStream::Config>* receive_configs, 241 VideoEncoderConfig* encoder_config) OVERRIDE { 242 send_config->encoder_settings.encoder = &fake_encoder_; 243 send_config->encoder_settings.payload_name = "H264"; 244 send_config->encoder_settings.payload_type = kFakeSendPayloadType; 245 encoder_config->streams[0].min_bitrate_bps = 50000; 246 encoder_config->streams[0].target_bitrate_bps = 247 encoder_config->streams[0].max_bitrate_bps = 2000000; 248 249 (*receive_configs)[0].renderer = this; 250 VideoCodec codec = 251 test::CreateDecoderVideoCodec(send_config->encoder_settings); 252 (*receive_configs)[0].codecs.resize(1); 253 (*receive_configs)[0].codecs[0] = codec; 254 (*receive_configs)[0].external_decoders.resize(1); 255 (*receive_configs)[0].external_decoders[0].payload_type = 256 send_config->encoder_settings.payload_type; 257 (*receive_configs)[0].external_decoders[0].decoder = &fake_decoder_; 258 } 259 260 virtual void RenderFrame(const I420VideoFrame& video_frame, 261 int time_to_render_ms) OVERRIDE { 262 const int kRequiredFrames = 500; 263 if (++frame_counter_ == kRequiredFrames) 264 observation_complete_->Set(); 265 } 266 267 private: 268 test::FakeH264Decoder fake_decoder_; 269 test::FakeH264Encoder fake_encoder_; 270 int frame_counter_; 271 } test; 272 273 RunBaseTest(&test); 274 } 275 276 TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) { 277 class SyncRtcpObserver : public test::EndToEndTest { 278 public: 279 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {} 280 281 virtual Action OnReceiveRtcp(const uint8_t* packet, 282 size_t length) OVERRIDE { 283 RTCPUtility::RTCPParserV2 parser(packet, length, true); 284 EXPECT_TRUE(parser.IsValid()); 285 uint32_t ssrc = 0; 286 ssrc |= static_cast<uint32_t>(packet[4]) << 24; 287 ssrc |= static_cast<uint32_t>(packet[5]) << 16; 288 ssrc |= static_cast<uint32_t>(packet[6]) << 8; 289 ssrc |= static_cast<uint32_t>(packet[7]) << 0; 290 EXPECT_EQ(kReceiverLocalSsrc, ssrc); 291 observation_complete_->Set(); 292 293 return SEND_PACKET; 294 } 295 296 virtual void PerformTest() OVERRIDE { 297 EXPECT_EQ(kEventSignaled, Wait()) 298 << "Timed out while waiting for a receiver RTCP packet to be sent."; 299 } 300 } test; 301 302 RunBaseTest(&test); 303 } 304 305 TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) { 306 static const int kNumberOfNacksToObserve = 2; 307 static const int kLossBurstSize = 2; 308 static const int kPacketsBetweenLossBursts = 9; 309 class NackObserver : public test::EndToEndTest { 310 public: 311 NackObserver() 312 : EndToEndTest(kLongTimeoutMs), 313 rtp_parser_(RtpHeaderParser::Create()), 314 sent_rtp_packets_(0), 315 packets_left_to_drop_(0), 316 nacks_left_(kNumberOfNacksToObserve) {} 317 318 private: 319 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 320 RTPHeader header; 321 EXPECT_TRUE(rtp_parser_->Parse(packet, length, &header)); 322 323 // Never drop retransmitted packets. 324 if (dropped_packets_.find(header.sequenceNumber) != 325 dropped_packets_.end()) { 326 retransmitted_packets_.insert(header.sequenceNumber); 327 if (nacks_left_ == 0 && 328 retransmitted_packets_.size() == dropped_packets_.size()) { 329 observation_complete_->Set(); 330 } 331 return SEND_PACKET; 332 } 333 334 ++sent_rtp_packets_; 335 336 // Enough NACKs received, stop dropping packets. 337 if (nacks_left_ == 0) 338 return SEND_PACKET; 339 340 // Check if it's time for a new loss burst. 341 if (sent_rtp_packets_ % kPacketsBetweenLossBursts == 0) 342 packets_left_to_drop_ = kLossBurstSize; 343 344 if (packets_left_to_drop_ > 0) { 345 --packets_left_to_drop_; 346 dropped_packets_.insert(header.sequenceNumber); 347 return DROP_PACKET; 348 } 349 350 return SEND_PACKET; 351 } 352 353 virtual Action OnReceiveRtcp(const uint8_t* packet, 354 size_t length) OVERRIDE { 355 RTCPUtility::RTCPParserV2 parser(packet, length, true); 356 EXPECT_TRUE(parser.IsValid()); 357 358 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 359 while (packet_type != RTCPUtility::kRtcpNotValidCode) { 360 if (packet_type == RTCPUtility::kRtcpRtpfbNackCode) { 361 --nacks_left_; 362 break; 363 } 364 packet_type = parser.Iterate(); 365 } 366 return SEND_PACKET; 367 } 368 369 virtual void ModifyConfigs( 370 VideoSendStream::Config* send_config, 371 std::vector<VideoReceiveStream::Config>* receive_configs, 372 VideoEncoderConfig* encoder_config) OVERRIDE { 373 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 374 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 375 } 376 377 virtual void PerformTest() OVERRIDE { 378 EXPECT_EQ(kEventSignaled, Wait()) 379 << "Timed out waiting for packets to be NACKed, retransmitted and " 380 "rendered."; 381 } 382 383 scoped_ptr<RtpHeaderParser> rtp_parser_; 384 std::set<uint16_t> dropped_packets_; 385 std::set<uint16_t> retransmitted_packets_; 386 uint64_t sent_rtp_packets_; 387 int packets_left_to_drop_; 388 int nacks_left_; 389 } test; 390 391 RunBaseTest(&test); 392 } 393 394 // TODO(pbos): Flaky, webrtc:3269 395 TEST_F(EndToEndTest, DISABLED_CanReceiveFec) { 396 class FecRenderObserver : public test::EndToEndTest, public VideoRenderer { 397 public: 398 FecRenderObserver() 399 : EndToEndTest(kDefaultTimeoutMs), 400 state_(kFirstPacket), 401 protected_sequence_number_(0), 402 protected_frame_timestamp_(0) {} 403 404 private: 405 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE 406 EXCLUSIVE_LOCKS_REQUIRED(crit_) { 407 RTPHeader header; 408 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 409 410 EXPECT_EQ(kRedPayloadType, header.payloadType); 411 int encapsulated_payload_type = 412 static_cast<int>(packet[header.headerLength]); 413 if (encapsulated_payload_type != kFakeSendPayloadType) 414 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type); 415 416 switch (state_) { 417 case kFirstPacket: 418 state_ = kDropEveryOtherPacketUntilFec; 419 break; 420 case kDropEveryOtherPacketUntilFec: 421 if (encapsulated_payload_type == kUlpfecPayloadType) { 422 state_ = kDropNextMediaPacket; 423 return SEND_PACKET; 424 } 425 if (header.sequenceNumber % 2 == 0) 426 return DROP_PACKET; 427 break; 428 case kDropNextMediaPacket: 429 if (encapsulated_payload_type == kFakeSendPayloadType) { 430 protected_sequence_number_ = header.sequenceNumber; 431 protected_frame_timestamp_ = header.timestamp; 432 state_ = kProtectedPacketDropped; 433 return DROP_PACKET; 434 } 435 break; 436 case kProtectedPacketDropped: 437 EXPECT_NE(header.sequenceNumber, protected_sequence_number_) 438 << "Protected packet retransmitted. Should not happen with FEC."; 439 break; 440 } 441 442 return SEND_PACKET; 443 } 444 445 virtual void RenderFrame(const I420VideoFrame& video_frame, 446 int time_to_render_ms) OVERRIDE { 447 CriticalSectionScoped lock(crit_.get()); 448 // Rendering frame with timestamp associated with dropped packet -> FEC 449 // protection worked. 450 if (state_ == kProtectedPacketDropped && 451 video_frame.timestamp() == protected_frame_timestamp_) { 452 observation_complete_->Set(); 453 } 454 } 455 456 enum { 457 kFirstPacket, 458 kDropEveryOtherPacketUntilFec, 459 kDropNextMediaPacket, 460 kProtectedPacketDropped, 461 } state_; 462 463 virtual void ModifyConfigs( 464 VideoSendStream::Config* send_config, 465 std::vector<VideoReceiveStream::Config>* receive_configs, 466 VideoEncoderConfig* encoder_config) OVERRIDE { 467 // TODO(pbos): Run this test with combined NACK/FEC enabled as well. 468 // int rtp_history_ms = 1000; 469 // (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms; 470 // send_config->rtp.nack.rtp_history_ms = rtp_history_ms; 471 send_config->rtp.fec.red_payload_type = kRedPayloadType; 472 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 473 474 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType; 475 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 476 (*receive_configs)[0].renderer = this; 477 } 478 479 virtual void PerformTest() OVERRIDE { 480 EXPECT_EQ(kEventSignaled, Wait()) 481 << "Timed out while waiting for retransmitted NACKed frames to be " 482 "rendered again."; 483 } 484 485 uint32_t protected_sequence_number_ GUARDED_BY(crit_); 486 uint32_t protected_frame_timestamp_ GUARDED_BY(crit_); 487 } test; 488 489 RunBaseTest(&test); 490 } 491 492 // This test drops second RTP packet with a marker bit set, makes sure it's 493 // retransmitted and renders. Retransmission SSRCs are also checked. 494 void EndToEndTest::DecodesRetransmittedFrame(bool retransmit_over_rtx) { 495 static const int kDroppedFrameNumber = 2; 496 class RetransmissionObserver : public test::EndToEndTest, 497 public I420FrameCallback { 498 public: 499 explicit RetransmissionObserver(bool expect_rtx) 500 : EndToEndTest(kDefaultTimeoutMs), 501 retransmission_ssrc_(expect_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]), 502 retransmission_payload_type_(expect_rtx ? kSendRtxPayloadType 503 : kFakeSendPayloadType), 504 marker_bits_observed_(0), 505 retransmitted_timestamp_(0), 506 frame_retransmitted_(false) {} 507 508 private: 509 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 510 RTPHeader header; 511 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 512 513 if (header.timestamp == retransmitted_timestamp_) { 514 EXPECT_EQ(retransmission_ssrc_, header.ssrc); 515 EXPECT_EQ(retransmission_payload_type_, header.payloadType); 516 frame_retransmitted_ = true; 517 return SEND_PACKET; 518 } 519 520 EXPECT_EQ(kSendSsrcs[0], header.ssrc); 521 EXPECT_EQ(kFakeSendPayloadType, header.payloadType); 522 523 // Found the second frame's final packet, drop this and expect a 524 // retransmission. 525 if (header.markerBit && ++marker_bits_observed_ == kDroppedFrameNumber) { 526 retransmitted_timestamp_ = header.timestamp; 527 return DROP_PACKET; 528 } 529 530 return SEND_PACKET; 531 } 532 533 virtual void FrameCallback(I420VideoFrame* frame) OVERRIDE { 534 CriticalSectionScoped lock(crit_.get()); 535 if (frame->timestamp() == retransmitted_timestamp_) { 536 EXPECT_TRUE(frame_retransmitted_); 537 observation_complete_->Set(); 538 } 539 } 540 541 virtual void ModifyConfigs( 542 VideoSendStream::Config* send_config, 543 std::vector<VideoReceiveStream::Config>* receive_configs, 544 VideoEncoderConfig* encoder_config) OVERRIDE { 545 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 546 (*receive_configs)[0].pre_render_callback = this; 547 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 548 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) { 549 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]); 550 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; 551 (*receive_configs)[0].rtp.rtx[kSendRtxPayloadType].ssrc = 552 kSendRtxSsrcs[0]; 553 (*receive_configs)[0].rtp.rtx[kSendRtxPayloadType].payload_type = 554 kSendRtxPayloadType; 555 } 556 } 557 558 virtual void PerformTest() OVERRIDE { 559 EXPECT_EQ(kEventSignaled, Wait()) 560 << "Timed out while waiting for retransmission to render."; 561 } 562 563 const uint32_t retransmission_ssrc_; 564 const int retransmission_payload_type_; 565 int marker_bits_observed_; 566 uint32_t retransmitted_timestamp_; 567 bool frame_retransmitted_; 568 } test(retransmit_over_rtx); 569 570 RunBaseTest(&test); 571 } 572 573 TEST_F(EndToEndTest, DecodesRetransmittedFrame) { 574 DecodesRetransmittedFrame(false); 575 } 576 577 TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) { 578 DecodesRetransmittedFrame(true); 579 } 580 581 TEST_F(EndToEndTest, UsesFrameCallbacks) { 582 static const int kWidth = 320; 583 static const int kHeight = 240; 584 585 class Renderer : public VideoRenderer { 586 public: 587 Renderer() : event_(EventWrapper::Create()) {} 588 589 virtual void RenderFrame(const I420VideoFrame& video_frame, 590 int /*time_to_render_ms*/) OVERRIDE { 591 EXPECT_EQ(0, *video_frame.buffer(kYPlane)) 592 << "Rendered frame should have zero luma which is applied by the " 593 "pre-render callback."; 594 event_->Set(); 595 } 596 597 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } 598 scoped_ptr<EventWrapper> event_; 599 } renderer; 600 601 class TestFrameCallback : public I420FrameCallback { 602 public: 603 TestFrameCallback(int expected_luma_byte, int next_luma_byte) 604 : event_(EventWrapper::Create()), 605 expected_luma_byte_(expected_luma_byte), 606 next_luma_byte_(next_luma_byte) {} 607 608 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); } 609 610 private: 611 virtual void FrameCallback(I420VideoFrame* frame) { 612 EXPECT_EQ(kWidth, frame->width()) 613 << "Width not as expected, callback done before resize?"; 614 EXPECT_EQ(kHeight, frame->height()) 615 << "Height not as expected, callback done before resize?"; 616 617 // Previous luma specified, observed luma should be fairly close. 618 if (expected_luma_byte_ != -1) { 619 EXPECT_NEAR(expected_luma_byte_, *frame->buffer(kYPlane), 10); 620 } 621 622 memset(frame->buffer(kYPlane), 623 next_luma_byte_, 624 frame->allocated_size(kYPlane)); 625 626 event_->Set(); 627 } 628 629 scoped_ptr<EventWrapper> event_; 630 int expected_luma_byte_; 631 int next_luma_byte_; 632 }; 633 634 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255. 635 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0. 636 637 test::DirectTransport sender_transport, receiver_transport; 638 639 CreateCalls(Call::Config(&sender_transport), 640 Call::Config(&receiver_transport)); 641 642 sender_transport.SetReceiver(receiver_call_->Receiver()); 643 receiver_transport.SetReceiver(sender_call_->Receiver()); 644 645 CreateSendConfig(1); 646 scoped_ptr<VideoEncoder> encoder( 647 VideoEncoder::Create(VideoEncoder::kVp8)); 648 send_config_.encoder_settings.encoder = encoder.get(); 649 send_config_.encoder_settings.payload_name = "VP8"; 650 ASSERT_EQ(1u, encoder_config_.streams.size()) << "Test setup error."; 651 encoder_config_.streams[0].width = kWidth; 652 encoder_config_.streams[0].height = kHeight; 653 send_config_.pre_encode_callback = &pre_encode_callback; 654 655 CreateMatchingReceiveConfigs(); 656 receive_configs_[0].pre_render_callback = &pre_render_callback; 657 receive_configs_[0].renderer = &renderer; 658 659 CreateStreams(); 660 Start(); 661 662 // Create frames that are smaller than the send width/height, this is done to 663 // check that the callbacks are done after processing video. 664 scoped_ptr<test::FrameGenerator> frame_generator( 665 test::FrameGenerator::Create(kWidth / 2, kHeight / 2)); 666 send_stream_->Input()->SwapFrame(frame_generator->NextFrame()); 667 668 EXPECT_EQ(kEventSignaled, pre_encode_callback.Wait()) 669 << "Timed out while waiting for pre-encode callback."; 670 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait()) 671 << "Timed out while waiting for pre-render callback."; 672 EXPECT_EQ(kEventSignaled, renderer.Wait()) 673 << "Timed out while waiting for the frame to render."; 674 675 Stop(); 676 677 sender_transport.StopSending(); 678 receiver_transport.StopSending(); 679 680 DestroyStreams(); 681 } 682 683 void EndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) { 684 static const int kPacketsToDrop = 1; 685 686 class PliObserver : public test::EndToEndTest, public VideoRenderer { 687 public: 688 explicit PliObserver(int rtp_history_ms) 689 : EndToEndTest(kLongTimeoutMs), 690 rtp_history_ms_(rtp_history_ms), 691 nack_enabled_(rtp_history_ms > 0), 692 highest_dropped_timestamp_(0), 693 frames_to_drop_(0), 694 received_pli_(false) {} 695 696 private: 697 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 698 RTPHeader header; 699 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 700 701 // Drop all retransmitted packets to force a PLI. 702 if (header.timestamp <= highest_dropped_timestamp_) 703 return DROP_PACKET; 704 705 if (frames_to_drop_ > 0) { 706 highest_dropped_timestamp_ = header.timestamp; 707 --frames_to_drop_; 708 return DROP_PACKET; 709 } 710 711 return SEND_PACKET; 712 } 713 714 virtual Action OnReceiveRtcp(const uint8_t* packet, 715 size_t length) OVERRIDE { 716 RTCPUtility::RTCPParserV2 parser(packet, length, true); 717 EXPECT_TRUE(parser.IsValid()); 718 719 for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 720 packet_type != RTCPUtility::kRtcpNotValidCode; 721 packet_type = parser.Iterate()) { 722 if (!nack_enabled_) 723 EXPECT_NE(packet_type, RTCPUtility::kRtcpRtpfbNackCode); 724 725 if (packet_type == RTCPUtility::kRtcpPsfbPliCode) { 726 received_pli_ = true; 727 break; 728 } 729 } 730 return SEND_PACKET; 731 } 732 733 virtual void RenderFrame(const I420VideoFrame& video_frame, 734 int time_to_render_ms) OVERRIDE { 735 CriticalSectionScoped lock(crit_.get()); 736 if (received_pli_ && 737 video_frame.timestamp() > highest_dropped_timestamp_) { 738 observation_complete_->Set(); 739 } 740 if (!received_pli_) 741 frames_to_drop_ = kPacketsToDrop; 742 } 743 744 virtual void ModifyConfigs( 745 VideoSendStream::Config* send_config, 746 std::vector<VideoReceiveStream::Config>* receive_configs, 747 VideoEncoderConfig* encoder_config) OVERRIDE { 748 send_config->rtp.nack.rtp_history_ms = rtp_history_ms_; 749 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_; 750 (*receive_configs)[0].renderer = this; 751 } 752 753 virtual void PerformTest() OVERRIDE { 754 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out waiting for PLI to be " 755 "received and a frame to be " 756 "rendered afterwards."; 757 } 758 759 int rtp_history_ms_; 760 bool nack_enabled_; 761 uint32_t highest_dropped_timestamp_; 762 int frames_to_drop_; 763 bool received_pli_; 764 } test(rtp_history_ms); 765 766 RunBaseTest(&test); 767 } 768 769 TEST_F(EndToEndTest, ReceivesPliAndRecoversWithNack) { 770 ReceivesPliAndRecovers(1000); 771 } 772 773 // TODO(pbos): Enable this when 2250 is resolved. 774 TEST_F(EndToEndTest, DISABLED_ReceivesPliAndRecoversWithoutNack) { 775 ReceivesPliAndRecovers(0); 776 } 777 778 TEST_F(EndToEndTest, UnknownRtpPacketGivesUnknownSsrcReturnCode) { 779 class PacketInputObserver : public PacketReceiver { 780 public: 781 explicit PacketInputObserver(PacketReceiver* receiver) 782 : receiver_(receiver), delivered_packet_(EventWrapper::Create()) {} 783 784 EventTypeWrapper Wait() { 785 return delivered_packet_->Wait(kDefaultTimeoutMs); 786 } 787 788 private: 789 virtual DeliveryStatus DeliverPacket(const uint8_t* packet, 790 size_t length) OVERRIDE { 791 if (RtpHeaderParser::IsRtcp(packet, length)) { 792 return receiver_->DeliverPacket(packet, length); 793 } else { 794 DeliveryStatus delivery_status = 795 receiver_->DeliverPacket(packet, length); 796 EXPECT_EQ(DELIVERY_UNKNOWN_SSRC, delivery_status); 797 delivered_packet_->Set(); 798 return delivery_status; 799 } 800 } 801 802 PacketReceiver* receiver_; 803 scoped_ptr<EventWrapper> delivered_packet_; 804 }; 805 806 test::DirectTransport send_transport, receive_transport; 807 808 CreateCalls(Call::Config(&send_transport), Call::Config(&receive_transport)); 809 PacketInputObserver input_observer(receiver_call_->Receiver()); 810 811 send_transport.SetReceiver(&input_observer); 812 receive_transport.SetReceiver(sender_call_->Receiver()); 813 814 CreateSendConfig(1); 815 CreateMatchingReceiveConfigs(); 816 817 CreateStreams(); 818 CreateFrameGeneratorCapturer(); 819 Start(); 820 821 receiver_call_->DestroyVideoReceiveStream(receive_streams_[0]); 822 receive_streams_.clear(); 823 824 // Wait() waits for a received packet. 825 EXPECT_EQ(kEventSignaled, input_observer.Wait()); 826 827 Stop(); 828 829 DestroyStreams(); 830 831 send_transport.StopSending(); 832 receive_transport.StopSending(); 833 } 834 835 void EndToEndTest::RespectsRtcpMode(newapi::RtcpMode rtcp_mode) { 836 static const int kNumCompoundRtcpPacketsToObserve = 10; 837 class RtcpModeObserver : public test::EndToEndTest { 838 public: 839 explicit RtcpModeObserver(newapi::RtcpMode rtcp_mode) 840 : EndToEndTest(kDefaultTimeoutMs), 841 rtcp_mode_(rtcp_mode), 842 sent_rtp_(0), 843 sent_rtcp_(0) {} 844 845 private: 846 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 847 if (++sent_rtp_ % 3 == 0) 848 return DROP_PACKET; 849 850 return SEND_PACKET; 851 } 852 853 virtual Action OnReceiveRtcp(const uint8_t* packet, 854 size_t length) OVERRIDE { 855 ++sent_rtcp_; 856 RTCPUtility::RTCPParserV2 parser(packet, length, true); 857 EXPECT_TRUE(parser.IsValid()); 858 859 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 860 bool has_report_block = false; 861 while (packet_type != RTCPUtility::kRtcpNotValidCode) { 862 EXPECT_NE(RTCPUtility::kRtcpSrCode, packet_type); 863 if (packet_type == RTCPUtility::kRtcpRrCode) { 864 has_report_block = true; 865 break; 866 } 867 packet_type = parser.Iterate(); 868 } 869 870 switch (rtcp_mode_) { 871 case newapi::kRtcpCompound: 872 if (!has_report_block) { 873 ADD_FAILURE() << "Received RTCP packet without receiver report for " 874 "kRtcpCompound."; 875 observation_complete_->Set(); 876 } 877 878 if (sent_rtcp_ >= kNumCompoundRtcpPacketsToObserve) 879 observation_complete_->Set(); 880 881 break; 882 case newapi::kRtcpReducedSize: 883 if (!has_report_block) 884 observation_complete_->Set(); 885 break; 886 } 887 888 return SEND_PACKET; 889 } 890 891 virtual void ModifyConfigs( 892 VideoSendStream::Config* send_config, 893 std::vector<VideoReceiveStream::Config>* receive_configs, 894 VideoEncoderConfig* encoder_config) OVERRIDE { 895 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 896 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 897 (*receive_configs)[0].rtp.rtcp_mode = rtcp_mode_; 898 } 899 900 virtual void PerformTest() OVERRIDE { 901 EXPECT_EQ(kEventSignaled, Wait()) 902 << (rtcp_mode_ == newapi::kRtcpCompound 903 ? "Timed out before observing enough compound packets." 904 : "Timed out before receiving a non-compound RTCP packet."); 905 } 906 907 newapi::RtcpMode rtcp_mode_; 908 int sent_rtp_; 909 int sent_rtcp_; 910 } test(rtcp_mode); 911 912 RunBaseTest(&test); 913 } 914 915 TEST_F(EndToEndTest, UsesRtcpCompoundMode) { 916 RespectsRtcpMode(newapi::kRtcpCompound); 917 } 918 919 TEST_F(EndToEndTest, UsesRtcpReducedSizeMode) { 920 RespectsRtcpMode(newapi::kRtcpReducedSize); 921 } 922 923 // Test sets up a Call multiple senders with different resolutions and SSRCs. 924 // Another is set up to receive all three of these with different renderers. 925 // Each renderer verifies that it receives the expected resolution, and as soon 926 // as every renderer has received a frame, the test finishes. 927 TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { 928 static const size_t kNumStreams = 3; 929 930 class VideoOutputObserver : public VideoRenderer { 931 public: 932 VideoOutputObserver(test::FrameGeneratorCapturer** capturer, 933 int width, 934 int height) 935 : capturer_(capturer), 936 width_(width), 937 height_(height), 938 done_(EventWrapper::Create()) {} 939 940 virtual void RenderFrame(const I420VideoFrame& video_frame, 941 int time_to_render_ms) OVERRIDE { 942 EXPECT_EQ(width_, video_frame.width()); 943 EXPECT_EQ(height_, video_frame.height()); 944 (*capturer_)->Stop(); 945 done_->Set(); 946 } 947 948 EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); } 949 950 private: 951 test::FrameGeneratorCapturer** capturer_; 952 int width_; 953 int height_; 954 scoped_ptr<EventWrapper> done_; 955 }; 956 957 struct { 958 uint32_t ssrc; 959 int width; 960 int height; 961 } codec_settings[kNumStreams] = {{1, 640, 480}, {2, 320, 240}, {3, 240, 160}}; 962 963 test::DirectTransport sender_transport, receiver_transport; 964 scoped_ptr<Call> sender_call(Call::Create(Call::Config(&sender_transport))); 965 scoped_ptr<Call> receiver_call( 966 Call::Create(Call::Config(&receiver_transport))); 967 sender_transport.SetReceiver(receiver_call->Receiver()); 968 receiver_transport.SetReceiver(sender_call->Receiver()); 969 970 VideoSendStream* send_streams[kNumStreams]; 971 VideoReceiveStream* receive_streams[kNumStreams]; 972 973 VideoOutputObserver* observers[kNumStreams]; 974 test::FrameGeneratorCapturer* frame_generators[kNumStreams]; 975 976 scoped_ptr<VideoEncoder> encoders[kNumStreams]; 977 for (size_t i = 0; i < kNumStreams; ++i) 978 encoders[i].reset(VideoEncoder::Create(VideoEncoder::kVp8)); 979 980 for (size_t i = 0; i < kNumStreams; ++i) { 981 uint32_t ssrc = codec_settings[i].ssrc; 982 int width = codec_settings[i].width; 983 int height = codec_settings[i].height; 984 observers[i] = new VideoOutputObserver(&frame_generators[i], width, height); 985 986 VideoSendStream::Config send_config; 987 send_config.rtp.ssrcs.push_back(ssrc); 988 send_config.encoder_settings.encoder = encoders[i].get(); 989 send_config.encoder_settings.payload_name = "VP8"; 990 send_config.encoder_settings.payload_type = 124; 991 VideoEncoderConfig encoder_config; 992 encoder_config.streams = test::CreateVideoStreams(1); 993 VideoStream* stream = &encoder_config.streams[0]; 994 stream->width = width; 995 stream->height = height; 996 stream->max_framerate = 5; 997 stream->min_bitrate_bps = stream->target_bitrate_bps = 998 stream->max_bitrate_bps = 100000; 999 send_streams[i] = 1000 sender_call->CreateVideoSendStream(send_config, encoder_config); 1001 send_streams[i]->Start(); 1002 1003 VideoReceiveStream::Config receive_config; 1004 receive_config.renderer = observers[i]; 1005 receive_config.rtp.remote_ssrc = ssrc; 1006 receive_config.rtp.local_ssrc = kReceiverLocalSsrc; 1007 VideoCodec codec = 1008 test::CreateDecoderVideoCodec(send_config.encoder_settings); 1009 receive_config.codecs.push_back(codec); 1010 receive_streams[i] = 1011 receiver_call->CreateVideoReceiveStream(receive_config); 1012 receive_streams[i]->Start(); 1013 1014 frame_generators[i] = test::FrameGeneratorCapturer::Create( 1015 send_streams[i]->Input(), width, height, 30, Clock::GetRealTimeClock()); 1016 frame_generators[i]->Start(); 1017 } 1018 1019 for (size_t i = 0; i < kNumStreams; ++i) { 1020 EXPECT_EQ(kEventSignaled, observers[i]->Wait()) 1021 << "Timed out while waiting for observer " << i << " to render."; 1022 } 1023 1024 for (size_t i = 0; i < kNumStreams; ++i) { 1025 frame_generators[i]->Stop(); 1026 sender_call->DestroyVideoSendStream(send_streams[i]); 1027 receiver_call->DestroyVideoReceiveStream(receive_streams[i]); 1028 delete frame_generators[i]; 1029 delete observers[i]; 1030 } 1031 1032 sender_transport.StopSending(); 1033 receiver_transport.StopSending(); 1034 } 1035 1036 TEST_F(EndToEndTest, ObserversEncodedFrames) { 1037 class EncodedFrameTestObserver : public EncodedFrameObserver { 1038 public: 1039 EncodedFrameTestObserver() 1040 : length_(0), 1041 frame_type_(kFrameEmpty), 1042 called_(EventWrapper::Create()) {} 1043 virtual ~EncodedFrameTestObserver() {} 1044 1045 virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) { 1046 frame_type_ = encoded_frame.frame_type_; 1047 length_ = encoded_frame.length_; 1048 buffer_.reset(new uint8_t[length_]); 1049 memcpy(buffer_.get(), encoded_frame.data_, length_); 1050 called_->Set(); 1051 } 1052 1053 EventTypeWrapper Wait() { return called_->Wait(kDefaultTimeoutMs); } 1054 1055 void ExpectEqualFrames(const EncodedFrameTestObserver& observer) { 1056 ASSERT_EQ(length_, observer.length_) 1057 << "Observed frames are of different lengths."; 1058 EXPECT_EQ(frame_type_, observer.frame_type_) 1059 << "Observed frames have different frame types."; 1060 EXPECT_EQ(0, memcmp(buffer_.get(), observer.buffer_.get(), length_)) 1061 << "Observed encoded frames have different content."; 1062 } 1063 1064 private: 1065 scoped_ptr<uint8_t[]> buffer_; 1066 size_t length_; 1067 FrameType frame_type_; 1068 scoped_ptr<EventWrapper> called_; 1069 }; 1070 1071 EncodedFrameTestObserver post_encode_observer; 1072 EncodedFrameTestObserver pre_decode_observer; 1073 1074 test::DirectTransport sender_transport, receiver_transport; 1075 1076 CreateCalls(Call::Config(&sender_transport), 1077 Call::Config(&receiver_transport)); 1078 1079 sender_transport.SetReceiver(receiver_call_->Receiver()); 1080 receiver_transport.SetReceiver(sender_call_->Receiver()); 1081 1082 CreateSendConfig(1); 1083 CreateMatchingReceiveConfigs(); 1084 send_config_.post_encode_callback = &post_encode_observer; 1085 receive_configs_[0].pre_decode_callback = &pre_decode_observer; 1086 1087 CreateStreams(); 1088 Start(); 1089 1090 scoped_ptr<test::FrameGenerator> frame_generator(test::FrameGenerator::Create( 1091 encoder_config_.streams[0].width, encoder_config_.streams[0].height)); 1092 send_stream_->Input()->SwapFrame(frame_generator->NextFrame()); 1093 1094 EXPECT_EQ(kEventSignaled, post_encode_observer.Wait()) 1095 << "Timed out while waiting for send-side encoded-frame callback."; 1096 1097 EXPECT_EQ(kEventSignaled, pre_decode_observer.Wait()) 1098 << "Timed out while waiting for pre-decode encoded-frame callback."; 1099 1100 post_encode_observer.ExpectEqualFrames(pre_decode_observer); 1101 1102 Stop(); 1103 1104 sender_transport.StopSending(); 1105 receiver_transport.StopSending(); 1106 1107 DestroyStreams(); 1108 } 1109 1110 TEST_F(EndToEndTest, ReceiveStreamSendsRemb) { 1111 class RembObserver : public test::EndToEndTest { 1112 public: 1113 RembObserver() : EndToEndTest(kDefaultTimeoutMs) {} 1114 1115 virtual Action OnReceiveRtcp(const uint8_t* packet, 1116 size_t length) OVERRIDE { 1117 RTCPUtility::RTCPParserV2 parser(packet, length, true); 1118 EXPECT_TRUE(parser.IsValid()); 1119 1120 bool received_psfb = false; 1121 bool received_remb = false; 1122 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 1123 while (packet_type != RTCPUtility::kRtcpNotValidCode) { 1124 if (packet_type == RTCPUtility::kRtcpPsfbRembCode) { 1125 const RTCPUtility::RTCPPacket& packet = parser.Packet(); 1126 EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalSsrc); 1127 received_psfb = true; 1128 } else if (packet_type == RTCPUtility::kRtcpPsfbRembItemCode) { 1129 const RTCPUtility::RTCPPacket& packet = parser.Packet(); 1130 EXPECT_GT(packet.REMBItem.BitRate, 0u); 1131 EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u); 1132 EXPECT_EQ(packet.REMBItem.SSRCs[0], kSendSsrcs[0]); 1133 received_remb = true; 1134 } 1135 packet_type = parser.Iterate(); 1136 } 1137 if (received_psfb && received_remb) 1138 observation_complete_->Set(); 1139 return SEND_PACKET; 1140 } 1141 virtual void PerformTest() OVERRIDE { 1142 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for a " 1143 "receiver RTCP REMB packet to be " 1144 "sent."; 1145 } 1146 } test; 1147 1148 RunBaseTest(&test); 1149 } 1150 1151 void EndToEndTest::TestXrReceiverReferenceTimeReport(bool enable_rrtr) { 1152 static const int kNumRtcpReportPacketsToObserve = 5; 1153 class RtcpXrObserver : public test::EndToEndTest { 1154 public: 1155 explicit RtcpXrObserver(bool enable_rrtr) 1156 : EndToEndTest(kDefaultTimeoutMs), 1157 enable_rrtr_(enable_rrtr), 1158 sent_rtcp_sr_(0), 1159 sent_rtcp_rr_(0), 1160 sent_rtcp_rrtr_(0), 1161 sent_rtcp_dlrr_(0) {} 1162 1163 private: 1164 // Receive stream should send RR packets (and RRTR packets if enabled). 1165 virtual Action OnReceiveRtcp(const uint8_t* packet, 1166 size_t length) OVERRIDE { 1167 RTCPUtility::RTCPParserV2 parser(packet, length, true); 1168 EXPECT_TRUE(parser.IsValid()); 1169 1170 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 1171 while (packet_type != RTCPUtility::kRtcpNotValidCode) { 1172 if (packet_type == RTCPUtility::kRtcpRrCode) { 1173 ++sent_rtcp_rr_; 1174 } else if (packet_type == 1175 RTCPUtility::kRtcpXrReceiverReferenceTimeCode) { 1176 ++sent_rtcp_rrtr_; 1177 } 1178 EXPECT_NE(packet_type, RTCPUtility::kRtcpSrCode); 1179 EXPECT_NE(packet_type, RTCPUtility::kRtcpXrDlrrReportBlockItemCode); 1180 packet_type = parser.Iterate(); 1181 } 1182 return SEND_PACKET; 1183 } 1184 // Send stream should send SR packets (and DLRR packets if enabled). 1185 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) { 1186 RTCPUtility::RTCPParserV2 parser(packet, length, true); 1187 EXPECT_TRUE(parser.IsValid()); 1188 1189 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 1190 while (packet_type != RTCPUtility::kRtcpNotValidCode) { 1191 if (packet_type == RTCPUtility::kRtcpSrCode) { 1192 ++sent_rtcp_sr_; 1193 } else if (packet_type == RTCPUtility::kRtcpXrDlrrReportBlockItemCode) { 1194 ++sent_rtcp_dlrr_; 1195 } 1196 EXPECT_NE(packet_type, RTCPUtility::kRtcpXrReceiverReferenceTimeCode); 1197 packet_type = parser.Iterate(); 1198 } 1199 if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve && 1200 sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve) { 1201 if (enable_rrtr_) { 1202 EXPECT_GT(sent_rtcp_rrtr_, 0); 1203 EXPECT_GT(sent_rtcp_dlrr_, 0); 1204 } else { 1205 EXPECT_EQ(0, sent_rtcp_rrtr_); 1206 EXPECT_EQ(0, sent_rtcp_dlrr_); 1207 } 1208 observation_complete_->Set(); 1209 } 1210 return SEND_PACKET; 1211 } 1212 1213 virtual void ModifyConfigs( 1214 VideoSendStream::Config* send_config, 1215 std::vector<VideoReceiveStream::Config>* receive_configs, 1216 VideoEncoderConfig* encoder_config) OVERRIDE { 1217 (*receive_configs)[0].rtp.rtcp_mode = newapi::kRtcpReducedSize; 1218 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = 1219 enable_rrtr_; 1220 } 1221 1222 virtual void PerformTest() OVERRIDE { 1223 EXPECT_EQ(kEventSignaled, Wait()) 1224 << "Timed out while waiting for RTCP SR/RR packets to be sent."; 1225 } 1226 1227 bool enable_rrtr_; 1228 int sent_rtcp_sr_; 1229 int sent_rtcp_rr_; 1230 int sent_rtcp_rrtr_; 1231 int sent_rtcp_dlrr_; 1232 } test(enable_rrtr); 1233 1234 RunBaseTest(&test); 1235 } 1236 1237 void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs, 1238 bool send_single_ssrc_first) { 1239 class SendsSetSsrcs : public test::EndToEndTest { 1240 public: 1241 SendsSetSsrcs(const uint32_t* ssrcs, 1242 size_t num_ssrcs, 1243 bool send_single_ssrc_first) 1244 : EndToEndTest(kDefaultTimeoutMs), 1245 num_ssrcs_(num_ssrcs), 1246 send_single_ssrc_first_(send_single_ssrc_first), 1247 ssrcs_to_observe_(num_ssrcs), 1248 expect_single_ssrc_(send_single_ssrc_first) { 1249 for (size_t i = 0; i < num_ssrcs; ++i) 1250 valid_ssrcs_[ssrcs[i]] = true; 1251 } 1252 1253 private: 1254 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 1255 RTPHeader header; 1256 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 1257 1258 EXPECT_TRUE(valid_ssrcs_[header.ssrc]) 1259 << "Received unknown SSRC: " << header.ssrc; 1260 1261 if (!valid_ssrcs_[header.ssrc]) 1262 observation_complete_->Set(); 1263 1264 if (!is_observed_[header.ssrc]) { 1265 is_observed_[header.ssrc] = true; 1266 --ssrcs_to_observe_; 1267 if (expect_single_ssrc_) { 1268 expect_single_ssrc_ = false; 1269 observation_complete_->Set(); 1270 } 1271 } 1272 1273 if (ssrcs_to_observe_ == 0) 1274 observation_complete_->Set(); 1275 1276 return SEND_PACKET; 1277 } 1278 1279 virtual size_t GetNumStreams() const OVERRIDE { return num_ssrcs_; } 1280 1281 virtual void ModifyConfigs( 1282 VideoSendStream::Config* send_config, 1283 std::vector<VideoReceiveStream::Config>* receive_configs, 1284 VideoEncoderConfig* encoder_config) OVERRIDE { 1285 if (num_ssrcs_ > 1) { 1286 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up. 1287 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { 1288 encoder_config->streams[i].min_bitrate_bps = 10000; 1289 encoder_config->streams[i].target_bitrate_bps = 15000; 1290 encoder_config->streams[i].max_bitrate_bps = 20000; 1291 } 1292 } 1293 1294 encoder_config_all_streams_ = *encoder_config; 1295 if (send_single_ssrc_first_) 1296 encoder_config->streams.resize(1); 1297 } 1298 1299 virtual void OnStreamsCreated( 1300 VideoSendStream* send_stream, 1301 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 1302 send_stream_ = send_stream; 1303 } 1304 1305 virtual void PerformTest() OVERRIDE { 1306 EXPECT_EQ(kEventSignaled, Wait()) 1307 << "Timed out while waiting for " 1308 << (send_single_ssrc_first_ ? "first SSRC." : "SSRCs."); 1309 1310 if (send_single_ssrc_first_) { 1311 // Set full simulcast and continue with the rest of the SSRCs. 1312 send_stream_->ReconfigureVideoEncoder(encoder_config_all_streams_); 1313 EXPECT_EQ(kEventSignaled, Wait()) 1314 << "Timed out while waiting on additional SSRCs."; 1315 } 1316 } 1317 1318 private: 1319 std::map<uint32_t, bool> valid_ssrcs_; 1320 std::map<uint32_t, bool> is_observed_; 1321 1322 const size_t num_ssrcs_; 1323 const bool send_single_ssrc_first_; 1324 1325 size_t ssrcs_to_observe_; 1326 bool expect_single_ssrc_; 1327 1328 VideoSendStream* send_stream_; 1329 VideoEncoderConfig encoder_config_all_streams_; 1330 } test(kSendSsrcs, num_ssrcs, send_single_ssrc_first); 1331 1332 RunBaseTest(&test); 1333 } 1334 1335 TEST_F(EndToEndTest, GetStats) { 1336 class StatsObserver : public test::EndToEndTest, public I420FrameCallback { 1337 public: 1338 StatsObserver() 1339 : EndToEndTest(kLongTimeoutMs), 1340 receive_stream_(NULL), 1341 send_stream_(NULL), 1342 expected_receive_ssrc_(), 1343 expected_send_ssrcs_(), 1344 check_stats_event_(EventWrapper::Create()) {} 1345 1346 private: 1347 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 1348 check_stats_event_->Set(); 1349 return SEND_PACKET; 1350 } 1351 1352 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE { 1353 check_stats_event_->Set(); 1354 return SEND_PACKET; 1355 } 1356 1357 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) OVERRIDE { 1358 check_stats_event_->Set(); 1359 return SEND_PACKET; 1360 } 1361 1362 virtual Action OnReceiveRtcp(const uint8_t* packet, 1363 size_t length) OVERRIDE { 1364 check_stats_event_->Set(); 1365 return SEND_PACKET; 1366 } 1367 1368 virtual void FrameCallback(I420VideoFrame* video_frame) OVERRIDE { 1369 // Ensure that we have at least 5ms send side delay. 1370 int64_t render_time = video_frame->render_time_ms(); 1371 if (render_time > 0) 1372 video_frame->set_render_time_ms(render_time - 5); 1373 } 1374 1375 bool CheckReceiveStats() { 1376 assert(receive_stream_ != NULL); 1377 VideoReceiveStream::Stats stats = receive_stream_->GetStats(); 1378 EXPECT_EQ(expected_receive_ssrc_, stats.ssrc); 1379 1380 // Make sure all fields have been populated. 1381 1382 receive_stats_filled_["IncomingRate"] |= 1383 stats.network_frame_rate != 0 || stats.bitrate_bps != 0; 1384 1385 receive_stats_filled_["FrameCallback"] |= stats.decode_frame_rate != 0; 1386 1387 receive_stats_filled_["FrameRendered"] |= stats.render_frame_rate != 0; 1388 1389 receive_stats_filled_["StatisticsUpdated"] |= 1390 stats.rtcp_stats.cumulative_lost != 0 || 1391 stats.rtcp_stats.extended_max_sequence_number != 0 || 1392 stats.rtcp_stats.fraction_lost != 0 || stats.rtcp_stats.jitter != 0; 1393 1394 receive_stats_filled_["DataCountersUpdated"] |= 1395 stats.rtp_stats.bytes != 0 || stats.rtp_stats.fec_packets != 0 || 1396 stats.rtp_stats.header_bytes != 0 || stats.rtp_stats.packets != 0 || 1397 stats.rtp_stats.padding_bytes != 0 || 1398 stats.rtp_stats.retransmitted_packets != 0; 1399 1400 receive_stats_filled_["CodecStats"] |= 1401 stats.avg_delay_ms != 0 || stats.discarded_packets != 0 || 1402 stats.key_frames != 0 || stats.delta_frames != 0; 1403 1404 return AllStatsFilled(receive_stats_filled_); 1405 } 1406 1407 bool CheckSendStats() { 1408 assert(send_stream_ != NULL); 1409 VideoSendStream::Stats stats = send_stream_->GetStats(); 1410 1411 send_stats_filled_["NumStreams"] |= 1412 stats.substreams.size() == expected_send_ssrcs_.size(); 1413 1414 for (std::map<uint32_t, StreamStats>::const_iterator it = 1415 stats.substreams.begin(); 1416 it != stats.substreams.end(); 1417 ++it) { 1418 EXPECT_TRUE(expected_send_ssrcs_.find(it->first) != 1419 expected_send_ssrcs_.end()); 1420 1421 send_stats_filled_[CompoundKey("IncomingRate", it->first)] |= 1422 stats.input_frame_rate != 0; 1423 1424 const StreamStats& stream_stats = it->second; 1425 1426 send_stats_filled_[CompoundKey("StatisticsUpdated", it->first)] |= 1427 stream_stats.rtcp_stats.cumulative_lost != 0 || 1428 stream_stats.rtcp_stats.extended_max_sequence_number != 0 || 1429 stream_stats.rtcp_stats.fraction_lost != 0; 1430 1431 send_stats_filled_[CompoundKey("DataCountersUpdated", it->first)] |= 1432 stream_stats.rtp_stats.fec_packets != 0 || 1433 stream_stats.rtp_stats.padding_bytes != 0 || 1434 stream_stats.rtp_stats.retransmitted_packets != 0 || 1435 stream_stats.rtp_stats.packets != 0; 1436 1437 send_stats_filled_[CompoundKey("BitrateStatisticsObserver", 1438 it->first)] |= 1439 stream_stats.bitrate_bps != 0; 1440 1441 send_stats_filled_[CompoundKey("FrameCountObserver", it->first)] |= 1442 stream_stats.delta_frames != 0 || stream_stats.key_frames != 0; 1443 1444 send_stats_filled_[CompoundKey("OutgoingRate", it->first)] |= 1445 stats.encode_frame_rate != 0; 1446 1447 send_stats_filled_[CompoundKey("Delay", it->first)] |= 1448 stream_stats.avg_delay_ms != 0 || stream_stats.max_delay_ms != 0; 1449 } 1450 1451 return AllStatsFilled(send_stats_filled_); 1452 } 1453 1454 std::string CompoundKey(const char* name, uint32_t ssrc) { 1455 std::ostringstream oss; 1456 oss << name << "_" << ssrc; 1457 return oss.str(); 1458 } 1459 1460 bool AllStatsFilled(const std::map<std::string, bool>& stats_map) { 1461 for (std::map<std::string, bool>::const_iterator it = stats_map.begin(); 1462 it != stats_map.end(); 1463 ++it) { 1464 if (!it->second) 1465 return false; 1466 } 1467 return true; 1468 } 1469 1470 virtual void ModifyConfigs( 1471 VideoSendStream::Config* send_config, 1472 std::vector<VideoReceiveStream::Config>* receive_configs, 1473 VideoEncoderConfig* encoder_config) OVERRIDE { 1474 send_config->pre_encode_callback = this; // Used to inject delay. 1475 send_config->rtp.c_name = "SomeCName"; 1476 1477 expected_receive_ssrc_ = (*receive_configs)[0].rtp.local_ssrc; 1478 const std::vector<uint32_t>& ssrcs = send_config->rtp.ssrcs; 1479 for (size_t i = 0; i < ssrcs.size(); ++i) 1480 expected_send_ssrcs_.insert(ssrcs[i]); 1481 1482 expected_cname_ = send_config->rtp.c_name; 1483 } 1484 1485 virtual void OnStreamsCreated( 1486 VideoSendStream* send_stream, 1487 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 1488 send_stream_ = send_stream; 1489 receive_stream_ = receive_streams[0]; 1490 } 1491 1492 virtual void PerformTest() OVERRIDE { 1493 Clock* clock = Clock::GetRealTimeClock(); 1494 int64_t now = clock->TimeInMilliseconds(); 1495 int64_t stop_time = now + test::CallTest::kLongTimeoutMs; 1496 bool receive_ok = false; 1497 bool send_ok = false; 1498 1499 while (now < stop_time) { 1500 if (!receive_ok) 1501 receive_ok = CheckReceiveStats(); 1502 if (!send_ok) 1503 send_ok = CheckSendStats(); 1504 1505 if (receive_ok && send_ok) 1506 return; 1507 1508 int64_t time_until_timout_ = stop_time - now; 1509 if (time_until_timout_ > 0) 1510 check_stats_event_->Wait(time_until_timout_); 1511 now = clock->TimeInMilliseconds(); 1512 } 1513 1514 ADD_FAILURE() << "Timed out waiting for filled stats."; 1515 for (std::map<std::string, bool>::const_iterator it = 1516 receive_stats_filled_.begin(); 1517 it != receive_stats_filled_.end(); 1518 ++it) { 1519 if (!it->second) { 1520 ADD_FAILURE() << "Missing receive stats: " << it->first; 1521 } 1522 } 1523 1524 for (std::map<std::string, bool>::const_iterator it = 1525 send_stats_filled_.begin(); 1526 it != send_stats_filled_.end(); 1527 ++it) { 1528 if (!it->second) { 1529 ADD_FAILURE() << "Missing send stats: " << it->first; 1530 } 1531 } 1532 } 1533 1534 VideoReceiveStream* receive_stream_; 1535 std::map<std::string, bool> receive_stats_filled_; 1536 1537 VideoSendStream* send_stream_; 1538 std::map<std::string, bool> send_stats_filled_; 1539 1540 uint32_t expected_receive_ssrc_; 1541 std::set<uint32_t> expected_send_ssrcs_; 1542 std::string expected_cname_; 1543 1544 scoped_ptr<EventWrapper> check_stats_event_; 1545 } test; 1546 1547 RunBaseTest(&test); 1548 } 1549 1550 TEST_F(EndToEndTest, ReceiverReferenceTimeReportEnabled) { 1551 TestXrReceiverReferenceTimeReport(true); 1552 } 1553 1554 TEST_F(EndToEndTest, ReceiverReferenceTimeReportDisabled) { 1555 TestXrReceiverReferenceTimeReport(false); 1556 } 1557 1558 TEST_F(EndToEndTest, TestReceivedRtpPacketStats) { 1559 static const size_t kNumRtpPacketsToSend = 5; 1560 class ReceivedRtpStatsObserver : public test::EndToEndTest { 1561 public: 1562 ReceivedRtpStatsObserver() 1563 : EndToEndTest(kDefaultTimeoutMs), 1564 receive_stream_(NULL), 1565 sent_rtp_(0) {} 1566 1567 private: 1568 virtual void OnStreamsCreated( 1569 VideoSendStream* send_stream, 1570 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 1571 receive_stream_ = receive_streams[0]; 1572 } 1573 1574 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 1575 if (sent_rtp_ >= kNumRtpPacketsToSend) { 1576 VideoReceiveStream::Stats stats = receive_stream_->GetStats(); 1577 if (kNumRtpPacketsToSend == stats.rtp_stats.packets) { 1578 observation_complete_->Set(); 1579 } 1580 return DROP_PACKET; 1581 } 1582 ++sent_rtp_; 1583 return SEND_PACKET; 1584 } 1585 1586 virtual void PerformTest() OVERRIDE { 1587 EXPECT_EQ(kEventSignaled, Wait()) 1588 << "Timed out while verifying number of received RTP packets."; 1589 } 1590 1591 VideoReceiveStream* receive_stream_; 1592 uint32_t sent_rtp_; 1593 } test; 1594 1595 RunBaseTest(&test); 1596 } 1597 1598 TEST_F(EndToEndTest, SendsSetSsrc) { TestSendsSetSsrcs(1, false); } 1599 1600 TEST_F(EndToEndTest, SendsSetSimulcastSsrcs) { 1601 TestSendsSetSsrcs(kNumSsrcs, false); 1602 } 1603 1604 TEST_F(EndToEndTest, CanSwitchToUseAllSsrcs) { 1605 TestSendsSetSsrcs(kNumSsrcs, true); 1606 } 1607 1608 TEST_F(EndToEndTest, DISABLED_RedundantPayloadsTransmittedOnAllSsrcs) { 1609 class ObserveRedundantPayloads: public test::EndToEndTest { 1610 public: 1611 ObserveRedundantPayloads() 1612 : EndToEndTest(kDefaultTimeoutMs), ssrcs_to_observe_(kNumSsrcs) { 1613 for (size_t i = 0; i < kNumSsrcs; ++i) { 1614 registered_rtx_ssrc_[kSendRtxSsrcs[i]] = true; 1615 } 1616 } 1617 1618 private: 1619 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 1620 RTPHeader header; 1621 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 1622 1623 if (!registered_rtx_ssrc_[header.ssrc]) 1624 return SEND_PACKET; 1625 1626 EXPECT_LE(static_cast<size_t>(header.headerLength + header.paddingLength), 1627 length); 1628 const bool packet_is_redundant_payload = 1629 static_cast<size_t>(header.headerLength + header.paddingLength) < 1630 length; 1631 1632 if (!packet_is_redundant_payload) 1633 return SEND_PACKET; 1634 1635 if (!observed_redundant_retransmission_[header.ssrc]) { 1636 observed_redundant_retransmission_[header.ssrc] = true; 1637 if (--ssrcs_to_observe_ == 0) 1638 observation_complete_->Set(); 1639 } 1640 1641 return SEND_PACKET; 1642 } 1643 1644 virtual size_t GetNumStreams() const OVERRIDE { return kNumSsrcs; } 1645 1646 virtual void ModifyConfigs( 1647 VideoSendStream::Config* send_config, 1648 std::vector<VideoReceiveStream::Config>* receive_configs, 1649 VideoEncoderConfig* encoder_config) OVERRIDE { 1650 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up. 1651 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { 1652 encoder_config->streams[i].min_bitrate_bps = 10000; 1653 encoder_config->streams[i].target_bitrate_bps = 15000; 1654 encoder_config->streams[i].max_bitrate_bps = 20000; 1655 } 1656 // Significantly higher than max bitrates for all video streams -> forcing 1657 // padding to trigger redundant padding on all RTX SSRCs. 1658 send_config->rtp.min_transmit_bitrate_bps = 100000; 1659 1660 send_config->rtp.rtx.payload_type = kSendRtxPayloadType; 1661 send_config->rtp.rtx.pad_with_redundant_payloads = true; 1662 1663 for (size_t i = 0; i < kNumSsrcs; ++i) 1664 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); 1665 } 1666 1667 virtual void PerformTest() OVERRIDE { 1668 EXPECT_EQ(kEventSignaled, Wait()) 1669 << "Timed out while waiting for redundant payloads on all SSRCs."; 1670 } 1671 1672 private: 1673 size_t ssrcs_to_observe_; 1674 std::map<uint32_t, bool> observed_redundant_retransmission_; 1675 std::map<uint32_t, bool> registered_rtx_ssrc_; 1676 } test; 1677 1678 RunBaseTest(&test); 1679 } 1680 1681 void EndToEndTest::TestRtpStatePreservation(bool use_rtx) { 1682 static const uint32_t kMaxSequenceNumberGap = 100; 1683 static const uint64_t kMaxTimestampGap = kDefaultTimeoutMs * 90; 1684 class RtpSequenceObserver : public test::RtpRtcpObserver { 1685 public: 1686 explicit RtpSequenceObserver(bool use_rtx) 1687 : test::RtpRtcpObserver(kDefaultTimeoutMs), 1688 crit_(CriticalSectionWrapper::CreateCriticalSection()), 1689 ssrcs_to_observe_(kNumSsrcs) { 1690 for (size_t i = 0; i < kNumSsrcs; ++i) { 1691 configured_ssrcs_[kSendSsrcs[i]] = true; 1692 if (use_rtx) 1693 configured_ssrcs_[kSendRtxSsrcs[i]] = true; 1694 } 1695 } 1696 1697 void ResetExpectedSsrcs(size_t num_expected_ssrcs) { 1698 CriticalSectionScoped lock(crit_.get()); 1699 ssrc_observed_.clear(); 1700 ssrcs_to_observe_ = num_expected_ssrcs; 1701 } 1702 1703 private: 1704 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 1705 RTPHeader header; 1706 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 1707 const uint32_t ssrc = header.ssrc; 1708 const uint16_t sequence_number = header.sequenceNumber; 1709 const uint32_t timestamp = header.timestamp; 1710 const bool only_padding = 1711 static_cast<size_t>(header.headerLength + header.paddingLength) == 1712 length; 1713 1714 EXPECT_TRUE(configured_ssrcs_[ssrc]) 1715 << "Received SSRC that wasn't configured: " << ssrc; 1716 1717 std::map<uint32_t, uint16_t>::iterator it = 1718 last_observed_sequence_number_.find(header.ssrc); 1719 if (it == last_observed_sequence_number_.end()) { 1720 last_observed_sequence_number_[ssrc] = sequence_number; 1721 last_observed_timestamp_[ssrc] = timestamp; 1722 } else { 1723 // Verify sequence numbers are reasonably close. 1724 uint32_t extended_sequence_number = sequence_number; 1725 // Check for roll-over. 1726 if (sequence_number < last_observed_sequence_number_[ssrc]) 1727 extended_sequence_number += 0xFFFFu + 1; 1728 EXPECT_LE( 1729 extended_sequence_number - last_observed_sequence_number_[ssrc], 1730 kMaxSequenceNumberGap) 1731 << "Gap in sequence numbers (" 1732 << last_observed_sequence_number_[ssrc] << " -> " << sequence_number 1733 << ") too large for SSRC: " << ssrc << "."; 1734 last_observed_sequence_number_[ssrc] = sequence_number; 1735 1736 // TODO(pbos): Remove this check if we ever have monotonically 1737 // increasing timestamps. Right now padding packets add a delta which 1738 // can cause reordering between padding packets and regular packets, 1739 // hence we drop padding-only packets to not flake. 1740 if (only_padding) { 1741 // Verify that timestamps are reasonably close. 1742 uint64_t extended_timestamp = timestamp; 1743 // Check for roll-over. 1744 if (timestamp < last_observed_timestamp_[ssrc]) 1745 extended_timestamp += static_cast<uint64_t>(0xFFFFFFFFu) + 1; 1746 EXPECT_LE(extended_timestamp - last_observed_timestamp_[ssrc], 1747 kMaxTimestampGap) 1748 << "Gap in timestamps (" << last_observed_timestamp_[ssrc] 1749 << " -> " << timestamp << ") too large for SSRC: " << ssrc << "."; 1750 } 1751 last_observed_timestamp_[ssrc] = timestamp; 1752 } 1753 1754 CriticalSectionScoped lock(crit_.get()); 1755 // Wait for media packets on all ssrcs. 1756 if (!ssrc_observed_[ssrc] && !only_padding) { 1757 ssrc_observed_[ssrc] = true; 1758 if (--ssrcs_to_observe_ == 0) 1759 observation_complete_->Set(); 1760 } 1761 1762 return SEND_PACKET; 1763 } 1764 1765 std::map<uint32_t, uint16_t> last_observed_sequence_number_; 1766 std::map<uint32_t, uint32_t> last_observed_timestamp_; 1767 std::map<uint32_t, bool> configured_ssrcs_; 1768 1769 scoped_ptr<CriticalSectionWrapper> crit_; 1770 size_t ssrcs_to_observe_ GUARDED_BY(crit_); 1771 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_); 1772 } observer(use_rtx); 1773 1774 CreateCalls(Call::Config(observer.SendTransport()), 1775 Call::Config(observer.ReceiveTransport())); 1776 observer.SetReceivers(sender_call_->Receiver(), NULL); 1777 1778 CreateSendConfig(kNumSsrcs); 1779 1780 if (use_rtx) { 1781 for (size_t i = 0; i < kNumSsrcs; ++i) { 1782 send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); 1783 } 1784 send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; 1785 } 1786 1787 // Lower bitrates so that all streams send initially. 1788 for (size_t i = 0; i < encoder_config_.streams.size(); ++i) { 1789 encoder_config_.streams[i].min_bitrate_bps = 10000; 1790 encoder_config_.streams[i].target_bitrate_bps = 15000; 1791 encoder_config_.streams[i].max_bitrate_bps = 20000; 1792 } 1793 1794 CreateMatchingReceiveConfigs(); 1795 1796 CreateStreams(); 1797 CreateFrameGeneratorCapturer(); 1798 1799 Start(); 1800 EXPECT_EQ(kEventSignaled, observer.Wait()) 1801 << "Timed out waiting for all SSRCs to send packets."; 1802 1803 // Test stream resetting more than once to make sure that the state doesn't 1804 // get set once (this could be due to using std::map::insert for instance). 1805 for (size_t i = 0; i < 3; ++i) { 1806 frame_generator_capturer_->Stop(); 1807 sender_call_->DestroyVideoSendStream(send_stream_); 1808 1809 // Re-create VideoSendStream with only one stream. 1810 VideoEncoderConfig one_stream = encoder_config_; 1811 one_stream.streams.resize(1); 1812 send_stream_ = 1813 sender_call_->CreateVideoSendStream(send_config_, one_stream); 1814 send_stream_->Start(); 1815 CreateFrameGeneratorCapturer(); 1816 frame_generator_capturer_->Start(); 1817 1818 observer.ResetExpectedSsrcs(1); 1819 EXPECT_EQ(kEventSignaled, observer.Wait()) 1820 << "Timed out waiting for single RTP packet."; 1821 1822 // Reconfigure back to use all streams. 1823 send_stream_->ReconfigureVideoEncoder(encoder_config_); 1824 observer.ResetExpectedSsrcs(kNumSsrcs); 1825 EXPECT_EQ(kEventSignaled, observer.Wait()) 1826 << "Timed out waiting for all SSRCs to send packets."; 1827 1828 // Reconfigure down to one stream. 1829 send_stream_->ReconfigureVideoEncoder(one_stream); 1830 observer.ResetExpectedSsrcs(1); 1831 EXPECT_EQ(kEventSignaled, observer.Wait()) 1832 << "Timed out waiting for single RTP packet."; 1833 1834 // Reconfigure back to use all streams. 1835 send_stream_->ReconfigureVideoEncoder(encoder_config_); 1836 observer.ResetExpectedSsrcs(kNumSsrcs); 1837 EXPECT_EQ(kEventSignaled, observer.Wait()) 1838 << "Timed out waiting for all SSRCs to send packets."; 1839 } 1840 1841 observer.StopSending(); 1842 1843 Stop(); 1844 DestroyStreams(); 1845 } 1846 1847 TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpState) { 1848 TestRtpStatePreservation(false); 1849 } 1850 1851 TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) { 1852 TestRtpStatePreservation(true); 1853 } 1854 1855 TEST_F(EndToEndTest, RespectsNetworkState) { 1856 // TODO(pbos): Remove accepted downtime packets etc. when signaling network 1857 // down blocks until no more packets will be sent. 1858 1859 // Pacer will send from its packet list and then send required padding before 1860 // checking paused_ again. This should be enough for one round of pacing, 1861 // otherwise increase. 1862 static const int kNumAcceptedDowntimeRtp = 5; 1863 // A single RTCP may be in the pipeline. 1864 static const int kNumAcceptedDowntimeRtcp = 1; 1865 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder { 1866 public: 1867 NetworkStateTest() 1868 : EndToEndTest(kDefaultTimeoutMs), 1869 FakeEncoder(Clock::GetRealTimeClock()), 1870 test_crit_(CriticalSectionWrapper::CreateCriticalSection()), 1871 encoded_frames_(EventWrapper::Create()), 1872 sender_packets_(EventWrapper::Create()), 1873 receiver_packets_(EventWrapper::Create()), 1874 sender_state_(Call::kNetworkUp), 1875 down_sender_rtp_(0), 1876 down_sender_rtcp_(0), 1877 receiver_state_(Call::kNetworkUp), 1878 down_receiver_rtcp_(0), 1879 down_frames_(0) {} 1880 1881 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 1882 CriticalSectionScoped lock(test_crit_.get()); 1883 if (sender_state_ == Call::kNetworkDown) { 1884 ++down_sender_rtp_; 1885 EXPECT_LE(down_sender_rtp_, kNumAcceptedDowntimeRtp) 1886 << "RTP sent during sender-side downtime."; 1887 if (down_sender_rtp_> kNumAcceptedDowntimeRtp) 1888 sender_packets_->Set(); 1889 } else { 1890 sender_packets_->Set(); 1891 } 1892 return SEND_PACKET; 1893 } 1894 1895 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE { 1896 CriticalSectionScoped lock(test_crit_.get()); 1897 if (sender_state_ == Call::kNetworkDown) { 1898 ++down_sender_rtcp_; 1899 EXPECT_LE(down_sender_rtcp_, kNumAcceptedDowntimeRtcp) 1900 << "RTCP sent during sender-side downtime."; 1901 if (down_sender_rtcp_ > kNumAcceptedDowntimeRtcp) 1902 sender_packets_->Set(); 1903 } else { 1904 sender_packets_->Set(); 1905 } 1906 return SEND_PACKET; 1907 } 1908 1909 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) OVERRIDE { 1910 ADD_FAILURE() << "Unexpected receiver RTP, should not be sending."; 1911 return SEND_PACKET; 1912 } 1913 1914 virtual Action OnReceiveRtcp(const uint8_t* packet, 1915 size_t length) OVERRIDE { 1916 CriticalSectionScoped lock(test_crit_.get()); 1917 if (receiver_state_ == Call::kNetworkDown) { 1918 ++down_receiver_rtcp_; 1919 EXPECT_LE(down_receiver_rtcp_, kNumAcceptedDowntimeRtcp) 1920 << "RTCP sent during receiver-side downtime."; 1921 if (down_receiver_rtcp_ > kNumAcceptedDowntimeRtcp) 1922 receiver_packets_->Set(); 1923 } else { 1924 receiver_packets_->Set(); 1925 } 1926 return SEND_PACKET; 1927 } 1928 1929 virtual void OnCallsCreated(Call* sender_call, 1930 Call* receiver_call) OVERRIDE { 1931 sender_call_ = sender_call; 1932 receiver_call_ = receiver_call; 1933 } 1934 1935 virtual void ModifyConfigs( 1936 VideoSendStream::Config* send_config, 1937 std::vector<VideoReceiveStream::Config>* receive_configs, 1938 VideoEncoderConfig* encoder_config) OVERRIDE { 1939 send_config->encoder_settings.encoder = this; 1940 } 1941 1942 virtual void PerformTest() OVERRIDE { 1943 EXPECT_EQ(kEventSignaled, encoded_frames_->Wait(kDefaultTimeoutMs)) 1944 << "No frames received by the encoder."; 1945 EXPECT_EQ(kEventSignaled, sender_packets_->Wait(kDefaultTimeoutMs)) 1946 << "Timed out waiting for send-side packets."; 1947 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs)) 1948 << "Timed out waiting for receiver-side packets."; 1949 1950 // Sender-side network down. 1951 sender_call_->SignalNetworkState(Call::kNetworkDown); 1952 { 1953 CriticalSectionScoped lock(test_crit_.get()); 1954 sender_packets_->Reset(); // Earlier packets should not count. 1955 sender_state_ = Call::kNetworkDown; 1956 } 1957 EXPECT_EQ(kEventTimeout, sender_packets_->Wait(kSilenceTimeoutMs)) 1958 << "Packets sent during sender-network downtime."; 1959 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs)) 1960 << "Timed out waiting for receiver-side packets."; 1961 // Receiver-side network down. 1962 receiver_call_->SignalNetworkState(Call::kNetworkDown); 1963 { 1964 CriticalSectionScoped lock(test_crit_.get()); 1965 receiver_packets_->Reset(); // Earlier packets should not count. 1966 receiver_state_ = Call::kNetworkDown; 1967 } 1968 EXPECT_EQ(kEventTimeout, receiver_packets_->Wait(kSilenceTimeoutMs)) 1969 << "Packets sent during receiver-network downtime."; 1970 1971 // Network back up again for both. 1972 { 1973 CriticalSectionScoped lock(test_crit_.get()); 1974 sender_packets_->Reset(); // Earlier packets should not count. 1975 receiver_packets_->Reset(); // Earlier packets should not count. 1976 sender_state_ = receiver_state_ = Call::kNetworkUp; 1977 } 1978 sender_call_->SignalNetworkState(Call::kNetworkUp); 1979 receiver_call_->SignalNetworkState(Call::kNetworkUp); 1980 EXPECT_EQ(kEventSignaled, sender_packets_->Wait(kDefaultTimeoutMs)) 1981 << "Timed out waiting for send-side packets."; 1982 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs)) 1983 << "Timed out waiting for receiver-side packets."; 1984 } 1985 1986 virtual int32_t Encode(const I420VideoFrame& input_image, 1987 const CodecSpecificInfo* codec_specific_info, 1988 const std::vector<VideoFrameType>* frame_types) 1989 OVERRIDE { 1990 { 1991 CriticalSectionScoped lock(test_crit_.get()); 1992 if (sender_state_ == Call::kNetworkDown) { 1993 ++down_frames_; 1994 EXPECT_LE(down_frames_, 1) 1995 << "Encoding more than one frame while network is down."; 1996 if (down_frames_ > 1) 1997 encoded_frames_->Set(); 1998 } else { 1999 encoded_frames_->Set(); 2000 } 2001 } 2002 return test::FakeEncoder::Encode( 2003 input_image, codec_specific_info, frame_types); 2004 } 2005 2006 private: 2007 const scoped_ptr<CriticalSectionWrapper> test_crit_; 2008 scoped_ptr<EventWrapper> encoded_frames_; 2009 scoped_ptr<EventWrapper> sender_packets_; 2010 scoped_ptr<EventWrapper> receiver_packets_; 2011 Call* sender_call_; 2012 Call* receiver_call_; 2013 Call::NetworkState sender_state_ GUARDED_BY(test_crit_); 2014 int down_sender_rtp_ GUARDED_BY(test_crit_); 2015 int down_sender_rtcp_ GUARDED_BY(test_crit_); 2016 Call::NetworkState receiver_state_ GUARDED_BY(test_crit_); 2017 int down_receiver_rtcp_ GUARDED_BY(test_crit_); 2018 int down_frames_ GUARDED_BY(test_crit_); 2019 } test; 2020 2021 RunBaseTest(&test); 2022 } 2023 2024 TEST_F(EndToEndTest, NewSendStreamsRespectNetworkDown) { 2025 class UnusedEncoder : public test::FakeEncoder { 2026 public: 2027 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {} 2028 virtual int32_t Encode(const I420VideoFrame& input_image, 2029 const CodecSpecificInfo* codec_specific_info, 2030 const std::vector<VideoFrameType>* frame_types) 2031 OVERRIDE { 2032 ADD_FAILURE() << "Unexpected frame encode."; 2033 return test::FakeEncoder::Encode( 2034 input_image, codec_specific_info, frame_types); 2035 } 2036 }; 2037 2038 UnusedTransport transport; 2039 CreateSenderCall(Call::Config(&transport)); 2040 sender_call_->SignalNetworkState(Call::kNetworkDown); 2041 2042 CreateSendConfig(1); 2043 UnusedEncoder unused_encoder; 2044 send_config_.encoder_settings.encoder = &unused_encoder; 2045 CreateStreams(); 2046 CreateFrameGeneratorCapturer(); 2047 2048 Start(); 2049 SleepMs(kSilenceTimeoutMs); 2050 Stop(); 2051 2052 DestroyStreams(); 2053 } 2054 2055 TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) { 2056 test::DirectTransport sender_transport; 2057 CreateSenderCall(Call::Config(&sender_transport)); 2058 UnusedTransport transport; 2059 CreateReceiverCall(Call::Config(&transport)); 2060 sender_transport.SetReceiver(receiver_call_->Receiver()); 2061 2062 receiver_call_->SignalNetworkState(Call::kNetworkDown); 2063 2064 CreateSendConfig(1); 2065 CreateMatchingReceiveConfigs(); 2066 CreateStreams(); 2067 CreateFrameGeneratorCapturer(); 2068 2069 Start(); 2070 SleepMs(kSilenceTimeoutMs); 2071 Stop(); 2072 2073 sender_transport.StopSending(); 2074 2075 DestroyStreams(); 2076 } 2077 } // namespace webrtc 2078