blob: b6c51841bdd829c707d782e70882ea4b5fba2af3 [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;
zhihuangf5b251b2017-01-12 19:37:48 -080067 cricket::TransportChannel* rtp_transport =
68 fake_transport_controller_.CreateTransportChannel(
69 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070070 voice_channel_ = channel_manager_.CreateVoiceChannel(
zhihuangf5b251b2017-01-12 19:37:48 -080071 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
72 cricket::CN_AUDIO, nullptr, rtcp_enabled, srtp_required,
73 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070074 video_channel_ = channel_manager_.CreateVideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -080075 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
76 cricket::CN_VIDEO, nullptr, rtcp_enabled, srtp_required,
77 cricket::VideoOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070078 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
79 video_media_channel_ = media_engine_->GetVideoChannel(0);
80 RTC_CHECK(voice_channel_);
81 RTC_CHECK(video_channel_);
82 RTC_CHECK(voice_media_channel_);
83 RTC_CHECK(video_media_channel_);
84
85 // Create streams for predefined SSRCs. Streams need to exist in order
86 // for the senders and receievers to apply parameters to them.
87 // Normally these would be created by SetLocalDescription and
88 // SetRemoteDescription.
89 voice_media_channel_->AddSendStream(
90 cricket::StreamParams::CreateLegacy(kAudioSsrc));
91 voice_media_channel_->AddRecvStream(
92 cricket::StreamParams::CreateLegacy(kAudioSsrc));
93 voice_media_channel_->AddSendStream(
94 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
95 voice_media_channel_->AddRecvStream(
96 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
97 video_media_channel_->AddSendStream(
98 cricket::StreamParams::CreateLegacy(kVideoSsrc));
99 video_media_channel_->AddRecvStream(
100 cricket::StreamParams::CreateLegacy(kVideoSsrc));
101 video_media_channel_->AddSendStream(
102 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
103 video_media_channel_->AddRecvStream(
104 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700105 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700106
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700107 void TearDown() override { channel_manager_.Terminate(); }
108
pbos5214a0a2016-12-16 15:39:11 -0800109 void AddVideoTrack() { AddVideoTrack(false); }
110
111 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100112 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800113 FakeVideoTrackSource::Create(is_screencast));
deadbeef70ab1a12015-09-28 16:53:55 -0700114 video_track_ = VideoTrack::Create(kVideoTrackId, source);
115 EXPECT_TRUE(stream_->AddTrack(video_track_));
116 }
117
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700118 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
119
120 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) {
121 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeef70ab1a12015-09-28 16:53:55 -0700122 EXPECT_TRUE(stream_->AddTrack(audio_track_));
deadbeeffac06552015-11-25 11:26:01 -0800123 audio_rtp_sender_ =
124 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700125 voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800126 audio_rtp_sender_->SetSsrc(kAudioSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700127 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700128 }
129
pbos5214a0a2016-12-16 15:39:11 -0800130 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
131
132 void CreateVideoRtpSender(bool is_screencast) {
133 AddVideoTrack(is_screencast);
deadbeef70ab1a12015-09-28 16:53:55 -0700134 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135 stream_->label(), video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800136 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700137 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700138 }
139
140 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700141 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700142 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700143 }
144
145 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700146 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700147 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700148 }
149
150 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800151 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100152 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700153 EXPECT_TRUE(stream_->AddTrack(audio_track_));
perkjd61bf802016-03-24 03:16:19 -0700154 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700155 kAudioSsrc, voice_channel_);
perkjd61bf802016-03-24 03:16:19 -0700156 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700157 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700158 }
159
160 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100161 video_rtp_receiver_ =
162 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700163 kVideoSsrc, video_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100164 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700165 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700166 }
167
168 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700169 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700170 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700171 }
172
173 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700174 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700175 VerifyVideoChannelNoOutput();
176 }
177
178 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
179
180 void VerifyVoiceChannelInput(uint32_t ssrc) {
181 // Verify that the media channel has an audio source, and the stream isn't
182 // muted.
183 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
184 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
185 }
186
187 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
188
189 void VerifyVideoChannelInput(uint32_t ssrc) {
190 // Verify that the media channel has a video source,
191 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
192 }
193
194 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
195
196 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
197 // Verify that the media channel's source is reset.
198 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
199 }
200
201 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
202
203 void VerifyVideoChannelNoInput(uint32_t ssrc) {
204 // Verify that the media channel's source is reset.
205 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
206 }
207
208 void VerifyVoiceChannelOutput() {
209 // Verify that the volume is initialized to 1.
210 double volume;
211 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
212 EXPECT_EQ(1, volume);
213 }
214
215 void VerifyVideoChannelOutput() {
216 // Verify that the media channel has a sink.
217 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
218 }
219
220 void VerifyVoiceChannelNoOutput() {
221 // Verify that the volume is reset to 0.
222 double volume;
223 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
224 EXPECT_EQ(0, volume);
225 }
226
227 void VerifyVideoChannelNoOutput() {
228 // Verify that the media channel's sink is reset.
229 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700230 }
231
232 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700233 webrtc::RtcEventLogNullImpl event_log_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700234 cricket::FakeMediaEngine* media_engine_;
235 cricket::FakeTransportController fake_transport_controller_;
236 cricket::ChannelManager channel_manager_;
237 cricket::FakeCall fake_call_;
238 cricket::FakeMediaController fake_media_controller_;
239 cricket::VoiceChannel* voice_channel_;
240 cricket::VideoChannel* video_channel_;
241 cricket::FakeVoiceMediaChannel* voice_media_channel_;
242 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700243 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
244 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
245 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
246 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
247 rtc::scoped_refptr<MediaStreamInterface> stream_;
248 rtc::scoped_refptr<VideoTrackInterface> video_track_;
249 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
250};
251
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700252// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700253// and disassociated with an AudioRtpSender.
254TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
255 CreateAudioRtpSender();
256 DestroyAudioRtpSender();
257}
258
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700259// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700260// disassociated with a VideoRtpSender.
261TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
262 CreateVideoRtpSender();
263 DestroyVideoRtpSender();
264}
265
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700266// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700267// associated and disassociated with an AudioRtpReceiver.
268TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
269 CreateAudioRtpReceiver();
270 DestroyAudioRtpReceiver();
271}
272
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700273// Test that |video_channel_| is updated when a remote video track is
274// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700275TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
276 CreateVideoRtpReceiver();
277 DestroyVideoRtpReceiver();
278}
279
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700280// Test that the AudioRtpSender applies options from the local audio source.
281TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
282 cricket::AudioOptions options;
283 options.echo_cancellation = rtc::Optional<bool>(true);
284 auto source = LocalAudioSource::Create(
285 PeerConnectionFactoryInterface::Options(), &options);
286 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700287
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700288 EXPECT_EQ(rtc::Optional<bool>(true),
289 voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700290
291 DestroyAudioRtpSender();
292}
293
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700294// Test that the stream is muted when the track is disabled, and unmuted when
295// the track is enabled.
296TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
297 CreateAudioRtpSender();
298
299 audio_track_->set_enabled(false);
300 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
301
302 audio_track_->set_enabled(true);
303 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
304
305 DestroyAudioRtpSender();
306}
307
308// Test that the volume is set to 0 when the track is disabled, and back to
309// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700310TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
311 CreateAudioRtpReceiver();
312
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700313 double volume;
314 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
315 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700316
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700317 audio_track_->set_enabled(false);
318 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
319 EXPECT_EQ(0, volume);
320
deadbeef70ab1a12015-09-28 16:53:55 -0700321 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700322 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
323 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700324
325 DestroyAudioRtpReceiver();
326}
327
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700328// Currently no action is taken when a remote video track is disabled or
329// enabled, so there's nothing to test here, other than what is normally
330// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700331TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
332 CreateVideoRtpSender();
333
deadbeef70ab1a12015-09-28 16:53:55 -0700334 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700335 video_track_->set_enabled(true);
336
337 DestroyVideoRtpSender();
338}
339
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700340// Test that the state of the video track created by the VideoRtpReceiver is
341// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100342TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
343 CreateVideoRtpReceiver();
344
345 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
346 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
347 video_track_->GetSource()->state());
348
349 DestroyVideoRtpReceiver();
350
351 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
352 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
353 video_track_->GetSource()->state());
354}
355
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700356// Currently no action is taken when a remote video track is disabled or
357// enabled, so there's nothing to test here, other than what is normally
358// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700359TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
360 CreateVideoRtpReceiver();
361
362 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700363 video_track_->set_enabled(true);
364
365 DestroyVideoRtpReceiver();
366}
367
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700368// Test that the AudioRtpReceiver applies volume changes from the track source
369// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700370TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
371 CreateAudioRtpReceiver();
372
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700373 double volume;
374 audio_track_->GetSource()->SetVolume(0.5);
375 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
376 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700377
378 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700379 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700380 audio_track_->GetSource()->SetVolume(0.8);
381 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
382 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700383
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700384 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700385 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700386 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
387 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700388
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700389 // Try changing volume one more time.
390 audio_track_->GetSource()->SetVolume(0.9);
391 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
392 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700393
394 DestroyAudioRtpReceiver();
395}
396
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700397// Test that the media channel isn't enabled for sending if the audio sender
398// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800399TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700400 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800401 rtc::scoped_refptr<AudioTrackInterface> track =
402 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700403
404 // Track but no SSRC.
405 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
406 VerifyVoiceChannelNoInput();
407
408 // SSRC but no track.
409 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
410 audio_rtp_sender_->SetSsrc(kAudioSsrc);
411 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800412}
413
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700414// Test that the media channel isn't enabled for sending if the video sender
415// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800416TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700417 video_rtp_sender_ = new VideoRtpSender(video_channel_);
418
419 // Track but no SSRC.
420 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
421 VerifyVideoChannelNoInput();
422
423 // SSRC but no track.
424 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
425 video_rtp_sender_->SetSsrc(kVideoSsrc);
426 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800427}
428
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700429// Test that the media channel is enabled for sending when the audio sender
430// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800431TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700432 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800433 rtc::scoped_refptr<AudioTrackInterface> track =
434 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700435 audio_rtp_sender_->SetSsrc(kAudioSsrc);
436 audio_rtp_sender_->SetTrack(track);
437 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800438
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700439 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800440}
441
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700442// Test that the media channel is enabled for sending when the audio sender
443// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800444TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700445 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800446 rtc::scoped_refptr<AudioTrackInterface> track =
447 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700448 audio_rtp_sender_->SetTrack(track);
449 audio_rtp_sender_->SetSsrc(kAudioSsrc);
450 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800451
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700452 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800453}
454
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700455// Test that the media channel is enabled for sending when the video sender
456// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800457TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700458 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700459 video_rtp_sender_ = new VideoRtpSender(video_channel_);
460 video_rtp_sender_->SetSsrc(kVideoSsrc);
461 video_rtp_sender_->SetTrack(video_track_);
462 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800463
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700464 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800465}
466
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700467// Test that the media channel is enabled for sending when the video sender
468// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800469TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700470 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700471 video_rtp_sender_ = new VideoRtpSender(video_channel_);
472 video_rtp_sender_->SetTrack(video_track_);
473 video_rtp_sender_->SetSsrc(kVideoSsrc);
474 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800475
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700476 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800477}
478
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700479// Test that the media channel stops sending when the audio sender's SSRC is set
480// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800481TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700482 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800483
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700484 audio_rtp_sender_->SetSsrc(0);
485 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800486}
487
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700488// Test that the media channel stops sending when the video sender's SSRC is set
489// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800490TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700491 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800492
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493 audio_rtp_sender_->SetSsrc(0);
494 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800495}
496
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497// Test that the media channel stops sending when the audio sender's track is
498// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800499TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700500 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800501
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700502 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
503 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800504}
505
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506// Test that the media channel stops sending when the video sender's track is
507// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800508TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700509 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800510
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700511 video_rtp_sender_->SetSsrc(0);
512 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800513}
514
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515// Test that when the audio sender's SSRC is changed, the media channel stops
516// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800517TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800519
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700520 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
521 VerifyVoiceChannelNoInput(kAudioSsrc);
522 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800523
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524 audio_rtp_sender_ = nullptr;
525 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800526}
527
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528// Test that when the audio sender's SSRC is changed, the media channel stops
529// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800530TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800532
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700533 video_rtp_sender_->SetSsrc(kVideoSsrc2);
534 VerifyVideoChannelNoInput(kVideoSsrc);
535 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800536
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537 video_rtp_sender_ = nullptr;
538 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800539}
540
skvladdc1c62c2016-03-16 19:07:43 -0700541TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
542 CreateAudioRtpSender();
543
skvladdc1c62c2016-03-16 19:07:43 -0700544 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700545 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700546 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
547
548 DestroyAudioRtpSender();
549}
550
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700551TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
552 CreateAudioRtpSender();
553
554 EXPECT_EQ(-1, voice_media_channel_->max_bps());
555 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
556 EXPECT_EQ(1, params.encodings.size());
557 EXPECT_EQ(-1, params.encodings[0].max_bitrate_bps);
558 params.encodings[0].max_bitrate_bps = 1000;
559 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
560
561 // Read back the parameters and verify they have been changed.
562 params = audio_rtp_sender_->GetParameters();
563 EXPECT_EQ(1, params.encodings.size());
564 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
565
566 // Verify that the audio channel received the new parameters.
567 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
568 EXPECT_EQ(1, params.encodings.size());
569 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
570
571 // Verify that the global bitrate limit has not been changed.
572 EXPECT_EQ(-1, voice_media_channel_->max_bps());
573
574 DestroyAudioRtpSender();
575}
576
skvladdc1c62c2016-03-16 19:07:43 -0700577TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
578 CreateVideoRtpSender();
579
skvladdc1c62c2016-03-16 19:07:43 -0700580 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700582 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
583
584 DestroyVideoRtpSender();
585}
586
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700587TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
588 CreateVideoRtpSender();
589
590 EXPECT_EQ(-1, video_media_channel_->max_bps());
591 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
592 EXPECT_EQ(1, params.encodings.size());
593 EXPECT_EQ(-1, params.encodings[0].max_bitrate_bps);
594 params.encodings[0].max_bitrate_bps = 1000;
595 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
596
597 // Read back the parameters and verify they have been changed.
598 params = video_rtp_sender_->GetParameters();
599 EXPECT_EQ(1, params.encodings.size());
600 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
601
602 // Verify that the video channel received the new parameters.
603 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
604 EXPECT_EQ(1, params.encodings.size());
605 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
606
607 // Verify that the global bitrate limit has not been changed.
608 EXPECT_EQ(-1, video_media_channel_->max_bps());
609
610 DestroyVideoRtpSender();
611}
612
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700613TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
614 CreateAudioRtpReceiver();
615
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700616 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700618 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
619
620 DestroyAudioRtpReceiver();
621}
622
623TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
624 CreateVideoRtpReceiver();
625
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700626 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700627 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700628 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
629
630 DestroyVideoRtpReceiver();
631}
632
pbos5214a0a2016-12-16 15:39:11 -0800633// Test that makes sure that a video track content hint translates to the proper
634// value for sources that are not screencast.
635TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
636 CreateVideoRtpSender();
637
638 video_track_->set_enabled(true);
639
640 // |video_track_| is not screencast by default.
641 EXPECT_EQ(rtc::Optional<bool>(false),
642 video_media_channel_->options().is_screencast);
643 // No content hint should be set by default.
644 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
645 video_track_->content_hint());
646 // Setting detailed should turn a non-screencast source into screencast mode.
647 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
648 EXPECT_EQ(rtc::Optional<bool>(true),
649 video_media_channel_->options().is_screencast);
650 // Removing the content hint should turn the track back into non-screencast
651 // mode.
652 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
653 EXPECT_EQ(rtc::Optional<bool>(false),
654 video_media_channel_->options().is_screencast);
655 // Setting fluid should remain in non-screencast mode (its default).
656 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
657 EXPECT_EQ(rtc::Optional<bool>(false),
658 video_media_channel_->options().is_screencast);
659
660 DestroyVideoRtpSender();
661}
662
663// Test that makes sure that a video track content hint translates to the proper
664// value for screencast sources.
665TEST_F(RtpSenderReceiverTest,
666 PropagatesVideoTrackContentHintForScreencastSource) {
667 CreateVideoRtpSender(true);
668
669 video_track_->set_enabled(true);
670
671 // |video_track_| with a screencast source should be screencast by default.
672 EXPECT_EQ(rtc::Optional<bool>(true),
673 video_media_channel_->options().is_screencast);
674 // No content hint should be set by default.
675 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
676 video_track_->content_hint());
677 // Setting fluid should turn a screencast source into non-screencast mode.
678 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
679 EXPECT_EQ(rtc::Optional<bool>(false),
680 video_media_channel_->options().is_screencast);
681 // Removing the content hint should turn the track back into screencast mode.
682 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
683 EXPECT_EQ(rtc::Optional<bool>(true),
684 video_media_channel_->options().is_screencast);
685 // Setting detailed should still remain in screencast mode (its default).
686 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
687 EXPECT_EQ(rtc::Optional<bool>(true),
688 video_media_channel_->options().is_screencast);
689
690 DestroyVideoRtpSender();
691}
692
693// Test that makes sure any content hints that are set on a track before
694// VideoRtpSender is ready to send are still applied when it gets ready to send.
695TEST_F(RtpSenderReceiverTest,
696 PropagatesVideoTrackContentHintSetBeforeEnabling) {
697 AddVideoTrack();
698 // Setting detailed overrides the default non-screencast mode. This should be
699 // applied even if the track is set on construction.
700 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
701 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
702 stream_->label(), video_channel_);
703 video_track_->set_enabled(true);
704
705 // Sender is not ready to send (no SSRC) so no option should have been set.
706 EXPECT_EQ(rtc::Optional<bool>(),
707 video_media_channel_->options().is_screencast);
708
709 // Verify that the content hint is accounted for when video_rtp_sender_ does
710 // get enabled.
711 video_rtp_sender_->SetSsrc(kVideoSsrc);
712 EXPECT_EQ(rtc::Optional<bool>(true),
713 video_media_channel_->options().is_screencast);
714
715 // And removing the hint should go back to false (to verify that false was
716 // default correctly).
717 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
718 EXPECT_EQ(rtc::Optional<bool>(false),
719 video_media_channel_->options().is_screencast);
720
721 DestroyVideoRtpSender();
722}
723
deadbeef70ab1a12015-09-28 16:53:55 -0700724} // namespace webrtc