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 <algorithm> // max 11 12 #include "testing/gtest/include/gtest/gtest.h" 13 14 #include "webrtc/call.h" 15 #include "webrtc/common_video/interface/i420_video_frame.h" 16 #include "webrtc/common_video/interface/native_handle.h" 17 #include "webrtc/common_video/interface/texture_video_frame.h" 18 #include "webrtc/frame_callback.h" 19 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" 20 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" 21 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" 23 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 24 #include "webrtc/system_wrappers/interface/event_wrapper.h" 25 #include "webrtc/system_wrappers/interface/ref_count.h" 26 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 27 #include "webrtc/system_wrappers/interface/scoped_vector.h" 28 #include "webrtc/system_wrappers/interface/sleep.h" 29 #include "webrtc/system_wrappers/interface/thread_wrapper.h" 30 #include "webrtc/system_wrappers/interface/logging.h" 31 #include "webrtc/test/call_test.h" 32 #include "webrtc/test/configurable_frame_size_encoder.h" 33 #include "webrtc/test/null_transport.h" 34 #include "webrtc/test/testsupport/perf_test.h" 35 #include "webrtc/video/transport_adapter.h" 36 #include "webrtc/video_send_stream.h" 37 38 namespace webrtc { 39 40 enum VideoFormat { kGeneric, kVP8, }; 41 42 void ExpectEqualFrames(const I420VideoFrame& frame1, 43 const I420VideoFrame& frame2); 44 void ExpectEqualTextureFrames(const I420VideoFrame& frame1, 45 const I420VideoFrame& frame2); 46 void ExpectEqualBufferFrames(const I420VideoFrame& frame1, 47 const I420VideoFrame& frame2); 48 void ExpectEqualFramesVector(const std::vector<I420VideoFrame*>& frames1, 49 const std::vector<I420VideoFrame*>& frames2); 50 I420VideoFrame* CreateI420VideoFrame(int width, int height, uint8_t data); 51 52 class FakeNativeHandle : public NativeHandle { 53 public: 54 FakeNativeHandle() {} 55 virtual ~FakeNativeHandle() {} 56 virtual void* GetHandle() { return NULL; } 57 }; 58 59 class VideoSendStreamTest : public test::CallTest { 60 protected: 61 void TestNackRetransmission(uint32_t retransmit_ssrc, 62 uint8_t retransmit_payload_type); 63 void TestPacketFragmentationSize(VideoFormat format, bool with_fec); 64 }; 65 66 TEST_F(VideoSendStreamTest, CanStartStartedStream) { 67 test::NullTransport transport; 68 Call::Config call_config(&transport); 69 CreateSenderCall(call_config); 70 71 CreateSendConfig(1); 72 CreateStreams(); 73 send_stream_->Start(); 74 send_stream_->Start(); 75 DestroyStreams(); 76 } 77 78 TEST_F(VideoSendStreamTest, CanStopStoppedStream) { 79 test::NullTransport transport; 80 Call::Config call_config(&transport); 81 CreateSenderCall(call_config); 82 83 CreateSendConfig(1); 84 CreateStreams(); 85 send_stream_->Stop(); 86 send_stream_->Stop(); 87 DestroyStreams(); 88 } 89 90 TEST_F(VideoSendStreamTest, SupportsCName) { 91 static std::string kCName = "PjQatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo="; 92 class CNameObserver : public test::SendTest { 93 public: 94 CNameObserver() : SendTest(kDefaultTimeoutMs) {} 95 96 private: 97 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE { 98 RTCPUtility::RTCPParserV2 parser(packet, length, true); 99 EXPECT_TRUE(parser.IsValid()); 100 101 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 102 while (packet_type != RTCPUtility::kRtcpNotValidCode) { 103 if (packet_type == RTCPUtility::kRtcpSdesChunkCode) { 104 EXPECT_EQ(parser.Packet().CName.CName, kCName); 105 observation_complete_->Set(); 106 } 107 108 packet_type = parser.Iterate(); 109 } 110 111 return SEND_PACKET; 112 } 113 114 virtual void ModifyConfigs( 115 VideoSendStream::Config* send_config, 116 std::vector<VideoReceiveStream::Config>* receive_configs, 117 VideoEncoderConfig* encoder_config) OVERRIDE { 118 send_config->rtp.c_name = kCName; 119 } 120 121 virtual void PerformTest() OVERRIDE { 122 EXPECT_EQ(kEventSignaled, Wait()) 123 << "Timed out while waiting for RTCP with CNAME."; 124 } 125 } test; 126 127 RunBaseTest(&test); 128 } 129 130 TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) { 131 static const uint8_t kAbsSendTimeExtensionId = 13; 132 class AbsoluteSendTimeObserver : public test::SendTest { 133 public: 134 AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) { 135 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( 136 kRtpExtensionAbsoluteSendTime, kAbsSendTimeExtensionId)); 137 } 138 139 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 140 RTPHeader header; 141 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 142 143 EXPECT_FALSE(header.extension.hasTransmissionTimeOffset); 144 EXPECT_TRUE(header.extension.hasAbsoluteSendTime); 145 EXPECT_EQ(header.extension.transmissionTimeOffset, 0); 146 EXPECT_GT(header.extension.absoluteSendTime, 0u); 147 observation_complete_->Set(); 148 149 return SEND_PACKET; 150 } 151 152 virtual void ModifyConfigs( 153 VideoSendStream::Config* send_config, 154 std::vector<VideoReceiveStream::Config>* receive_configs, 155 VideoEncoderConfig* encoder_config) OVERRIDE { 156 send_config->rtp.extensions.push_back( 157 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeExtensionId)); 158 } 159 160 virtual void PerformTest() OVERRIDE { 161 EXPECT_EQ(kEventSignaled, Wait()) 162 << "Timed out while waiting for single RTP packet."; 163 } 164 } test; 165 166 RunBaseTest(&test); 167 } 168 169 TEST_F(VideoSendStreamTest, SupportsTransmissionTimeOffset) { 170 static const uint8_t kTOffsetExtensionId = 13; 171 class TransmissionTimeOffsetObserver : public test::SendTest { 172 public: 173 TransmissionTimeOffsetObserver() 174 : SendTest(kDefaultTimeoutMs), encoder_(Clock::GetRealTimeClock()) { 175 EXPECT_TRUE(parser_->RegisterRtpHeaderExtension( 176 kRtpExtensionTransmissionTimeOffset, kTOffsetExtensionId)); 177 } 178 179 private: 180 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 181 RTPHeader header; 182 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 183 184 EXPECT_TRUE(header.extension.hasTransmissionTimeOffset); 185 EXPECT_FALSE(header.extension.hasAbsoluteSendTime); 186 EXPECT_GT(header.extension.transmissionTimeOffset, 0); 187 EXPECT_EQ(header.extension.absoluteSendTime, 0u); 188 observation_complete_->Set(); 189 190 return SEND_PACKET; 191 } 192 193 virtual void ModifyConfigs( 194 VideoSendStream::Config* send_config, 195 std::vector<VideoReceiveStream::Config>* receive_configs, 196 VideoEncoderConfig* encoder_config) OVERRIDE { 197 send_config->encoder_settings.encoder = &encoder_; 198 send_config->rtp.extensions.push_back( 199 RtpExtension(RtpExtension::kTOffset, kTOffsetExtensionId)); 200 } 201 202 virtual void PerformTest() OVERRIDE { 203 EXPECT_EQ(kEventSignaled, Wait()) 204 << "Timed out while waiting single RTP packet."; 205 } 206 207 class DelayedEncoder : public test::FakeEncoder { 208 public: 209 explicit DelayedEncoder(Clock* clock) : test::FakeEncoder(clock) {} 210 virtual int32_t Encode( 211 const I420VideoFrame& input_image, 212 const CodecSpecificInfo* codec_specific_info, 213 const std::vector<VideoFrameType>* frame_types) OVERRIDE { 214 // A delay needs to be introduced to assure that we get a timestamp 215 // offset. 216 SleepMs(5); 217 return FakeEncoder::Encode( 218 input_image, codec_specific_info, frame_types); 219 } 220 }; 221 222 DelayedEncoder encoder_; 223 } test; 224 225 RunBaseTest(&test); 226 } 227 228 class FakeReceiveStatistics : public NullReceiveStatistics { 229 public: 230 FakeReceiveStatistics(uint32_t send_ssrc, 231 uint32_t last_sequence_number, 232 uint32_t cumulative_lost, 233 uint8_t fraction_lost) 234 : lossy_stats_(new LossyStatistician(last_sequence_number, 235 cumulative_lost, 236 fraction_lost)) { 237 stats_map_[send_ssrc] = lossy_stats_.get(); 238 } 239 240 virtual StatisticianMap GetActiveStatisticians() const OVERRIDE { 241 return stats_map_; 242 } 243 244 virtual StreamStatistician* GetStatistician(uint32_t ssrc) const OVERRIDE { 245 return lossy_stats_.get(); 246 } 247 248 private: 249 class LossyStatistician : public StreamStatistician { 250 public: 251 LossyStatistician(uint32_t extended_max_sequence_number, 252 uint32_t cumulative_lost, 253 uint8_t fraction_lost) { 254 stats_.fraction_lost = fraction_lost; 255 stats_.cumulative_lost = cumulative_lost; 256 stats_.extended_max_sequence_number = extended_max_sequence_number; 257 } 258 virtual bool GetStatistics(RtcpStatistics* statistics, 259 bool reset) OVERRIDE { 260 *statistics = stats_; 261 return true; 262 } 263 virtual void GetDataCounters(uint32_t* bytes_received, 264 uint32_t* packets_received) const OVERRIDE { 265 *bytes_received = 0; 266 *packets_received = 0; 267 } 268 virtual uint32_t BitrateReceived() const OVERRIDE { return 0; } 269 virtual void ResetStatistics() OVERRIDE {} 270 virtual bool IsRetransmitOfOldPacket(const RTPHeader& header, 271 int min_rtt) const OVERRIDE { 272 return false; 273 } 274 275 virtual bool IsPacketInOrder(uint16_t sequence_number) const OVERRIDE { 276 return true; 277 } 278 279 RtcpStatistics stats_; 280 }; 281 282 scoped_ptr<LossyStatistician> lossy_stats_; 283 StatisticianMap stats_map_; 284 }; 285 286 TEST_F(VideoSendStreamTest, SwapsI420VideoFrames) { 287 static const size_t kWidth = 320; 288 static const size_t kHeight = 240; 289 290 test::NullTransport transport; 291 Call::Config call_config(&transport); 292 CreateSenderCall(call_config); 293 294 CreateSendConfig(1); 295 CreateStreams(); 296 send_stream_->Start(); 297 298 I420VideoFrame frame; 299 frame.CreateEmptyFrame( 300 kWidth, kHeight, kWidth, (kWidth + 1) / 2, (kWidth + 1) / 2); 301 uint8_t* old_y_buffer = frame.buffer(kYPlane); 302 303 send_stream_->Input()->SwapFrame(&frame); 304 305 EXPECT_NE(frame.buffer(kYPlane), old_y_buffer); 306 307 DestroyStreams(); 308 } 309 310 TEST_F(VideoSendStreamTest, SupportsFec) { 311 class FecObserver : public test::SendTest { 312 public: 313 FecObserver() 314 : SendTest(kDefaultTimeoutMs), 315 transport_adapter_(SendTransport()), 316 send_count_(0), 317 received_media_(false), 318 received_fec_(false) { 319 transport_adapter_.Enable(); 320 } 321 322 private: 323 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 324 RTPHeader header; 325 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 326 327 // Send lossy receive reports to trigger FEC enabling. 328 if (send_count_++ % 2 != 0) { 329 // Receive statistics reporting having lost 50% of the packets. 330 FakeReceiveStatistics lossy_receive_stats( 331 kSendSsrcs[0], header.sequenceNumber, send_count_ / 2, 127); 332 RTCPSender rtcp_sender( 333 0, false, Clock::GetRealTimeClock(), &lossy_receive_stats); 334 EXPECT_EQ(0, rtcp_sender.RegisterSendTransport(&transport_adapter_)); 335 336 rtcp_sender.SetRTCPStatus(kRtcpNonCompound); 337 rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]); 338 339 RTCPSender::FeedbackState feedback_state; 340 341 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr)); 342 } 343 344 EXPECT_EQ(kRedPayloadType, header.payloadType); 345 346 uint8_t encapsulated_payload_type = packet[header.headerLength]; 347 348 if (encapsulated_payload_type == kUlpfecPayloadType) { 349 received_fec_ = true; 350 } else { 351 received_media_ = true; 352 } 353 354 if (received_media_ && received_fec_) 355 observation_complete_->Set(); 356 357 return SEND_PACKET; 358 } 359 360 virtual void ModifyConfigs( 361 VideoSendStream::Config* send_config, 362 std::vector<VideoReceiveStream::Config>* receive_configs, 363 VideoEncoderConfig* encoder_config) OVERRIDE { 364 send_config->rtp.fec.red_payload_type = kRedPayloadType; 365 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 366 } 367 368 virtual void PerformTest() OVERRIDE { 369 EXPECT_TRUE(Wait()) << "Timed out waiting for FEC and media packets."; 370 } 371 372 internal::TransportAdapter transport_adapter_; 373 int send_count_; 374 bool received_media_; 375 bool received_fec_; 376 } test; 377 378 RunBaseTest(&test); 379 } 380 381 void VideoSendStreamTest::TestNackRetransmission( 382 uint32_t retransmit_ssrc, 383 uint8_t retransmit_payload_type) { 384 class NackObserver : public test::SendTest { 385 public: 386 explicit NackObserver(uint32_t retransmit_ssrc, 387 uint8_t retransmit_payload_type) 388 : SendTest(kDefaultTimeoutMs), 389 transport_adapter_(SendTransport()), 390 send_count_(0), 391 retransmit_ssrc_(retransmit_ssrc), 392 retransmit_payload_type_(retransmit_payload_type), 393 nacked_sequence_number_(-1) { 394 transport_adapter_.Enable(); 395 } 396 397 private: 398 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 399 RTPHeader header; 400 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 401 402 // Nack second packet after receiving the third one. 403 if (++send_count_ == 3) { 404 uint16_t nack_sequence_number = header.sequenceNumber - 1; 405 nacked_sequence_number_ = nack_sequence_number; 406 NullReceiveStatistics null_stats; 407 RTCPSender rtcp_sender( 408 0, false, Clock::GetRealTimeClock(), &null_stats); 409 EXPECT_EQ(0, rtcp_sender.RegisterSendTransport(&transport_adapter_)); 410 411 rtcp_sender.SetRTCPStatus(kRtcpNonCompound); 412 rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]); 413 414 RTCPSender::FeedbackState feedback_state; 415 416 EXPECT_EQ(0, 417 rtcp_sender.SendRTCP( 418 feedback_state, kRtcpNack, 1, &nack_sequence_number)); 419 } 420 421 uint16_t sequence_number = header.sequenceNumber; 422 423 if (header.ssrc == retransmit_ssrc_ && 424 retransmit_ssrc_ != kSendSsrcs[0]) { 425 // Not kSendSsrcs[0], assume correct RTX packet. Extract sequence 426 // number. 427 const uint8_t* rtx_header = packet + header.headerLength; 428 sequence_number = (rtx_header[0] << 8) + rtx_header[1]; 429 } 430 431 if (sequence_number == nacked_sequence_number_) { 432 EXPECT_EQ(retransmit_ssrc_, header.ssrc); 433 EXPECT_EQ(retransmit_payload_type_, header.payloadType); 434 observation_complete_->Set(); 435 } 436 437 return SEND_PACKET; 438 } 439 440 virtual void ModifyConfigs( 441 VideoSendStream::Config* send_config, 442 std::vector<VideoReceiveStream::Config>* receive_configs, 443 VideoEncoderConfig* encoder_config) OVERRIDE { 444 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 445 send_config->rtp.rtx.payload_type = retransmit_payload_type_; 446 if (retransmit_ssrc_ != kSendSsrcs[0]) 447 send_config->rtp.rtx.ssrcs.push_back(retransmit_ssrc_); 448 } 449 450 virtual void PerformTest() OVERRIDE { 451 EXPECT_EQ(kEventSignaled, Wait()) 452 << "Timed out while waiting for NACK retransmission."; 453 } 454 455 internal::TransportAdapter transport_adapter_; 456 int send_count_; 457 uint32_t retransmit_ssrc_; 458 uint8_t retransmit_payload_type_; 459 int nacked_sequence_number_; 460 } test(retransmit_ssrc, retransmit_payload_type); 461 462 RunBaseTest(&test); 463 } 464 465 TEST_F(VideoSendStreamTest, RetransmitsNack) { 466 // Normal NACKs should use the send SSRC. 467 TestNackRetransmission(kSendSsrcs[0], kFakeSendPayloadType); 468 } 469 470 TEST_F(VideoSendStreamTest, RetransmitsNackOverRtx) { 471 // NACKs over RTX should use a separate SSRC. 472 TestNackRetransmission(kSendRtxSsrcs[0], kSendRtxPayloadType); 473 } 474 475 void VideoSendStreamTest::TestPacketFragmentationSize(VideoFormat format, 476 bool with_fec) { 477 // Use a fake encoder to output a frame of every size in the range [90, 290], 478 // for each size making sure that the exact number of payload bytes received 479 // is correct and that packets are fragmented to respect max packet size. 480 static const uint32_t kMaxPacketSize = 128; 481 static const uint32_t start = 90; 482 static const uint32_t stop = 290; 483 484 // Observer that verifies that the expected number of packets and bytes 485 // arrive for each frame size, from start_size to stop_size. 486 class FrameFragmentationTest : public test::SendTest, 487 public EncodedFrameObserver { 488 public: 489 FrameFragmentationTest(uint32_t max_packet_size, 490 uint32_t start_size, 491 uint32_t stop_size, 492 bool test_generic_packetization, 493 bool use_fec) 494 : SendTest(kLongTimeoutMs), 495 transport_adapter_(SendTransport()), 496 encoder_(stop), 497 max_packet_size_(max_packet_size), 498 stop_size_(stop_size), 499 test_generic_packetization_(test_generic_packetization), 500 use_fec_(use_fec), 501 packet_count_(0), 502 accumulated_size_(0), 503 accumulated_payload_(0), 504 fec_packet_received_(false), 505 current_size_rtp_(start_size), 506 current_size_frame_(start_size) { 507 // Fragmentation required, this test doesn't make sense without it. 508 encoder_.SetFrameSize(start); 509 assert(stop_size > max_packet_size); 510 transport_adapter_.Enable(); 511 } 512 513 private: 514 virtual Action OnSendRtp(const uint8_t* packet, size_t size) OVERRIDE { 515 uint32_t length = static_cast<int>(size); 516 RTPHeader header; 517 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 518 519 EXPECT_LE(length, max_packet_size_); 520 521 if (use_fec_) { 522 uint8_t payload_type = packet[header.headerLength]; 523 bool is_fec = header.payloadType == kRedPayloadType && 524 payload_type == kUlpfecPayloadType; 525 if (is_fec) { 526 fec_packet_received_ = true; 527 return SEND_PACKET; 528 } 529 } 530 531 accumulated_size_ += length; 532 533 if (use_fec_) 534 TriggerLossReport(header); 535 536 if (test_generic_packetization_) { 537 uint32_t overhead = header.headerLength + header.paddingLength + 538 (1 /* Generic header */); 539 if (use_fec_) 540 overhead += 1; // RED for FEC header. 541 accumulated_payload_ += length - overhead; 542 } 543 544 // Marker bit set indicates last packet of a frame. 545 if (header.markerBit) { 546 if (use_fec_ && accumulated_payload_ == current_size_rtp_ - 1) { 547 // With FEC enabled, frame size is incremented asynchronously, so 548 // "old" frames one byte too small may arrive. Accept, but don't 549 // increase expected frame size. 550 accumulated_size_ = 0; 551 accumulated_payload_ = 0; 552 return SEND_PACKET; 553 } 554 555 EXPECT_GE(accumulated_size_, current_size_rtp_); 556 if (test_generic_packetization_) { 557 EXPECT_EQ(current_size_rtp_, accumulated_payload_); 558 } 559 560 // Last packet of frame; reset counters. 561 accumulated_size_ = 0; 562 accumulated_payload_ = 0; 563 if (current_size_rtp_ == stop_size_) { 564 // Done! (Don't increase size again, might arrive more @ stop_size). 565 observation_complete_->Set(); 566 } else { 567 // Increase next expected frame size. If testing with FEC, make sure 568 // a FEC packet has been received for this frame size before 569 // proceeding, to make sure that redundancy packets don't exceed 570 // size limit. 571 if (!use_fec_) { 572 ++current_size_rtp_; 573 } else if (fec_packet_received_) { 574 fec_packet_received_ = false; 575 ++current_size_rtp_; 576 ++current_size_frame_; 577 } 578 } 579 } 580 581 return SEND_PACKET; 582 } 583 584 void TriggerLossReport(const RTPHeader& header) { 585 // Send lossy receive reports to trigger FEC enabling. 586 if (packet_count_++ % 2 != 0) { 587 // Receive statistics reporting having lost 50% of the packets. 588 FakeReceiveStatistics lossy_receive_stats( 589 kSendSsrcs[0], header.sequenceNumber, packet_count_ / 2, 127); 590 RTCPSender rtcp_sender( 591 0, false, Clock::GetRealTimeClock(), &lossy_receive_stats); 592 EXPECT_EQ(0, rtcp_sender.RegisterSendTransport(&transport_adapter_)); 593 594 rtcp_sender.SetRTCPStatus(kRtcpNonCompound); 595 rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]); 596 597 RTCPSender::FeedbackState feedback_state; 598 599 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr)); 600 } 601 } 602 603 virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) { 604 // Increase frame size for next encoded frame, in the context of the 605 // encoder thread. 606 if (!use_fec_ && 607 current_size_frame_.Value() < static_cast<int32_t>(stop_size_)) { 608 ++current_size_frame_; 609 } 610 encoder_.SetFrameSize(current_size_frame_.Value()); 611 } 612 613 virtual void ModifyConfigs( 614 VideoSendStream::Config* send_config, 615 std::vector<VideoReceiveStream::Config>* receive_configs, 616 VideoEncoderConfig* encoder_config) OVERRIDE { 617 if (use_fec_) { 618 send_config->rtp.fec.red_payload_type = kRedPayloadType; 619 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; 620 } 621 622 if (!test_generic_packetization_) 623 send_config->encoder_settings.payload_name = "VP8"; 624 625 send_config->encoder_settings.encoder = &encoder_; 626 send_config->rtp.max_packet_size = kMaxPacketSize; 627 send_config->post_encode_callback = this; 628 629 // Add an extension header, to make the RTP header larger than the base 630 // length of 12 bytes. 631 static const uint8_t kAbsSendTimeExtensionId = 13; 632 send_config->rtp.extensions.push_back( 633 RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeExtensionId)); 634 } 635 636 virtual void PerformTest() OVERRIDE { 637 EXPECT_EQ(kEventSignaled, Wait()) 638 << "Timed out while observing incoming RTP packets."; 639 } 640 641 internal::TransportAdapter transport_adapter_; 642 test::ConfigurableFrameSizeEncoder encoder_; 643 644 const uint32_t max_packet_size_; 645 const uint32_t stop_size_; 646 const bool test_generic_packetization_; 647 const bool use_fec_; 648 649 uint32_t packet_count_; 650 uint32_t accumulated_size_; 651 uint32_t accumulated_payload_; 652 bool fec_packet_received_; 653 654 uint32_t current_size_rtp_; 655 Atomic32 current_size_frame_; 656 }; 657 658 // Don't auto increment if FEC is used; continue sending frame size until 659 // a FEC packet has been received. 660 FrameFragmentationTest test( 661 kMaxPacketSize, start, stop, format == kGeneric, with_fec); 662 663 RunBaseTest(&test); 664 } 665 666 // TODO(sprang): Is there any way of speeding up these tests? 667 TEST_F(VideoSendStreamTest, FragmentsGenericAccordingToMaxPacketSize) { 668 TestPacketFragmentationSize(kGeneric, false); 669 } 670 671 TEST_F(VideoSendStreamTest, FragmentsGenericAccordingToMaxPacketSizeWithFec) { 672 TestPacketFragmentationSize(kGeneric, true); 673 } 674 675 TEST_F(VideoSendStreamTest, FragmentsVp8AccordingToMaxPacketSize) { 676 TestPacketFragmentationSize(kVP8, false); 677 } 678 679 TEST_F(VideoSendStreamTest, FragmentsVp8AccordingToMaxPacketSizeWithFec) { 680 TestPacketFragmentationSize(kVP8, true); 681 } 682 683 // The test will go through a number of phases. 684 // 1. Start sending packets. 685 // 2. As soon as the RTP stream has been detected, signal a low REMB value to 686 // suspend the stream. 687 // 3. Wait until |kSuspendTimeFrames| have been captured without seeing any RTP 688 // packets. 689 // 4. Signal a high REMB and then wait for the RTP stream to start again. 690 // When the stream is detected again, and the stats show that the stream 691 // is no longer suspended, the test ends. 692 TEST_F(VideoSendStreamTest, SuspendBelowMinBitrate) { 693 static const int kSuspendTimeFrames = 60; // Suspend for 2 seconds @ 30 fps. 694 695 class RembObserver : public test::SendTest, public I420FrameCallback { 696 public: 697 RembObserver() 698 : SendTest(kDefaultTimeoutMs), 699 transport_adapter_(&transport_), 700 clock_(Clock::GetRealTimeClock()), 701 crit_(CriticalSectionWrapper::CreateCriticalSection()), 702 test_state_(kBeforeSuspend), 703 rtp_count_(0), 704 last_sequence_number_(0), 705 suspended_frame_count_(0), 706 low_remb_bps_(0), 707 high_remb_bps_(0) { 708 transport_adapter_.Enable(); 709 } 710 711 private: 712 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE { 713 // Receive statistics reporting having lost 0% of the packets. 714 // This is needed for the send-side bitrate controller to work properly. 715 CriticalSectionScoped lock(crit_.get()); 716 SendRtcpFeedback(0); // REMB is only sent if value is > 0. 717 return SEND_PACKET; 718 } 719 720 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 721 CriticalSectionScoped lock(crit_.get()); 722 ++rtp_count_; 723 RTPHeader header; 724 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 725 last_sequence_number_ = header.sequenceNumber; 726 727 if (test_state_ == kBeforeSuspend) { 728 // The stream has started. Try to suspend it. 729 SendRtcpFeedback(low_remb_bps_); 730 test_state_ = kDuringSuspend; 731 } else if (test_state_ == kDuringSuspend) { 732 if (header.paddingLength == 0) { 733 // Received non-padding packet during suspension period. Reset the 734 // counter. 735 suspended_frame_count_ = 0; 736 } 737 } else if (test_state_ == kWaitingForPacket) { 738 if (header.paddingLength == 0) { 739 // Non-padding packet observed. Test is almost complete. Will just 740 // have to wait for the stats to change. 741 test_state_ = kWaitingForStats; 742 } 743 } else if (test_state_ == kWaitingForStats) { 744 VideoSendStream::Stats stats = stream_->GetStats(); 745 if (stats.suspended == false) { 746 // Stats flipped to false. Test is complete. 747 observation_complete_->Set(); 748 } 749 } 750 751 return SEND_PACKET; 752 } 753 754 // This method implements the I420FrameCallback. 755 void FrameCallback(I420VideoFrame* video_frame) OVERRIDE { 756 CriticalSectionScoped lock(crit_.get()); 757 if (test_state_ == kDuringSuspend && 758 ++suspended_frame_count_ > kSuspendTimeFrames) { 759 VideoSendStream::Stats stats = stream_->GetStats(); 760 EXPECT_TRUE(stats.suspended); 761 SendRtcpFeedback(high_remb_bps_); 762 test_state_ = kWaitingForPacket; 763 } 764 } 765 766 void set_low_remb_bps(int value) { 767 CriticalSectionScoped lock(crit_.get()); 768 low_remb_bps_ = value; 769 } 770 771 void set_high_remb_bps(int value) { 772 CriticalSectionScoped lock(crit_.get()); 773 high_remb_bps_ = value; 774 } 775 776 virtual void SetReceivers( 777 PacketReceiver* send_transport_receiver, 778 PacketReceiver* receive_transport_receiver) OVERRIDE { 779 transport_.SetReceiver(send_transport_receiver); 780 } 781 782 virtual void OnStreamsCreated( 783 VideoSendStream* send_stream, 784 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 785 stream_ = send_stream; 786 } 787 788 virtual void ModifyConfigs( 789 VideoSendStream::Config* send_config, 790 std::vector<VideoReceiveStream::Config>* receive_configs, 791 VideoEncoderConfig* encoder_config) OVERRIDE { 792 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 793 send_config->pre_encode_callback = this; 794 send_config->suspend_below_min_bitrate = true; 795 int min_bitrate_bps = encoder_config->streams[0].min_bitrate_bps; 796 set_low_remb_bps(min_bitrate_bps - 10000); 797 int threshold_window = std::max(min_bitrate_bps / 10, 10000); 798 ASSERT_GT(encoder_config->streams[0].max_bitrate_bps, 799 min_bitrate_bps + threshold_window + 5000); 800 set_high_remb_bps(min_bitrate_bps + threshold_window + 5000); 801 } 802 803 virtual void PerformTest() OVERRIDE { 804 EXPECT_EQ(kEventSignaled, Wait()) 805 << "Timed out during suspend-below-min-bitrate test."; 806 transport_.StopSending(); 807 } 808 809 enum TestState { 810 kBeforeSuspend, 811 kDuringSuspend, 812 kWaitingForPacket, 813 kWaitingForStats 814 }; 815 816 virtual void SendRtcpFeedback(int remb_value) 817 EXCLUSIVE_LOCKS_REQUIRED(crit_) { 818 FakeReceiveStatistics receive_stats( 819 kSendSsrcs[0], last_sequence_number_, rtp_count_, 0); 820 RTCPSender rtcp_sender(0, false, clock_, &receive_stats); 821 EXPECT_EQ(0, rtcp_sender.RegisterSendTransport(&transport_adapter_)); 822 823 rtcp_sender.SetRTCPStatus(kRtcpNonCompound); 824 rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]); 825 if (remb_value > 0) { 826 rtcp_sender.SetREMBStatus(true); 827 rtcp_sender.SetREMBData(remb_value, 0, NULL); 828 } 829 RTCPSender::FeedbackState feedback_state; 830 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr)); 831 } 832 833 internal::TransportAdapter transport_adapter_; 834 test::DirectTransport transport_; 835 Clock* const clock_; 836 VideoSendStream* stream_; 837 838 const scoped_ptr<CriticalSectionWrapper> crit_; 839 TestState test_state_ GUARDED_BY(crit_); 840 int rtp_count_ GUARDED_BY(crit_); 841 int last_sequence_number_ GUARDED_BY(crit_); 842 int suspended_frame_count_ GUARDED_BY(crit_); 843 int low_remb_bps_ GUARDED_BY(crit_); 844 int high_remb_bps_ GUARDED_BY(crit_); 845 } test; 846 847 RunBaseTest(&test); 848 } 849 850 TEST_F(VideoSendStreamTest, NoPaddingWhenVideoIsMuted) { 851 class NoPaddingWhenVideoIsMuted : public test::SendTest { 852 public: 853 NoPaddingWhenVideoIsMuted() 854 : SendTest(kDefaultTimeoutMs), 855 clock_(Clock::GetRealTimeClock()), 856 transport_adapter_(ReceiveTransport()), 857 crit_(CriticalSectionWrapper::CreateCriticalSection()), 858 last_packet_time_ms_(-1), 859 capturer_(NULL) { 860 transport_adapter_.Enable(); 861 } 862 863 private: 864 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 865 CriticalSectionScoped lock(crit_.get()); 866 last_packet_time_ms_ = clock_->TimeInMilliseconds(); 867 capturer_->Stop(); 868 return SEND_PACKET; 869 } 870 871 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE { 872 CriticalSectionScoped lock(crit_.get()); 873 const int kVideoMutedThresholdMs = 10000; 874 if (last_packet_time_ms_ > 0 && 875 clock_->TimeInMilliseconds() - last_packet_time_ms_ > 876 kVideoMutedThresholdMs) 877 observation_complete_->Set(); 878 // Receive statistics reporting having lost 50% of the packets. 879 FakeReceiveStatistics receive_stats(kSendSsrcs[0], 1, 1, 0); 880 RTCPSender rtcp_sender( 881 0, false, Clock::GetRealTimeClock(), &receive_stats); 882 EXPECT_EQ(0, rtcp_sender.RegisterSendTransport(&transport_adapter_)); 883 884 rtcp_sender.SetRTCPStatus(kRtcpNonCompound); 885 rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]); 886 887 RTCPSender::FeedbackState feedback_state; 888 889 EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr)); 890 return SEND_PACKET; 891 } 892 893 virtual void SetReceivers( 894 PacketReceiver* send_transport_receiver, 895 PacketReceiver* receive_transport_receiver) OVERRIDE { 896 RtpRtcpObserver::SetReceivers(send_transport_receiver, 897 send_transport_receiver); 898 } 899 900 virtual size_t GetNumStreams() const OVERRIDE { return 3; } 901 902 virtual void OnFrameGeneratorCapturerCreated( 903 test::FrameGeneratorCapturer* frame_generator_capturer) { 904 CriticalSectionScoped lock(crit_.get()); 905 capturer_ = frame_generator_capturer; 906 } 907 908 virtual void PerformTest() OVERRIDE { 909 EXPECT_EQ(kEventSignaled, Wait()) 910 << "Timed out while waiting for RTP packets to stop being sent."; 911 } 912 913 Clock* const clock_; 914 internal::TransportAdapter transport_adapter_; 915 const scoped_ptr<CriticalSectionWrapper> crit_; 916 int64_t last_packet_time_ms_ GUARDED_BY(crit_); 917 test::FrameGeneratorCapturer* capturer_ GUARDED_BY(crit_); 918 } test; 919 920 RunBaseTest(&test); 921 } 922 923 TEST_F(VideoSendStreamTest, ProducesStats) { 924 class ProducesStats : public test::SendTest { 925 public: 926 ProducesStats() 927 : SendTest(kDefaultTimeoutMs), 928 stream_(NULL), 929 event_(EventWrapper::Create()) {} 930 931 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE { 932 event_->Set(); 933 934 return SEND_PACKET; 935 } 936 937 private: 938 bool WaitForFilledStats() { 939 Clock* clock = Clock::GetRealTimeClock(); 940 int64_t now = clock->TimeInMilliseconds(); 941 int64_t stop_time = now + kDefaultTimeoutMs; 942 while (now < stop_time) { 943 int64_t time_left = stop_time - now; 944 if (time_left > 0 && event_->Wait(time_left) == kEventSignaled && 945 CheckStats()) { 946 return true; 947 } 948 now = clock->TimeInMilliseconds(); 949 } 950 return false; 951 } 952 953 bool CheckStats() { 954 VideoSendStream::Stats stats = stream_->GetStats(); 955 // Check that all applicable data sources have been used. 956 if (stats.input_frame_rate > 0 && stats.encode_frame_rate > 0 957 && !stats.substreams.empty()) { 958 uint32_t ssrc = stats.substreams.begin()->first; 959 EXPECT_NE( 960 config_.rtp.ssrcs.end(), 961 std::find( 962 config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end(), ssrc)); 963 // Check for data populated by various sources. RTCP excluded as this 964 // data is received from remote side. Tested in call tests instead. 965 const StreamStats& entry = stats.substreams[ssrc]; 966 if (entry.key_frames > 0u && entry.bitrate_bps > 0 && 967 entry.rtp_stats.packets > 0u && entry.avg_delay_ms > 0 && 968 entry.max_delay_ms > 0) { 969 return true; 970 } 971 } 972 return false; 973 } 974 975 void SetConfig(const VideoSendStream::Config& config) { config_ = config; } 976 977 virtual void ModifyConfigs( 978 VideoSendStream::Config* send_config, 979 std::vector<VideoReceiveStream::Config>* receive_configs, 980 VideoEncoderConfig* encoder_config) OVERRIDE { 981 SetConfig(*send_config); 982 } 983 984 virtual void OnStreamsCreated( 985 VideoSendStream* send_stream, 986 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 987 stream_ = send_stream; 988 } 989 990 virtual void PerformTest() OVERRIDE { 991 EXPECT_TRUE(WaitForFilledStats()) 992 << "Timed out waiting for filled statistics."; 993 } 994 995 VideoSendStream* stream_; 996 VideoSendStream::Config config_; 997 scoped_ptr<EventWrapper> event_; 998 } test; 999 1000 RunBaseTest(&test); 1001 } 1002 1003 // This test first observes "high" bitrate use at which point it sends a REMB to 1004 // indicate that it should be lowered significantly. The test then observes that 1005 // the bitrate observed is sinking well below the min-transmit-bitrate threshold 1006 // to verify that the min-transmit bitrate respects incoming REMB. 1007 // 1008 // Note that the test starts at "high" bitrate and does not ramp up to "higher" 1009 // bitrate since no receiver block or remb is sent in the initial phase. 1010 TEST_F(VideoSendStreamTest, MinTransmitBitrateRespectsRemb) { 1011 static const int kMinTransmitBitrateBps = 400000; 1012 static const int kHighBitrateBps = 150000; 1013 static const int kRembBitrateBps = 80000; 1014 static const int kRembRespectedBitrateBps = 100000; 1015 class BitrateObserver : public test::SendTest, public PacketReceiver { 1016 public: 1017 BitrateObserver() 1018 : SendTest(kDefaultTimeoutMs), 1019 feedback_transport_(ReceiveTransport()), 1020 bitrate_capped_(false) { 1021 RtpRtcp::Configuration config; 1022 feedback_transport_.Enable(); 1023 config.outgoing_transport = &feedback_transport_; 1024 rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); 1025 rtp_rtcp_->SetREMBStatus(true); 1026 rtp_rtcp_->SetRTCPStatus(kRtcpNonCompound); 1027 } 1028 1029 virtual void OnStreamsCreated( 1030 VideoSendStream* send_stream, 1031 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 1032 stream_ = send_stream; 1033 } 1034 1035 private: 1036 virtual DeliveryStatus DeliverPacket(const uint8_t* packet, 1037 size_t length) OVERRIDE { 1038 if (RtpHeaderParser::IsRtcp(packet, length)) 1039 return DELIVERY_OK; 1040 1041 RTPHeader header; 1042 if (!parser_->Parse(packet, length, &header)) 1043 return DELIVERY_PACKET_ERROR; 1044 assert(stream_ != NULL); 1045 VideoSendStream::Stats stats = stream_->GetStats(); 1046 if (!stats.substreams.empty()) { 1047 EXPECT_EQ(1u, stats.substreams.size()); 1048 int bitrate_bps = stats.substreams.begin()->second.bitrate_bps; 1049 test::PrintResult( 1050 "bitrate_stats_", 1051 "min_transmit_bitrate_low_remb", 1052 "bitrate_bps", 1053 static_cast<size_t>(bitrate_bps), 1054 "bps", 1055 false); 1056 if (bitrate_bps > kHighBitrateBps) { 1057 rtp_rtcp_->SetREMBData(kRembBitrateBps, 1, &header.ssrc); 1058 rtp_rtcp_->Process(); 1059 bitrate_capped_ = true; 1060 } else if (bitrate_capped_ && 1061 bitrate_bps < kRembRespectedBitrateBps) { 1062 observation_complete_->Set(); 1063 } 1064 } 1065 return DELIVERY_OK; 1066 } 1067 1068 virtual void SetReceivers( 1069 PacketReceiver* send_transport_receiver, 1070 PacketReceiver* receive_transport_receiver) OVERRIDE { 1071 RtpRtcpObserver::SetReceivers(this, send_transport_receiver); 1072 } 1073 1074 virtual void ModifyConfigs( 1075 VideoSendStream::Config* send_config, 1076 std::vector<VideoReceiveStream::Config>* receive_configs, 1077 VideoEncoderConfig* encoder_config) OVERRIDE { 1078 send_config->rtp.min_transmit_bitrate_bps = kMinTransmitBitrateBps; 1079 } 1080 1081 virtual void PerformTest() OVERRIDE { 1082 EXPECT_EQ(kEventSignaled, Wait()) 1083 << "Timeout while waiting for low bitrate stats after REMB."; 1084 } 1085 1086 scoped_ptr<RtpRtcp> rtp_rtcp_; 1087 internal::TransportAdapter feedback_transport_; 1088 VideoSendStream* stream_; 1089 bool bitrate_capped_; 1090 } test; 1091 1092 RunBaseTest(&test); 1093 } 1094 1095 TEST_F(VideoSendStreamTest, CapturesTextureAndI420VideoFrames) { 1096 class FrameObserver : public I420FrameCallback { 1097 public: 1098 FrameObserver() : output_frame_event_(EventWrapper::Create()) {} 1099 1100 void FrameCallback(I420VideoFrame* video_frame) OVERRIDE { 1101 // Clone the frame because the caller owns it. 1102 output_frames_.push_back(video_frame->CloneFrame()); 1103 output_frame_event_->Set(); 1104 } 1105 1106 void WaitOutputFrame() { 1107 const unsigned long kWaitFrameTimeoutMs = 3000; 1108 EXPECT_EQ(kEventSignaled, output_frame_event_->Wait(kWaitFrameTimeoutMs)) 1109 << "Timeout while waiting for output frames."; 1110 } 1111 1112 const std::vector<I420VideoFrame*>& output_frames() const { 1113 return output_frames_.get(); 1114 } 1115 1116 private: 1117 // Delivered output frames. 1118 ScopedVector<I420VideoFrame> output_frames_; 1119 1120 // Indicate an output frame has arrived. 1121 scoped_ptr<EventWrapper> output_frame_event_; 1122 }; 1123 1124 // Initialize send stream. 1125 test::NullTransport transport; 1126 CreateSenderCall(Call::Config(&transport)); 1127 1128 CreateSendConfig(1); 1129 FrameObserver observer; 1130 send_config_.pre_encode_callback = &observer; 1131 CreateStreams(); 1132 1133 // Prepare five input frames. Send I420VideoFrame and TextureVideoFrame 1134 // alternatively. 1135 ScopedVector<I420VideoFrame> input_frames; 1136 int width = static_cast<int>(encoder_config_.streams[0].width); 1137 int height = static_cast<int>(encoder_config_.streams[0].height); 1138 webrtc::RefCountImpl<FakeNativeHandle>* handle1 = 1139 new webrtc::RefCountImpl<FakeNativeHandle>(); 1140 webrtc::RefCountImpl<FakeNativeHandle>* handle2 = 1141 new webrtc::RefCountImpl<FakeNativeHandle>(); 1142 webrtc::RefCountImpl<FakeNativeHandle>* handle3 = 1143 new webrtc::RefCountImpl<FakeNativeHandle>(); 1144 input_frames.push_back(new TextureVideoFrame(handle1, width, height, 1, 1)); 1145 input_frames.push_back(new TextureVideoFrame(handle2, width, height, 2, 2)); 1146 input_frames.push_back(CreateI420VideoFrame(width, height, 1)); 1147 input_frames.push_back(CreateI420VideoFrame(width, height, 2)); 1148 input_frames.push_back(new TextureVideoFrame(handle3, width, height, 3, 3)); 1149 1150 send_stream_->Start(); 1151 for (size_t i = 0; i < input_frames.size(); i++) { 1152 // Make a copy of the input frame because the buffer will be swapped. 1153 scoped_ptr<I420VideoFrame> frame(input_frames[i]->CloneFrame()); 1154 send_stream_->Input()->SwapFrame(frame.get()); 1155 // Do not send the next frame too fast, so the frame dropper won't drop it. 1156 if (i < input_frames.size() - 1) 1157 SleepMs(1000 / encoder_config_.streams[0].max_framerate); 1158 // Wait until the output frame is received before sending the next input 1159 // frame. Or the previous input frame may be replaced without delivering. 1160 observer.WaitOutputFrame(); 1161 } 1162 send_stream_->Stop(); 1163 1164 // Test if the input and output frames are the same. render_time_ms and 1165 // timestamp are not compared because capturer sets those values. 1166 ExpectEqualFramesVector(input_frames.get(), observer.output_frames()); 1167 1168 DestroyStreams(); 1169 } 1170 1171 void ExpectEqualFrames(const I420VideoFrame& frame1, 1172 const I420VideoFrame& frame2) { 1173 if (frame1.native_handle() != NULL || frame2.native_handle() != NULL) 1174 ExpectEqualTextureFrames(frame1, frame2); 1175 else 1176 ExpectEqualBufferFrames(frame1, frame2); 1177 } 1178 1179 void ExpectEqualTextureFrames(const I420VideoFrame& frame1, 1180 const I420VideoFrame& frame2) { 1181 EXPECT_EQ(frame1.native_handle(), frame2.native_handle()); 1182 EXPECT_EQ(frame1.width(), frame2.width()); 1183 EXPECT_EQ(frame1.height(), frame2.height()); 1184 } 1185 1186 void ExpectEqualBufferFrames(const I420VideoFrame& frame1, 1187 const I420VideoFrame& frame2) { 1188 EXPECT_EQ(frame1.width(), frame2.width()); 1189 EXPECT_EQ(frame1.height(), frame2.height()); 1190 EXPECT_EQ(frame1.stride(kYPlane), frame2.stride(kYPlane)); 1191 EXPECT_EQ(frame1.stride(kUPlane), frame2.stride(kUPlane)); 1192 EXPECT_EQ(frame1.stride(kVPlane), frame2.stride(kVPlane)); 1193 EXPECT_EQ(frame1.ntp_time_ms(), frame2.ntp_time_ms()); 1194 ASSERT_EQ(frame1.allocated_size(kYPlane), frame2.allocated_size(kYPlane)); 1195 EXPECT_EQ(0, 1196 memcmp(frame1.buffer(kYPlane), 1197 frame2.buffer(kYPlane), 1198 frame1.allocated_size(kYPlane))); 1199 ASSERT_EQ(frame1.allocated_size(kUPlane), frame2.allocated_size(kUPlane)); 1200 EXPECT_EQ(0, 1201 memcmp(frame1.buffer(kUPlane), 1202 frame2.buffer(kUPlane), 1203 frame1.allocated_size(kUPlane))); 1204 ASSERT_EQ(frame1.allocated_size(kVPlane), frame2.allocated_size(kVPlane)); 1205 EXPECT_EQ(0, 1206 memcmp(frame1.buffer(kVPlane), 1207 frame2.buffer(kVPlane), 1208 frame1.allocated_size(kVPlane))); 1209 } 1210 1211 void ExpectEqualFramesVector(const std::vector<I420VideoFrame*>& frames1, 1212 const std::vector<I420VideoFrame*>& frames2) { 1213 EXPECT_EQ(frames1.size(), frames2.size()); 1214 for (size_t i = 0; i < std::min(frames1.size(), frames2.size()); ++i) 1215 ExpectEqualFrames(*frames1[i], *frames2[i]); 1216 } 1217 1218 I420VideoFrame* CreateI420VideoFrame(int width, int height, uint8_t data) { 1219 I420VideoFrame* frame = new I420VideoFrame(); 1220 const int kSizeY = width * height * 2; 1221 const int kSizeUV = width * height; 1222 scoped_ptr<uint8_t[]> buffer(new uint8_t[kSizeY]); 1223 memset(buffer.get(), data, kSizeY); 1224 frame->CreateFrame(kSizeY, 1225 buffer.get(), 1226 kSizeUV, 1227 buffer.get(), 1228 kSizeUV, 1229 buffer.get(), 1230 width, 1231 height, 1232 width, 1233 width / 2, 1234 width / 2); 1235 frame->set_timestamp(data); 1236 frame->set_ntp_time_ms(data); 1237 frame->set_render_time_ms(data); 1238 return frame; 1239 } 1240 1241 TEST_F(VideoSendStreamTest, EncoderIsProperlyInitializedAndDestroyed) { 1242 class EncoderStateObserver : public test::SendTest, public VideoEncoder { 1243 public: 1244 EncoderStateObserver() 1245 : SendTest(kDefaultTimeoutMs), 1246 crit_(CriticalSectionWrapper::CreateCriticalSection()), 1247 initialized_(false), 1248 callback_registered_(false), 1249 num_releases_(0), 1250 released_(false) {} 1251 1252 bool IsReleased() { 1253 CriticalSectionScoped lock(crit_.get()); 1254 return released_; 1255 } 1256 1257 bool IsReadyForEncode() { 1258 CriticalSectionScoped lock(crit_.get()); 1259 return initialized_ && callback_registered_; 1260 } 1261 1262 size_t num_releases() { 1263 CriticalSectionScoped lock(crit_.get()); 1264 return num_releases_; 1265 } 1266 1267 private: 1268 virtual int32_t InitEncode(const VideoCodec* codecSettings, 1269 int32_t numberOfCores, 1270 uint32_t maxPayloadSize) OVERRIDE { 1271 CriticalSectionScoped lock(crit_.get()); 1272 EXPECT_FALSE(initialized_); 1273 initialized_ = true; 1274 released_ = false; 1275 return 0; 1276 } 1277 1278 virtual int32_t Encode( 1279 const I420VideoFrame& inputImage, 1280 const CodecSpecificInfo* codecSpecificInfo, 1281 const std::vector<VideoFrameType>* frame_types) OVERRIDE { 1282 EXPECT_TRUE(IsReadyForEncode()); 1283 1284 observation_complete_->Set(); 1285 return 0; 1286 } 1287 1288 virtual int32_t RegisterEncodeCompleteCallback( 1289 EncodedImageCallback* callback) OVERRIDE { 1290 CriticalSectionScoped lock(crit_.get()); 1291 EXPECT_TRUE(initialized_); 1292 callback_registered_ = true; 1293 return 0; 1294 } 1295 1296 virtual int32_t Release() OVERRIDE { 1297 CriticalSectionScoped lock(crit_.get()); 1298 EXPECT_TRUE(IsReadyForEncode()); 1299 EXPECT_FALSE(released_); 1300 initialized_ = false; 1301 callback_registered_ = false; 1302 released_ = true; 1303 ++num_releases_; 1304 return 0; 1305 } 1306 1307 virtual int32_t SetChannelParameters(uint32_t packetLoss, 1308 int rtt) OVERRIDE { 1309 EXPECT_TRUE(IsReadyForEncode()); 1310 return 0; 1311 } 1312 1313 virtual int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) OVERRIDE { 1314 EXPECT_TRUE(IsReadyForEncode()); 1315 return 0; 1316 } 1317 1318 virtual void OnStreamsCreated( 1319 VideoSendStream* send_stream, 1320 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 1321 // Encoder initialization should be done in stream construction before 1322 // starting. 1323 EXPECT_TRUE(IsReadyForEncode()); 1324 stream_ = send_stream; 1325 } 1326 1327 virtual void ModifyConfigs( 1328 VideoSendStream::Config* send_config, 1329 std::vector<VideoReceiveStream::Config>* receive_configs, 1330 VideoEncoderConfig* encoder_config) OVERRIDE { 1331 send_config->encoder_settings.encoder = this; 1332 encoder_config_ = *encoder_config; 1333 } 1334 1335 virtual void PerformTest() OVERRIDE { 1336 EXPECT_EQ(kEventSignaled, Wait()) 1337 << "Timed out while waiting for Encode."; 1338 EXPECT_EQ(0u, num_releases()); 1339 stream_->ReconfigureVideoEncoder(encoder_config_); 1340 EXPECT_EQ(0u, num_releases()); 1341 stream_->Stop(); 1342 // Encoder should not be released before destroying the VideoSendStream. 1343 EXPECT_FALSE(IsReleased()); 1344 EXPECT_TRUE(IsReadyForEncode()); 1345 stream_->Start(); 1346 // Sanity check, make sure we still encode frames with this encoder. 1347 EXPECT_EQ(kEventSignaled, Wait()) 1348 << "Timed out while waiting for Encode."; 1349 } 1350 1351 scoped_ptr<CriticalSectionWrapper> crit_; 1352 VideoSendStream* stream_; 1353 bool initialized_ GUARDED_BY(crit_); 1354 bool callback_registered_ GUARDED_BY(crit_); 1355 size_t num_releases_ GUARDED_BY(crit_); 1356 bool released_ GUARDED_BY(crit_); 1357 VideoEncoderConfig encoder_config_; 1358 } test_encoder; 1359 1360 RunBaseTest(&test_encoder); 1361 1362 EXPECT_TRUE(test_encoder.IsReleased()); 1363 EXPECT_EQ(1u, test_encoder.num_releases()); 1364 } 1365 1366 TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) { 1367 class VideoCodecConfigObserver : public test::SendTest, 1368 public test::FakeEncoder { 1369 public: 1370 VideoCodecConfigObserver() 1371 : SendTest(kDefaultTimeoutMs), 1372 FakeEncoder(Clock::GetRealTimeClock()), 1373 num_initializations_(0) {} 1374 1375 private: 1376 virtual void ModifyConfigs( 1377 VideoSendStream::Config* send_config, 1378 std::vector<VideoReceiveStream::Config>* receive_configs, 1379 VideoEncoderConfig* encoder_config) OVERRIDE { 1380 send_config->encoder_settings.encoder = this; 1381 encoder_config_ = *encoder_config; 1382 } 1383 1384 virtual void OnStreamsCreated( 1385 VideoSendStream* send_stream, 1386 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 1387 stream_ = send_stream; 1388 } 1389 1390 virtual int32_t InitEncode(const VideoCodec* config, 1391 int32_t number_of_cores, 1392 uint32_t max_payload_size) OVERRIDE { 1393 if (num_initializations_ == 0) { 1394 // Verify default values. 1395 EXPECT_EQ(kRealtimeVideo, config->mode); 1396 } else { 1397 // Verify that changed values are propagated. 1398 EXPECT_EQ(kScreensharing, config->mode); 1399 } 1400 ++num_initializations_; 1401 return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size); 1402 } 1403 1404 virtual void PerformTest() OVERRIDE { 1405 EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized."; 1406 1407 encoder_config_.content_type = VideoEncoderConfig::kScreenshare; 1408 stream_->ReconfigureVideoEncoder(encoder_config_); 1409 EXPECT_EQ(2u, num_initializations_) 1410 << "ReconfigureVideoEncoder did not reinitialize the encoder with " 1411 "new encoder settings."; 1412 } 1413 1414 size_t num_initializations_; 1415 VideoSendStream* stream_; 1416 VideoEncoderConfig encoder_config_; 1417 } test; 1418 1419 RunBaseTest(&test); 1420 } 1421 1422 TEST_F(VideoSendStreamTest, EncoderSetupPropagatesVp8Config) { 1423 static const size_t kNumberOfTemporalLayers = 4; 1424 class VideoCodecConfigObserver : public test::SendTest, 1425 public test::FakeEncoder { 1426 public: 1427 VideoCodecConfigObserver() 1428 : SendTest(kDefaultTimeoutMs), 1429 FakeEncoder(Clock::GetRealTimeClock()), 1430 num_initializations_(0) { 1431 memset(&vp8_settings_, 0, sizeof(vp8_settings_)); 1432 } 1433 1434 private: 1435 virtual void ModifyConfigs( 1436 VideoSendStream::Config* send_config, 1437 std::vector<VideoReceiveStream::Config>* receive_configs, 1438 VideoEncoderConfig* encoder_config) OVERRIDE { 1439 send_config->encoder_settings.encoder = this; 1440 send_config->encoder_settings.payload_name = "VP8"; 1441 1442 for (size_t i = 0; i < encoder_config->streams.size(); ++i) { 1443 encoder_config->streams[i].temporal_layers.resize( 1444 kNumberOfTemporalLayers); 1445 } 1446 1447 encoder_config->encoder_specific_settings = &vp8_settings_; 1448 encoder_config_ = *encoder_config; 1449 } 1450 1451 virtual void OnStreamsCreated( 1452 VideoSendStream* send_stream, 1453 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE { 1454 stream_ = send_stream; 1455 } 1456 1457 virtual int32_t InitEncode(const VideoCodec* config, 1458 int32_t number_of_cores, 1459 uint32_t max_payload_size) OVERRIDE { 1460 EXPECT_EQ(kVideoCodecVP8, config->codecType); 1461 1462 // Check that the number of temporal layers has propagated properly to 1463 // VideoCodec. 1464 EXPECT_EQ(kNumberOfTemporalLayers, 1465 config->codecSpecific.VP8.numberOfTemporalLayers); 1466 1467 for (unsigned char i = 0; i < config->numberOfSimulcastStreams; ++i) { 1468 EXPECT_EQ(kNumberOfTemporalLayers, 1469 config->simulcastStream[i].numberOfTemporalLayers); 1470 } 1471 1472 // Set expected temporal layers as they should have been set when 1473 // reconfiguring the encoder and not match the set config. 1474 vp8_settings_.numberOfTemporalLayers = kNumberOfTemporalLayers; 1475 EXPECT_EQ(0, 1476 memcmp(&config->codecSpecific.VP8, 1477 &vp8_settings_, 1478 sizeof(vp8_settings_))); 1479 ++num_initializations_; 1480 return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size); 1481 } 1482 1483 virtual void PerformTest() OVERRIDE { 1484 EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized."; 1485 1486 vp8_settings_.denoisingOn = true; 1487 stream_->ReconfigureVideoEncoder(encoder_config_); 1488 EXPECT_EQ(2u, num_initializations_) 1489 << "ReconfigureVideoEncoder did not reinitialize the encoder with " 1490 "new encoder settings."; 1491 } 1492 1493 int32_t Encode(const I420VideoFrame& input_image, 1494 const CodecSpecificInfo* codec_specific_info, 1495 const std::vector<VideoFrameType>* frame_types) OVERRIDE { 1496 // Silently skip the encode, FakeEncoder::Encode doesn't produce VP8. 1497 return 0; 1498 } 1499 1500 VideoCodecVP8 vp8_settings_; 1501 size_t num_initializations_; 1502 VideoSendStream* stream_; 1503 VideoEncoderConfig encoder_config_; 1504 } test; 1505 1506 RunBaseTest(&test); 1507 } 1508 1509 TEST_F(VideoSendStreamTest, RtcpSenderReportContainsMediaBytesSent) { 1510 class RtcpByeTest : public test::SendTest { 1511 public: 1512 RtcpByeTest() : SendTest(kDefaultTimeoutMs), media_bytes_sent_(0) {} 1513 1514 private: 1515 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { 1516 RTPHeader header; 1517 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 1518 media_bytes_sent_ += length - header.headerLength - header.paddingLength; 1519 return SEND_PACKET; 1520 } 1521 1522 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE { 1523 RTCPUtility::RTCPParserV2 parser(packet, length, true); 1524 EXPECT_TRUE(parser.IsValid()); 1525 1526 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); 1527 uint32_t sender_octet_count = 0; 1528 while (packet_type != RTCPUtility::kRtcpNotValidCode) { 1529 if (packet_type == RTCPUtility::kRtcpSrCode) { 1530 sender_octet_count = parser.Packet().SR.SenderOctetCount; 1531 EXPECT_EQ(sender_octet_count, media_bytes_sent_); 1532 if (sender_octet_count > 0) 1533 observation_complete_->Set(); 1534 } 1535 1536 packet_type = parser.Iterate(); 1537 } 1538 1539 return SEND_PACKET; 1540 } 1541 1542 virtual void PerformTest() OVERRIDE { 1543 EXPECT_EQ(kEventSignaled, Wait()) 1544 << "Timed out while waiting for RTCP sender report."; 1545 } 1546 1547 size_t media_bytes_sent_; 1548 } test; 1549 1550 RunBaseTest(&test); 1551 } 1552 1553 } // namespace webrtc 1554