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 |