blob: 279aba27afaef92efbd7c5b52bfa2fb055d5386c [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
Seth Hampson24722b32017-12-22 09:36:42 -080015#include "api/rtpparameters.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "media/base/fakemediaengine.h"
Steve Antonc9e15602017-11-06 15:40:09 -080017#include "media/base/rtpdataengine.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "media/engine/fakewebrtccall.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "pc/audiotrack.h"
20#include "pc/channelmanager.h"
21#include "pc/localaudiosource.h"
22#include "pc/mediastream.h"
23#include "pc/remoteaudiosource.h"
24#include "pc/rtpreceiver.h"
25#include "pc/rtpsender.h"
26#include "pc/streamcollection.h"
Zhi Huangb5261582017-09-29 10:51:43 -070027#include "pc/test/faketransportcontroller.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "pc/test/fakevideotracksource.h"
29#include "pc/videotrack.h"
30#include "pc/videotracksource.h"
31#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "test/gmock.h"
33#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070034
35using ::testing::_;
36using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070037using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070038using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070039
deadbeef20cb0c12017-02-01 20:27:00 -080040namespace {
41
Seth Hampson845e8782018-03-02 11:34:10 -080042static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070043static const char kVideoTrackId[] = "video_1";
44static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020045static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080046static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020047static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080048static const uint32_t kAudioSsrc2 = 101;
deadbeef20cb0c12017-02-01 20:27:00 -080049static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080050} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070051
52namespace webrtc {
53
deadbeef20cb0c12017-02-01 20:27:00 -080054class RtpSenderReceiverTest : public testing::Test,
55 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070056 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070057 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080058 : network_thread_(rtc::Thread::Current()),
59 worker_thread_(rtc::Thread::Current()),
60 // Create fake media engine/etc. so we can create channels to use to
61 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070062 media_engine_(new cricket::FakeMediaEngine()),
Steve Antonc9e15602017-11-06 15:40:09 -080063 channel_manager_(rtc::WrapUnique(media_engine_),
64 rtc::MakeUnique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080065 worker_thread_,
66 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010067 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080068 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070069 // Create channels to be used by the RtpSenders and RtpReceivers.
70 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080071 bool srtp_required = true;
zhihuangb2cdd932017-01-19 16:54:25 -080072 cricket::DtlsTransportInternal* rtp_transport =
73 fake_transport_controller_.CreateDtlsTransport(
zhihuangf5b251b2017-01-12 19:37:48 -080074 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070075 voice_channel_ = channel_manager_.CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -070076 &fake_call_, cricket::MediaConfig(),
77 rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080078 cricket::CN_AUDIO, srtp_required, cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070079 video_channel_ = channel_manager_.CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -070080 &fake_call_, cricket::MediaConfig(),
81 rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080082 cricket::CN_VIDEO, srtp_required, cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080083 voice_channel_->Enable(true);
84 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070085 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
86 video_media_channel_ = media_engine_->GetVideoChannel(0);
87 RTC_CHECK(voice_channel_);
88 RTC_CHECK(video_channel_);
89 RTC_CHECK(voice_media_channel_);
90 RTC_CHECK(video_media_channel_);
91
92 // Create streams for predefined SSRCs. Streams need to exist in order
93 // for the senders and receievers to apply parameters to them.
94 // Normally these would be created by SetLocalDescription and
95 // SetRemoteDescription.
96 voice_media_channel_->AddSendStream(
97 cricket::StreamParams::CreateLegacy(kAudioSsrc));
98 voice_media_channel_->AddRecvStream(
99 cricket::StreamParams::CreateLegacy(kAudioSsrc));
100 voice_media_channel_->AddSendStream(
101 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
102 voice_media_channel_->AddRecvStream(
103 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
104 video_media_channel_->AddSendStream(
105 cricket::StreamParams::CreateLegacy(kVideoSsrc));
106 video_media_channel_->AddRecvStream(
107 cricket::StreamParams::CreateLegacy(kVideoSsrc));
108 video_media_channel_->AddSendStream(
109 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
110 video_media_channel_->AddRecvStream(
111 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700112 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700113
deadbeef20cb0c12017-02-01 20:27:00 -0800114 // Needed to use DTMF sender.
115 void AddDtmfCodec() {
116 cricket::AudioSendParameters params;
117 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
118 0, 1);
119 params.codecs.push_back(kTelephoneEventCodec);
120 voice_media_channel_->SetSendParameters(params);
121 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700122
pbos5214a0a2016-12-16 15:39:11 -0800123 void AddVideoTrack() { AddVideoTrack(false); }
124
125 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100126 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800127 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700128 video_track_ =
129 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800130 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700131 }
132
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700133 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
134
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100135 void CreateAudioRtpSender(
136 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700137 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800138 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800139 audio_rtp_sender_ =
140 new AudioRtpSender(worker_thread_, local_stream_->GetAudioTracks()[0],
Seth Hampson13b8bad2018-03-13 16:05:28 -0700141 {local_stream_->id()}, nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800142 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800143 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800144 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
145 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700146 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700147 }
148
Steve Anton02ee47c2018-01-10 16:26:06 -0800149 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton47136dd2018-01-12 10:49:35 -0800150 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800151 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800152 }
153
deadbeef20cb0c12017-02-01 20:27:00 -0800154 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
155
pbos5214a0a2016-12-16 15:39:11 -0800156 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
157
158 void CreateVideoRtpSender(bool is_screencast) {
159 AddVideoTrack(is_screencast);
Steve Anton47136dd2018-01-12 10:49:35 -0800160 video_rtp_sender_ =
161 new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0],
Seth Hampson13b8bad2018-03-13 16:05:28 -0700162 {local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800163 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800164 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700165 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700166 }
167
Steve Anton02ee47c2018-01-10 16:26:06 -0800168 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton47136dd2018-01-12 10:49:35 -0800169 video_rtp_sender_ = new VideoRtpSender(worker_thread_);
Steve Anton57858b32018-02-15 15:19:50 -0800170 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800171 }
172
deadbeef70ab1a12015-09-28 16:53:55 -0700173 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700174 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700175 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700176 }
177
178 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700179 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700180 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700181 }
182
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100183 void CreateAudioRtpReceiver(
184 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
185 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800186 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800187 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800188 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700189 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700190 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700191 }
192
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100193 void CreateVideoRtpReceiver(
194 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800195 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800196 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800197 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800198 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100199 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700200 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700201 }
202
203 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700204 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700205 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700206 }
207
208 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700209 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700210 VerifyVideoChannelNoOutput();
211 }
212
213 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
214
215 void VerifyVoiceChannelInput(uint32_t ssrc) {
216 // Verify that the media channel has an audio source, and the stream isn't
217 // muted.
218 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
219 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
220 }
221
222 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
223
224 void VerifyVideoChannelInput(uint32_t ssrc) {
225 // Verify that the media channel has a video source,
226 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
227 }
228
229 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
230
231 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
232 // Verify that the media channel's source is reset.
233 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
234 }
235
236 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
237
238 void VerifyVideoChannelNoInput(uint32_t ssrc) {
239 // Verify that the media channel's source is reset.
240 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
241 }
242
243 void VerifyVoiceChannelOutput() {
244 // Verify that the volume is initialized to 1.
245 double volume;
246 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
247 EXPECT_EQ(1, volume);
248 }
249
250 void VerifyVideoChannelOutput() {
251 // Verify that the media channel has a sink.
252 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
253 }
254
255 void VerifyVoiceChannelNoOutput() {
256 // Verify that the volume is reset to 0.
257 double volume;
258 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
259 EXPECT_EQ(0, volume);
260 }
261
262 void VerifyVideoChannelNoOutput() {
263 // Verify that the media channel's sink is reset.
264 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700265 }
266
267 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800268 rtc::Thread* const network_thread_;
269 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700270 webrtc::RtcEventLogNullImpl event_log_;
deadbeef112b2e92017-02-10 20:13:37 -0800271 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700272 cricket::FakeMediaEngine* media_engine_;
273 cricket::FakeTransportController fake_transport_controller_;
274 cricket::ChannelManager channel_manager_;
275 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700276 cricket::VoiceChannel* voice_channel_;
277 cricket::VideoChannel* video_channel_;
278 cricket::FakeVoiceMediaChannel* voice_media_channel_;
279 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700280 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
281 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
282 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
283 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800284 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700285 rtc::scoped_refptr<VideoTrackInterface> video_track_;
286 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800287 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700288};
289
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700290// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700291// and disassociated with an AudioRtpSender.
292TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
293 CreateAudioRtpSender();
294 DestroyAudioRtpSender();
295}
296
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700297// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700298// disassociated with a VideoRtpSender.
299TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
300 CreateVideoRtpSender();
301 DestroyVideoRtpSender();
302}
303
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700304// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700305// associated and disassociated with an AudioRtpReceiver.
306TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
307 CreateAudioRtpReceiver();
308 DestroyAudioRtpReceiver();
309}
310
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700311// Test that |video_channel_| is updated when a remote video track is
312// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700313TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
314 CreateVideoRtpReceiver();
315 DestroyVideoRtpReceiver();
316}
317
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100318TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
319 CreateAudioRtpReceiver({local_stream_});
320 DestroyAudioRtpReceiver();
321}
322
323TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
324 CreateVideoRtpReceiver({local_stream_});
325 DestroyVideoRtpReceiver();
326}
327
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700328// Test that the AudioRtpSender applies options from the local audio source.
329TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
330 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100331 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800332 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700333 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700334
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100335 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700336
337 DestroyAudioRtpSender();
338}
339
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700340// Test that the stream is muted when the track is disabled, and unmuted when
341// the track is enabled.
342TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
343 CreateAudioRtpSender();
344
345 audio_track_->set_enabled(false);
346 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
347
348 audio_track_->set_enabled(true);
349 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
350
351 DestroyAudioRtpSender();
352}
353
354// Test that the volume is set to 0 when the track is disabled, and back to
355// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700356TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
357 CreateAudioRtpReceiver();
358
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700359 double volume;
360 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
361 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700362
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700363 audio_track_->set_enabled(false);
364 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
365 EXPECT_EQ(0, volume);
366
deadbeef70ab1a12015-09-28 16:53:55 -0700367 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700368 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
369 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700370
371 DestroyAudioRtpReceiver();
372}
373
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700374// Currently no action is taken when a remote video track is disabled or
375// enabled, so there's nothing to test here, other than what is normally
376// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700377TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
378 CreateVideoRtpSender();
379
deadbeef70ab1a12015-09-28 16:53:55 -0700380 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700381 video_track_->set_enabled(true);
382
383 DestroyVideoRtpSender();
384}
385
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700386// Test that the state of the video track created by the VideoRtpReceiver is
387// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100388TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
389 CreateVideoRtpReceiver();
390
391 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
392 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
393 video_track_->GetSource()->state());
394
395 DestroyVideoRtpReceiver();
396
397 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
398 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
399 video_track_->GetSource()->state());
400}
401
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700402// Currently no action is taken when a remote video track is disabled or
403// enabled, so there's nothing to test here, other than what is normally
404// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700405TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
406 CreateVideoRtpReceiver();
407
408 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700409 video_track_->set_enabled(true);
410
411 DestroyVideoRtpReceiver();
412}
413
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700414// Test that the AudioRtpReceiver applies volume changes from the track source
415// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700416TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
417 CreateAudioRtpReceiver();
418
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700419 double volume;
420 audio_track_->GetSource()->SetVolume(0.5);
421 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
422 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700423
424 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700425 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700426 audio_track_->GetSource()->SetVolume(0.8);
427 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
428 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700429
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700430 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700431 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700432 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
433 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700434
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700435 // Try changing volume one more time.
436 audio_track_->GetSource()->SetVolume(0.9);
437 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
438 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700439
440 DestroyAudioRtpReceiver();
441}
442
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700443// Test that the media channel isn't enabled for sending if the audio sender
444// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800445TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800446 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800447 rtc::scoped_refptr<AudioTrackInterface> track =
448 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700449
450 // Track but no SSRC.
451 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
452 VerifyVoiceChannelNoInput();
453
454 // SSRC but no track.
455 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
456 audio_rtp_sender_->SetSsrc(kAudioSsrc);
457 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800458}
459
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700460// Test that the media channel isn't enabled for sending if the video sender
461// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800462TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800463 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700464
465 // Track but no SSRC.
466 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
467 VerifyVideoChannelNoInput();
468
469 // SSRC but no track.
470 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
471 video_rtp_sender_->SetSsrc(kVideoSsrc);
472 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800473}
474
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700475// Test that the media channel is enabled for sending when the audio sender
476// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800477TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800478 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800479 rtc::scoped_refptr<AudioTrackInterface> track =
480 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700481 audio_rtp_sender_->SetSsrc(kAudioSsrc);
482 audio_rtp_sender_->SetTrack(track);
483 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800484
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700485 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800486}
487
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700488// Test that the media channel is enabled for sending when the audio sender
489// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800490TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800491 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800492 rtc::scoped_refptr<AudioTrackInterface> track =
493 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700494 audio_rtp_sender_->SetTrack(track);
495 audio_rtp_sender_->SetSsrc(kAudioSsrc);
496 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800497
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700498 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800499}
500
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700501// Test that the media channel is enabled for sending when the video sender
502// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800503TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700504 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800505 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506 video_rtp_sender_->SetSsrc(kVideoSsrc);
507 video_rtp_sender_->SetTrack(video_track_);
508 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800509
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800511}
512
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513// Test that the media channel is enabled for sending when the video sender
514// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800515TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700516 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800517 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518 video_rtp_sender_->SetTrack(video_track_);
519 video_rtp_sender_->SetSsrc(kVideoSsrc);
520 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800521
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700522 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800523}
524
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525// Test that the media channel stops sending when the audio sender's SSRC is set
526// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800527TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800529
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700530 audio_rtp_sender_->SetSsrc(0);
531 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800532}
533
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700534// Test that the media channel stops sending when the video sender's SSRC is set
535// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800536TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800538
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539 audio_rtp_sender_->SetSsrc(0);
540 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800541}
542
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700543// Test that the media channel stops sending when the audio sender's track is
544// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800545TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800547
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700548 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
549 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800550}
551
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700552// Test that the media channel stops sending when the video sender's track is
553// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800554TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800556
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700557 video_rtp_sender_->SetSsrc(0);
558 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800559}
560
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561// Test that when the audio sender's SSRC is changed, the media channel stops
562// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800563TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800565
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700566 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
567 VerifyVoiceChannelNoInput(kAudioSsrc);
568 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800569
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570 audio_rtp_sender_ = nullptr;
571 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800572}
573
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700574// Test that when the audio sender's SSRC is changed, the media channel stops
575// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800576TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700577 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800578
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579 video_rtp_sender_->SetSsrc(kVideoSsrc2);
580 VerifyVideoChannelNoInput(kVideoSsrc);
581 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800582
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700583 video_rtp_sender_ = nullptr;
584 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800585}
586
skvladdc1c62c2016-03-16 19:07:43 -0700587TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
588 CreateAudioRtpSender();
589
skvladdc1c62c2016-03-16 19:07:43 -0700590 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700591 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800592 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700593
594 DestroyAudioRtpSender();
595}
596
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
598 CreateAudioRtpSender();
599
600 EXPECT_EQ(-1, voice_media_channel_->max_bps());
601 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
602 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800603 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100604 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800605 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700606
607 // Read back the parameters and verify they have been changed.
608 params = audio_rtp_sender_->GetParameters();
609 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100610 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700611
612 // Verify that the audio channel received the new parameters.
613 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
614 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100615 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700616
617 // Verify that the global bitrate limit has not been changed.
618 EXPECT_EQ(-1, voice_media_channel_->max_bps());
619
620 DestroyAudioRtpSender();
621}
622
Seth Hampson24722b32017-12-22 09:36:42 -0800623TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
624 CreateAudioRtpSender();
625
626 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
627 EXPECT_EQ(1, params.encodings.size());
628 EXPECT_EQ(webrtc::kDefaultBitratePriority,
629 params.encodings[0].bitrate_priority);
630 double new_bitrate_priority = 2.0;
631 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800632 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800633
634 params = audio_rtp_sender_->GetParameters();
635 EXPECT_EQ(1, params.encodings.size());
636 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
637
638 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
639 EXPECT_EQ(1, params.encodings.size());
640 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
641
642 DestroyAudioRtpSender();
643}
644
skvladdc1c62c2016-03-16 19:07:43 -0700645TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
646 CreateVideoRtpSender();
647
skvladdc1c62c2016-03-16 19:07:43 -0700648 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700649 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800650 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700651
652 DestroyVideoRtpSender();
653}
654
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700655TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
656 CreateVideoRtpSender();
657
658 EXPECT_EQ(-1, video_media_channel_->max_bps());
659 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
660 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800661 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100662 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800663 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700664
665 // Read back the parameters and verify they have been changed.
666 params = video_rtp_sender_->GetParameters();
667 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100668 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700669
670 // Verify that the video channel received the new parameters.
671 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
672 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100673 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700674
675 // Verify that the global bitrate limit has not been changed.
676 EXPECT_EQ(-1, video_media_channel_->max_bps());
677
678 DestroyVideoRtpSender();
679}
680
Seth Hampson24722b32017-12-22 09:36:42 -0800681TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
682 CreateVideoRtpSender();
683
684 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
685 EXPECT_EQ(1, params.encodings.size());
686 EXPECT_EQ(webrtc::kDefaultBitratePriority,
687 params.encodings[0].bitrate_priority);
688 double new_bitrate_priority = 2.0;
689 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800690 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800691
692 params = video_rtp_sender_->GetParameters();
693 EXPECT_EQ(1, params.encodings.size());
694 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
695
696 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
697 EXPECT_EQ(1, params.encodings.size());
698 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
699
700 DestroyVideoRtpSender();
701}
702
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700703TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
704 CreateAudioRtpReceiver();
705
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700706 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700707 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700708 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
709
710 DestroyAudioRtpReceiver();
711}
712
713TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
714 CreateVideoRtpReceiver();
715
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700716 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700717 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700718 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
719
720 DestroyVideoRtpReceiver();
721}
722
pbos5214a0a2016-12-16 15:39:11 -0800723// Test that makes sure that a video track content hint translates to the proper
724// value for sources that are not screencast.
725TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
726 CreateVideoRtpSender();
727
728 video_track_->set_enabled(true);
729
730 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100731 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800732 // No content hint should be set by default.
733 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
734 video_track_->content_hint());
735 // Setting detailed should turn a non-screencast source into screencast mode.
736 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100737 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800738 // Removing the content hint should turn the track back into non-screencast
739 // mode.
740 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100741 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800742 // Setting fluid should remain in non-screencast mode (its default).
743 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100744 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800745
746 DestroyVideoRtpSender();
747}
748
749// Test that makes sure that a video track content hint translates to the proper
750// value for screencast sources.
751TEST_F(RtpSenderReceiverTest,
752 PropagatesVideoTrackContentHintForScreencastSource) {
753 CreateVideoRtpSender(true);
754
755 video_track_->set_enabled(true);
756
757 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100758 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800759 // No content hint should be set by default.
760 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
761 video_track_->content_hint());
762 // Setting fluid should turn a screencast source into non-screencast mode.
763 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100764 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800765 // Removing the content hint should turn the track back into screencast mode.
766 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100767 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800768 // Setting detailed should still remain in screencast mode (its default).
769 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100770 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800771
772 DestroyVideoRtpSender();
773}
774
775// Test that makes sure any content hints that are set on a track before
776// VideoRtpSender is ready to send are still applied when it gets ready to send.
777TEST_F(RtpSenderReceiverTest,
778 PropagatesVideoTrackContentHintSetBeforeEnabling) {
779 AddVideoTrack();
780 // Setting detailed overrides the default non-screencast mode. This should be
781 // applied even if the track is set on construction.
782 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Seth Hampson13b8bad2018-03-13 16:05:28 -0700783 video_rtp_sender_ =
784 new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0],
785 {local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800786 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800787 video_track_->set_enabled(true);
788
789 // Sender is not ready to send (no SSRC) so no option should have been set.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100790 EXPECT_EQ(rtc::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800791
792 // Verify that the content hint is accounted for when video_rtp_sender_ does
793 // get enabled.
794 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100795 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800796
797 // And removing the hint should go back to false (to verify that false was
798 // default correctly).
799 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100800 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800801
802 DestroyVideoRtpSender();
803}
804
deadbeef20cb0c12017-02-01 20:27:00 -0800805TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
806 CreateAudioRtpSender();
807 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
808}
809
810TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
811 CreateVideoRtpSender();
812 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
813}
814
815// Test that the DTMF sender is really using |voice_channel_|, and thus returns
816// true/false from CanSendDtmf based on what |voice_channel_| returns.
817TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
818 AddDtmfCodec();
819 CreateAudioRtpSender();
820 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
821 ASSERT_NE(nullptr, dtmf_sender);
822 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
823}
824
825TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
826 CreateAudioRtpSender();
827 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
828 ASSERT_NE(nullptr, dtmf_sender);
829 // DTMF codec has not been added, as it was in the above test.
830 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
831}
832
833TEST_F(RtpSenderReceiverTest, InsertDtmf) {
834 AddDtmfCodec();
835 CreateAudioRtpSender();
836 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
837 ASSERT_NE(nullptr, dtmf_sender);
838
839 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
840
841 // Insert DTMF
842 const int expected_duration = 90;
843 dtmf_sender->InsertDtmf("012", expected_duration, 100);
844
845 // Verify
846 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
847 kDefaultTimeout);
848 const uint32_t send_ssrc =
849 voice_media_channel_->send_streams()[0].first_ssrc();
850 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
851 send_ssrc, 0, expected_duration));
852 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
853 send_ssrc, 1, expected_duration));
854 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
855 send_ssrc, 2, expected_duration));
856}
857
858// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
859// destroyed, which is needed for the DTMF sender.
860TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
861 CreateAudioRtpSender();
862 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
863 audio_rtp_sender_ = nullptr;
864 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
865}
866
deadbeef70ab1a12015-09-28 16:53:55 -0700867} // namespace webrtc