blob: fad839cc4ca531c9d44fbe84a8a9807e9758ec3d [file] [log] [blame]
deadbeef70ab1a12015-09-28 23:53:551/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 23:53:553 *
kjellanderb24317b2016-02-10 15:54:434 * 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 23:53:559 */
10
kwibergd1fe2812016-04-27 13:47:2911#include <memory>
deadbeef70ab1a12015-09-28 23:53:5512#include <string>
Tommif888bb52015-12-12 00:37:0113#include <utility>
deadbeef70ab1a12015-09-28 23:53:5514
Seth Hampson24722b32017-12-22 17:36:4215#include "api/rtpparameters.h"
Benjamin Wright84583f62018-10-04 21:22:3416#include "api/test/fake_frame_decryptor.h"
17#include "api/test/fake_frame_encryptor.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3118#include "media/base/fakemediaengine.h"
Steve Antonc9e15602017-11-06 23:40:0919#include "media/base/rtpdataengine.h"
Seth Hampson2d2c8882018-05-16 23:02:3220#include "media/base/testutils.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3121#include "media/engine/fakewebrtccall.h"
Zhi Huange830e682018-03-30 17:48:3522#include "p2p/base/fakedtlstransport.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3123#include "pc/audiotrack.h"
24#include "pc/channelmanager.h"
25#include "pc/localaudiosource.h"
26#include "pc/mediastream.h"
27#include "pc/remoteaudiosource.h"
28#include "pc/rtpreceiver.h"
29#include "pc/rtpsender.h"
30#include "pc/streamcollection.h"
31#include "pc/test/fakevideotracksource.h"
32#include "pc/videotrack.h"
33#include "pc/videotracksource.h"
34#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3135#include "test/gmock.h"
36#include "test/gtest.h"
deadbeef70ab1a12015-09-28 23:53:5537
38using ::testing::_;
39using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 23:20:0140using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-17 02:07:4341using ::testing::Return;
deadbeef70ab1a12015-09-28 23:53:5542
deadbeef20cb0c12017-02-02 04:27:0043namespace {
44
Seth Hampson845e8782018-03-02 19:34:1045static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 23:53:5546static const char kVideoTrackId[] = "video_1";
47static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 10:23:2148static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 19:26:0149static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 10:23:2150static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 19:26:0151static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 20:47:2052static const uint32_t kVideoSsrcSimulcast = 102;
53static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-02 04:27:0054static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-02 04:27:0055} // namespace
deadbeef70ab1a12015-09-28 23:53:5556
57namespace webrtc {
58
deadbeef20cb0c12017-02-02 04:27:0059class RtpSenderReceiverTest : public testing::Test,
60 public sigslot::has_slots<> {
tkchin3784b4a2016-06-25 02:31:4761 public:
Taylor Brandstetterba29c6a2016-06-27 23:30:3562 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 18:49:3563 : network_thread_(rtc::Thread::Current()),
64 worker_thread_(rtc::Thread::Current()),
65 // Create fake media engine/etc. so we can create channels to use to
66 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 23:30:3567 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 09:40:3368 channel_manager_(absl::WrapUnique(media_engine_),
69 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 18:49:3570 worker_thread_,
71 network_thread_),
Sebastian Jansson8f83b422018-02-21 12:07:1372 fake_call_(),
Seth Hampson845e8782018-03-02 19:34:1073 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 23:30:3574 // Create channels to be used by the RtpSenders and RtpReceivers.
75 channel_manager_.Init();
deadbeef7af91dd2016-12-13 19:29:1176 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 09:40:3377 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 17:48:3578 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
79 rtp_transport_ = CreateDtlsSrtpTransport();
80
Taylor Brandstetterba29c6a2016-06-27 23:30:3581 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 17:48:3582 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Oleh Prypin37cf2452018-10-14 19:44:2983 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
84 webrtc::CryptoOptions(), cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 23:30:3585 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 17:48:3586 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
87 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
Benjamin Wrighta54daf12018-10-11 22:33:1788 webrtc::CryptoOptions(), cricket::VideoOptions());
deadbeef20cb0c12017-02-02 04:27:0089 voice_channel_->Enable(true);
90 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 23:30:3591 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
92 video_media_channel_ = media_engine_->GetVideoChannel(0);
93 RTC_CHECK(voice_channel_);
94 RTC_CHECK(video_channel_);
95 RTC_CHECK(voice_media_channel_);
96 RTC_CHECK(video_media_channel_);
97
98 // Create streams for predefined SSRCs. Streams need to exist in order
99 // for the senders and receievers to apply parameters to them.
100 // Normally these would be created by SetLocalDescription and
101 // SetRemoteDescription.
102 voice_media_channel_->AddSendStream(
103 cricket::StreamParams::CreateLegacy(kAudioSsrc));
104 voice_media_channel_->AddRecvStream(
105 cricket::StreamParams::CreateLegacy(kAudioSsrc));
106 voice_media_channel_->AddSendStream(
107 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
108 voice_media_channel_->AddRecvStream(
109 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
110 video_media_channel_->AddSendStream(
111 cricket::StreamParams::CreateLegacy(kVideoSsrc));
112 video_media_channel_->AddRecvStream(
113 cricket::StreamParams::CreateLegacy(kVideoSsrc));
114 video_media_channel_->AddSendStream(
115 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
116 video_media_channel_->AddRecvStream(
117 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-25 02:31:47118 }
Taylor Brandstetter2d549172016-06-24 21:18:22119
Zhi Huange830e682018-03-30 17:48:35120 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 09:40:33121 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
122 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 17:48:35123 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
124 /*rtcp_dtls_transport=*/nullptr);
125 return dtls_srtp_transport;
126 }
127
deadbeef20cb0c12017-02-02 04:27:00128 // Needed to use DTMF sender.
129 void AddDtmfCodec() {
130 cricket::AudioSendParameters params;
131 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
132 0, 1);
133 params.codecs.push_back(kTelephoneEventCodec);
134 voice_media_channel_->SetSendParameters(params);
135 }
Taylor Brandstetterba29c6a2016-06-27 23:30:35136
pbos5214a0a2016-12-16 23:39:11137 void AddVideoTrack() { AddVideoTrack(false); }
138
139 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 00:27:48140 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 23:39:11141 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-08-01 06:22:01142 video_track_ =
143 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-26 02:15:09144 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 23:53:55145 }
146
Taylor Brandstetterba29c6a2016-06-27 23:30:35147 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
148
Mirko Bonadeic61ce0d2017-11-21 16:04:20149 void CreateAudioRtpSender(
150 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35151 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-26 02:15:09152 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 18:49:35153 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 20:03:36154 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
155 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
156 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 23:19:50157 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 19:26:01158 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-02 04:27:00159 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
160 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 23:30:35161 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 23:53:55162 }
163
Steve Anton02ee47c2018-01-11 00:26:06164 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 20:03:36165 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Steve Anton57858b32018-02-15 23:19:50166 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-11 00:26:06167 }
168
deadbeef20cb0c12017-02-02 04:27:00169 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
170
Seth Hampson2d2c8882018-05-16 23:02:32171 void CreateVideoRtpSender(uint32_t ssrc) {
172 CreateVideoRtpSender(false, ssrc);
173 }
174
pbos5214a0a2016-12-16 23:39:11175 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
176
Florent Castelli892acf02018-10-01 20:47:20177 void CreateVideoRtpSenderWithSimulcast(
178 int num_layers = kVideoSimulcastLayerCount) {
179 std::vector<uint32_t> ssrcs;
180 for (int i = 0; i < num_layers; ++i)
181 ssrcs.push_back(kVideoSsrcSimulcast + i);
182 cricket::StreamParams stream_params =
183 cricket::CreateSimStreamParams("cname", ssrcs);
184 video_media_channel_->AddSendStream(stream_params);
185 uint32_t primary_ssrc = stream_params.first_ssrc();
186 CreateVideoRtpSender(primary_ssrc);
187 }
188
Seth Hampson2d2c8882018-05-16 23:02:32189 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 23:39:11190 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 20:03:36191 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
192 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
193 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 23:19:50194 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 23:02:32195 video_rtp_sender_->SetSsrc(ssrc);
196 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 23:53:55197 }
Steve Anton02ee47c2018-01-11 00:26:06198 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 20:03:36199 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Steve Anton57858b32018-02-15 23:19:50200 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-11 00:26:06201 }
202
deadbeef70ab1a12015-09-28 23:53:55203 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55204 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35205 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55206 }
207
208 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55209 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35210 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55211 }
212
Henrik Boström9e6fd2b2017-11-21 12:41:51213 void CreateAudioRtpReceiver(
214 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
215 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-18 01:41:02216 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 23:19:50217 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-18 01:41:02218 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 10:16:19219 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35220 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55221 }
222
Henrik Boström9e6fd2b2017-11-21 12:41:51223 void CreateVideoRtpReceiver(
224 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-26 02:15:09225 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-18 01:41:02226 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 23:19:50227 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-18 01:41:02228 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 17:32:00229 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35230 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55231 }
232
233 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 23:53:55234 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35235 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 23:53:55236 }
237
238 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 23:53:55239 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35240 VerifyVideoChannelNoOutput();
241 }
242
243 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
244
245 void VerifyVoiceChannelInput(uint32_t ssrc) {
246 // Verify that the media channel has an audio source, and the stream isn't
247 // muted.
248 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
249 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
250 }
251
252 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
253
254 void VerifyVideoChannelInput(uint32_t ssrc) {
255 // Verify that the media channel has a video source,
256 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
257 }
258
259 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
260
261 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
262 // Verify that the media channel's source is reset.
263 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
264 }
265
266 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
267
268 void VerifyVideoChannelNoInput(uint32_t ssrc) {
269 // Verify that the media channel's source is reset.
270 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
271 }
272
273 void VerifyVoiceChannelOutput() {
274 // Verify that the volume is initialized to 1.
275 double volume;
276 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
277 EXPECT_EQ(1, volume);
278 }
279
280 void VerifyVideoChannelOutput() {
281 // Verify that the media channel has a sink.
282 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
283 }
284
285 void VerifyVoiceChannelNoOutput() {
286 // Verify that the volume is reset to 0.
287 double volume;
288 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
289 EXPECT_EQ(0, volume);
290 }
291
292 void VerifyVideoChannelNoOutput() {
293 // Verify that the media channel's sink is reset.
294 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 23:53:55295 }
296
297 protected:
Steve Anton47136dd2018-01-12 18:49:35298 rtc::Thread* const network_thread_;
299 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 18:53:05300 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 17:48:35301 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
302 // the |channel_manager|.
303 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
304 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-11 04:13:37305 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 23:30:35306 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 23:30:35307 cricket::ChannelManager channel_manager_;
308 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 23:30:35309 cricket::VoiceChannel* voice_channel_;
310 cricket::VideoChannel* video_channel_;
311 cricket::FakeVoiceMediaChannel* voice_media_channel_;
312 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 23:53:55313 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
314 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
315 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
316 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-26 02:15:09317 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 23:53:55318 rtc::scoped_refptr<VideoTrackInterface> video_track_;
319 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-02 04:27:00320 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 23:53:55321};
322
Taylor Brandstetterba29c6a2016-06-27 23:30:35323// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 23:53:55324// and disassociated with an AudioRtpSender.
325TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
326 CreateAudioRtpSender();
327 DestroyAudioRtpSender();
328}
329
Taylor Brandstetterba29c6a2016-06-27 23:30:35330// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 23:53:55331// disassociated with a VideoRtpSender.
332TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
333 CreateVideoRtpSender();
334 DestroyVideoRtpSender();
335}
336
Taylor Brandstetterba29c6a2016-06-27 23:30:35337// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 23:53:55338// associated and disassociated with an AudioRtpReceiver.
339TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
340 CreateAudioRtpReceiver();
341 DestroyAudioRtpReceiver();
342}
343
Taylor Brandstetterba29c6a2016-06-27 23:30:35344// Test that |video_channel_| is updated when a remote video track is
345// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55346TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
347 CreateVideoRtpReceiver();
348 DestroyVideoRtpReceiver();
349}
350
Henrik Boström9e6fd2b2017-11-21 12:41:51351TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
352 CreateAudioRtpReceiver({local_stream_});
353 DestroyAudioRtpReceiver();
354}
355
356TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
357 CreateVideoRtpReceiver({local_stream_});
358 DestroyVideoRtpReceiver();
359}
360
Taylor Brandstetterba29c6a2016-06-27 23:30:35361// Test that the AudioRtpSender applies options from the local audio source.
362TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
363 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 09:54:27364 options.echo_cancellation = true;
deadbeef757146b2017-02-11 05:26:48365 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 23:30:35366 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 21:18:22367
Oskar Sundbom36f8f3e2017-11-16 09:54:27368 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 21:18:22369
370 DestroyAudioRtpSender();
371}
372
Taylor Brandstetterba29c6a2016-06-27 23:30:35373// Test that the stream is muted when the track is disabled, and unmuted when
374// the track is enabled.
375TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
376 CreateAudioRtpSender();
377
378 audio_track_->set_enabled(false);
379 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
380
381 audio_track_->set_enabled(true);
382 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
383
384 DestroyAudioRtpSender();
385}
386
387// Test that the volume is set to 0 when the track is disabled, and back to
388// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 23:53:55389TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
390 CreateAudioRtpReceiver();
391
Taylor Brandstetterba29c6a2016-06-27 23:30:35392 double volume;
393 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
394 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 21:18:22395
Taylor Brandstetterba29c6a2016-06-27 23:30:35396 audio_track_->set_enabled(false);
397 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
398 EXPECT_EQ(0, volume);
399
deadbeef70ab1a12015-09-28 23:53:55400 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 23:30:35401 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
402 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 23:53:55403
404 DestroyAudioRtpReceiver();
405}
406
Taylor Brandstetterba29c6a2016-06-27 23:30:35407// Currently no action is taken when a remote video track is disabled or
408// enabled, so there's nothing to test here, other than what is normally
409// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 23:53:55410TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
411 CreateVideoRtpSender();
412
deadbeef70ab1a12015-09-28 23:53:55413 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55414 video_track_->set_enabled(true);
415
416 DestroyVideoRtpSender();
417}
418
Taylor Brandstetterba29c6a2016-06-27 23:30:35419// Test that the state of the video track created by the VideoRtpReceiver is
420// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 17:32:00421TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
422 CreateVideoRtpReceiver();
423
424 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
425 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
426 video_track_->GetSource()->state());
427
428 DestroyVideoRtpReceiver();
429
430 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
431 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
432 video_track_->GetSource()->state());
433}
434
Taylor Brandstetterba29c6a2016-06-27 23:30:35435// Currently no action is taken when a remote video track is disabled or
436// enabled, so there's nothing to test here, other than what is normally
437// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55438TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
439 CreateVideoRtpReceiver();
440
441 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55442 video_track_->set_enabled(true);
443
444 DestroyVideoRtpReceiver();
445}
446
Taylor Brandstetterba29c6a2016-06-27 23:30:35447// Test that the AudioRtpReceiver applies volume changes from the track source
448// to the media channel.
deadbeef70ab1a12015-09-28 23:53:55449TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
450 CreateAudioRtpReceiver();
451
Taylor Brandstetterba29c6a2016-06-27 23:30:35452 double volume;
453 audio_track_->GetSource()->SetVolume(0.5);
454 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
455 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 23:53:55456
457 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 23:53:55458 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 23:30:35459 audio_track_->GetSource()->SetVolume(0.8);
460 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
461 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 23:53:55462
Taylor Brandstetterba29c6a2016-06-27 23:30:35463 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 23:53:55464 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 23:30:35465 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
466 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 23:53:55467
Taylor Brandstetterba29c6a2016-06-27 23:30:35468 // Try changing volume one more time.
469 audio_track_->GetSource()->SetVolume(0.9);
470 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
471 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 23:53:55472
473 DestroyAudioRtpReceiver();
474}
475
Taylor Brandstetterba29c6a2016-06-27 23:30:35476// Test that the media channel isn't enabled for sending if the audio sender
477// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01478TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06479 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01480 rtc::scoped_refptr<AudioTrackInterface> track =
481 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35482
483 // Track but no SSRC.
484 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
485 VerifyVoiceChannelNoInput();
486
487 // SSRC but no track.
488 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
489 audio_rtp_sender_->SetSsrc(kAudioSsrc);
490 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01491}
492
Taylor Brandstetterba29c6a2016-06-27 23:30:35493// Test that the media channel isn't enabled for sending if the video sender
494// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01495TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06496 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35497
498 // Track but no SSRC.
499 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
500 VerifyVideoChannelNoInput();
501
502 // SSRC but no track.
503 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
504 video_rtp_sender_->SetSsrc(kVideoSsrc);
505 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01506}
507
Taylor Brandstetterba29c6a2016-06-27 23:30:35508// Test that the media channel is enabled for sending when the audio sender
509// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01510TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-11 00:26:06511 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01512 rtc::scoped_refptr<AudioTrackInterface> track =
513 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35514 audio_rtp_sender_->SetSsrc(kAudioSsrc);
515 audio_rtp_sender_->SetTrack(track);
516 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01517
Taylor Brandstetterba29c6a2016-06-27 23:30:35518 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01519}
520
Taylor Brandstetterba29c6a2016-06-27 23:30:35521// Test that the media channel is enabled for sending when the audio sender
522// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01523TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06524 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01525 rtc::scoped_refptr<AudioTrackInterface> track =
526 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35527 audio_rtp_sender_->SetTrack(track);
528 audio_rtp_sender_->SetSsrc(kAudioSsrc);
529 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01530
Taylor Brandstetterba29c6a2016-06-27 23:30:35531 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01532}
533
Taylor Brandstetterba29c6a2016-06-27 23:30:35534// Test that the media channel is enabled for sending when the video sender
535// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01536TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 15:20:42537 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06538 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35539 video_rtp_sender_->SetSsrc(kVideoSsrc);
540 video_rtp_sender_->SetTrack(video_track_);
541 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01542
Taylor Brandstetterba29c6a2016-06-27 23:30:35543 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01544}
545
Taylor Brandstetterba29c6a2016-06-27 23:30:35546// Test that the media channel is enabled for sending when the video sender
547// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01548TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 15:20:42549 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06550 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35551 video_rtp_sender_->SetTrack(video_track_);
552 video_rtp_sender_->SetSsrc(kVideoSsrc);
553 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01554
Taylor Brandstetterba29c6a2016-06-27 23:30:35555 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01556}
557
Taylor Brandstetterba29c6a2016-06-27 23:30:35558// Test that the media channel stops sending when the audio sender's SSRC is set
559// to 0.
deadbeeffac06552015-11-25 19:26:01560TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35561 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01562
Taylor Brandstetterba29c6a2016-06-27 23:30:35563 audio_rtp_sender_->SetSsrc(0);
564 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01565}
566
Taylor Brandstetterba29c6a2016-06-27 23:30:35567// Test that the media channel stops sending when the video sender's SSRC is set
568// to 0.
deadbeeffac06552015-11-25 19:26:01569TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35570 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01571
Taylor Brandstetterba29c6a2016-06-27 23:30:35572 audio_rtp_sender_->SetSsrc(0);
573 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01574}
575
Taylor Brandstetterba29c6a2016-06-27 23:30:35576// Test that the media channel stops sending when the audio sender's track is
577// set to null.
deadbeeffac06552015-11-25 19:26:01578TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35579 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01580
Taylor Brandstetterba29c6a2016-06-27 23:30:35581 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
582 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01583}
584
Taylor Brandstetterba29c6a2016-06-27 23:30:35585// Test that the media channel stops sending when the video sender's track is
586// set to null.
deadbeeffac06552015-11-25 19:26:01587TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35588 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01589
Taylor Brandstetterba29c6a2016-06-27 23:30:35590 video_rtp_sender_->SetSsrc(0);
591 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01592}
593
Taylor Brandstetterba29c6a2016-06-27 23:30:35594// Test that when the audio sender's SSRC is changed, the media channel stops
595// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01596TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35597 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01598
Taylor Brandstetterba29c6a2016-06-27 23:30:35599 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
600 VerifyVoiceChannelNoInput(kAudioSsrc);
601 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01602
Taylor Brandstetterba29c6a2016-06-27 23:30:35603 audio_rtp_sender_ = nullptr;
604 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01605}
606
Taylor Brandstetterba29c6a2016-06-27 23:30:35607// Test that when the audio sender's SSRC is changed, the media channel stops
608// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01609TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35610 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01611
Taylor Brandstetterba29c6a2016-06-27 23:30:35612 video_rtp_sender_->SetSsrc(kVideoSsrc2);
613 VerifyVideoChannelNoInput(kVideoSsrc);
614 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01615
Taylor Brandstetterba29c6a2016-06-27 23:30:35616 video_rtp_sender_ = nullptr;
617 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01618}
619
skvladdc1c62c2016-03-17 02:07:43620TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
621 CreateAudioRtpSender();
622
skvladdc1c62c2016-03-17 02:07:43623 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:35624 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:36625 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:43626
627 DestroyAudioRtpSender();
628}
629
Florent Castelli892acf02018-10-01 20:47:20630TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
631 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
632
633 RtpParameters params = audio_rtp_sender_->GetParameters();
634 ASSERT_EQ(1u, params.encodings.size());
635 params.encodings[0].max_bitrate_bps = 90000;
636 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
637
638 params = audio_rtp_sender_->GetParameters();
639 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
640 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
641
642 DestroyAudioRtpSender();
643}
644
645TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
646 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
647 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
648
649 audio_rtp_sender_ =
650 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
651 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
652 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
653
654 std::vector<RtpEncodingParameters> init_encodings(1);
655 init_encodings[0].max_bitrate_bps = 60000;
656 audio_rtp_sender_->set_init_send_encodings(init_encodings);
657
658 RtpParameters params = audio_rtp_sender_->GetParameters();
659 ASSERT_EQ(1u, params.encodings.size());
660 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
661
662 // Simulate the setLocalDescription call
663 std::vector<uint32_t> ssrcs(1, 1);
664 cricket::StreamParams stream_params =
665 cricket::CreateSimStreamParams("cname", ssrcs);
666 voice_media_channel_->AddSendStream(stream_params);
667 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
668 audio_rtp_sender_->SetSsrc(1);
669
670 params = audio_rtp_sender_->GetParameters();
671 ASSERT_EQ(1u, params.encodings.size());
672 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
673
674 DestroyAudioRtpSender();
675}
676
677TEST_F(RtpSenderReceiverTest,
678 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
679 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
680
681 RtpParameters params;
682 RTCError result = audio_rtp_sender_->SetParameters(params);
683 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
684 DestroyAudioRtpSender();
685}
686
Florent Castellicebf50f2018-05-03 13:31:53687TEST_F(RtpSenderReceiverTest,
688 AudioSenderMustCallGetParametersBeforeSetParameters) {
689 CreateAudioRtpSender();
690
691 RtpParameters params;
692 RTCError result = audio_rtp_sender_->SetParameters(params);
693 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
694
695 DestroyAudioRtpSender();
696}
697
698TEST_F(RtpSenderReceiverTest,
699 AudioSenderSetParametersInvalidatesTransactionId) {
700 CreateAudioRtpSender();
701
702 RtpParameters params = audio_rtp_sender_->GetParameters();
703 EXPECT_EQ(1u, params.encodings.size());
704 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
705 RTCError result = audio_rtp_sender_->SetParameters(params);
706 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
707
708 DestroyAudioRtpSender();
709}
710
711TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
712 CreateAudioRtpSender();
713
714 RtpParameters params = audio_rtp_sender_->GetParameters();
715 params.transaction_id = "";
716 RTCError result = audio_rtp_sender_->SetParameters(params);
717 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
718
719 DestroyAudioRtpSender();
720}
721
722TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
723 CreateAudioRtpSender();
724
725 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23726 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:53727 auto saved_transaction_id = params.transaction_id;
728 params = audio_rtp_sender_->GetParameters();
729 EXPECT_NE(saved_transaction_id, params.transaction_id);
730
731 DestroyAudioRtpSender();
732}
733
734TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
735 CreateAudioRtpSender();
736
737 RtpParameters params = audio_rtp_sender_->GetParameters();
738 RtpParameters second_params = audio_rtp_sender_->GetParameters();
739
740 RTCError result = audio_rtp_sender_->SetParameters(params);
741 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 23:02:32742 DestroyAudioRtpSender();
743}
744
745TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
746 CreateAudioRtpSender();
747 RtpParameters params = audio_rtp_sender_->GetParameters();
748 EXPECT_EQ(1u, params.encodings.size());
749
Florent Castelli87b3c512018-07-18 14:00:28750 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:32751 params.mid = "dummy_mid";
752 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
753 audio_rtp_sender_->SetParameters(params).type());
754 params = audio_rtp_sender_->GetParameters();
755
Seth Hampson2d2c8882018-05-16 23:02:32756 DestroyAudioRtpSender();
757}
758
759TEST_F(RtpSenderReceiverTest,
760 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
761 CreateAudioRtpSender();
762 RtpParameters params = audio_rtp_sender_->GetParameters();
763 EXPECT_EQ(1u, params.encodings.size());
764
765 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 08:42:19766 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Seth Hampson2d2c8882018-05-16 23:02:32767 params.encodings[0].codec_payload_type = 1;
768 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
769 audio_rtp_sender_->SetParameters(params).type());
770 params = audio_rtp_sender_->GetParameters();
771
772 params.encodings[0].fec = RtpFecParameters();
773 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
774 audio_rtp_sender_->SetParameters(params).type());
775 params = audio_rtp_sender_->GetParameters();
776
777 params.encodings[0].rtx = RtpRtxParameters();
778 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
779 audio_rtp_sender_->SetParameters(params).type());
780 params = audio_rtp_sender_->GetParameters();
781
782 params.encodings[0].dtx = DtxStatus::ENABLED;
783 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
784 audio_rtp_sender_->SetParameters(params).type());
785 params = audio_rtp_sender_->GetParameters();
786
787 params.encodings[0].ptime = 1;
788 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
789 audio_rtp_sender_->SetParameters(params).type());
790 params = audio_rtp_sender_->GetParameters();
791
Seth Hampson2d2c8882018-05-16 23:02:32792 params.encodings[0].scale_resolution_down_by = 2.0;
793 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
794 audio_rtp_sender_->SetParameters(params).type());
795 params = audio_rtp_sender_->GetParameters();
796
797 params.encodings[0].rid = "dummy_rid";
798 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
799 audio_rtp_sender_->SetParameters(params).type());
800 params = audio_rtp_sender_->GetParameters();
801
802 params.encodings[0].dependency_rids.push_back("dummy_rid");
803 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
804 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 13:31:53805
806 DestroyAudioRtpSender();
807}
808
Taylor Brandstetterba29c6a2016-06-27 23:30:35809TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
810 CreateAudioRtpSender();
811
812 EXPECT_EQ(-1, voice_media_channel_->max_bps());
813 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23814 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 20:09:01815 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:27816 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:36817 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:35818
819 // Read back the parameters and verify they have been changed.
820 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23821 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:27822 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:35823
824 // Verify that the audio channel received the new parameters.
825 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:23826 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:27827 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:35828
829 // Verify that the global bitrate limit has not been changed.
830 EXPECT_EQ(-1, voice_media_channel_->max_bps());
831
832 DestroyAudioRtpSender();
833}
834
Seth Hampson24722b32017-12-22 17:36:42835TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
836 CreateAudioRtpSender();
837
838 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23839 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:42840 EXPECT_EQ(webrtc::kDefaultBitratePriority,
841 params.encodings[0].bitrate_priority);
842 double new_bitrate_priority = 2.0;
843 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:36844 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:42845
846 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23847 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:42848 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
849
850 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:23851 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:42852 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
853
854 DestroyAudioRtpSender();
855}
856
skvladdc1c62c2016-03-17 02:07:43857TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
858 CreateVideoRtpSender();
859
skvladdc1c62c2016-03-17 02:07:43860 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:35861 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:36862 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:43863
864 DestroyVideoRtpSender();
865}
866
Florent Castelli892acf02018-10-01 20:47:20867TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
868 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
869
870 RtpParameters params = video_rtp_sender_->GetParameters();
871 ASSERT_EQ(1u, params.encodings.size());
872 params.encodings[0].max_bitrate_bps = 90000;
873 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
874
875 params = video_rtp_sender_->GetParameters();
876 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
877 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
878
879 DestroyVideoRtpSender();
880}
881
882TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
883 AddVideoTrack(false);
884
885 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
886 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
887 video_rtp_sender_->set_stream_ids({local_stream_->id()});
888
889 std::vector<RtpEncodingParameters> init_encodings(2);
890 init_encodings[0].max_bitrate_bps = 60000;
891 init_encodings[1].max_bitrate_bps = 900000;
892 video_rtp_sender_->set_init_send_encodings(init_encodings);
893
894 RtpParameters params = video_rtp_sender_->GetParameters();
895 ASSERT_EQ(2u, params.encodings.size());
896 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
897 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
898
899 // Simulate the setLocalDescription call
900 std::vector<uint32_t> ssrcs;
901 for (int i = 0; i < 2; ++i)
902 ssrcs.push_back(kVideoSsrcSimulcast + i);
903 cricket::StreamParams stream_params =
904 cricket::CreateSimStreamParams("cname", ssrcs);
905 video_media_channel_->AddSendStream(stream_params);
906 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
907 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
908
909 params = video_rtp_sender_->GetParameters();
910 ASSERT_EQ(2u, params.encodings.size());
911 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
912 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
913
914 DestroyVideoRtpSender();
915}
916
917TEST_F(RtpSenderReceiverTest,
918 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
919 AddVideoTrack(false);
920
921 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
922 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
923 video_rtp_sender_->set_stream_ids({local_stream_->id()});
924
925 std::vector<RtpEncodingParameters> init_encodings(1);
926 init_encodings[0].max_bitrate_bps = 60000;
927 video_rtp_sender_->set_init_send_encodings(init_encodings);
928
929 RtpParameters params = video_rtp_sender_->GetParameters();
930 ASSERT_EQ(1u, params.encodings.size());
931 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
932
933 // Simulate the setLocalDescription call as if the user used SDP munging
934 // to enable simulcast
935 std::vector<uint32_t> ssrcs;
936 for (int i = 0; i < 2; ++i)
937 ssrcs.push_back(kVideoSsrcSimulcast + i);
938 cricket::StreamParams stream_params =
939 cricket::CreateSimStreamParams("cname", ssrcs);
940 video_media_channel_->AddSendStream(stream_params);
941 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
942 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
943
944 params = video_rtp_sender_->GetParameters();
945 ASSERT_EQ(2u, params.encodings.size());
946 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
947
948 DestroyVideoRtpSender();
949}
950
951TEST_F(RtpSenderReceiverTest,
952 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
953 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
954
955 RtpParameters params;
956 RTCError result = video_rtp_sender_->SetParameters(params);
957 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
958 DestroyVideoRtpSender();
959}
960
Florent Castellicebf50f2018-05-03 13:31:53961TEST_F(RtpSenderReceiverTest,
962 VideoSenderMustCallGetParametersBeforeSetParameters) {
963 CreateVideoRtpSender();
964
965 RtpParameters params;
966 RTCError result = video_rtp_sender_->SetParameters(params);
967 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
968
969 DestroyVideoRtpSender();
970}
971
972TEST_F(RtpSenderReceiverTest,
973 VideoSenderSetParametersInvalidatesTransactionId) {
974 CreateVideoRtpSender();
975
976 RtpParameters params = video_rtp_sender_->GetParameters();
977 EXPECT_EQ(1u, params.encodings.size());
978 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
979 RTCError result = video_rtp_sender_->SetParameters(params);
980 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
981
982 DestroyVideoRtpSender();
983}
984
985TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
986 CreateVideoRtpSender();
987
988 RtpParameters params = video_rtp_sender_->GetParameters();
989 params.transaction_id = "";
990 RTCError result = video_rtp_sender_->SetParameters(params);
991 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
992
993 DestroyVideoRtpSender();
994}
995
996TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
997 CreateVideoRtpSender();
998
999 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231000 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531001 auto saved_transaction_id = params.transaction_id;
1002 params = video_rtp_sender_->GetParameters();
1003 EXPECT_NE(saved_transaction_id, params.transaction_id);
1004
1005 DestroyVideoRtpSender();
1006}
1007
1008TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1009 CreateVideoRtpSender();
1010
1011 RtpParameters params = video_rtp_sender_->GetParameters();
1012 RtpParameters second_params = video_rtp_sender_->GetParameters();
1013
1014 RTCError result = video_rtp_sender_->SetParameters(params);
1015 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1016
1017 DestroyVideoRtpSender();
1018}
1019
Seth Hampson2d2c8882018-05-16 23:02:321020TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1021 CreateVideoRtpSender();
1022 RtpParameters params = video_rtp_sender_->GetParameters();
1023 EXPECT_EQ(1u, params.encodings.size());
1024
Florent Castelli87b3c512018-07-18 14:00:281025 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321026 params.mid = "dummy_mid";
1027 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1028 video_rtp_sender_->SetParameters(params).type());
1029 params = video_rtp_sender_->GetParameters();
1030
Seth Hampson2d2c8882018-05-16 23:02:321031 DestroyVideoRtpSender();
1032}
1033
1034TEST_F(RtpSenderReceiverTest,
1035 VideoSenderCantSetUnimplementedEncodingParameters) {
1036 CreateVideoRtpSender();
1037 RtpParameters params = video_rtp_sender_->GetParameters();
1038 EXPECT_EQ(1u, params.encodings.size());
1039
1040 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 08:42:191041 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Seth Hampson2d2c8882018-05-16 23:02:321042 params.encodings[0].codec_payload_type = 1;
1043 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1044 video_rtp_sender_->SetParameters(params).type());
1045 params = video_rtp_sender_->GetParameters();
1046
1047 params.encodings[0].fec = RtpFecParameters();
1048 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1049 video_rtp_sender_->SetParameters(params).type());
1050 params = video_rtp_sender_->GetParameters();
1051
1052 params.encodings[0].rtx = RtpRtxParameters();
1053 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1054 video_rtp_sender_->SetParameters(params).type());
1055 params = video_rtp_sender_->GetParameters();
1056
1057 params.encodings[0].dtx = DtxStatus::ENABLED;
1058 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1059 video_rtp_sender_->SetParameters(params).type());
1060 params = video_rtp_sender_->GetParameters();
1061
1062 params.encodings[0].ptime = 1;
1063 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1064 video_rtp_sender_->SetParameters(params).type());
1065 params = video_rtp_sender_->GetParameters();
1066
Seth Hampson2d2c8882018-05-16 23:02:321067 params.encodings[0].scale_resolution_down_by = 2.0;
1068 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1069 video_rtp_sender_->SetParameters(params).type());
1070 params = video_rtp_sender_->GetParameters();
1071
1072 params.encodings[0].rid = "dummy_rid";
1073 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1074 video_rtp_sender_->SetParameters(params).type());
1075 params = video_rtp_sender_->GetParameters();
1076
1077 params.encodings[0].dependency_rids.push_back("dummy_rid");
1078 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1079 video_rtp_sender_->SetParameters(params).type());
1080
1081 DestroyVideoRtpSender();
1082}
1083
Florent Castelli892acf02018-10-01 20:47:201084TEST_F(RtpSenderReceiverTest,
1085 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1086 CreateVideoRtpSenderWithSimulcast();
1087 RtpParameters params = video_rtp_sender_->GetParameters();
1088 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1089
1090 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
1091 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
1092 for (size_t i = 0; i < params.encodings.size(); i++) {
1093 params.encodings[i].codec_payload_type = 1;
1094 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1095 video_rtp_sender_->SetParameters(params).type());
1096 params = video_rtp_sender_->GetParameters();
1097
1098 params.encodings[i].fec = RtpFecParameters();
1099 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1100 video_rtp_sender_->SetParameters(params).type());
1101 params = video_rtp_sender_->GetParameters();
1102
1103 params.encodings[i].rtx = RtpRtxParameters();
1104 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1105 video_rtp_sender_->SetParameters(params).type());
1106 params = video_rtp_sender_->GetParameters();
1107
1108 params.encodings[i].dtx = DtxStatus::ENABLED;
1109 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1110 video_rtp_sender_->SetParameters(params).type());
1111 params = video_rtp_sender_->GetParameters();
1112
1113 params.encodings[i].ptime = 1;
1114 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1115 video_rtp_sender_->SetParameters(params).type());
1116 params = video_rtp_sender_->GetParameters();
1117
1118 params.encodings[i].scale_resolution_down_by = 2.0;
1119 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1120 video_rtp_sender_->SetParameters(params).type());
1121 params = video_rtp_sender_->GetParameters();
1122
1123 params.encodings[i].rid = "dummy_rid";
1124 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1125 video_rtp_sender_->SetParameters(params).type());
1126 params = video_rtp_sender_->GetParameters();
1127
1128 params.encodings[i].dependency_rids.push_back("dummy_rid");
1129 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1130 video_rtp_sender_->SetParameters(params).type());
1131 }
1132
1133 DestroyVideoRtpSender();
1134}
1135
Seth Hampson2d2c8882018-05-16 23:02:321136// A video sender can have multiple simulcast layers, in which case it will
1137// contain multiple RtpEncodingParameters. This tests that if this is the case
1138// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1139// for any encodings besides at index 0, because these are both implemented
1140// "per-sender."
1141TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1142 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201143 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 23:02:321144 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201145 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 23:02:321146
1147 params.encodings[1].bitrate_priority = 2.0;
1148 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1149 video_rtp_sender_->SetParameters(params).type());
1150 params = video_rtp_sender_->GetParameters();
1151
Seth Hampson2d2c8882018-05-16 23:02:321152 DestroyVideoRtpSender();
1153}
1154
Florent Castelli892acf02018-10-01 20:47:201155TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1156 // Add a simulcast specific send stream that contains 2 encoding parameters.
1157 CreateVideoRtpSenderWithSimulcast();
1158 RtpParameters params = video_rtp_sender_->GetParameters();
1159 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1160
1161 for (size_t i = 0; i < params.encodings.size(); i++) {
1162 params.encodings[i].ssrc = 1337;
1163 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1164 video_rtp_sender_->SetParameters(params).type());
1165 params = video_rtp_sender_->GetParameters();
1166 }
1167
1168 DestroyVideoRtpSender();
1169}
1170
Ă…sa Persson55659812018-06-18 15:51:321171TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 23:30:351172 CreateVideoRtpSender();
1173
1174 EXPECT_EQ(-1, video_media_channel_->max_bps());
1175 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231176 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321177 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 20:09:011178 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 15:51:321179 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 09:54:271180 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361181 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351182
1183 // Read back the parameters and verify they have been changed.
1184 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231185 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321186 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271187 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351188
1189 // Verify that the video channel received the new parameters.
1190 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231191 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321192 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271193 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351194
1195 // Verify that the global bitrate limit has not been changed.
1196 EXPECT_EQ(-1, video_media_channel_->max_bps());
1197
1198 DestroyVideoRtpSender();
1199}
1200
Ă…sa Persson55659812018-06-18 15:51:321201TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1202 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201203 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 15:51:321204
1205 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201206 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321207 params.encodings[0].min_bitrate_bps = 100;
1208 params.encodings[0].max_bitrate_bps = 1000;
1209 params.encodings[1].min_bitrate_bps = 200;
1210 params.encodings[1].max_bitrate_bps = 2000;
1211 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1212
1213 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 20:47:201214 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1215 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321216 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1217 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1218 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1219 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1220
1221 DestroyVideoRtpSender();
1222}
1223
Seth Hampson24722b32017-12-22 17:36:421224TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1225 CreateVideoRtpSender();
1226
1227 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231228 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421229 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1230 params.encodings[0].bitrate_priority);
1231 double new_bitrate_priority = 2.0;
1232 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361233 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421234
1235 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231236 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421237 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1238
1239 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231240 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421241 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1242
1243 DestroyVideoRtpSender();
1244}
1245
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301246TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1247 CreateAudioRtpReceiver();
1248
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301249 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:351250 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301251 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1252
1253 DestroyAudioRtpReceiver();
1254}
1255
1256TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1257 CreateVideoRtpReceiver();
1258
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301259 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:351260 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301261 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1262
1263 DestroyVideoRtpReceiver();
1264}
1265
pbos5214a0a2016-12-16 23:39:111266// Test that makes sure that a video track content hint translates to the proper
1267// value for sources that are not screencast.
1268TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1269 CreateVideoRtpSender();
1270
1271 video_track_->set_enabled(true);
1272
1273 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 09:54:271274 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111275 // No content hint should be set by default.
1276 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1277 video_track_->content_hint());
1278 // Setting detailed should turn a non-screencast source into screencast mode.
1279 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 09:54:271280 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111281 // Removing the content hint should turn the track back into non-screencast
1282 // mode.
1283 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 09:54:271284 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111285 // Setting fluid should remain in non-screencast mode (its default).
1286 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 09:54:271287 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101288 // Setting text should have the same effect as Detailed
1289 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1290 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111291
1292 DestroyVideoRtpSender();
1293}
1294
1295// Test that makes sure that a video track content hint translates to the proper
1296// value for screencast sources.
1297TEST_F(RtpSenderReceiverTest,
1298 PropagatesVideoTrackContentHintForScreencastSource) {
1299 CreateVideoRtpSender(true);
1300
1301 video_track_->set_enabled(true);
1302
1303 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 09:54:271304 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111305 // No content hint should be set by default.
1306 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1307 video_track_->content_hint());
1308 // Setting fluid should turn a screencast source into non-screencast mode.
1309 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 09:54:271310 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111311 // Removing the content hint should turn the track back into screencast mode.
1312 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 09:54:271313 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111314 // Setting detailed should still remain in screencast mode (its default).
1315 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 09:54:271316 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101317 // Setting text should have the same effect as Detailed
1318 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1319 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111320
1321 DestroyVideoRtpSender();
1322}
1323
1324// Test that makes sure any content hints that are set on a track before
1325// VideoRtpSender is ready to send are still applied when it gets ready to send.
1326TEST_F(RtpSenderReceiverTest,
1327 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1328 AddVideoTrack();
1329 // Setting detailed overrides the default non-screencast mode. This should be
1330 // applied even if the track is set on construction.
1331 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 20:03:361332 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1333 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1334 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 23:19:501335 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 23:39:111336 video_track_->set_enabled(true);
1337
1338 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 14:47:431339 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111340
1341 // Verify that the content hint is accounted for when video_rtp_sender_ does
1342 // get enabled.
1343 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 09:54:271344 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111345
1346 // And removing the hint should go back to false (to verify that false was
1347 // default correctly).
1348 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 09:54:271349 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111350
1351 DestroyVideoRtpSender();
1352}
1353
deadbeef20cb0c12017-02-02 04:27:001354TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1355 CreateAudioRtpSender();
1356 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1357}
1358
1359TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1360 CreateVideoRtpSender();
1361 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1362}
1363
1364// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1365// true/false from CanSendDtmf based on what |voice_channel_| returns.
1366TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1367 AddDtmfCodec();
1368 CreateAudioRtpSender();
1369 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1370 ASSERT_NE(nullptr, dtmf_sender);
1371 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1372}
1373
1374TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1375 CreateAudioRtpSender();
1376 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1377 ASSERT_NE(nullptr, dtmf_sender);
1378 // DTMF codec has not been added, as it was in the above test.
1379 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1380}
1381
1382TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1383 AddDtmfCodec();
1384 CreateAudioRtpSender();
1385 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1386 ASSERT_NE(nullptr, dtmf_sender);
1387
1388 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1389
1390 // Insert DTMF
1391 const int expected_duration = 90;
1392 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1393
1394 // Verify
1395 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1396 kDefaultTimeout);
1397 const uint32_t send_ssrc =
1398 voice_media_channel_->send_streams()[0].first_ssrc();
1399 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1400 send_ssrc, 0, expected_duration));
1401 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1402 send_ssrc, 1, expected_duration));
1403 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1404 send_ssrc, 2, expected_duration));
1405}
1406
1407// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1408// destroyed, which is needed for the DTMF sender.
1409TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1410 CreateAudioRtpSender();
1411 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1412 audio_rtp_sender_ = nullptr;
1413 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1414}
1415
Benjamin Wright84583f62018-10-04 21:22:341416// Validate that the default FrameEncryptor setting is nullptr.
1417TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1418 CreateAudioRtpSender();
1419 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1420 new FakeFrameEncryptor());
1421 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1422 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1423 EXPECT_EQ(fake_frame_encryptor.get(),
1424 audio_rtp_sender_->GetFrameEncryptor().get());
1425}
1426
1427// Validate that the default FrameEncryptor setting is nullptr.
1428TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1429 CreateAudioRtpReceiver();
1430 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1431 new FakeFrameDecryptor());
1432 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1433 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1434 EXPECT_EQ(fake_frame_decryptor.get(),
1435 audio_rtp_receiver_->GetFrameDecryptor().get());
1436}
1437
deadbeef70ab1a12015-09-28 23:53:551438} // namespace webrtc