| 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 "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "webrtc/api/audiotrack.h" | 17 #include "webrtc/api/audiotrack.h" |
| 18 #include "webrtc/api/fakemediacontroller.h" | |
| 19 #include "webrtc/api/localaudiosource.h" | |
| 20 #include "webrtc/api/mediastream.h" | 18 #include "webrtc/api/mediastream.h" |
| 21 #include "webrtc/api/remoteaudiosource.h" | 19 #include "webrtc/api/remoteaudiosource.h" |
| 22 #include "webrtc/api/rtpreceiver.h" | 20 #include "webrtc/api/rtpreceiver.h" |
| 23 #include "webrtc/api/rtpsender.h" | 21 #include "webrtc/api/rtpsender.h" |
| 24 #include "webrtc/api/streamcollection.h" | 22 #include "webrtc/api/streamcollection.h" |
| 25 #include "webrtc/api/test/fakevideotracksource.h" | 23 #include "webrtc/api/test/fakevideotracksource.h" |
| 26 #include "webrtc/api/videotracksource.h" | 24 #include "webrtc/api/videotracksource.h" |
| 27 #include "webrtc/api/videotrack.h" | 25 #include "webrtc/api/videotrack.h" |
| 28 #include "webrtc/base/gunit.h" | 26 #include "webrtc/base/gunit.h" |
| 29 #include "webrtc/media/base/mediachannel.h" | 27 #include "webrtc/media/base/mediachannel.h" |
| 30 #include "webrtc/media/base/fakemediaengine.h" | |
| 31 #include "webrtc/media/engine/fakewebrtccall.h" | |
| 32 #include "webrtc/p2p/base/faketransportcontroller.h" | |
| 33 #include "webrtc/pc/channelmanager.h" | |
| 34 | 28 |
| 35 using ::testing::_; | 29 using ::testing::_; |
| 36 using ::testing::Exactly; | 30 using ::testing::Exactly; |
| 37 using ::testing::InvokeWithoutArgs; | 31 using ::testing::InvokeWithoutArgs; |
| 38 using ::testing::Return; | 32 using ::testing::Return; |
| 39 | 33 |
| 40 static const char kStreamLabel1[] = "local_stream_1"; | 34 static const char kStreamLabel1[] = "local_stream_1"; |
| 41 static const char kVideoTrackId[] = "video_1"; | 35 static const char kVideoTrackId[] = "video_1"; |
| 42 static const char kAudioTrackId[] = "audio_1"; | 36 static const char kAudioTrackId[] = "audio_1"; |
| 43 static const uint32_t kVideoSsrc = 98; | 37 static const uint32_t kVideoSsrc = 98; |
| 44 static const uint32_t kVideoSsrc2 = 100; | 38 static const uint32_t kVideoSsrc2 = 100; |
| 45 static const uint32_t kAudioSsrc = 99; | 39 static const uint32_t kAudioSsrc = 99; |
| 46 static const uint32_t kAudioSsrc2 = 101; | 40 static const uint32_t kAudioSsrc2 = 101; |
| 47 | 41 |
| 48 namespace webrtc { | 42 namespace webrtc { |
| 49 | 43 |
| 44 // Helper class to test RtpSender/RtpReceiver. |
| 45 class MockAudioProvider : public AudioProviderInterface { |
| 46 public: |
| 47 // TODO(nisse): Valid overrides commented out, because the gmock |
| 48 // methods don't use any override declarations, and we want to avoid |
| 49 // warnings from -Winconsistent-missing-override. See |
| 50 // http://crbug.com/428099. |
| 51 ~MockAudioProvider() /* override */ {} |
| 52 |
| 53 MOCK_METHOD2(SetAudioPlayout, |
| 54 void(uint32_t ssrc, |
| 55 bool enable)); |
| 56 MOCK_METHOD4(SetAudioSend, |
| 57 void(uint32_t ssrc, |
| 58 bool enable, |
| 59 const cricket::AudioOptions& options, |
| 60 cricket::AudioSource* source)); |
| 61 MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32_t ssrc, double volume)); |
| 62 MOCK_CONST_METHOD1(GetAudioRtpSendParameters, RtpParameters(uint32_t ssrc)); |
| 63 MOCK_METHOD2(SetAudioRtpSendParameters, |
| 64 bool(uint32_t ssrc, const RtpParameters&)); |
| 65 MOCK_CONST_METHOD1(GetAudioRtpReceiveParameters, |
| 66 RtpParameters(uint32_t ssrc)); |
| 67 MOCK_METHOD2(SetAudioRtpReceiveParameters, |
| 68 bool(uint32_t ssrc, const RtpParameters&)); |
| 69 |
| 70 void SetRawAudioSink( |
| 71 uint32_t, std::unique_ptr<AudioSinkInterface> sink) /* override */ { |
| 72 sink_ = std::move(sink); |
| 73 } |
| 74 |
| 75 private: |
| 76 std::unique_ptr<AudioSinkInterface> sink_; |
| 77 }; |
| 78 |
| 79 // Helper class to test RtpSender/RtpReceiver. |
| 80 class MockVideoProvider : public VideoProviderInterface { |
| 81 public: |
| 82 virtual ~MockVideoProvider() {} |
| 83 MOCK_METHOD3(SetVideoPlayout, |
| 84 void(uint32_t ssrc, |
| 85 bool enable, |
| 86 rtc::VideoSinkInterface<cricket::VideoFrame>* sink)); |
| 87 MOCK_METHOD4(SetVideoSend, |
| 88 void(uint32_t ssrc, |
| 89 bool enable, |
| 90 const cricket::VideoOptions* options, |
| 91 rtc::VideoSourceInterface<cricket::VideoFrame>* source)); |
| 92 |
| 93 MOCK_CONST_METHOD1(GetVideoRtpSendParameters, RtpParameters(uint32_t ssrc)); |
| 94 MOCK_METHOD2(SetVideoRtpSendParameters, |
| 95 bool(uint32_t ssrc, const RtpParameters&)); |
| 96 MOCK_CONST_METHOD1(GetVideoRtpReceiveParameters, |
| 97 RtpParameters(uint32_t ssrc)); |
| 98 MOCK_METHOD2(SetVideoRtpReceiveParameters, |
| 99 bool(uint32_t ssrc, const RtpParameters&)); |
| 100 }; |
| 101 |
| 50 class RtpSenderReceiverTest : public testing::Test { | 102 class RtpSenderReceiverTest : public testing::Test { |
| 51 public: | 103 public: |
| 52 RtpSenderReceiverTest() | 104 virtual void SetUp() { |
| 53 : // Create fake media engine/etc. so we can create channels to use to | 105 stream_ = MediaStream::Create(kStreamLabel1); |
| 54 // test RtpSenders/RtpReceivers. | |
| 55 media_engine_(new cricket::FakeMediaEngine()), | |
| 56 channel_manager_(media_engine_, | |
| 57 rtc::Thread::Current(), | |
| 58 rtc::Thread::Current()), | |
| 59 fake_call_(webrtc::Call::Config()), | |
| 60 fake_media_controller_(&channel_manager_, &fake_call_), | |
| 61 stream_(MediaStream::Create(kStreamLabel1)) { | |
| 62 // Create channels to be used by the RtpSenders and RtpReceivers. | |
| 63 channel_manager_.Init(); | |
| 64 voice_channel_ = channel_manager_.CreateVoiceChannel( | |
| 65 &fake_media_controller_, &fake_transport_controller_, cricket::CN_AUDIO, | |
| 66 nullptr, false, cricket::AudioOptions()); | |
| 67 video_channel_ = channel_manager_.CreateVideoChannel( | |
| 68 &fake_media_controller_, &fake_transport_controller_, cricket::CN_VIDEO, | |
| 69 nullptr, false, cricket::VideoOptions()); | |
| 70 voice_media_channel_ = media_engine_->GetVoiceChannel(0); | |
| 71 video_media_channel_ = media_engine_->GetVideoChannel(0); | |
| 72 RTC_CHECK(voice_channel_); | |
| 73 RTC_CHECK(video_channel_); | |
| 74 RTC_CHECK(voice_media_channel_); | |
| 75 RTC_CHECK(video_media_channel_); | |
| 76 | |
| 77 // Create streams for predefined SSRCs. Streams need to exist in order | |
| 78 // for the senders and receievers to apply parameters to them. | |
| 79 // Normally these would be created by SetLocalDescription and | |
| 80 // SetRemoteDescription. | |
| 81 voice_media_channel_->AddSendStream( | |
| 82 cricket::StreamParams::CreateLegacy(kAudioSsrc)); | |
| 83 voice_media_channel_->AddRecvStream( | |
| 84 cricket::StreamParams::CreateLegacy(kAudioSsrc)); | |
| 85 voice_media_channel_->AddSendStream( | |
| 86 cricket::StreamParams::CreateLegacy(kAudioSsrc2)); | |
| 87 voice_media_channel_->AddRecvStream( | |
| 88 cricket::StreamParams::CreateLegacy(kAudioSsrc2)); | |
| 89 video_media_channel_->AddSendStream( | |
| 90 cricket::StreamParams::CreateLegacy(kVideoSsrc)); | |
| 91 video_media_channel_->AddRecvStream( | |
| 92 cricket::StreamParams::CreateLegacy(kVideoSsrc)); | |
| 93 video_media_channel_->AddSendStream( | |
| 94 cricket::StreamParams::CreateLegacy(kVideoSsrc2)); | |
| 95 video_media_channel_->AddRecvStream( | |
| 96 cricket::StreamParams::CreateLegacy(kVideoSsrc2)); | |
| 97 } | 106 } |
| 98 | 107 |
| 99 void TearDown() override { channel_manager_.Terminate(); } | |
| 100 | |
| 101 void AddVideoTrack() { | 108 void AddVideoTrack() { |
| 102 rtc::scoped_refptr<VideoTrackSourceInterface> source( | 109 rtc::scoped_refptr<VideoTrackSourceInterface> source( |
| 103 FakeVideoTrackSource::Create()); | 110 FakeVideoTrackSource::Create()); |
| 104 video_track_ = VideoTrack::Create(kVideoTrackId, source); | 111 video_track_ = VideoTrack::Create(kVideoTrackId, source); |
| 105 EXPECT_TRUE(stream_->AddTrack(video_track_)); | 112 EXPECT_TRUE(stream_->AddTrack(video_track_)); |
| 106 } | 113 } |
| 107 | 114 |
| 108 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); } | 115 void CreateAudioRtpSender() { |
| 109 | 116 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL); |
| 110 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) { | |
| 111 audio_track_ = AudioTrack::Create(kAudioTrackId, source); | |
| 112 EXPECT_TRUE(stream_->AddTrack(audio_track_)); | 117 EXPECT_TRUE(stream_->AddTrack(audio_track_)); |
| 118 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _)); |
| 113 audio_rtp_sender_ = | 119 audio_rtp_sender_ = |
| 114 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(), | 120 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(), |
| 115 voice_channel_, nullptr); | 121 &audio_provider_, nullptr); |
| 116 audio_rtp_sender_->SetSsrc(kAudioSsrc); | 122 audio_rtp_sender_->SetSsrc(kAudioSsrc); |
| 117 VerifyVoiceChannelInput(); | |
| 118 } | 123 } |
| 119 | 124 |
| 120 void CreateVideoRtpSender() { | 125 void CreateVideoRtpSender() { |
| 121 AddVideoTrack(); | 126 AddVideoTrack(); |
| 127 EXPECT_CALL(video_provider_, |
| 128 SetVideoSend(kVideoSsrc, true, _, video_track_.get())); |
| 122 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0], | 129 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0], |
| 123 stream_->label(), video_channel_); | 130 stream_->label(), &video_provider_); |
| 124 video_rtp_sender_->SetSsrc(kVideoSsrc); | 131 video_rtp_sender_->SetSsrc(kVideoSsrc); |
| 125 VerifyVideoChannelInput(); | |
| 126 } | 132 } |
| 127 | 133 |
| 128 void DestroyAudioRtpSender() { | 134 void DestroyAudioRtpSender() { |
| 135 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)) |
| 136 .Times(1); |
| 129 audio_rtp_sender_ = nullptr; | 137 audio_rtp_sender_ = nullptr; |
| 130 VerifyVoiceChannelNoInput(); | |
| 131 } | 138 } |
| 132 | 139 |
| 133 void DestroyVideoRtpSender() { | 140 void DestroyVideoRtpSender() { |
| 141 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr)) |
| 142 .Times(1); |
| 134 video_rtp_sender_ = nullptr; | 143 video_rtp_sender_ = nullptr; |
| 135 VerifyVideoChannelNoInput(); | |
| 136 } | 144 } |
| 137 | 145 |
| 138 void CreateAudioRtpReceiver() { | 146 void CreateAudioRtpReceiver() { |
| 139 audio_track_ = AudioTrack::Create( | 147 audio_track_ = AudioTrack::Create( |
| 140 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL)); | 148 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL)); |
| 141 EXPECT_TRUE(stream_->AddTrack(audio_track_)); | 149 EXPECT_TRUE(stream_->AddTrack(audio_track_)); |
| 150 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true)); |
| 142 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId, | 151 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId, |
| 143 kAudioSsrc, voice_channel_); | 152 kAudioSsrc, &audio_provider_); |
| 144 audio_track_ = audio_rtp_receiver_->audio_track(); | 153 audio_track_ = audio_rtp_receiver_->audio_track(); |
| 145 VerifyVoiceChannelOutput(); | |
| 146 } | 154 } |
| 147 | 155 |
| 148 void CreateVideoRtpReceiver() { | 156 void CreateVideoRtpReceiver() { |
| 157 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, true, _)); |
| 149 video_rtp_receiver_ = | 158 video_rtp_receiver_ = |
| 150 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(), | 159 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(), |
| 151 kVideoSsrc, video_channel_); | 160 kVideoSsrc, &video_provider_); |
| 152 video_track_ = video_rtp_receiver_->video_track(); | 161 video_track_ = video_rtp_receiver_->video_track(); |
| 153 VerifyVideoChannelOutput(); | |
| 154 } | 162 } |
| 155 | 163 |
| 156 void DestroyAudioRtpReceiver() { | 164 void DestroyAudioRtpReceiver() { |
| 165 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false)); |
| 157 audio_rtp_receiver_ = nullptr; | 166 audio_rtp_receiver_ = nullptr; |
| 158 VerifyVoiceChannelNoOutput(); | |
| 159 } | 167 } |
| 160 | 168 |
| 161 void DestroyVideoRtpReceiver() { | 169 void DestroyVideoRtpReceiver() { |
| 170 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL)); |
| 162 video_rtp_receiver_ = nullptr; | 171 video_rtp_receiver_ = nullptr; |
| 163 VerifyVideoChannelNoOutput(); | |
| 164 } | |
| 165 | |
| 166 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); } | |
| 167 | |
| 168 void VerifyVoiceChannelInput(uint32_t ssrc) { | |
| 169 // Verify that the media channel has an audio source, and the stream isn't | |
| 170 // muted. | |
| 171 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc)); | |
| 172 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc)); | |
| 173 } | |
| 174 | |
| 175 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); } | |
| 176 | |
| 177 void VerifyVideoChannelInput(uint32_t ssrc) { | |
| 178 // Verify that the media channel has a video source, | |
| 179 EXPECT_TRUE(video_media_channel_->HasSource(ssrc)); | |
| 180 } | |
| 181 | |
| 182 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); } | |
| 183 | |
| 184 void VerifyVoiceChannelNoInput(uint32_t ssrc) { | |
| 185 // Verify that the media channel's source is reset. | |
| 186 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc)); | |
| 187 } | |
| 188 | |
| 189 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); } | |
| 190 | |
| 191 void VerifyVideoChannelNoInput(uint32_t ssrc) { | |
| 192 // Verify that the media channel's source is reset. | |
| 193 EXPECT_FALSE(video_media_channel_->HasSource(ssrc)); | |
| 194 } | |
| 195 | |
| 196 void VerifyVoiceChannelOutput() { | |
| 197 // Verify that the volume is initialized to 1. | |
| 198 double volume; | |
| 199 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | |
| 200 EXPECT_EQ(1, volume); | |
| 201 } | |
| 202 | |
| 203 void VerifyVideoChannelOutput() { | |
| 204 // Verify that the media channel has a sink. | |
| 205 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc)); | |
| 206 } | |
| 207 | |
| 208 void VerifyVoiceChannelNoOutput() { | |
| 209 // Verify that the volume is reset to 0. | |
| 210 double volume; | |
| 211 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | |
| 212 EXPECT_EQ(0, volume); | |
| 213 } | |
| 214 | |
| 215 void VerifyVideoChannelNoOutput() { | |
| 216 // Verify that the media channel's sink is reset. | |
| 217 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc)); | |
| 218 } | 172 } |
| 219 | 173 |
| 220 protected: | 174 protected: |
| 221 cricket::FakeMediaEngine* media_engine_; | 175 MockAudioProvider audio_provider_; |
| 222 cricket::FakeTransportController fake_transport_controller_; | 176 MockVideoProvider video_provider_; |
| 223 cricket::ChannelManager channel_manager_; | |
| 224 cricket::FakeCall fake_call_; | |
| 225 cricket::FakeMediaController fake_media_controller_; | |
| 226 cricket::VoiceChannel* voice_channel_; | |
| 227 cricket::VideoChannel* video_channel_; | |
| 228 cricket::FakeVoiceMediaChannel* voice_media_channel_; | |
| 229 cricket::FakeVideoMediaChannel* video_media_channel_; | |
| 230 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_; | 177 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_; |
| 231 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_; | 178 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_; |
| 232 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_; | 179 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_; |
| 233 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_; | 180 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_; |
| 234 rtc::scoped_refptr<MediaStreamInterface> stream_; | 181 rtc::scoped_refptr<MediaStreamInterface> stream_; |
| 235 rtc::scoped_refptr<VideoTrackInterface> video_track_; | 182 rtc::scoped_refptr<VideoTrackInterface> video_track_; |
| 236 rtc::scoped_refptr<AudioTrackInterface> audio_track_; | 183 rtc::scoped_refptr<AudioTrackInterface> audio_track_; |
| 237 }; | 184 }; |
| 238 | 185 |
| 239 // Test that |voice_channel_| is updated when an audio track is associated | 186 // Test that |audio_provider_| is notified when an audio track is associated |
| 240 // and disassociated with an AudioRtpSender. | 187 // and disassociated with an AudioRtpSender. |
| 241 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) { | 188 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) { |
| 242 CreateAudioRtpSender(); | 189 CreateAudioRtpSender(); |
| 243 DestroyAudioRtpSender(); | 190 DestroyAudioRtpSender(); |
| 244 } | 191 } |
| 245 | 192 |
| 246 // Test that |video_channel_| is updated when a video track is associated and | 193 // Test that |video_provider_| is notified when a video track is associated and |
| 247 // disassociated with a VideoRtpSender. | 194 // disassociated with a VideoRtpSender. |
| 248 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) { | 195 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) { |
| 249 CreateVideoRtpSender(); | 196 CreateVideoRtpSender(); |
| 250 DestroyVideoRtpSender(); | 197 DestroyVideoRtpSender(); |
| 251 } | 198 } |
| 252 | 199 |
| 253 // Test that |voice_channel_| is updated when a remote audio track is | 200 // Test that |audio_provider_| is notified when a remote audio and track is |
| 254 // associated and disassociated with an AudioRtpReceiver. | 201 // associated and disassociated with an AudioRtpReceiver. |
| 255 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) { | 202 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) { |
| 256 CreateAudioRtpReceiver(); | 203 CreateAudioRtpReceiver(); |
| 257 DestroyAudioRtpReceiver(); | 204 DestroyAudioRtpReceiver(); |
| 258 } | 205 } |
| 259 | 206 |
| 260 // Test that |video_channel_| is updated when a remote video track is | 207 // Test that |video_provider_| is notified when a remote |
| 261 // associated and disassociated with a VideoRtpReceiver. | 208 // video track is associated and disassociated with a VideoRtpReceiver. |
| 262 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) { | 209 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) { |
| 263 CreateVideoRtpReceiver(); | 210 CreateVideoRtpReceiver(); |
| 264 DestroyVideoRtpReceiver(); | 211 DestroyVideoRtpReceiver(); |
| 265 } | 212 } |
| 266 | 213 |
| 267 // Test that the AudioRtpSender applies options from the local audio source. | 214 TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) { |
| 268 TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) { | 215 CreateAudioRtpSender(); |
| 269 cricket::AudioOptions options; | |
| 270 options.echo_cancellation = rtc::Optional<bool>(true); | |
| 271 auto source = LocalAudioSource::Create( | |
| 272 PeerConnectionFactoryInterface::Options(), &options); | |
| 273 CreateAudioRtpSender(source.get()); | |
| 274 | 216 |
| 275 EXPECT_EQ(rtc::Optional<bool>(true), | 217 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)); |
| 276 voice_media_channel_->options().echo_cancellation); | 218 audio_track_->set_enabled(false); |
| 219 |
| 220 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _)); |
| 221 audio_track_->set_enabled(true); |
| 277 | 222 |
| 278 DestroyAudioRtpSender(); | 223 DestroyAudioRtpSender(); |
| 279 } | 224 } |
| 280 | 225 |
| 281 // Test that the stream is muted when the track is disabled, and unmuted when | |
| 282 // the track is enabled. | |
| 283 TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) { | |
| 284 CreateAudioRtpSender(); | |
| 285 | |
| 286 audio_track_->set_enabled(false); | |
| 287 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc)); | |
| 288 | |
| 289 audio_track_->set_enabled(true); | |
| 290 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc)); | |
| 291 | |
| 292 DestroyAudioRtpSender(); | |
| 293 } | |
| 294 | |
| 295 // Test that the volume is set to 0 when the track is disabled, and back to | |
| 296 // 1 when the track is enabled. | |
| 297 TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) { | 226 TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) { |
| 298 CreateAudioRtpReceiver(); | 227 CreateAudioRtpReceiver(); |
| 299 | 228 |
| 300 double volume; | 229 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false)); |
| 301 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | 230 audio_track_->set_enabled(false); |
| 302 EXPECT_EQ(1, volume); | |
| 303 | 231 |
| 304 audio_track_->set_enabled(false); | 232 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true)); |
| 305 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | |
| 306 EXPECT_EQ(0, volume); | |
| 307 | |
| 308 audio_track_->set_enabled(true); | 233 audio_track_->set_enabled(true); |
| 309 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | |
| 310 EXPECT_EQ(1, volume); | |
| 311 | 234 |
| 312 DestroyAudioRtpReceiver(); | 235 DestroyAudioRtpReceiver(); |
| 313 } | 236 } |
| 314 | 237 |
| 315 // Currently no action is taken when a remote video track is disabled or | |
| 316 // enabled, so there's nothing to test here, other than what is normally | |
| 317 // verified in DestroyVideoRtpSender. | |
| 318 TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) { | 238 TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) { |
| 319 CreateVideoRtpSender(); | 239 CreateVideoRtpSender(); |
| 320 | 240 |
| 241 EXPECT_CALL(video_provider_, |
| 242 SetVideoSend(kVideoSsrc, false, _, video_track_.get())); |
| 321 video_track_->set_enabled(false); | 243 video_track_->set_enabled(false); |
| 244 |
| 245 EXPECT_CALL(video_provider_, |
| 246 SetVideoSend(kVideoSsrc, true, _, video_track_.get())); |
| 322 video_track_->set_enabled(true); | 247 video_track_->set_enabled(true); |
| 323 | 248 |
| 324 DestroyVideoRtpSender(); | 249 DestroyVideoRtpSender(); |
| 325 } | 250 } |
| 326 | 251 |
| 327 // Test that the state of the video track created by the VideoRtpReceiver is | |
| 328 // updated when the receiver is destroyed. | |
| 329 TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) { | 252 TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) { |
| 330 CreateVideoRtpReceiver(); | 253 CreateVideoRtpReceiver(); |
| 331 | 254 |
| 332 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state()); | 255 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state()); |
| 333 EXPECT_EQ(webrtc::MediaSourceInterface::kLive, | 256 EXPECT_EQ(webrtc::MediaSourceInterface::kLive, |
| 334 video_track_->GetSource()->state()); | 257 video_track_->GetSource()->state()); |
| 335 | 258 |
| 336 DestroyVideoRtpReceiver(); | 259 DestroyVideoRtpReceiver(); |
| 337 | 260 |
| 338 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state()); | 261 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state()); |
| 339 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded, | 262 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded, |
| 340 video_track_->GetSource()->state()); | 263 video_track_->GetSource()->state()); |
| 341 } | 264 } |
| 342 | 265 |
| 343 // Currently no action is taken when a remote video track is disabled or | |
| 344 // enabled, so there's nothing to test here, other than what is normally | |
| 345 // verified in DestroyVideoRtpReceiver. | |
| 346 TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) { | 266 TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) { |
| 347 CreateVideoRtpReceiver(); | 267 CreateVideoRtpReceiver(); |
| 348 | 268 |
| 349 video_track_->set_enabled(false); | 269 video_track_->set_enabled(false); |
| 270 |
| 350 video_track_->set_enabled(true); | 271 video_track_->set_enabled(true); |
| 351 | 272 |
| 352 DestroyVideoRtpReceiver(); | 273 DestroyVideoRtpReceiver(); |
| 353 } | 274 } |
| 354 | 275 |
| 355 // Test that the AudioRtpReceiver applies volume changes from the track source | |
| 356 // to the media channel. | |
| 357 TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) { | 276 TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) { |
| 358 CreateAudioRtpReceiver(); | 277 CreateAudioRtpReceiver(); |
| 359 | 278 |
| 360 double volume; | 279 double volume = 0.5; |
| 361 audio_track_->GetSource()->SetVolume(0.5); | 280 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume)); |
| 362 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | 281 audio_track_->GetSource()->SetVolume(volume); |
| 363 EXPECT_EQ(0.5, volume); | |
| 364 | 282 |
| 365 // Disable the audio track, this should prevent setting the volume. | 283 // Disable the audio track, this should prevent setting the volume. |
| 284 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false)); |
| 366 audio_track_->set_enabled(false); | 285 audio_track_->set_enabled(false); |
| 367 audio_track_->GetSource()->SetVolume(0.8); | 286 audio_track_->GetSource()->SetVolume(1.0); |
| 368 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | 287 |
| 369 EXPECT_EQ(0, volume); | 288 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true)); |
| 370 | |
| 371 // When the track is enabled, the previously set volume should take effect. | |
| 372 audio_track_->set_enabled(true); | 289 audio_track_->set_enabled(true); |
| 373 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | 290 |
| 374 EXPECT_EQ(0.8, volume); | 291 double new_volume = 0.8; |
| 375 | 292 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume)); |
| 376 // Try changing volume one more time. | 293 audio_track_->GetSource()->SetVolume(new_volume); |
| 377 audio_track_->GetSource()->SetVolume(0.9); | |
| 378 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume)); | |
| 379 EXPECT_EQ(0.9, volume); | |
| 380 | 294 |
| 381 DestroyAudioRtpReceiver(); | 295 DestroyAudioRtpReceiver(); |
| 382 } | 296 } |
| 383 | 297 |
| 384 // Test that the media channel isn't enabled for sending if the audio sender | 298 // Test that provider methods aren't called without both a track and an SSRC. |
| 385 // doesn't have both a track and SSRC. | |
| 386 TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) { | 299 TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) { |
| 387 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr); | 300 rtc::scoped_refptr<AudioRtpSender> sender = |
| 388 rtc::scoped_refptr<AudioTrackInterface> track = | 301 new AudioRtpSender(&audio_provider_, nullptr); |
| 389 AudioTrack::Create(kAudioTrackId, nullptr); | 302 rtc::scoped_refptr<AudioTrackInterface> track = |
| 390 | 303 AudioTrack::Create(kAudioTrackId, nullptr); |
| 391 // Track but no SSRC. | 304 EXPECT_TRUE(sender->SetTrack(track)); |
| 392 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track)); | 305 EXPECT_TRUE(sender->SetTrack(nullptr)); |
| 393 VerifyVoiceChannelNoInput(); | 306 sender->SetSsrc(kAudioSsrc); |
| 394 | 307 sender->SetSsrc(0); |
| 395 // SSRC but no track. | 308 // Just let it get destroyed and make sure it doesn't call any methods on the |
| 396 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr)); | 309 // provider interface. |
| 397 audio_rtp_sender_->SetSsrc(kAudioSsrc); | 310 } |
| 398 VerifyVoiceChannelNoInput(); | 311 |
| 399 } | 312 // Test that provider methods aren't called without both a track and an SSRC. |
| 400 | |
| 401 // Test that the media channel isn't enabled for sending if the video sender | |
| 402 // doesn't have both a track and SSRC. | |
| 403 TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) { | 313 TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) { |
| 404 video_rtp_sender_ = new VideoRtpSender(video_channel_); | 314 rtc::scoped_refptr<VideoRtpSender> sender = |
| 405 | 315 new VideoRtpSender(&video_provider_); |
| 406 // Track but no SSRC. | 316 EXPECT_TRUE(sender->SetTrack(video_track_)); |
| 407 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_)); | 317 EXPECT_TRUE(sender->SetTrack(nullptr)); |
| 408 VerifyVideoChannelNoInput(); | 318 sender->SetSsrc(kVideoSsrc); |
| 409 | 319 sender->SetSsrc(0); |
| 410 // SSRC but no track. | 320 // Just let it get destroyed and make sure it doesn't call any methods on the |
| 411 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr)); | 321 // provider interface. |
| 412 video_rtp_sender_->SetSsrc(kVideoSsrc); | 322 } |
| 413 VerifyVideoChannelNoInput(); | 323 |
| 414 } | 324 // Test that an audio sender calls the expected methods on the provider once |
| 415 | 325 // it has a track and SSRC, when the SSRC is set first. |
| 416 // Test that the media channel is enabled for sending when the audio sender | |
| 417 // has a track and SSRC, when the SSRC is set first. | |
| 418 TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) { | 326 TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) { |
| 419 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr); | 327 rtc::scoped_refptr<AudioRtpSender> sender = |
| 420 rtc::scoped_refptr<AudioTrackInterface> track = | 328 new AudioRtpSender(&audio_provider_, nullptr); |
| 421 AudioTrack::Create(kAudioTrackId, nullptr); | 329 rtc::scoped_refptr<AudioTrackInterface> track = |
| 422 audio_rtp_sender_->SetSsrc(kAudioSsrc); | 330 AudioTrack::Create(kAudioTrackId, nullptr); |
| 423 audio_rtp_sender_->SetTrack(track); | 331 sender->SetSsrc(kAudioSsrc); |
| 424 VerifyVoiceChannelInput(); | 332 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _)); |
| 425 | 333 sender->SetTrack(track); |
| 426 DestroyAudioRtpSender(); | 334 |
| 427 } | 335 // Calls expected from destructor. |
| 428 | 336 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1); |
| 429 // Test that the media channel is enabled for sending when the audio sender | 337 } |
| 430 // has a track and SSRC, when the SSRC is set last. | 338 |
| 339 // Test that an audio sender calls the expected methods on the provider once |
| 340 // it has a track and SSRC, when the SSRC is set last. |
| 431 TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) { | 341 TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) { |
| 432 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr); | 342 rtc::scoped_refptr<AudioRtpSender> sender = |
| 433 rtc::scoped_refptr<AudioTrackInterface> track = | 343 new AudioRtpSender(&audio_provider_, nullptr); |
| 434 AudioTrack::Create(kAudioTrackId, nullptr); | 344 rtc::scoped_refptr<AudioTrackInterface> track = |
| 435 audio_rtp_sender_->SetTrack(track); | 345 AudioTrack::Create(kAudioTrackId, nullptr); |
| 436 audio_rtp_sender_->SetSsrc(kAudioSsrc); | 346 sender->SetTrack(track); |
| 437 VerifyVoiceChannelInput(); | 347 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _)); |
| 438 | 348 sender->SetSsrc(kAudioSsrc); |
| 439 DestroyAudioRtpSender(); | 349 |
| 440 } | 350 // Calls expected from destructor. |
| 441 | 351 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1); |
| 442 // Test that the media channel is enabled for sending when the video sender | 352 } |
| 443 // has a track and SSRC, when the SSRC is set first. | 353 |
| 354 // Test that a video sender calls the expected methods on the provider once |
| 355 // it has a track and SSRC, when the SSRC is set first. |
| 444 TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) { | 356 TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) { |
| 445 AddVideoTrack(); | 357 AddVideoTrack(); |
| 446 video_rtp_sender_ = new VideoRtpSender(video_channel_); | 358 rtc::scoped_refptr<VideoRtpSender> sender = |
| 447 video_rtp_sender_->SetSsrc(kVideoSsrc); | 359 new VideoRtpSender(&video_provider_); |
| 448 video_rtp_sender_->SetTrack(video_track_); | 360 sender->SetSsrc(kVideoSsrc); |
| 449 VerifyVideoChannelInput(); | 361 EXPECT_CALL(video_provider_, |
| 450 | 362 SetVideoSend(kVideoSsrc, true, _, video_track_.get())); |
| 451 DestroyVideoRtpSender(); | 363 sender->SetTrack(video_track_); |
| 452 } | 364 |
| 453 | 365 // Calls expected from destructor. |
| 454 // Test that the media channel is enabled for sending when the video sender | 366 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr)) |
| 455 // has a track and SSRC, when the SSRC is set last. | 367 .Times(1); |
| 368 } |
| 369 |
| 370 // Test that a video sender calls the expected methods on the provider once |
| 371 // it has a track and SSRC, when the SSRC is set last. |
| 456 TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) { | 372 TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) { |
| 457 AddVideoTrack(); | 373 AddVideoTrack(); |
| 458 video_rtp_sender_ = new VideoRtpSender(video_channel_); | 374 rtc::scoped_refptr<VideoRtpSender> sender = |
| 459 video_rtp_sender_->SetTrack(video_track_); | 375 new VideoRtpSender(&video_provider_); |
| 460 video_rtp_sender_->SetSsrc(kVideoSsrc); | 376 sender->SetTrack(video_track_); |
| 461 VerifyVideoChannelInput(); | 377 EXPECT_CALL(video_provider_, |
| 462 | 378 SetVideoSend(kVideoSsrc, true, _, video_track_.get())); |
| 463 DestroyVideoRtpSender(); | 379 sender->SetSsrc(kVideoSsrc); |
| 464 } | 380 |
| 465 | 381 // Calls expected from destructor. |
| 466 // Test that the media channel stops sending when the audio sender's SSRC is set | 382 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr)) |
| 467 // to 0. | 383 .Times(1); |
| 384 } |
| 385 |
| 386 // Test that the sender is disconnected from the provider when its SSRC is |
| 387 // set to 0. |
| 468 TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) { | 388 TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) { |
| 469 CreateAudioRtpSender(); | 389 rtc::scoped_refptr<AudioTrackInterface> track = |
| 470 | 390 AudioTrack::Create(kAudioTrackId, nullptr); |
| 471 audio_rtp_sender_->SetSsrc(0); | 391 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _)); |
| 472 VerifyVoiceChannelNoInput(); | 392 rtc::scoped_refptr<AudioRtpSender> sender = |
| 473 } | 393 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr); |
| 474 | 394 sender->SetSsrc(kAudioSsrc); |
| 475 // Test that the media channel stops sending when the video sender's SSRC is set | 395 |
| 476 // to 0. | 396 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1); |
| 397 sender->SetSsrc(0); |
| 398 |
| 399 // Make sure it's SetSsrc that called methods on the provider, and not the |
| 400 // destructor. |
| 401 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0); |
| 402 } |
| 403 |
| 404 // Test that the sender is disconnected from the provider when its SSRC is |
| 405 // set to 0. |
| 477 TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) { | 406 TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) { |
| 478 CreateAudioRtpSender(); | 407 AddVideoTrack(); |
| 479 | 408 EXPECT_CALL(video_provider_, |
| 480 audio_rtp_sender_->SetSsrc(0); | 409 SetVideoSend(kVideoSsrc, true, _, video_track_.get())); |
| 481 VerifyVideoChannelNoInput(); | 410 rtc::scoped_refptr<VideoRtpSender> sender = |
| 482 } | 411 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_); |
| 483 | 412 sender->SetSsrc(kVideoSsrc); |
| 484 // Test that the media channel stops sending when the audio sender's track is | 413 |
| 485 // set to null. | 414 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr)) |
| 415 .Times(1); |
| 416 sender->SetSsrc(0); |
| 417 |
| 418 // Make sure it's SetSsrc that called methods on the provider, and not the |
| 419 // destructor. |
| 420 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _, _)).Times(0); |
| 421 } |
| 422 |
| 486 TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) { | 423 TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) { |
| 487 CreateAudioRtpSender(); | 424 rtc::scoped_refptr<AudioTrackInterface> track = |
| 488 | 425 AudioTrack::Create(kAudioTrackId, nullptr); |
| 489 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr)); | 426 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _)); |
| 490 VerifyVoiceChannelNoInput(); | 427 rtc::scoped_refptr<AudioRtpSender> sender = |
| 491 } | 428 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr); |
| 492 | 429 sender->SetSsrc(kAudioSsrc); |
| 493 // Test that the media channel stops sending when the video sender's track is | 430 |
| 494 // set to null. | 431 // Expect that SetAudioSend will be called before the reference to the track |
| 432 // is released. |
| 433 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, nullptr)) |
| 434 .Times(1) |
| 435 .WillOnce(InvokeWithoutArgs([&track] { |
| 436 EXPECT_LT(2, track->AddRef()); |
| 437 track->Release(); |
| 438 })); |
| 439 EXPECT_TRUE(sender->SetTrack(nullptr)); |
| 440 |
| 441 // Make sure it's SetTrack that called methods on the provider, and not the |
| 442 // destructor. |
| 443 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0); |
| 444 } |
| 445 |
| 495 TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) { | 446 TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) { |
| 496 CreateVideoRtpSender(); | 447 rtc::scoped_refptr<VideoTrackSourceInterface> source( |
| 497 | 448 FakeVideoTrackSource::Create()); |
| 498 video_rtp_sender_->SetSsrc(0); | 449 rtc::scoped_refptr<VideoTrackInterface> track = |
| 499 VerifyVideoChannelNoInput(); | 450 VideoTrack::Create(kVideoTrackId, source); |
| 500 } | 451 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _, track.get())); |
| 501 | 452 rtc::scoped_refptr<VideoRtpSender> sender = |
| 502 // Test that when the audio sender's SSRC is changed, the media channel stops | 453 new VideoRtpSender(track, kStreamLabel1, &video_provider_); |
| 503 // sending with the old SSRC and starts sending with the new one. | 454 sender->SetSsrc(kVideoSsrc); |
| 455 |
| 456 // Expect that SetVideoSend will be called before the reference to the track |
| 457 // is released. |
| 458 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr)) |
| 459 .Times(1) |
| 460 .WillOnce(InvokeWithoutArgs([&track] { |
| 461 EXPECT_LT(2, track->AddRef()); |
| 462 track->Release(); |
| 463 })); |
| 464 EXPECT_TRUE(sender->SetTrack(nullptr)); |
| 465 |
| 466 // Make sure it's SetTrack that called methods on the provider, and not the |
| 467 // destructor. |
| 468 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _, _)).Times(0); |
| 469 } |
| 470 |
| 504 TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) { | 471 TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) { |
| 505 CreateAudioRtpSender(); | 472 AddVideoTrack(); |
| 506 | 473 rtc::scoped_refptr<AudioTrackInterface> track = |
| 507 audio_rtp_sender_->SetSsrc(kAudioSsrc2); | 474 AudioTrack::Create(kAudioTrackId, nullptr); |
| 508 VerifyVoiceChannelNoInput(kAudioSsrc); | 475 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _)); |
| 509 VerifyVoiceChannelInput(kAudioSsrc2); | 476 rtc::scoped_refptr<AudioRtpSender> sender = |
| 510 | 477 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr); |
| 511 audio_rtp_sender_ = nullptr; | 478 sender->SetSsrc(kAudioSsrc); |
| 512 VerifyVoiceChannelNoInput(kAudioSsrc2); | 479 |
| 513 } | 480 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1); |
| 514 | 481 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1); |
| 515 // Test that when the audio sender's SSRC is changed, the media channel stops | 482 sender->SetSsrc(kAudioSsrc2); |
| 516 // sending with the old SSRC and starts sending with the new one. | 483 |
| 484 // Calls expected from destructor. |
| 485 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1); |
| 486 } |
| 487 |
| 517 TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) { | 488 TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) { |
| 518 CreateVideoRtpSender(); | 489 AddVideoTrack(); |
| 519 | 490 EXPECT_CALL(video_provider_, |
| 520 video_rtp_sender_->SetSsrc(kVideoSsrc2); | 491 SetVideoSend(kVideoSsrc, true, _, video_track_.get())); |
| 521 VerifyVideoChannelNoInput(kVideoSsrc); | 492 rtc::scoped_refptr<VideoRtpSender> sender = |
| 522 VerifyVideoChannelInput(kVideoSsrc2); | 493 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_); |
| 523 | 494 sender->SetSsrc(kVideoSsrc); |
| 524 video_rtp_sender_ = nullptr; | 495 |
| 525 VerifyVideoChannelNoInput(kVideoSsrc2); | 496 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr)) |
| 497 .Times(1); |
| 498 EXPECT_CALL(video_provider_, |
| 499 SetVideoSend(kVideoSsrc2, true, _, video_track_.get())) |
| 500 .Times(1); |
| 501 sender->SetSsrc(kVideoSsrc2); |
| 502 |
| 503 // Calls expected from destructor. |
| 504 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _, nullptr)) |
| 505 .Times(1); |
| 526 } | 506 } |
| 527 | 507 |
| 528 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) { | 508 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) { |
| 529 CreateAudioRtpSender(); | 509 CreateAudioRtpSender(); |
| 530 | 510 |
| 511 EXPECT_CALL(audio_provider_, GetAudioRtpSendParameters(kAudioSsrc)) |
| 512 .WillOnce(Return(RtpParameters())); |
| 513 EXPECT_CALL(audio_provider_, SetAudioRtpSendParameters(kAudioSsrc, _)) |
| 514 .WillOnce(Return(true)); |
| 531 RtpParameters params = audio_rtp_sender_->GetParameters(); | 515 RtpParameters params = audio_rtp_sender_->GetParameters(); |
| 532 EXPECT_EQ(1u, params.encodings.size()); | |
| 533 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params)); | 516 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params)); |
| 534 | 517 |
| 535 DestroyAudioRtpSender(); | 518 DestroyAudioRtpSender(); |
| 536 } | 519 } |
| 537 | |
| 538 TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) { | |
| 539 CreateAudioRtpSender(); | |
| 540 | |
| 541 EXPECT_EQ(-1, voice_media_channel_->max_bps()); | |
| 542 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters(); | |
| 543 EXPECT_EQ(1, params.encodings.size()); | |
| 544 EXPECT_EQ(-1, params.encodings[0].max_bitrate_bps); | |
| 545 params.encodings[0].max_bitrate_bps = 1000; | |
| 546 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params)); | |
| 547 | |
| 548 // Read back the parameters and verify they have been changed. | |
| 549 params = audio_rtp_sender_->GetParameters(); | |
| 550 EXPECT_EQ(1, params.encodings.size()); | |
| 551 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps); | |
| 552 | |
| 553 // Verify that the audio channel received the new parameters. | |
| 554 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc); | |
| 555 EXPECT_EQ(1, params.encodings.size()); | |
| 556 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps); | |
| 557 | |
| 558 // Verify that the global bitrate limit has not been changed. | |
| 559 EXPECT_EQ(-1, voice_media_channel_->max_bps()); | |
| 560 | |
| 561 DestroyAudioRtpSender(); | |
| 562 } | |
| 563 | 520 |
| 564 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) { | 521 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) { |
| 565 CreateVideoRtpSender(); | 522 CreateVideoRtpSender(); |
| 566 | 523 |
| 524 EXPECT_CALL(video_provider_, GetVideoRtpSendParameters(kVideoSsrc)) |
| 525 .WillOnce(Return(RtpParameters())); |
| 526 EXPECT_CALL(video_provider_, SetVideoRtpSendParameters(kVideoSsrc, _)) |
| 527 .WillOnce(Return(true)); |
| 567 RtpParameters params = video_rtp_sender_->GetParameters(); | 528 RtpParameters params = video_rtp_sender_->GetParameters(); |
| 568 EXPECT_EQ(1u, params.encodings.size()); | |
| 569 EXPECT_TRUE(video_rtp_sender_->SetParameters(params)); | 529 EXPECT_TRUE(video_rtp_sender_->SetParameters(params)); |
| 570 | 530 |
| 571 DestroyVideoRtpSender(); | 531 DestroyVideoRtpSender(); |
| 572 } | 532 } |
| 573 | |
| 574 TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) { | |
| 575 CreateVideoRtpSender(); | |
| 576 | |
| 577 EXPECT_EQ(-1, video_media_channel_->max_bps()); | |
| 578 webrtc::RtpParameters params = video_rtp_sender_->GetParameters(); | |
| 579 EXPECT_EQ(1, params.encodings.size()); | |
| 580 EXPECT_EQ(-1, params.encodings[0].max_bitrate_bps); | |
| 581 params.encodings[0].max_bitrate_bps = 1000; | |
| 582 EXPECT_TRUE(video_rtp_sender_->SetParameters(params)); | |
| 583 | |
| 584 // Read back the parameters and verify they have been changed. | |
| 585 params = video_rtp_sender_->GetParameters(); | |
| 586 EXPECT_EQ(1, params.encodings.size()); | |
| 587 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps); | |
| 588 | |
| 589 // Verify that the video channel received the new parameters. | |
| 590 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc); | |
| 591 EXPECT_EQ(1, params.encodings.size()); | |
| 592 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps); | |
| 593 | |
| 594 // Verify that the global bitrate limit has not been changed. | |
| 595 EXPECT_EQ(-1, video_media_channel_->max_bps()); | |
| 596 | |
| 597 DestroyVideoRtpSender(); | |
| 598 } | |
| 599 | 533 |
| 600 TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) { | 534 TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) { |
| 601 CreateAudioRtpReceiver(); | 535 CreateAudioRtpReceiver(); |
| 602 | 536 |
| 537 EXPECT_CALL(audio_provider_, GetAudioRtpReceiveParameters(kAudioSsrc)) |
| 538 .WillOnce(Return(RtpParameters())); |
| 539 EXPECT_CALL(audio_provider_, SetAudioRtpReceiveParameters(kAudioSsrc, _)) |
| 540 .WillOnce(Return(true)); |
| 603 RtpParameters params = audio_rtp_receiver_->GetParameters(); | 541 RtpParameters params = audio_rtp_receiver_->GetParameters(); |
| 604 EXPECT_EQ(1u, params.encodings.size()); | |
| 605 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params)); | 542 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params)); |
| 606 | 543 |
| 607 DestroyAudioRtpReceiver(); | 544 DestroyAudioRtpReceiver(); |
| 608 } | 545 } |
| 609 | 546 |
| 610 TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) { | 547 TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) { |
| 611 CreateVideoRtpReceiver(); | 548 CreateVideoRtpReceiver(); |
| 612 | 549 |
| 550 EXPECT_CALL(video_provider_, GetVideoRtpReceiveParameters(kVideoSsrc)) |
| 551 .WillOnce(Return(RtpParameters())); |
| 552 EXPECT_CALL(video_provider_, SetVideoRtpReceiveParameters(kVideoSsrc, _)) |
| 553 .WillOnce(Return(true)); |
| 613 RtpParameters params = video_rtp_receiver_->GetParameters(); | 554 RtpParameters params = video_rtp_receiver_->GetParameters(); |
| 614 EXPECT_EQ(1u, params.encodings.size()); | |
| 615 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params)); | 555 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params)); |
| 616 | 556 |
| 617 DestroyVideoRtpReceiver(); | 557 DestroyVideoRtpReceiver(); |
| 618 } | 558 } |
| 619 | 559 |
| 620 } // namespace webrtc | 560 } // namespace webrtc |
| OLD | NEW |