blob: a79b2976b6cf76f4d68464110c657c2cba4d8886 [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 16:53:55 -07009 */
10
kwibergd1fe2812016-04-27 06:47:29 -070011#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070012#include <string>
Tommif888bb52015-12-12 01:37:01 +010013#include <utility>
deadbeef70ab1a12015-09-28 16:53:55 -070014
Henrik Kjellander15583c12016-02-10 10:53:12 +010015#include "webrtc/api/audiotrack.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070016#include "webrtc/api/fakemediacontroller.h"
17#include "webrtc/api/localaudiosource.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010018#include "webrtc/api/mediastream.h"
19#include "webrtc/api/remoteaudiosource.h"
20#include "webrtc/api/rtpreceiver.h"
21#include "webrtc/api/rtpsender.h"
22#include "webrtc/api/streamcollection.h"
nisseaf510af2016-03-21 08:20:42 -070023#include "webrtc/api/test/fakevideotracksource.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010024#include "webrtc/api/videotrack.h"
kwibergac9f8762016-09-30 22:29:43 -070025#include "webrtc/api/videotracksource.h"
deadbeef70ab1a12015-09-28 16:53:55 -070026#include "webrtc/base/gunit.h"
skvlad11a9cbf2016-10-07 11:53:05 -070027#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070028#include "webrtc/media/base/fakemediaengine.h"
kwibergac9f8762016-09-30 22:29:43 -070029#include "webrtc/media/base/mediachannel.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070030#include "webrtc/media/engine/fakewebrtccall.h"
31#include "webrtc/p2p/base/faketransportcontroller.h"
32#include "webrtc/pc/channelmanager.h"
kwibergac9f8762016-09-30 22:29:43 -070033#include "webrtc/test/gmock.h"
34#include "webrtc/test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070035
36using ::testing::_;
37using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070038using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070039using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070040
41static const char kStreamLabel1[] = "local_stream_1";
42static const char kVideoTrackId[] = "video_1";
43static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020044static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080045static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020046static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080047static const uint32_t kAudioSsrc2 = 101;
deadbeef70ab1a12015-09-28 16:53:55 -070048
49namespace webrtc {
50
tkchin3784b4a2016-06-24 19:31:47 -070051class RtpSenderReceiverTest : public testing::Test {
52 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070053 RtpSenderReceiverTest()
54 : // Create fake media engine/etc. so we can create channels to use to
55 // test RtpSenders/RtpReceivers.
56 media_engine_(new cricket::FakeMediaEngine()),
57 channel_manager_(media_engine_,
58 rtc::Thread::Current(),
59 rtc::Thread::Current()),
skvlad11a9cbf2016-10-07 11:53:05 -070060 fake_call_(Call::Config(&event_log_)),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070061 fake_media_controller_(&channel_manager_, &fake_call_),
62 stream_(MediaStream::Create(kStreamLabel1)) {
63 // Create channels to be used by the RtpSenders and RtpReceivers.
64 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080065 bool rtcp_enabled = false;
66 bool srtp_required = true;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070067 voice_channel_ = channel_manager_.CreateVoiceChannel(
68 &fake_media_controller_, &fake_transport_controller_, cricket::CN_AUDIO,
deadbeef7af91dd2016-12-13 11:29:11 -080069 nullptr, rtcp_enabled, srtp_required, cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070070 video_channel_ = channel_manager_.CreateVideoChannel(
71 &fake_media_controller_, &fake_transport_controller_, cricket::CN_VIDEO,
deadbeef7af91dd2016-12-13 11:29:11 -080072 nullptr, rtcp_enabled, srtp_required, cricket::VideoOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070073 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
74 video_media_channel_ = media_engine_->GetVideoChannel(0);
75 RTC_CHECK(voice_channel_);
76 RTC_CHECK(video_channel_);
77 RTC_CHECK(voice_media_channel_);
78 RTC_CHECK(video_media_channel_);
79
80 // Create streams for predefined SSRCs. Streams need to exist in order
81 // for the senders and receievers to apply parameters to them.
82 // Normally these would be created by SetLocalDescription and
83 // SetRemoteDescription.
84 voice_media_channel_->AddSendStream(
85 cricket::StreamParams::CreateLegacy(kAudioSsrc));
86 voice_media_channel_->AddRecvStream(
87 cricket::StreamParams::CreateLegacy(kAudioSsrc));
88 voice_media_channel_->AddSendStream(
89 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
90 voice_media_channel_->AddRecvStream(
91 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
92 video_media_channel_->AddSendStream(
93 cricket::StreamParams::CreateLegacy(kVideoSsrc));
94 video_media_channel_->AddRecvStream(
95 cricket::StreamParams::CreateLegacy(kVideoSsrc));
96 video_media_channel_->AddSendStream(
97 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
98 video_media_channel_->AddRecvStream(
99 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700100 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700101
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700102 void TearDown() override { channel_manager_.Terminate(); }
103
pbos5214a0a2016-12-16 15:39:11 -0800104 void AddVideoTrack() { AddVideoTrack(false); }
105
106 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100107 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800108 FakeVideoTrackSource::Create(is_screencast));
deadbeef70ab1a12015-09-28 16:53:55 -0700109 video_track_ = VideoTrack::Create(kVideoTrackId, source);
110 EXPECT_TRUE(stream_->AddTrack(video_track_));
111 }
112
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700113 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
114
115 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) {
116 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeef70ab1a12015-09-28 16:53:55 -0700117 EXPECT_TRUE(stream_->AddTrack(audio_track_));
deadbeeffac06552015-11-25 11:26:01 -0800118 audio_rtp_sender_ =
119 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700120 voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800121 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700122 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700123 }
124
pbos5214a0a2016-12-16 15:39:11 -0800125 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
126
127 void CreateVideoRtpSender(bool is_screencast) {
128 AddVideoTrack(is_screencast);
deadbeef70ab1a12015-09-28 16:53:55 -0700129 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700130 stream_->label(), video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800131 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700132 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700133 }
134
135 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700136 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700137 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700138 }
139
140 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700141 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700142 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700143 }
144
145 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800146 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100147 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700148 EXPECT_TRUE(stream_->AddTrack(audio_track_));
perkjd61bf802016-03-24 03:16:19 -0700149 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700150 kAudioSsrc, voice_channel_);
perkjd61bf802016-03-24 03:16:19 -0700151 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700152 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700153 }
154
155 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100156 video_rtp_receiver_ =
157 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700158 kVideoSsrc, video_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100159 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700160 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700161 }
162
163 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700164 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700165 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700166 }
167
168 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700169 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700170 VerifyVideoChannelNoOutput();
171 }
172
173 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
174
175 void VerifyVoiceChannelInput(uint32_t ssrc) {
176 // Verify that the media channel has an audio source, and the stream isn't
177 // muted.
178 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
179 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
180 }
181
182 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
183
184 void VerifyVideoChannelInput(uint32_t ssrc) {
185 // Verify that the media channel has a video source,
186 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
187 }
188
189 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
190
191 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
192 // Verify that the media channel's source is reset.
193 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
194 }
195
196 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
197
198 void VerifyVideoChannelNoInput(uint32_t ssrc) {
199 // Verify that the media channel's source is reset.
200 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
201 }
202
203 void VerifyVoiceChannelOutput() {
204 // Verify that the volume is initialized to 1.
205 double volume;
206 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
207 EXPECT_EQ(1, volume);
208 }
209
210 void VerifyVideoChannelOutput() {
211 // Verify that the media channel has a sink.
212 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
213 }
214
215 void VerifyVoiceChannelNoOutput() {
216 // Verify that the volume is reset to 0.
217 double volume;
218 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
219 EXPECT_EQ(0, volume);
220 }
221
222 void VerifyVideoChannelNoOutput() {
223 // Verify that the media channel's sink is reset.
224 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700225 }
226
227 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700228 webrtc::RtcEventLogNullImpl event_log_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700229 cricket::FakeMediaEngine* media_engine_;
230 cricket::FakeTransportController fake_transport_controller_;
231 cricket::ChannelManager channel_manager_;
232 cricket::FakeCall fake_call_;
233 cricket::FakeMediaController fake_media_controller_;
234 cricket::VoiceChannel* voice_channel_;
235 cricket::VideoChannel* video_channel_;
236 cricket::FakeVoiceMediaChannel* voice_media_channel_;
237 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700238 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
239 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
240 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
241 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
242 rtc::scoped_refptr<MediaStreamInterface> stream_;
243 rtc::scoped_refptr<VideoTrackInterface> video_track_;
244 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
245};
246
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700247// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700248// and disassociated with an AudioRtpSender.
249TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
250 CreateAudioRtpSender();
251 DestroyAudioRtpSender();
252}
253
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700254// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700255// disassociated with a VideoRtpSender.
256TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
257 CreateVideoRtpSender();
258 DestroyVideoRtpSender();
259}
260
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700261// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700262// associated and disassociated with an AudioRtpReceiver.
263TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
264 CreateAudioRtpReceiver();
265 DestroyAudioRtpReceiver();
266}
267
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700268// Test that |video_channel_| is updated when a remote video track is
269// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700270TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
271 CreateVideoRtpReceiver();
272 DestroyVideoRtpReceiver();
273}
274
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700275// Test that the AudioRtpSender applies options from the local audio source.
276TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
277 cricket::AudioOptions options;
278 options.echo_cancellation = rtc::Optional<bool>(true);
279 auto source = LocalAudioSource::Create(
280 PeerConnectionFactoryInterface::Options(), &options);
281 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700282
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700283 EXPECT_EQ(rtc::Optional<bool>(true),
284 voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700285
286 DestroyAudioRtpSender();
287}
288
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700289// Test that the stream is muted when the track is disabled, and unmuted when
290// the track is enabled.
291TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
292 CreateAudioRtpSender();
293
294 audio_track_->set_enabled(false);
295 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
296
297 audio_track_->set_enabled(true);
298 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
299
300 DestroyAudioRtpSender();
301}
302
303// Test that the volume is set to 0 when the track is disabled, and back to
304// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700305TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
306 CreateAudioRtpReceiver();
307
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700308 double volume;
309 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
310 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700311
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700312 audio_track_->set_enabled(false);
313 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
314 EXPECT_EQ(0, volume);
315
deadbeef70ab1a12015-09-28 16:53:55 -0700316 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700317 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
318 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700319
320 DestroyAudioRtpReceiver();
321}
322
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700323// Currently no action is taken when a remote video track is disabled or
324// enabled, so there's nothing to test here, other than what is normally
325// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700326TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
327 CreateVideoRtpSender();
328
deadbeef70ab1a12015-09-28 16:53:55 -0700329 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700330 video_track_->set_enabled(true);
331
332 DestroyVideoRtpSender();
333}
334
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700335// Test that the state of the video track created by the VideoRtpReceiver is
336// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100337TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
338 CreateVideoRtpReceiver();
339
340 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
341 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
342 video_track_->GetSource()->state());
343
344 DestroyVideoRtpReceiver();
345
346 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
347 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
348 video_track_->GetSource()->state());
349}
350
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700351// Currently no action is taken when a remote video track is disabled or
352// enabled, so there's nothing to test here, other than what is normally
353// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700354TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
355 CreateVideoRtpReceiver();
356
357 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700358 video_track_->set_enabled(true);
359
360 DestroyVideoRtpReceiver();
361}
362
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700363// Test that the AudioRtpReceiver applies volume changes from the track source
364// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700365TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
366 CreateAudioRtpReceiver();
367
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700368 double volume;
369 audio_track_->GetSource()->SetVolume(0.5);
370 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
371 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700372
373 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700374 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700375 audio_track_->GetSource()->SetVolume(0.8);
376 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
377 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700378
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700379 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700380 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700381 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
382 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700383
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700384 // Try changing volume one more time.
385 audio_track_->GetSource()->SetVolume(0.9);
386 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
387 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700388
389 DestroyAudioRtpReceiver();
390}
391
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700392// Test that the media channel isn't enabled for sending if the audio sender
393// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800394TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700395 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800396 rtc::scoped_refptr<AudioTrackInterface> track =
397 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700398
399 // Track but no SSRC.
400 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
401 VerifyVoiceChannelNoInput();
402
403 // SSRC but no track.
404 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
405 audio_rtp_sender_->SetSsrc(kAudioSsrc);
406 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800407}
408
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700409// Test that the media channel isn't enabled for sending if the video sender
410// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800411TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700412 video_rtp_sender_ = new VideoRtpSender(video_channel_);
413
414 // Track but no SSRC.
415 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
416 VerifyVideoChannelNoInput();
417
418 // SSRC but no track.
419 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
420 video_rtp_sender_->SetSsrc(kVideoSsrc);
421 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800422}
423
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700424// Test that the media channel is enabled for sending when the audio sender
425// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800426TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700427 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800428 rtc::scoped_refptr<AudioTrackInterface> track =
429 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700430 audio_rtp_sender_->SetSsrc(kAudioSsrc);
431 audio_rtp_sender_->SetTrack(track);
432 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800433
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700434 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800435}
436
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700437// Test that the media channel is enabled for sending when the audio sender
438// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800439TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700440 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800441 rtc::scoped_refptr<AudioTrackInterface> track =
442 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700443 audio_rtp_sender_->SetTrack(track);
444 audio_rtp_sender_->SetSsrc(kAudioSsrc);
445 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800446
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700447 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800448}
449
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700450// Test that the media channel is enabled for sending when the video sender
451// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800452TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700453 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700454 video_rtp_sender_ = new VideoRtpSender(video_channel_);
455 video_rtp_sender_->SetSsrc(kVideoSsrc);
456 video_rtp_sender_->SetTrack(video_track_);
457 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800458
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700459 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800460}
461
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700462// Test that the media channel is enabled for sending when the video sender
463// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800464TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700465 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700466 video_rtp_sender_ = new VideoRtpSender(video_channel_);
467 video_rtp_sender_->SetTrack(video_track_);
468 video_rtp_sender_->SetSsrc(kVideoSsrc);
469 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800470
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700471 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800472}
473
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700474// Test that the media channel stops sending when the audio sender's SSRC is set
475// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800476TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700477 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800478
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700479 audio_rtp_sender_->SetSsrc(0);
480 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800481}
482
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700483// Test that the media channel stops sending when the video sender's SSRC is set
484// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800485TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700486 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800487
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700488 audio_rtp_sender_->SetSsrc(0);
489 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800490}
491
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700492// Test that the media channel stops sending when the audio sender's track is
493// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800494TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700495 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800496
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
498 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800499}
500
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700501// Test that the media channel stops sending when the video sender's track is
502// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800503TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700504 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800505
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506 video_rtp_sender_->SetSsrc(0);
507 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800508}
509
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510// Test that when the audio sender's SSRC is changed, the media channel stops
511// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800512TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800514
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
516 VerifyVoiceChannelNoInput(kAudioSsrc);
517 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800518
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700519 audio_rtp_sender_ = nullptr;
520 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800521}
522
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700523// Test that when the audio sender's SSRC is changed, the media channel stops
524// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800525TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700526 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800527
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528 video_rtp_sender_->SetSsrc(kVideoSsrc2);
529 VerifyVideoChannelNoInput(kVideoSsrc);
530 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800531
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532 video_rtp_sender_ = nullptr;
533 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800534}
535
skvladdc1c62c2016-03-16 19:07:43 -0700536TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
537 CreateAudioRtpSender();
538
skvladdc1c62c2016-03-16 19:07:43 -0700539 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700541 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
542
543 DestroyAudioRtpSender();
544}
545
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
547 CreateAudioRtpSender();
548
549 EXPECT_EQ(-1, voice_media_channel_->max_bps());
550 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
551 EXPECT_EQ(1, params.encodings.size());
552 EXPECT_EQ(-1, params.encodings[0].max_bitrate_bps);
553 params.encodings[0].max_bitrate_bps = 1000;
554 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
555
556 // Read back the parameters and verify they have been changed.
557 params = audio_rtp_sender_->GetParameters();
558 EXPECT_EQ(1, params.encodings.size());
559 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
560
561 // Verify that the audio channel received the new parameters.
562 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
563 EXPECT_EQ(1, params.encodings.size());
564 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
565
566 // Verify that the global bitrate limit has not been changed.
567 EXPECT_EQ(-1, voice_media_channel_->max_bps());
568
569 DestroyAudioRtpSender();
570}
571
skvladdc1c62c2016-03-16 19:07:43 -0700572TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
573 CreateVideoRtpSender();
574
skvladdc1c62c2016-03-16 19:07:43 -0700575 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700576 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700577 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
578
579 DestroyVideoRtpSender();
580}
581
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700582TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
583 CreateVideoRtpSender();
584
585 EXPECT_EQ(-1, video_media_channel_->max_bps());
586 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
587 EXPECT_EQ(1, params.encodings.size());
588 EXPECT_EQ(-1, params.encodings[0].max_bitrate_bps);
589 params.encodings[0].max_bitrate_bps = 1000;
590 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
591
592 // Read back the parameters and verify they have been changed.
593 params = video_rtp_sender_->GetParameters();
594 EXPECT_EQ(1, params.encodings.size());
595 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
596
597 // Verify that the video channel received the new parameters.
598 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
599 EXPECT_EQ(1, params.encodings.size());
600 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
601
602 // Verify that the global bitrate limit has not been changed.
603 EXPECT_EQ(-1, video_media_channel_->max_bps());
604
605 DestroyVideoRtpSender();
606}
607
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700608TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
609 CreateAudioRtpReceiver();
610
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700611 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700612 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700613 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
614
615 DestroyAudioRtpReceiver();
616}
617
618TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
619 CreateVideoRtpReceiver();
620
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700621 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700622 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700623 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
624
625 DestroyVideoRtpReceiver();
626}
627
pbos5214a0a2016-12-16 15:39:11 -0800628// Test that makes sure that a video track content hint translates to the proper
629// value for sources that are not screencast.
630TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
631 CreateVideoRtpSender();
632
633 video_track_->set_enabled(true);
634
635 // |video_track_| is not screencast by default.
636 EXPECT_EQ(rtc::Optional<bool>(false),
637 video_media_channel_->options().is_screencast);
638 // No content hint should be set by default.
639 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
640 video_track_->content_hint());
641 // Setting detailed should turn a non-screencast source into screencast mode.
642 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
643 EXPECT_EQ(rtc::Optional<bool>(true),
644 video_media_channel_->options().is_screencast);
645 // Removing the content hint should turn the track back into non-screencast
646 // mode.
647 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
648 EXPECT_EQ(rtc::Optional<bool>(false),
649 video_media_channel_->options().is_screencast);
650 // Setting fluid should remain in non-screencast mode (its default).
651 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
652 EXPECT_EQ(rtc::Optional<bool>(false),
653 video_media_channel_->options().is_screencast);
654
655 DestroyVideoRtpSender();
656}
657
658// Test that makes sure that a video track content hint translates to the proper
659// value for screencast sources.
660TEST_F(RtpSenderReceiverTest,
661 PropagatesVideoTrackContentHintForScreencastSource) {
662 CreateVideoRtpSender(true);
663
664 video_track_->set_enabled(true);
665
666 // |video_track_| with a screencast source should be screencast by default.
667 EXPECT_EQ(rtc::Optional<bool>(true),
668 video_media_channel_->options().is_screencast);
669 // No content hint should be set by default.
670 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
671 video_track_->content_hint());
672 // Setting fluid should turn a screencast source into non-screencast mode.
673 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
674 EXPECT_EQ(rtc::Optional<bool>(false),
675 video_media_channel_->options().is_screencast);
676 // Removing the content hint should turn the track back into screencast mode.
677 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
678 EXPECT_EQ(rtc::Optional<bool>(true),
679 video_media_channel_->options().is_screencast);
680 // Setting detailed should still remain in screencast mode (its default).
681 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
682 EXPECT_EQ(rtc::Optional<bool>(true),
683 video_media_channel_->options().is_screencast);
684
685 DestroyVideoRtpSender();
686}
687
688// Test that makes sure any content hints that are set on a track before
689// VideoRtpSender is ready to send are still applied when it gets ready to send.
690TEST_F(RtpSenderReceiverTest,
691 PropagatesVideoTrackContentHintSetBeforeEnabling) {
692 AddVideoTrack();
693 // Setting detailed overrides the default non-screencast mode. This should be
694 // applied even if the track is set on construction.
695 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
696 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
697 stream_->label(), video_channel_);
698 video_track_->set_enabled(true);
699
700 // Sender is not ready to send (no SSRC) so no option should have been set.
701 EXPECT_EQ(rtc::Optional<bool>(),
702 video_media_channel_->options().is_screencast);
703
704 // Verify that the content hint is accounted for when video_rtp_sender_ does
705 // get enabled.
706 video_rtp_sender_->SetSsrc(kVideoSsrc);
707 EXPECT_EQ(rtc::Optional<bool>(true),
708 video_media_channel_->options().is_screencast);
709
710 // And removing the hint should go back to false (to verify that false was
711 // default correctly).
712 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
713 EXPECT_EQ(rtc::Optional<bool>(false),
714 video_media_channel_->options().is_screencast);
715
716 DestroyVideoRtpSender();
717}
718
deadbeef70ab1a12015-09-28 16:53:55 -0700719} // namespace webrtc