| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 return s; | 67 return s; |
| 68 } | 68 } |
| 69 } // namespace std | 69 } // namespace std |
| 70 | 70 |
| 71 inline int TimeBetweenSend(const cricket::VideoCodec& codec) { | 71 inline int TimeBetweenSend(const cricket::VideoCodec& codec) { |
| 72 return static_cast<int>( | 72 return static_cast<int>( |
| 73 cricket::VideoFormat::FpsToInterval(codec.framerate) / | 73 cricket::VideoFormat::FpsToInterval(codec.framerate) / |
| 74 rtc::kNumNanosecsPerMillisec); | 74 rtc::kNumNanosecsPerMillisec); |
| 75 } | 75 } |
| 76 | 76 |
| 77 // Fake video engine that makes it possible to test enabling and disabling | |
| 78 // capturer (checking that the engine state is updated and that the capturer | |
| 79 // is indeed capturing) without having to create a channel. It also makes it | |
| 80 // possible to test that the media processors are indeed being called when | |
| 81 // registered. | |
| 82 template<class T> | |
| 83 class VideoEngineOverride : public T { | |
| 84 public: | |
| 85 VideoEngineOverride() : T() { | |
| 86 } | |
| 87 virtual ~VideoEngineOverride() { | |
| 88 } | |
| 89 bool is_camera_on() const { return T::GetVideoCapturer()->IsRunning(); } | |
| 90 | |
| 91 void TriggerMediaFrame(uint32_t ssrc, | |
| 92 cricket::VideoFrame* frame, | |
| 93 bool* drop_frame) { | |
| 94 T::SignalMediaFrame(ssrc, frame, drop_frame); | |
| 95 } | |
| 96 }; | |
| 97 | |
| 98 template<class E, class C> | 77 template<class E, class C> |
| 99 class VideoMediaChannelTest : public testing::Test, | 78 class VideoMediaChannelTest : public testing::Test, |
| 100 public sigslot::has_slots<> { | 79 public sigslot::has_slots<> { |
| 101 protected: | 80 protected: |
| 102 VideoMediaChannelTest<E, C>() | 81 VideoMediaChannelTest<E, C>() |
| 103 : call_(webrtc::Call::Create(webrtc::Call::Config())) {} | 82 : call_(webrtc::Call::Create(webrtc::Call::Config())) {} |
| 104 | 83 |
| 105 virtual cricket::VideoCodec DefaultCodec() = 0; | 84 virtual cricket::VideoCodec DefaultCodec() = 0; |
| 106 | 85 |
| 107 virtual cricket::StreamParams DefaultSendStreamParams() { | 86 virtual cricket::StreamParams DefaultSendStreamParams() { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 118 media_error_ = cricket::VideoMediaChannel::ERROR_NONE; | 97 media_error_ = cricket::VideoMediaChannel::ERROR_NONE; |
| 119 cricket::VideoRecvParameters parameters; | 98 cricket::VideoRecvParameters parameters; |
| 120 parameters.codecs = engine_.codecs(); | 99 parameters.codecs = engine_.codecs(); |
| 121 channel_->SetRecvParameters(parameters); | 100 channel_->SetRecvParameters(parameters); |
| 122 EXPECT_TRUE(channel_->AddSendStream(DefaultSendStreamParams())); | 101 EXPECT_TRUE(channel_->AddSendStream(DefaultSendStreamParams())); |
| 123 video_capturer_.reset(CreateFakeVideoCapturer()); | 102 video_capturer_.reset(CreateFakeVideoCapturer()); |
| 124 cricket::VideoFormat format(640, 480, | 103 cricket::VideoFormat format(640, 480, |
| 125 cricket::VideoFormat::FpsToInterval(30), | 104 cricket::VideoFormat::FpsToInterval(30), |
| 126 cricket::FOURCC_I420); | 105 cricket::FOURCC_I420); |
| 127 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(format)); | 106 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(format)); |
| 128 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get())); | 107 channel_->SetSource(kSsrc, video_capturer_.get()); |
| 129 } | 108 } |
| 130 | 109 |
| 131 virtual cricket::FakeVideoCapturer* CreateFakeVideoCapturer() { | 110 virtual cricket::FakeVideoCapturer* CreateFakeVideoCapturer() { |
| 132 return new cricket::FakeVideoCapturer(); | 111 return new cricket::FakeVideoCapturer(); |
| 133 } | 112 } |
| 134 | 113 |
| 135 // Utility method to setup an additional stream to send and receive video. | 114 // Utility method to setup an additional stream to send and receive video. |
| 136 // Used to test send and recv between two streams. | 115 // Used to test send and recv between two streams. |
| 137 void SetUpSecondStream() { | 116 void SetUpSecondStream() { |
| 138 SetUpSecondStreamWithNoRecv(); | 117 SetUpSecondStreamWithNoRecv(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 155 cricket::StreamParams::CreateLegacy(kSsrc + 2))); | 134 cricket::StreamParams::CreateLegacy(kSsrc + 2))); |
| 156 // We dont add recv for the second stream. | 135 // We dont add recv for the second stream. |
| 157 | 136 |
| 158 // Setup the receive and renderer for second stream after send. | 137 // Setup the receive and renderer for second stream after send. |
| 159 video_capturer_2_.reset(CreateFakeVideoCapturer()); | 138 video_capturer_2_.reset(CreateFakeVideoCapturer()); |
| 160 cricket::VideoFormat format(640, 480, | 139 cricket::VideoFormat format(640, 480, |
| 161 cricket::VideoFormat::FpsToInterval(30), | 140 cricket::VideoFormat::FpsToInterval(30), |
| 162 cricket::FOURCC_I420); | 141 cricket::FOURCC_I420); |
| 163 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_2_->Start(format)); | 142 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_2_->Start(format)); |
| 164 | 143 |
| 165 EXPECT_TRUE(channel_->SetCapturer(kSsrc + 2, video_capturer_2_.get())); | 144 channel_->SetSource(kSsrc + 2, video_capturer_2_.get()); |
| 166 } | 145 } |
| 167 virtual void TearDown() { | 146 virtual void TearDown() { |
| 168 channel_.reset(); | 147 channel_.reset(); |
| 169 } | 148 } |
| 170 bool SetDefaultCodec() { | 149 bool SetDefaultCodec() { |
| 171 return SetOneCodec(DefaultCodec()); | 150 return SetOneCodec(DefaultCodec()); |
| 172 } | 151 } |
| 173 | 152 |
| 174 bool SetOneCodec(int pt, const char* name, int w, int h, int fr) { | 153 bool SetOneCodec(int pt, const char* name, int w, int h, int fr) { |
| 175 return SetOneCodec(cricket::VideoCodec(pt, name, w, h, fr, 0)); | 154 return SetOneCodec(cricket::VideoCodec(pt, name, w, h, fr, 0)); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 } | 345 } |
| 367 | 346 |
| 368 void OnVideoChannelError(uint32_t ssrc, | 347 void OnVideoChannelError(uint32_t ssrc, |
| 369 cricket::VideoMediaChannel::Error error) { | 348 cricket::VideoMediaChannel::Error error) { |
| 370 media_error_ = error; | 349 media_error_ = error; |
| 371 } | 350 } |
| 372 | 351 |
| 373 // Test that SetSend works. | 352 // Test that SetSend works. |
| 374 void SetSend() { | 353 void SetSend() { |
| 375 EXPECT_FALSE(channel_->sending()); | 354 EXPECT_FALSE(channel_->sending()); |
| 376 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get())); | 355 channel_->SetSource(kSsrc, video_capturer_.get()); |
| 377 EXPECT_TRUE(SetOneCodec(DefaultCodec())); | 356 EXPECT_TRUE(SetOneCodec(DefaultCodec())); |
| 378 EXPECT_FALSE(channel_->sending()); | 357 EXPECT_FALSE(channel_->sending()); |
| 379 EXPECT_TRUE(SetSend(true)); | 358 EXPECT_TRUE(SetSend(true)); |
| 380 EXPECT_TRUE(channel_->sending()); | 359 EXPECT_TRUE(channel_->sending()); |
| 381 EXPECT_TRUE(SendFrame()); | 360 EXPECT_TRUE(SendFrame()); |
| 382 EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout); | 361 EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout); |
| 383 EXPECT_TRUE(SetSend(false)); | 362 EXPECT_TRUE(SetSend(false)); |
| 384 EXPECT_FALSE(channel_->sending()); | 363 EXPECT_FALSE(channel_->sending()); |
| 385 } | 364 } |
| 386 // Test that SetSend fails without codecs being set. | 365 // Test that SetSend fails without codecs being set. |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 std::unique_ptr<cricket::FakeVideoCapturer> capturer( | 539 std::unique_ptr<cricket::FakeVideoCapturer> capturer( |
| 561 CreateFakeVideoCapturer()); | 540 CreateFakeVideoCapturer()); |
| 562 const int kTestWidth = 160; | 541 const int kTestWidth = 160; |
| 563 const int kTestHeight = 120; | 542 const int kTestHeight = 120; |
| 564 cricket::VideoFormat format(kTestWidth, kTestHeight, | 543 cricket::VideoFormat format(kTestWidth, kTestHeight, |
| 565 cricket::VideoFormat::FpsToInterval(5), | 544 cricket::VideoFormat::FpsToInterval(5), |
| 566 cricket::FOURCC_I420); | 545 cricket::FOURCC_I420); |
| 567 EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(format)); | 546 EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(format)); |
| 568 EXPECT_TRUE(channel_->AddSendStream( | 547 EXPECT_TRUE(channel_->AddSendStream( |
| 569 cricket::StreamParams::CreateLegacy(5678))); | 548 cricket::StreamParams::CreateLegacy(5678))); |
| 570 EXPECT_TRUE(channel_->SetCapturer(5678, capturer.get())); | 549 channel_->SetSource(5678, capturer.get()); |
| 571 EXPECT_TRUE(channel_->AddRecvStream( | 550 EXPECT_TRUE(channel_->AddRecvStream( |
| 572 cricket::StreamParams::CreateLegacy(5678))); | 551 cricket::StreamParams::CreateLegacy(5678))); |
| 573 EXPECT_TRUE(channel_->SetSink(5678, &renderer2)); | 552 EXPECT_TRUE(channel_->SetSink(5678, &renderer2)); |
| 574 EXPECT_TRUE(capturer->CaptureCustomFrame( | 553 EXPECT_TRUE(capturer->CaptureCustomFrame( |
| 575 kTestWidth, kTestHeight, cricket::FOURCC_I420)); | 554 kTestWidth, kTestHeight, cricket::FOURCC_I420)); |
| 576 EXPECT_FRAME_ON_RENDERER_WAIT( | 555 EXPECT_FRAME_ON_RENDERER_WAIT( |
| 577 renderer2, 1, kTestWidth, kTestHeight, kTimeout); | 556 renderer2, 1, kTestWidth, kTestHeight, kTimeout); |
| 578 | 557 |
| 579 // Get stats, and make sure they are correct for two senders. We wait until | 558 // Get stats, and make sure they are correct for two senders. We wait until |
| 580 // the number of expected packets have been sent to avoid races where we | 559 // the number of expected packets have been sent to avoid races where we |
| (...skipping 15 matching lines...) Expand all Loading... |
| 596 << "Timed out while waiting for packet counts for all sent packets."; | 575 << "Timed out while waiting for packet counts for all sent packets."; |
| 597 EXPECT_EQ(1U, info.senders[0].ssrcs().size()); | 576 EXPECT_EQ(1U, info.senders[0].ssrcs().size()); |
| 598 EXPECT_EQ(1234U, info.senders[0].ssrcs()[0]); | 577 EXPECT_EQ(1234U, info.senders[0].ssrcs()[0]); |
| 599 EXPECT_EQ(DefaultCodec().width, info.senders[0].send_frame_width); | 578 EXPECT_EQ(DefaultCodec().width, info.senders[0].send_frame_width); |
| 600 EXPECT_EQ(DefaultCodec().height, info.senders[0].send_frame_height); | 579 EXPECT_EQ(DefaultCodec().height, info.senders[0].send_frame_height); |
| 601 EXPECT_EQ(1U, info.senders[1].ssrcs().size()); | 580 EXPECT_EQ(1U, info.senders[1].ssrcs().size()); |
| 602 EXPECT_EQ(5678U, info.senders[1].ssrcs()[0]); | 581 EXPECT_EQ(5678U, info.senders[1].ssrcs()[0]); |
| 603 EXPECT_EQ(kTestWidth, info.senders[1].send_frame_width); | 582 EXPECT_EQ(kTestWidth, info.senders[1].send_frame_width); |
| 604 EXPECT_EQ(kTestHeight, info.senders[1].send_frame_height); | 583 EXPECT_EQ(kTestHeight, info.senders[1].send_frame_height); |
| 605 // The capturer must be unregistered here as it runs out of it's scope next. | 584 // The capturer must be unregistered here as it runs out of it's scope next. |
| 606 EXPECT_TRUE(channel_->SetCapturer(5678, NULL)); | 585 channel_->SetSource(5678, NULL); |
| 607 } | 586 } |
| 608 | 587 |
| 609 // Test that we can set the bandwidth. | 588 // Test that we can set the bandwidth. |
| 610 void SetSendBandwidth() { | 589 void SetSendBandwidth() { |
| 611 cricket::VideoSendParameters parameters; | 590 cricket::VideoSendParameters parameters; |
| 612 parameters.codecs.push_back(DefaultCodec()); | 591 parameters.codecs.push_back(DefaultCodec()); |
| 613 parameters.max_bandwidth_bps = -1; // <= 0 means unlimited. | 592 parameters.max_bandwidth_bps = -1; // <= 0 means unlimited. |
| 614 EXPECT_TRUE(channel_->SetSendParameters(parameters)); | 593 EXPECT_TRUE(channel_->SetSendParameters(parameters)); |
| 615 parameters.max_bandwidth_bps = 128 * 1024; | 594 parameters.max_bandwidth_bps = 128 * 1024; |
| 616 EXPECT_TRUE(channel_->SetSendParameters(parameters)); | 595 EXPECT_TRUE(channel_->SetSendParameters(parameters)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 633 EXPECT_EQ(0, NumRtpPackets(kSsrc - 1)); | 612 EXPECT_EQ(0, NumRtpPackets(kSsrc - 1)); |
| 634 EXPECT_EQ(0, NumRtpBytes(kSsrc - 1)); | 613 EXPECT_EQ(0, NumRtpBytes(kSsrc - 1)); |
| 635 } | 614 } |
| 636 // Test that we can set the SSRC even after codecs are set. | 615 // Test that we can set the SSRC even after codecs are set. |
| 637 void SetSendSsrcAfterSetCodecs() { | 616 void SetSendSsrcAfterSetCodecs() { |
| 638 // Remove stream added in Setup. | 617 // Remove stream added in Setup. |
| 639 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc)); | 618 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc)); |
| 640 EXPECT_TRUE(SetDefaultCodec()); | 619 EXPECT_TRUE(SetDefaultCodec()); |
| 641 EXPECT_TRUE(channel_->AddSendStream( | 620 EXPECT_TRUE(channel_->AddSendStream( |
| 642 cricket::StreamParams::CreateLegacy(999))); | 621 cricket::StreamParams::CreateLegacy(999))); |
| 643 EXPECT_TRUE(channel_->SetCapturer(999u, video_capturer_.get())); | 622 channel_->SetSource(999u, video_capturer_.get()); |
| 644 EXPECT_TRUE(SetSend(true)); | 623 EXPECT_TRUE(SetSend(true)); |
| 645 EXPECT_TRUE(WaitAndSendFrame(0)); | 624 EXPECT_TRUE(WaitAndSendFrame(0)); |
| 646 EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout); | 625 EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout); |
| 647 uint32_t ssrc = 0; | 626 uint32_t ssrc = 0; |
| 648 std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtpPacket(0)); | 627 std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtpPacket(0)); |
| 649 ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL); | 628 ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL); |
| 650 EXPECT_EQ(999u, ssrc); | 629 EXPECT_EQ(999u, ssrc); |
| 651 // Packets are being paced out, so these can mismatch between the first and | 630 // Packets are being paced out, so these can mismatch between the first and |
| 652 // second call to NumRtpPackets until pending packets are paced out. | 631 // second call to NumRtpPackets until pending packets are paced out. |
| 653 EXPECT_EQ_WAIT(NumRtpPackets(), NumRtpPackets(ssrc), kTimeout); | 632 EXPECT_EQ_WAIT(NumRtpPackets(), NumRtpPackets(ssrc), kTimeout); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 p(GetRtpPacket(static_cast<int>(last_packet))); | 678 p(GetRtpPacket(static_cast<int>(last_packet))); |
| 700 ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL); | 679 ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL); |
| 701 EXPECT_EQ(kSsrc, ssrc); | 680 EXPECT_EQ(kSsrc, ssrc); |
| 702 | 681 |
| 703 // Remove the send stream that was added during Setup. | 682 // Remove the send stream that was added during Setup. |
| 704 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc)); | 683 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc)); |
| 705 int rtp_packets = NumRtpPackets(); | 684 int rtp_packets = NumRtpPackets(); |
| 706 | 685 |
| 707 EXPECT_TRUE(channel_->AddSendStream( | 686 EXPECT_TRUE(channel_->AddSendStream( |
| 708 cricket::StreamParams::CreateLegacy(789u))); | 687 cricket::StreamParams::CreateLegacy(789u))); |
| 709 EXPECT_TRUE(channel_->SetCapturer(789u, video_capturer_.get())); | 688 channel_->SetSource(789u, video_capturer_.get()); |
| 710 EXPECT_EQ(rtp_packets, NumRtpPackets()); | 689 EXPECT_EQ(rtp_packets, NumRtpPackets()); |
| 711 // Wait 30ms to guarantee the engine does not drop the frame. | 690 // Wait 30ms to guarantee the engine does not drop the frame. |
| 712 EXPECT_TRUE(WaitAndSendFrame(30)); | 691 EXPECT_TRUE(WaitAndSendFrame(30)); |
| 713 EXPECT_TRUE_WAIT(NumRtpPackets() > rtp_packets, kTimeout); | 692 EXPECT_TRUE_WAIT(NumRtpPackets() > rtp_packets, kTimeout); |
| 714 | 693 |
| 715 last_packet = NumRtpPackets() - 1; | 694 last_packet = NumRtpPackets() - 1; |
| 716 p.reset(GetRtpPacket(static_cast<int>(last_packet))); | 695 p.reset(GetRtpPacket(static_cast<int>(last_packet))); |
| 717 ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL); | 696 ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL); |
| 718 EXPECT_EQ(789u, ssrc); | 697 EXPECT_EQ(789u, ssrc); |
| 719 } | 698 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 782 cricket::FOURCC_I420); | 761 cricket::FOURCC_I420); |
| 783 EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(format)); | 762 EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(format)); |
| 784 // All capturers start generating frames with the same timestamp. ViE does | 763 // All capturers start generating frames with the same timestamp. ViE does |
| 785 // not allow the same timestamp to be used. Capture one frame before | 764 // not allow the same timestamp to be used. Capture one frame before |
| 786 // associating the capturer with the channel. | 765 // associating the capturer with the channel. |
| 787 EXPECT_TRUE(capturer->CaptureCustomFrame(format.width, format.height, | 766 EXPECT_TRUE(capturer->CaptureCustomFrame(format.width, format.height, |
| 788 cricket::FOURCC_I420)); | 767 cricket::FOURCC_I420)); |
| 789 | 768 |
| 790 int captured_frames = 1; | 769 int captured_frames = 1; |
| 791 for (int iterations = 0; iterations < 2; ++iterations) { | 770 for (int iterations = 0; iterations < 2; ++iterations) { |
| 792 EXPECT_TRUE(channel_->SetCapturer(kSsrc, capturer.get())); | 771 channel_->SetSource(kSsrc, capturer.get()); |
| 793 rtc::Thread::Current()->ProcessMessages(time_between_send); | 772 rtc::Thread::Current()->ProcessMessages(time_between_send); |
| 794 EXPECT_TRUE(capturer->CaptureCustomFrame(format.width, format.height, | 773 EXPECT_TRUE(capturer->CaptureCustomFrame(format.width, format.height, |
| 795 cricket::FOURCC_I420)); | 774 cricket::FOURCC_I420)); |
| 796 ++captured_frames; | 775 ++captured_frames; |
| 797 // Wait until frame of right size is captured. | 776 // Wait until frame of right size is captured. |
| 798 EXPECT_TRUE_WAIT(renderer_.num_rendered_frames() >= captured_frames && | 777 EXPECT_TRUE_WAIT(renderer_.num_rendered_frames() >= captured_frames && |
| 799 format.width == renderer_.width() && | 778 format.width == renderer_.width() && |
| 800 format.height == renderer_.height() && | 779 format.height == renderer_.height() && |
| 801 !renderer_.black_frame(), kTimeout); | 780 !renderer_.black_frame(), kTimeout); |
| 802 EXPECT_GE(renderer_.num_rendered_frames(), captured_frames); | 781 EXPECT_GE(renderer_.num_rendered_frames(), captured_frames); |
| 803 EXPECT_EQ(format.width, renderer_.width()); | 782 EXPECT_EQ(format.width, renderer_.width()); |
| 804 EXPECT_EQ(format.height, renderer_.height()); | 783 EXPECT_EQ(format.height, renderer_.height()); |
| 805 captured_frames = renderer_.num_rendered_frames() + 1; | 784 captured_frames = renderer_.num_rendered_frames() + 1; |
| 806 EXPECT_FALSE(renderer_.black_frame()); | 785 EXPECT_FALSE(renderer_.black_frame()); |
| 807 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); | 786 channel_->SetSource(kSsrc, NULL); |
| 808 // Make sure a black frame is generated within the specified timeout. | 787 // Make sure a black frame is generated within the specified timeout. |
| 809 // The black frame should be the resolution of the previous frame to | 788 // The black frame should be the resolution of the previous frame to |
| 810 // prevent expensive encoder reconfigurations. | 789 // prevent expensive encoder reconfigurations. |
| 811 EXPECT_TRUE_WAIT(renderer_.num_rendered_frames() >= captured_frames && | 790 EXPECT_TRUE_WAIT(renderer_.num_rendered_frames() >= captured_frames && |
| 812 format.width == renderer_.width() && | 791 format.width == renderer_.width() && |
| 813 format.height == renderer_.height() && | 792 format.height == renderer_.height() && |
| 814 renderer_.black_frame(), kTimeout); | 793 renderer_.black_frame(), kTimeout); |
| 815 EXPECT_GE(renderer_.num_rendered_frames(), captured_frames); | 794 EXPECT_GE(renderer_.num_rendered_frames(), captured_frames); |
| 816 EXPECT_EQ(format.width, renderer_.width()); | 795 EXPECT_EQ(format.width, renderer_.width()); |
| 817 EXPECT_EQ(format.height, renderer_.height()); | 796 EXPECT_EQ(format.height, renderer_.height()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 832 EXPECT_TRUE(SetOneCodec(DefaultCodec())); | 811 EXPECT_TRUE(SetOneCodec(DefaultCodec())); |
| 833 EXPECT_TRUE(SetSend(true)); | 812 EXPECT_TRUE(SetSend(true)); |
| 834 EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_)); | 813 EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_)); |
| 835 EXPECT_EQ(0, renderer_.num_rendered_frames()); | 814 EXPECT_EQ(0, renderer_.num_rendered_frames()); |
| 836 EXPECT_TRUE(SendFrame()); | 815 EXPECT_TRUE(SendFrame()); |
| 837 EXPECT_FRAME_WAIT(1, 640, 400, kTimeout); | 816 EXPECT_FRAME_WAIT(1, 640, 400, kTimeout); |
| 838 // Wait for one frame so they don't get dropped because we send frames too | 817 // Wait for one frame so they don't get dropped because we send frames too |
| 839 // tightly. | 818 // tightly. |
| 840 rtc::Thread::Current()->ProcessMessages(30); | 819 rtc::Thread::Current()->ProcessMessages(30); |
| 841 // Remove the capturer. | 820 // Remove the capturer. |
| 842 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); | 821 channel_->SetSource(kSsrc, NULL); |
| 843 // Wait for one black frame for removing the capturer. | 822 // Wait for one black frame for removing the capturer. |
| 844 EXPECT_FRAME_WAIT(2, 640, 400, kTimeout); | 823 EXPECT_FRAME_WAIT(2, 640, 400, kTimeout); |
| 845 | 824 |
| 846 // No capturer was added, so this RemoveCapturer should | 825 // No capturer was added, so this SetSource should be a NOP. |
| 847 // fail. | 826 channel_->SetSource(kSsrc, NULL); |
| 848 EXPECT_FALSE(channel_->SetCapturer(kSsrc, NULL)); | |
| 849 rtc::Thread::Current()->ProcessMessages(300); | 827 rtc::Thread::Current()->ProcessMessages(300); |
| 850 // Verify no more frames were sent. | 828 // Verify no more frames were sent. |
| 851 EXPECT_EQ(2, renderer_.num_rendered_frames()); | 829 EXPECT_EQ(2, renderer_.num_rendered_frames()); |
| 852 } | 830 } |
| 853 | 831 |
| 854 // Tests that we can add and remove capturer as unique sources. | 832 // Tests that we can add and remove capturer as unique sources. |
| 855 void AddRemoveCapturerMultipleSources() { | 833 void AddRemoveCapturerMultipleSources() { |
| 856 // WebRTC implementation will drop frames if pushed to quickly. Wait the | 834 // WebRTC implementation will drop frames if pushed to quickly. Wait the |
| 857 // interval time to avoid that. | 835 // interval time to avoid that. |
| 858 // WebRTC implementation will drop frames if pushed to quickly. Wait the | 836 // WebRTC implementation will drop frames if pushed to quickly. Wait the |
| (...skipping 21 matching lines...) Expand all Loading... |
| 880 EXPECT_TRUE(channel_->AddRecvStream( | 858 EXPECT_TRUE(channel_->AddRecvStream( |
| 881 cricket::StreamParams::CreateLegacy(2))); | 859 cricket::StreamParams::CreateLegacy(2))); |
| 882 EXPECT_TRUE(channel_->SetSink(2, &renderer2)); | 860 EXPECT_TRUE(channel_->SetSink(2, &renderer2)); |
| 883 EXPECT_TRUE(channel_->AddSendStream( | 861 EXPECT_TRUE(channel_->AddSendStream( |
| 884 cricket::StreamParams::CreateLegacy(2))); | 862 cricket::StreamParams::CreateLegacy(2))); |
| 885 std::unique_ptr<cricket::FakeVideoCapturer> capturer2( | 863 std::unique_ptr<cricket::FakeVideoCapturer> capturer2( |
| 886 CreateFakeVideoCapturer()); | 864 CreateFakeVideoCapturer()); |
| 887 EXPECT_EQ(cricket::CS_RUNNING, capturer2->Start(capture_format)); | 865 EXPECT_EQ(cricket::CS_RUNNING, capturer2->Start(capture_format)); |
| 888 // State for all the streams. | 866 // State for all the streams. |
| 889 EXPECT_TRUE(SetOneCodec(DefaultCodec())); | 867 EXPECT_TRUE(SetOneCodec(DefaultCodec())); |
| 890 // A limitation in the lmi implementation requires that SetCapturer() is | 868 // A limitation in the lmi implementation requires that SetSource() is |
| 891 // called after SetOneCodec(). | 869 // called after SetOneCodec(). |
| 892 // TODO(hellner): this seems like an unnecessary constraint, fix it. | 870 // TODO(hellner): this seems like an unnecessary constraint, fix it. |
| 893 EXPECT_TRUE(channel_->SetCapturer(1, capturer1.get())); | 871 channel_->SetSource(1, capturer1.get()); |
| 894 EXPECT_TRUE(channel_->SetCapturer(2, capturer2.get())); | 872 channel_->SetSource(2, capturer2.get()); |
| 895 EXPECT_TRUE(SetSend(true)); | 873 EXPECT_TRUE(SetSend(true)); |
| 896 // Test capturer associated with engine. | 874 // Test capturer associated with engine. |
| 897 const int kTestWidth = 160; | 875 const int kTestWidth = 160; |
| 898 const int kTestHeight = 120; | 876 const int kTestHeight = 120; |
| 899 EXPECT_TRUE(capturer1->CaptureCustomFrame( | 877 EXPECT_TRUE(capturer1->CaptureCustomFrame( |
| 900 kTestWidth, kTestHeight, cricket::FOURCC_I420)); | 878 kTestWidth, kTestHeight, cricket::FOURCC_I420)); |
| 901 EXPECT_FRAME_ON_RENDERER_WAIT( | 879 EXPECT_FRAME_ON_RENDERER_WAIT( |
| 902 renderer1, 1, kTestWidth, kTestHeight, kTimeout); | 880 renderer1, 1, kTestWidth, kTestHeight, kTimeout); |
| 903 // Capture a frame with additional capturer2, frames should be received | 881 // Capture a frame with additional capturer2, frames should be received |
| 904 EXPECT_TRUE(capturer2->CaptureCustomFrame( | 882 EXPECT_TRUE(capturer2->CaptureCustomFrame( |
| 905 kTestWidth, kTestHeight, cricket::FOURCC_I420)); | 883 kTestWidth, kTestHeight, cricket::FOURCC_I420)); |
| 906 EXPECT_FRAME_ON_RENDERER_WAIT( | 884 EXPECT_FRAME_ON_RENDERER_WAIT( |
| 907 renderer2, 1, kTestWidth, kTestHeight, kTimeout); | 885 renderer2, 1, kTestWidth, kTestHeight, kTimeout); |
| 908 // Successfully remove the capturer. | 886 // Successfully remove the capturer. |
| 909 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); | 887 channel_->SetSource(kSsrc, NULL); |
| 910 // Fail to re-remove the capturer. | 888 // Fail to re-remove the capturer. |
| 911 EXPECT_FALSE(channel_->SetCapturer(kSsrc, NULL)); | 889 channel_->SetSource(kSsrc, NULL); |
| 912 // The capturers must be unregistered here as it runs out of it's scope | 890 // The capturers must be unregistered here as it runs out of it's scope |
| 913 // next. | 891 // next. |
| 914 EXPECT_TRUE(channel_->SetCapturer(1, NULL)); | 892 channel_->SetSource(1, NULL); |
| 915 EXPECT_TRUE(channel_->SetCapturer(2, NULL)); | 893 channel_->SetSource(2, NULL); |
| 916 } | 894 } |
| 917 | 895 |
| 918 void HighAspectHighHeightCapturer() { | 896 void HighAspectHighHeightCapturer() { |
| 919 const int kWidth = 80; | 897 const int kWidth = 80; |
| 920 const int kHeight = 10000; | 898 const int kHeight = 10000; |
| 921 const int kScaledWidth = 20; | 899 const int kScaledWidth = 20; |
| 922 const int kScaledHeight = 2500; | 900 const int kScaledHeight = 2500; |
| 923 | 901 |
| 924 cricket::VideoCodec codec(DefaultCodec()); | 902 cricket::VideoCodec codec(DefaultCodec()); |
| 925 EXPECT_TRUE(SetOneCodec(codec)); | 903 EXPECT_TRUE(SetOneCodec(codec)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 938 // Registering an external capturer is currently the same as screen casting | 916 // Registering an external capturer is currently the same as screen casting |
| 939 // (update the test when this changes). | 917 // (update the test when this changes). |
| 940 std::unique_ptr<cricket::FakeVideoCapturer> capturer( | 918 std::unique_ptr<cricket::FakeVideoCapturer> capturer( |
| 941 CreateFakeVideoCapturer()); | 919 CreateFakeVideoCapturer()); |
| 942 const std::vector<cricket::VideoFormat>* formats = | 920 const std::vector<cricket::VideoFormat>* formats = |
| 943 capturer->GetSupportedFormats(); | 921 capturer->GetSupportedFormats(); |
| 944 cricket::VideoFormat capture_format = (*formats)[0]; | 922 cricket::VideoFormat capture_format = (*formats)[0]; |
| 945 EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(capture_format)); | 923 EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(capture_format)); |
| 946 // Capture frame to not get same frame timestamps as previous capturer. | 924 // Capture frame to not get same frame timestamps as previous capturer. |
| 947 capturer->CaptureFrame(); | 925 capturer->CaptureFrame(); |
| 948 EXPECT_TRUE(channel_->SetCapturer(kSsrc, capturer.get())); | 926 channel_->SetSource(kSsrc, capturer.get()); |
| 949 EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); | 927 EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); |
| 950 EXPECT_TRUE(capturer->CaptureCustomFrame(kWidth, kHeight, | 928 EXPECT_TRUE(capturer->CaptureCustomFrame(kWidth, kHeight, |
| 951 cricket::FOURCC_ARGB)); | 929 cricket::FOURCC_ARGB)); |
| 952 EXPECT_GT_FRAME_ON_RENDERER_WAIT( | 930 EXPECT_GT_FRAME_ON_RENDERER_WAIT( |
| 953 renderer, 2, kScaledWidth, kScaledHeight, kTimeout); | 931 renderer, 2, kScaledWidth, kScaledHeight, kTimeout); |
| 954 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); | 932 channel_->SetSource(kSsrc, NULL); |
| 955 } | 933 } |
| 956 | 934 |
| 957 // Tests that we can adapt video resolution with 16:10 aspect ratio properly. | 935 // Tests that we can adapt video resolution with 16:10 aspect ratio properly. |
| 958 void AdaptResolution16x10() { | 936 void AdaptResolution16x10() { |
| 959 EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_)); | 937 EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_)); |
| 960 cricket::VideoCodec codec(DefaultCodec()); | 938 cricket::VideoCodec codec(DefaultCodec()); |
| 961 codec.width = 640; | 939 codec.width = 640; |
| 962 codec.height = 400; | 940 codec.height = 400; |
| 963 SendAndReceive(codec); | 941 SendAndReceive(codec); |
| 964 codec.width /= 2; | 942 codec.width /= 2; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1055 EXPECT_TRUE(SendFrame()); | 1033 EXPECT_TRUE(SendFrame()); |
| 1056 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout); | 1034 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout); |
| 1057 | 1035 |
| 1058 // Check that we send smaller frames at the new resolution. | 1036 // Check that we send smaller frames at the new resolution. |
| 1059 EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(33)); | 1037 EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(33)); |
| 1060 EXPECT_TRUE(video_capturer_->CaptureCustomFrame( | 1038 EXPECT_TRUE(video_capturer_->CaptureCustomFrame( |
| 1061 codec.width / 2, codec.height / 2, cricket::FOURCC_I420)); | 1039 codec.width / 2, codec.height / 2, cricket::FOURCC_I420)); |
| 1062 EXPECT_FRAME_WAIT(2, codec.width / 2, codec.height / 2, kTimeout); | 1040 EXPECT_FRAME_WAIT(2, codec.width / 2, codec.height / 2, kTimeout); |
| 1063 } | 1041 } |
| 1064 | 1042 |
| 1065 // Tests that we can mute and unmute the channel properly. | |
| 1066 void MuteStream() { | |
| 1067 EXPECT_TRUE(SetDefaultCodec()); | |
| 1068 cricket::FakeVideoCapturer video_capturer; | |
| 1069 video_capturer.Start( | |
| 1070 cricket::VideoFormat( | |
| 1071 640, 480, | |
| 1072 cricket::VideoFormat::FpsToInterval(30), | |
| 1073 cricket::FOURCC_I420)); | |
| 1074 EXPECT_TRUE(channel_->SetCapturer(kSsrc, &video_capturer)); | |
| 1075 EXPECT_TRUE(SetSend(true)); | |
| 1076 EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_)); | |
| 1077 EXPECT_EQ(0, renderer_.num_rendered_frames()); | |
| 1078 // Mute the channel and expect black output frame. | |
| 1079 int frame_count = 0; | |
| 1080 EXPECT_TRUE(channel_->SetVideoSend(kSsrc, false, nullptr)); | |
| 1081 EXPECT_TRUE(video_capturer.CaptureFrame()); | |
| 1082 ++frame_count; | |
| 1083 EXPECT_EQ_WAIT(frame_count, renderer_.num_rendered_frames(), kTimeout); | |
| 1084 EXPECT_TRUE(renderer_.black_frame()); | |
| 1085 // Unmute the channel and expect non-black output frame. | |
| 1086 EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr)); | |
| 1087 EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); | |
| 1088 EXPECT_TRUE(video_capturer.CaptureFrame()); | |
| 1089 ++frame_count; | |
| 1090 EXPECT_EQ_WAIT(frame_count, renderer_.num_rendered_frames(), kTimeout); | |
| 1091 EXPECT_FALSE(renderer_.black_frame()); | |
| 1092 // Test that we can also Mute using the correct send stream SSRC. | |
| 1093 EXPECT_TRUE(channel_->SetVideoSend(kSsrc, false, nullptr)); | |
| 1094 EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); | |
| 1095 EXPECT_TRUE(video_capturer.CaptureFrame()); | |
| 1096 ++frame_count; | |
| 1097 EXPECT_EQ_WAIT(frame_count, renderer_.num_rendered_frames(), kTimeout); | |
| 1098 EXPECT_TRUE(renderer_.black_frame()); | |
| 1099 EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr)); | |
| 1100 EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); | |
| 1101 EXPECT_TRUE(video_capturer.CaptureFrame()); | |
| 1102 ++frame_count; | |
| 1103 EXPECT_EQ_WAIT(frame_count, renderer_.num_rendered_frames(), kTimeout); | |
| 1104 EXPECT_FALSE(renderer_.black_frame()); | |
| 1105 // Test that muting an existing stream succeeds even if it's muted. | |
| 1106 EXPECT_TRUE(channel_->SetVideoSend(kSsrc, false, nullptr)); | |
| 1107 EXPECT_TRUE(channel_->SetVideoSend(kSsrc, false, nullptr)); | |
| 1108 // Test that unmuting an existing stream succeeds even if it's not muted. | |
| 1109 EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr)); | |
| 1110 EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr)); | |
| 1111 // Test that muting an invalid stream fails. | |
| 1112 EXPECT_FALSE(channel_->SetVideoSend(kSsrc+1, false, nullptr)); | |
| 1113 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); | |
| 1114 } | |
| 1115 | |
| 1116 // Test that multiple send streams can be created and deleted properly. | 1043 // Test that multiple send streams can be created and deleted properly. |
| 1117 void MultipleSendStreams() { | 1044 void MultipleSendStreams() { |
| 1118 // Remove stream added in Setup. I.e. remove stream corresponding to default | 1045 // Remove stream added in Setup. I.e. remove stream corresponding to default |
| 1119 // channel. | 1046 // channel. |
| 1120 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc)); | 1047 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc)); |
| 1121 const unsigned int kSsrcsSize = sizeof(kSsrcs4)/sizeof(kSsrcs4[0]); | 1048 const unsigned int kSsrcsSize = sizeof(kSsrcs4)/sizeof(kSsrcs4[0]); |
| 1122 for (unsigned int i = 0; i < kSsrcsSize; ++i) { | 1049 for (unsigned int i = 0; i < kSsrcsSize; ++i) { |
| 1123 EXPECT_TRUE(channel_->AddSendStream( | 1050 EXPECT_TRUE(channel_->AddSendStream( |
| 1124 cricket::StreamParams::CreateLegacy(kSsrcs4[i]))); | 1051 cricket::StreamParams::CreateLegacy(kSsrcs4[i]))); |
| 1125 } | 1052 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1137 SetUpSecondStream(); | 1064 SetUpSecondStream(); |
| 1138 // Test sending and receiving on first stream. | 1065 // Test sending and receiving on first stream. |
| 1139 SendAndReceive(codec); | 1066 SendAndReceive(codec); |
| 1140 // Test sending and receiving on second stream. | 1067 // Test sending and receiving on second stream. |
| 1141 EXPECT_EQ_WAIT(1, renderer2_.num_rendered_frames(), kTimeout); | 1068 EXPECT_EQ_WAIT(1, renderer2_.num_rendered_frames(), kTimeout); |
| 1142 EXPECT_GT(NumRtpPackets(), 0); | 1069 EXPECT_GT(NumRtpPackets(), 0); |
| 1143 EXPECT_EQ(1, renderer2_.num_rendered_frames()); | 1070 EXPECT_EQ(1, renderer2_.num_rendered_frames()); |
| 1144 } | 1071 } |
| 1145 | 1072 |
| 1146 const std::unique_ptr<webrtc::Call> call_; | 1073 const std::unique_ptr<webrtc::Call> call_; |
| 1147 VideoEngineOverride<E> engine_; | 1074 E engine_; |
| 1148 std::unique_ptr<cricket::FakeVideoCapturer> video_capturer_; | 1075 std::unique_ptr<cricket::FakeVideoCapturer> video_capturer_; |
| 1149 std::unique_ptr<cricket::FakeVideoCapturer> video_capturer_2_; | 1076 std::unique_ptr<cricket::FakeVideoCapturer> video_capturer_2_; |
| 1150 std::unique_ptr<C> channel_; | 1077 std::unique_ptr<C> channel_; |
| 1151 cricket::FakeNetworkInterface network_interface_; | 1078 cricket::FakeNetworkInterface network_interface_; |
| 1152 cricket::FakeVideoRenderer renderer_; | 1079 cricket::FakeVideoRenderer renderer_; |
| 1153 cricket::VideoMediaChannel::Error media_error_; | 1080 cricket::VideoMediaChannel::Error media_error_; |
| 1154 | 1081 |
| 1155 // Used by test cases where 2 streams are run on the same channel. | 1082 // Used by test cases where 2 streams are run on the same channel. |
| 1156 cricket::FakeVideoRenderer renderer2_; | 1083 cricket::FakeVideoRenderer renderer2_; |
| 1157 }; | 1084 }; |
| 1158 | 1085 |
| 1159 #endif // WEBRTC_MEDIA_BASE_VIDEOENGINE_UNITTEST_H_ NOLINT | 1086 #endif // WEBRTC_MEDIA_BASE_VIDEOENGINE_UNITTEST_H_ NOLINT |
| OLD | NEW |