| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <memory> | 11 #include <memory> |
| 12 #include <string> | 12 #include <string> |
| 13 #include <utility> | 13 #include <utility> |
| 14 | 14 |
| 15 #include "webrtc/base/gunit.h" | 15 #include "webrtc/base/gunit.h" |
| 16 #include "webrtc/base/sigslot.h" |
| 16 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 17 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
| 17 #include "webrtc/media/base/fakemediaengine.h" | 18 #include "webrtc/media/base/fakemediaengine.h" |
| 18 #include "webrtc/media/base/mediachannel.h" | 19 #include "webrtc/media/base/mediachannel.h" |
| 19 #include "webrtc/media/engine/fakewebrtccall.h" | 20 #include "webrtc/media/engine/fakewebrtccall.h" |
| 20 #include "webrtc/p2p/base/faketransportcontroller.h" | 21 #include "webrtc/p2p/base/faketransportcontroller.h" |
| 21 #include "webrtc/pc/audiotrack.h" | 22 #include "webrtc/pc/audiotrack.h" |
| 22 #include "webrtc/pc/channelmanager.h" | 23 #include "webrtc/pc/channelmanager.h" |
| 23 #include "webrtc/pc/fakemediacontroller.h" | 24 #include "webrtc/pc/fakemediacontroller.h" |
| 24 #include "webrtc/pc/localaudiosource.h" | 25 #include "webrtc/pc/localaudiosource.h" |
| 25 #include "webrtc/pc/mediastream.h" | 26 #include "webrtc/pc/mediastream.h" |
| 26 #include "webrtc/pc/remoteaudiosource.h" | 27 #include "webrtc/pc/remoteaudiosource.h" |
| 27 #include "webrtc/pc/rtpreceiver.h" | 28 #include "webrtc/pc/rtpreceiver.h" |
| 28 #include "webrtc/pc/rtpsender.h" | 29 #include "webrtc/pc/rtpsender.h" |
| 29 #include "webrtc/pc/streamcollection.h" | 30 #include "webrtc/pc/streamcollection.h" |
| 30 #include "webrtc/pc/test/fakevideotracksource.h" | 31 #include "webrtc/pc/test/fakevideotracksource.h" |
| 31 #include "webrtc/pc/videotrack.h" | 32 #include "webrtc/pc/videotrack.h" |
| 32 #include "webrtc/pc/videotracksource.h" | 33 #include "webrtc/pc/videotracksource.h" |
| 33 #include "webrtc/test/gmock.h" | 34 #include "webrtc/test/gmock.h" |
| 34 #include "webrtc/test/gtest.h" | 35 #include "webrtc/test/gtest.h" |
| 35 | 36 |
| 36 using ::testing::_; | 37 using ::testing::_; |
| 37 using ::testing::Exactly; | 38 using ::testing::Exactly; |
| 38 using ::testing::InvokeWithoutArgs; | 39 using ::testing::InvokeWithoutArgs; |
| 39 using ::testing::Return; | 40 using ::testing::Return; |
| 40 | 41 |
| 42 namespace { |
| 43 |
| 41 static const char kStreamLabel1[] = "local_stream_1"; | 44 static const char kStreamLabel1[] = "local_stream_1"; |
| 42 static const char kVideoTrackId[] = "video_1"; | 45 static const char kVideoTrackId[] = "video_1"; |
| 43 static const char kAudioTrackId[] = "audio_1"; | 46 static const char kAudioTrackId[] = "audio_1"; |
| 44 static const uint32_t kVideoSsrc = 98; | 47 static const uint32_t kVideoSsrc = 98; |
| 45 static const uint32_t kVideoSsrc2 = 100; | 48 static const uint32_t kVideoSsrc2 = 100; |
| 46 static const uint32_t kAudioSsrc = 99; | 49 static const uint32_t kAudioSsrc = 99; |
| 47 static const uint32_t kAudioSsrc2 = 101; | 50 static const uint32_t kAudioSsrc2 = 101; |
| 51 static const int kDefaultTimeout = 10000; // 10 seconds. |
| 52 |
| 53 } // namespace |
| 48 | 54 |
| 49 namespace webrtc { | 55 namespace webrtc { |
| 50 | 56 |
| 51 class RtpSenderReceiverTest : public testing::Test { | 57 class RtpSenderReceiverTest : public testing::Test, |
| 58 public sigslot::has_slots<> { |
| 52 public: | 59 public: |
| 53 RtpSenderReceiverTest() | 60 RtpSenderReceiverTest() |
| 54 : // Create fake media engine/etc. so we can create channels to use to | 61 : // Create fake media engine/etc. so we can create channels to use to |
| 55 // test RtpSenders/RtpReceivers. | 62 // test RtpSenders/RtpReceivers. |
| 56 media_engine_(new cricket::FakeMediaEngine()), | 63 media_engine_(new cricket::FakeMediaEngine()), |
| 57 channel_manager_(media_engine_, | 64 channel_manager_(media_engine_, |
| 58 rtc::Thread::Current(), | 65 rtc::Thread::Current(), |
| 59 rtc::Thread::Current()), | 66 rtc::Thread::Current()), |
| 60 fake_call_(Call::Config(&event_log_)), | 67 fake_call_(Call::Config(&event_log_)), |
| 61 fake_media_controller_(&channel_manager_, &fake_call_), | 68 fake_media_controller_(&channel_manager_, &fake_call_), |
| 62 stream_(MediaStream::Create(kStreamLabel1)) { | 69 stream_(MediaStream::Create(kStreamLabel1)) { |
| 63 // Create channels to be used by the RtpSenders and RtpReceivers. | 70 // Create channels to be used by the RtpSenders and RtpReceivers. |
| 64 channel_manager_.Init(); | 71 channel_manager_.Init(); |
| 65 bool rtcp_mux_required = true; | 72 bool rtcp_mux_required = true; |
| 66 bool srtp_required = true; | 73 bool srtp_required = true; |
| 67 cricket::DtlsTransportInternal* rtp_transport = | 74 cricket::DtlsTransportInternal* rtp_transport = |
| 68 fake_transport_controller_.CreateDtlsTransport( | 75 fake_transport_controller_.CreateDtlsTransport( |
| 69 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP); | 76 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 70 voice_channel_ = channel_manager_.CreateVoiceChannel( | 77 voice_channel_ = channel_manager_.CreateVoiceChannel( |
| 71 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(), | 78 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(), |
| 72 cricket::CN_AUDIO, nullptr, rtcp_mux_required, srtp_required, | 79 cricket::CN_AUDIO, nullptr, rtcp_mux_required, srtp_required, |
| 73 cricket::AudioOptions()); | 80 cricket::AudioOptions()); |
| 74 video_channel_ = channel_manager_.CreateVideoChannel( | 81 video_channel_ = channel_manager_.CreateVideoChannel( |
| 75 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(), | 82 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(), |
| 76 cricket::CN_VIDEO, nullptr, rtcp_mux_required, srtp_required, | 83 cricket::CN_VIDEO, nullptr, rtcp_mux_required, srtp_required, |
| 77 cricket::VideoOptions()); | 84 cricket::VideoOptions()); |
| 85 voice_channel_->Enable(true); |
| 86 video_channel_->Enable(true); |
| 78 voice_media_channel_ = media_engine_->GetVoiceChannel(0); | 87 voice_media_channel_ = media_engine_->GetVoiceChannel(0); |
| 79 video_media_channel_ = media_engine_->GetVideoChannel(0); | 88 video_media_channel_ = media_engine_->GetVideoChannel(0); |
| 80 RTC_CHECK(voice_channel_); | 89 RTC_CHECK(voice_channel_); |
| 81 RTC_CHECK(video_channel_); | 90 RTC_CHECK(video_channel_); |
| 82 RTC_CHECK(voice_media_channel_); | 91 RTC_CHECK(voice_media_channel_); |
| 83 RTC_CHECK(video_media_channel_); | 92 RTC_CHECK(video_media_channel_); |
| 84 | 93 |
| 85 // Create streams for predefined SSRCs. Streams need to exist in order | 94 // Create streams for predefined SSRCs. Streams need to exist in order |
| 86 // for the senders and receievers to apply parameters to them. | 95 // for the senders and receievers to apply parameters to them. |
| 87 // Normally these would be created by SetLocalDescription and | 96 // Normally these would be created by SetLocalDescription and |
| 88 // SetRemoteDescription. | 97 // SetRemoteDescription. |
| 89 voice_media_channel_->AddSendStream( | 98 voice_media_channel_->AddSendStream( |
| 90 cricket::StreamParams::CreateLegacy(kAudioSsrc)); | 99 cricket::StreamParams::CreateLegacy(kAudioSsrc)); |
| 91 voice_media_channel_->AddRecvStream( | 100 voice_media_channel_->AddRecvStream( |
| 92 cricket::StreamParams::CreateLegacy(kAudioSsrc)); | 101 cricket::StreamParams::CreateLegacy(kAudioSsrc)); |
| 93 voice_media_channel_->AddSendStream( | 102 voice_media_channel_->AddSendStream( |
| 94 cricket::StreamParams::CreateLegacy(kAudioSsrc2)); | 103 cricket::StreamParams::CreateLegacy(kAudioSsrc2)); |
| 95 voice_media_channel_->AddRecvStream( | 104 voice_media_channel_->AddRecvStream( |
| 96 cricket::StreamParams::CreateLegacy(kAudioSsrc2)); | 105 cricket::StreamParams::CreateLegacy(kAudioSsrc2)); |
| 97 video_media_channel_->AddSendStream( | 106 video_media_channel_->AddSendStream( |
| 98 cricket::StreamParams::CreateLegacy(kVideoSsrc)); | 107 cricket::StreamParams::CreateLegacy(kVideoSsrc)); |
| 99 video_media_channel_->AddRecvStream( | 108 video_media_channel_->AddRecvStream( |
| 100 cricket::StreamParams::CreateLegacy(kVideoSsrc)); | 109 cricket::StreamParams::CreateLegacy(kVideoSsrc)); |
| 101 video_media_channel_->AddSendStream( | 110 video_media_channel_->AddSendStream( |
| 102 cricket::StreamParams::CreateLegacy(kVideoSsrc2)); | 111 cricket::StreamParams::CreateLegacy(kVideoSsrc2)); |
| 103 video_media_channel_->AddRecvStream( | 112 video_media_channel_->AddRecvStream( |
| 104 cricket::StreamParams::CreateLegacy(kVideoSsrc2)); | 113 cricket::StreamParams::CreateLegacy(kVideoSsrc2)); |
| 105 } | 114 } |
| 106 | 115 |
| 107 void TearDown() override { channel_manager_.Terminate(); } | 116 // Needed to use DTMF sender. |
| 117 void AddDtmfCodec() { |
| 118 cricket::AudioSendParameters params; |
| 119 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, |
| 120 0, 1); |
| 121 params.codecs.push_back(kTelephoneEventCodec); |
| 122 voice_media_channel_->SetSendParameters(params); |
| 123 } |
| 108 | 124 |
| 109 void AddVideoTrack() { AddVideoTrack(false); } | 125 void AddVideoTrack() { AddVideoTrack(false); } |
| 110 | 126 |
| 111 void AddVideoTrack(bool is_screencast) { | 127 void AddVideoTrack(bool is_screencast) { |
| 112 rtc::scoped_refptr<VideoTrackSourceInterface> source( | 128 rtc::scoped_refptr<VideoTrackSourceInterface> source( |
| 113 FakeVideoTrackSource::Create(is_screencast)); | 129 FakeVideoTrackSource::Create(is_screencast)); |
| 114 video_track_ = VideoTrack::Create(kVideoTrackId, source); | 130 video_track_ = VideoTrack::Create(kVideoTrackId, source); |
| 115 EXPECT_TRUE(stream_->AddTrack(video_track_)); | 131 EXPECT_TRUE(stream_->AddTrack(video_track_)); |
| 116 } | 132 } |
| 117 | 133 |
| 118 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); } | 134 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); } |
| 119 | 135 |
| 120 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) { | 136 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) { |
| 121 audio_track_ = AudioTrack::Create(kAudioTrackId, source); | 137 audio_track_ = AudioTrack::Create(kAudioTrackId, source); |
| 122 EXPECT_TRUE(stream_->AddTrack(audio_track_)); | 138 EXPECT_TRUE(stream_->AddTrack(audio_track_)); |
| 123 audio_rtp_sender_ = | 139 audio_rtp_sender_ = |
| 124 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(), | 140 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(), |
| 125 voice_channel_, nullptr); | 141 voice_channel_, nullptr); |
| 126 audio_rtp_sender_->SetSsrc(kAudioSsrc); | 142 audio_rtp_sender_->SetSsrc(kAudioSsrc); |
| 143 audio_rtp_sender_->GetOnDestroyedSignal()->connect( |
| 144 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed); |
| 127 VerifyVoiceChannelInput(); | 145 VerifyVoiceChannelInput(); |
| 128 } | 146 } |
| 129 | 147 |
| 148 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; } |
| 149 |
| 130 void CreateVideoRtpSender() { CreateVideoRtpSender(false); } | 150 void CreateVideoRtpSender() { CreateVideoRtpSender(false); } |
| 131 | 151 |
| 132 void CreateVideoRtpSender(bool is_screencast) { | 152 void CreateVideoRtpSender(bool is_screencast) { |
| 133 AddVideoTrack(is_screencast); | 153 AddVideoTrack(is_screencast); |
| 134 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0], | 154 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0], |
| 135 stream_->label(), video_channel_); | 155 stream_->label(), video_channel_); |
| 136 video_rtp_sender_->SetSsrc(kVideoSsrc); | 156 video_rtp_sender_->SetSsrc(kVideoSsrc); |
| 137 VerifyVideoChannelInput(); | 157 VerifyVideoChannelInput(); |
| 138 } | 158 } |
| 139 | 159 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 cricket::VideoChannel* video_channel_; | 260 cricket::VideoChannel* video_channel_; |
| 241 cricket::FakeVoiceMediaChannel* voice_media_channel_; | 261 cricket::FakeVoiceMediaChannel* voice_media_channel_; |
| 242 cricket::FakeVideoMediaChannel* video_media_channel_; | 262 cricket::FakeVideoMediaChannel* video_media_channel_; |
| 243 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_; | 263 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_; |
| 244 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_; | 264 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_; |
| 245 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_; | 265 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_; |
| 246 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_; | 266 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_; |
| 247 rtc::scoped_refptr<MediaStreamInterface> stream_; | 267 rtc::scoped_refptr<MediaStreamInterface> stream_; |
| 248 rtc::scoped_refptr<VideoTrackInterface> video_track_; | 268 rtc::scoped_refptr<VideoTrackInterface> video_track_; |
| 249 rtc::scoped_refptr<AudioTrackInterface> audio_track_; | 269 rtc::scoped_refptr<AudioTrackInterface> audio_track_; |
| 270 bool audio_sender_destroyed_signal_fired_ = false; |
| 250 }; | 271 }; |
| 251 | 272 |
| 252 // Test that |voice_channel_| is updated when an audio track is associated | 273 // Test that |voice_channel_| is updated when an audio track is associated |
| 253 // and disassociated with an AudioRtpSender. | 274 // and disassociated with an AudioRtpSender. |
| 254 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) { | 275 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) { |
| 255 CreateAudioRtpSender(); | 276 CreateAudioRtpSender(); |
| 256 DestroyAudioRtpSender(); | 277 DestroyAudioRtpSender(); |
| 257 } | 278 } |
| 258 | 279 |
| 259 // Test that |video_channel_| is updated when a video track is associated and | 280 // Test that |video_channel_| is updated when a video track is associated and |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 | 735 |
| 715 // And removing the hint should go back to false (to verify that false was | 736 // And removing the hint should go back to false (to verify that false was |
| 716 // default correctly). | 737 // default correctly). |
| 717 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone); | 738 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone); |
| 718 EXPECT_EQ(rtc::Optional<bool>(false), | 739 EXPECT_EQ(rtc::Optional<bool>(false), |
| 719 video_media_channel_->options().is_screencast); | 740 video_media_channel_->options().is_screencast); |
| 720 | 741 |
| 721 DestroyVideoRtpSender(); | 742 DestroyVideoRtpSender(); |
| 722 } | 743 } |
| 723 | 744 |
| 745 TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) { |
| 746 CreateAudioRtpSender(); |
| 747 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender()); |
| 748 } |
| 749 |
| 750 TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) { |
| 751 CreateVideoRtpSender(); |
| 752 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender()); |
| 753 } |
| 754 |
| 755 // Test that the DTMF sender is really using |voice_channel_|, and thus returns |
| 756 // true/false from CanSendDtmf based on what |voice_channel_| returns. |
| 757 TEST_F(RtpSenderReceiverTest, CanInsertDtmf) { |
| 758 AddDtmfCodec(); |
| 759 CreateAudioRtpSender(); |
| 760 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender(); |
| 761 ASSERT_NE(nullptr, dtmf_sender); |
| 762 EXPECT_TRUE(dtmf_sender->CanInsertDtmf()); |
| 763 } |
| 764 |
| 765 TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) { |
| 766 CreateAudioRtpSender(); |
| 767 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender(); |
| 768 ASSERT_NE(nullptr, dtmf_sender); |
| 769 // DTMF codec has not been added, as it was in the above test. |
| 770 EXPECT_FALSE(dtmf_sender->CanInsertDtmf()); |
| 771 } |
| 772 |
| 773 TEST_F(RtpSenderReceiverTest, InsertDtmf) { |
| 774 AddDtmfCodec(); |
| 775 CreateAudioRtpSender(); |
| 776 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender(); |
| 777 ASSERT_NE(nullptr, dtmf_sender); |
| 778 |
| 779 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size()); |
| 780 |
| 781 // Insert DTMF |
| 782 const int expected_duration = 90; |
| 783 dtmf_sender->InsertDtmf("012", expected_duration, 100); |
| 784 |
| 785 // Verify |
| 786 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(), |
| 787 kDefaultTimeout); |
| 788 const uint32_t send_ssrc = |
| 789 voice_media_channel_->send_streams()[0].first_ssrc(); |
| 790 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0], |
| 791 send_ssrc, 0, expected_duration)); |
| 792 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1], |
| 793 send_ssrc, 1, expected_duration)); |
| 794 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2], |
| 795 send_ssrc, 2, expected_duration)); |
| 796 } |
| 797 |
| 798 // Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is |
| 799 // destroyed, which is needed for the DTMF sender. |
| 800 TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) { |
| 801 CreateAudioRtpSender(); |
| 802 EXPECT_FALSE(audio_sender_destroyed_signal_fired_); |
| 803 audio_rtp_sender_ = nullptr; |
| 804 EXPECT_TRUE(audio_sender_destroyed_signal_fired_); |
| 805 } |
| 806 |
| 724 } // namespace webrtc | 807 } // namespace webrtc |
| OLD | NEW |